fixing docker pulls #2446

Merged
mfreeman451 merged 3 commits from refs/pull/2446/head into main 2025-11-23 02:56:52 +00:00
mfreeman451 commented 2025-11-23 02:19:07 +00:00 (Migrated from github.com)
Owner

Imported from GitHub pull request.

Original GitHub pull request: #1978
Original author: @mfreeman451
Original URL: https://github.com/carverauto/serviceradar/pull/1978
Original created: 2025-11-23T02:19:07Z
Original updated: 2025-12-08T06:54:39Z
Original head: carverauto/serviceradar:updates/rbe_fix_docker_pulls
Original base: main
Original merged: 2025-11-23T02:56:52Z by @mfreeman451

User description

IMPORTANT: Please sign the Developer Certificate of Origin

Thank you for your contribution to ServiceRadar. Please note, when contributing, the developer must include
a DCO sign-off statement indicating the DCO acceptance in one commit message. Here
is an example DCO Signed-off-by line in a commit message:

Signed-off-by: J. Doe <j.doe@domain.com>

Describe your changes

Code checklist before requesting a review

  • I have signed the DCO?
  • The build completes without errors?
  • All tests are passing when running make test?

PR Type

Enhancement


Description

  • Add Docker authentication configuration for Bazel pulls

  • Use GitHub secrets for DockerHub credentials

  • Execute setup script during CI workflow


Diagram Walkthrough

flowchart LR
  A["GitHub Secrets<br/>DOCKERHUB_USERNAME<br/>DOCKERHUB_TOKEN"] -->|"Pass credentials"| B["buildbuddy_setup_docker_auth.sh"]
  B -->|"Configure Docker auth"| C["Bazel pulls<br/>authenticated"]

File Walkthrough

Relevant files
Configuration changes
main.yml
Add Docker auth configuration step to CI workflow               

.github/workflows/main.yml

  • Add new workflow step to configure Docker authentication for Bazel
  • Conditionally run setup script when DockerHub credentials are
    available
  • Pass DOCKERHUB_USERNAME and DOCKERHUB_TOKEN as environment variables
  • Execute buildbuddy_setup_docker_auth.sh script before test execution
+7/-0     

Imported from GitHub pull request. Original GitHub pull request: #1978 Original author: @mfreeman451 Original URL: https://github.com/carverauto/serviceradar/pull/1978 Original created: 2025-11-23T02:19:07Z Original updated: 2025-12-08T06:54:39Z Original head: carverauto/serviceradar:updates/rbe_fix_docker_pulls Original base: main Original merged: 2025-11-23T02:56:52Z by @mfreeman451 --- ### **User description** ## IMPORTANT: Please sign the Developer Certificate of Origin Thank you for your contribution to ServiceRadar. Please note, when contributing, the developer must include a [DCO sign-off statement]( https://developercertificate.org/) indicating the DCO acceptance in one commit message. Here is an example DCO Signed-off-by line in a commit message: ``` Signed-off-by: J. Doe <j.doe@domain.com> ``` ## Describe your changes ## Issue ticket number and link ## Code checklist before requesting a review - [ ] I have signed the DCO? - [ ] The build completes without errors? - [ ] All tests are passing when running make test? ___ ### **PR Type** Enhancement ___ ### **Description** - Add Docker authentication configuration for Bazel pulls - Use GitHub secrets for DockerHub credentials - Execute setup script during CI workflow ___ ### Diagram Walkthrough ```mermaid flowchart LR A["GitHub Secrets<br/>DOCKERHUB_USERNAME<br/>DOCKERHUB_TOKEN"] -->|"Pass credentials"| B["buildbuddy_setup_docker_auth.sh"] B -->|"Configure Docker auth"| C["Bazel pulls<br/>authenticated"] ``` <details> <summary><h3> File Walkthrough</h3></summary> <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Configuration changes</strong></td><td><table> <tr> <td> <details> <summary><strong>main.yml</strong><dd><code>Add Docker auth configuration step to CI workflow</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> .github/workflows/main.yml <ul><li>Add new workflow step to configure Docker authentication for Bazel<br> <li> Conditionally run setup script when DockerHub credentials are <br>available<br> <li> Pass DOCKERHUB_USERNAME and DOCKERHUB_TOKEN as environment variables<br> <li> Execute <code>buildbuddy_setup_docker_auth.sh</code> script before test execution</ul> </details> </td> <td><a href="https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3">+7/-0</a>&nbsp; &nbsp; &nbsp; </td> </tr> </table></td></tr></tr></tbody></table> </details> ___
qodo-code-review[bot] commented 2025-11-23 02:19:28 +00:00 (Migrated from github.com)
Author
Owner

Imported GitHub PR comment.

Original author: @qodo-code-review[bot]
Original URL: https://github.com/carverauto/serviceradar/pull/1978#issuecomment-3567391535
Original created: 2025-11-23T02:19:28Z

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
Secret leakage in CI logs

Description: GitHub Actions step directly exposes DockerHub credentials as environment variables to a
shell script without restricting permissions or masking script output, risking accidental
secret leakage via verbose logs or echo statements in the script; ensure the script avoids
printing env vars, disables command echoing where appropriate (set +x), and
least-privilege scopes are used.
main.yml [76-81]

Referred Code
- name: Configure Docker auth for Bazel pulls
  if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }}
  env:
    DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
    DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
  run: ./buildbuddy_setup_docker_auth.sh
Ticket Compliance
🎫 No ticket provided
  • Create ticket/issue
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
🟢
Generic: Meaningful Naming and Self-Documenting Code

Objective: Ensure all identifiers clearly express their purpose and intent, making code
self-documenting

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Comprehensive Audit Trails

Objective: To create a detailed and reliable record of critical system actions for security analysis
and compliance.

Status:
Missing audit logs: The new workflow step adds Docker auth configuration without any explicit logging of the
action outcome, making it unclear whether critical authentication/configuration actions
are auditable.

Referred Code
- name: Configure Docker auth for Bazel pulls
  if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }}
  env:
    DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
    DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
  run: ./buildbuddy_setup_docker_auth.sh

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status:
Unhandled script failures: The step runs './buildbuddy_setup_docker_auth.sh' without explicit error
handling or fallback, and it is unclear if failures are handled or surfaced with
actionable context.

Referred Code
- name: Configure Docker auth for Bazel pulls
  if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }}
  env:
    DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
    DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
  run: ./buildbuddy_setup_docker_auth.sh

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Error Handling

Objective: To prevent the leakage of sensitive system information through error messages while
providing sufficient detail for internal debugging.

Status:
Potential secret leakage: If the called script outputs errors, it may inadvertently echo DockerHub credentials
unless the script suppresses or masks them, which is not verifiable from this diff.

Referred Code
env:
  DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
  DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
run: ./buildbuddy_setup_docker_auth.sh

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Logging Practices

Objective: To ensure logs are useful for debugging and auditing without exposing sensitive
information like PII, PHI, or cardholder data.

Status:
Secrets in env: Secrets are passed as environment variables to a script; without confirmation that the
script avoids logging them, there is a risk of secret exposure in CI logs.

Referred Code
env:
  DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
  DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
run: ./buildbuddy_setup_docker_auth.sh

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Security-First Input Validation and Data Handling

Objective: Ensure all data inputs are validated, sanitized, and handled securely to prevent
vulnerabilities

Status:
Secret handling validation: The workflow passes external secret inputs to a shell script without visible validation or
sanitization, and it is unclear whether the script securely handles and stores these
credentials.

Referred Code
env:
  DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
  DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
run: ./buildbuddy_setup_docker_auth.sh

Learn more about managing compliance generic rules or creating your own custom rules

  • Update
Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
- Requires Further Human Verification
🏷️ - Compliance label
Imported GitHub PR comment. Original author: @qodo-code-review[bot] Original URL: https://github.com/carverauto/serviceradar/pull/1978#issuecomment-3567391535 Original created: 2025-11-23T02:19:28Z --- ## PR Compliance Guide 🔍 <!-- https://github.com/carverauto/serviceradar/commit/755c5b9beb8b57523423ad696a530751f8dbbcc0 --> Below is a summary of compliance checks for this PR:<br> <table><tbody><tr><td colspan='2'><strong>Security Compliance</strong></td></tr> <tr><td rowspan=1>⚪</td> <td><details><summary><strong>Secret leakage in CI logs </strong></summary><br> <b>Description:</b> GitHub Actions step directly exposes DockerHub credentials as environment variables to a <br>shell script without restricting permissions or masking script output, risking accidental <br>secret leakage via verbose logs or echo statements in the script; ensure the script avoids <br>printing env vars, disables command echoing where appropriate (set +x), and <br>least-privilege scopes are used.<br> <strong><a href='https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3R76-R81'>main.yml [76-81]</a></strong><br> <details open><summary>Referred Code</summary> ```yaml - name: Configure Docker auth for Bazel pulls if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }} env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} run: ./buildbuddy_setup_docker_auth.sh ``` </details></details></td></tr> <tr><td colspan='2'><strong>Ticket Compliance</strong></td></tr> <tr><td>⚪</td><td><details><summary>🎫 <strong>No ticket provided </strong></summary> - [ ] Create ticket/issue <!-- /create_ticket --create_ticket=true --> </details></td></tr> <tr><td colspan='2'><strong>Codebase Duplication Compliance</strong></td></tr> <tr><td>⚪</td><td><details><summary><strong>Codebase context is not defined </strong></summary> Follow the <a href='https://qodo-merge-docs.qodo.ai/core-abilities/rag_context_enrichment/'>guide</a> to enable codebase context checks. </details></td></tr> <tr><td colspan='2'><strong>Custom Compliance</strong></td></tr> <tr><td rowspan=1>🟢</td><td> <details><summary><strong>Generic: Meaningful Naming and Self-Documenting Code</strong></summary><br> **Objective:** Ensure all identifiers clearly express their purpose and intent, making code <br>self-documenting<br> **Status:** Passed<br> > Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a> </details></td></tr> <tr><td rowspan=5>⚪</td> <td><details> <summary><strong>Generic: Comprehensive Audit Trails</strong></summary><br> **Objective:** To create a detailed and reliable record of critical system actions for security analysis <br>and compliance.<br> **Status:** <br><a href='https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3R76-R81'><strong>Missing audit logs</strong></a>: The new workflow step adds Docker auth configuration without any explicit logging of the <br>action outcome, making it unclear whether critical authentication/configuration actions <br>are auditable.<br> <details open><summary>Referred Code</summary> ```yaml - name: Configure Docker auth for Bazel pulls if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }} env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} run: ./buildbuddy_setup_docker_auth.sh ``` </details> > Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a> </details></td></tr> <tr><td><details> <summary><strong>Generic: Robust Error Handling and Edge Case Management</strong></summary><br> **Objective:** Ensure comprehensive error handling that provides meaningful context and graceful <br>degradation<br> **Status:** <br><a href='https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3R76-R81'><strong>Unhandled script failures</strong></a>: The step runs &#x27;./buildbuddy_setup_docker_auth.sh&#x27; without explicit error <br>handling or fallback, and it is unclear if failures are handled or surfaced with <br>actionable context.<br> <details open><summary>Referred Code</summary> ```yaml - name: Configure Docker auth for Bazel pulls if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }} env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} run: ./buildbuddy_setup_docker_auth.sh ``` </details> > Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a> </details></td></tr> <tr><td><details> <summary><strong>Generic: Secure Error Handling</strong></summary><br> **Objective:** To prevent the leakage of sensitive system information through error messages while <br>providing sufficient detail for internal debugging.<br> **Status:** <br><a href='https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3R78-R81'><strong>Potential secret leakage</strong></a>: If the called script outputs errors, it may inadvertently echo DockerHub credentials <br>unless the script suppresses or masks them, which is not verifiable from this diff.<br> <details open><summary>Referred Code</summary> ```yaml env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} run: ./buildbuddy_setup_docker_auth.sh ``` </details> > Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a> </details></td></tr> <tr><td><details> <summary><strong>Generic: Secure Logging Practices</strong></summary><br> **Objective:** To ensure logs are useful for debugging and auditing without exposing sensitive <br>information like PII, PHI, or cardholder data.<br> **Status:** <br><a href='https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3R78-R81'><strong>Secrets in env</strong></a>: Secrets are passed as environment variables to a script; without confirmation that the <br>script avoids logging them, there is a risk of secret exposure in CI logs.<br> <details open><summary>Referred Code</summary> ```yaml env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} run: ./buildbuddy_setup_docker_auth.sh ``` </details> > Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a> </details></td></tr> <tr><td><details> <summary><strong>Generic: Security-First Input Validation and Data Handling</strong></summary><br> **Objective:** Ensure all data inputs are validated, sanitized, and handled securely to prevent <br>vulnerabilities<br> **Status:** <br><a href='https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3R78-R81'><strong>Secret handling validation</strong></a>: The workflow passes external secret inputs to a shell script without visible validation or <br>sanitization, and it is unclear whether the script securely handles and stores these <br>credentials.<br> <details open><summary>Referred Code</summary> ```yaml env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} run: ./buildbuddy_setup_docker_auth.sh ``` </details> > Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a> </details></td></tr> <tr><td align="center" colspan="2"> - [ ] Update <!-- /compliance --update_compliance=true --> </td></tr></tbody></table> <details><summary>Compliance status legend</summary> 🟢 - Fully Compliant<br> 🟡 - Partial Compliant<br> 🔴 - Not Compliant<br> ⚪ - Requires Further Human Verification<br> 🏷️ - Compliance label<br> </details>
qodo-code-review[bot] commented 2025-11-23 02:20:11 +00:00 (Migrated from github.com)
Author
Owner

Imported GitHub PR comment.

Original author: @qodo-code-review[bot]
Original URL: https://github.com/carverauto/serviceradar/pull/1978#issuecomment-3567391970
Original created: 2025-11-23T02:20:11Z

PR Code Suggestions

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
Use official action for authentication

Replace the custom buildbuddy_setup_docker_auth.sh script with the official
docker/login-action for a more standard and robust approach to Docker
authentication.

.github/workflows/main.yml [76-81]

-- name: Configure Docker auth for Bazel pulls
+- name: Log in to Docker Hub
   if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }}
-  env:
-    DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
-    DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
-  run: ./buildbuddy_setup_docker_auth.sh
+  uses: docker/login-action@v3
+  with:
+    username: ${{ secrets.DOCKERHUB_USERNAME }}
+    password: ${{ secrets.DOCKERHUB_TOKEN }}
  • Apply / Chat
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly proposes replacing a custom script with the official docker/login-action, which is a more robust, secure, and standard practice for handling Docker authentication in GitHub Actions.

Medium
  • Update
Imported GitHub PR comment. Original author: @qodo-code-review[bot] Original URL: https://github.com/carverauto/serviceradar/pull/1978#issuecomment-3567391970 Original created: 2025-11-23T02:20:11Z --- ## PR Code Suggestions ✨ <!-- 755c5b9 --> Explore these optional code suggestions: <table><thead><tr><td><strong>Category</strong></td><td align=left><strong>Suggestion&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </strong></td><td align=center><strong>Impact</strong></td></tr><tbody><tr><td rowspan=1>General</td> <td> <details><summary>Use official action for authentication<!-- not_implemented --></summary> ___ **Replace the custom <code>buildbuddy_setup_docker_auth.sh</code> script with the official <br><code>docker/login-action</code> for a more standard and robust approach to Docker <br>authentication.** [.github/workflows/main.yml [76-81]](https://github.com/carverauto/serviceradar/pull/1978/files#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3R76-R81) ```diff -- name: Configure Docker auth for Bazel pulls +- name: Log in to Docker Hub if: ${{ secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != '' }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} - run: ./buildbuddy_setup_docker_auth.sh + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} ``` - [ ] **Apply / Chat** <!-- /improve --apply_suggestion=0 --> <details><summary>Suggestion importance[1-10]: 7</summary> __ Why: The suggestion correctly proposes replacing a custom script with the official `docker/login-action`, which is a more robust, secure, and standard practice for handling Docker authentication in GitHub Actions. </details></details></td><td align=center>Medium </td></tr> <tr><td align="center" colspan="2"> - [ ] Update <!-- /improve_multi --more_suggestions=true --> </td><td></td></tr></tbody></table>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
carverauto/serviceradar!2446
No description provided.