Skip to content

[CFX-7263] Fail on bad env credentials instead of using the stored profile - #751

Merged
chasdr merged 10 commits into
mainfrom
chas/CFX-7263
Aug 13, 2026
Merged

[CFX-7263] Fail on bad env credentials instead of using the stored profile#751
chasdr merged 10 commits into
mainfrom
chas/CFX-7263

Conversation

@chasdr

@chasdr chasdr commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Summary

dr honored DATAROBOT_ENDPOINT/DATAROBOT_API_TOKEN only once they verified. On failure it silently fell back to the stored CLI profile, so a script passing a project's .env credentials ran against the caller's own instance with exit 0. dr llm-gateway list listed the wrong catalog. A complete env pair that fails verification now fails the command, with the reason on stderr and both endpoints named. dr auth check and dr auth export already treat env credentials as authoritative.

Notes for review

  • A stale .env in a template checkout used to self-heal: task loads .env into the environment, and dr dotenv update quietly ran on the stored profile. Those runs now fail with the fix named. pulumi and the SDKs already fail on the same stale credentials.
  • Partial env credentials (one var set) keep the old fallback. Only a complete pair is an explicit instance request.

Output

$ DATAROBOT_ENDPOINT=http://127.0.0.1:8471/api/v2 DATAROBOT_API_TOKEN=expired-token dr llm-gateway list
❌ DATAROBOT_API_TOKEN environment variable is invalid or expired.
Unset it and try again:
  unset DATAROBOT_API_TOKEN (or Remove-Item Env:\DATAROBOT_API_TOKEN on Windows)
Environment credentials for http://127.0.0.1:8471 failed to verify; not falling back to the stored profile for http://127.0.0.1:8600.
Error: Authentication failed.

$ DATAROBOT_ENDPOINT=http://127.0.0.1:9 DATAROBOT_API_TOKEN=some-token dr llm-gateway list
❌ Could not connect to http://127.0.0.1:9: dial tcp 127.0.0.1:9: connect: connection refused
Check DATAROBOT_ENDPOINT and your network, then try again.
Error: Authentication failed.

Before this change both commands printed the caller's own catalog and exited 0.

Technical Changes

  • internal/auth/auth.go: EnsureAuthenticated fails before the stored-profile check when a complete env pair fails verification. Classification extracted to ReportEnvCredentialsError with a new transport-error branch. EnvCredentials.EndpointVar names DATAROBOT_API_ENDPOINT when that fallback supplied the endpoint. Styles bind to the destination writer so redirected stderr gets no ANSI codes.
  • cmd/auth/check/cmd.go: drops its copy of the classification for the shared helper.
  • docs: authentication.md documents the precedence; auth.md adds the could-not-connect example.
  • 8 new tests. The load-bearing one pins env-invalid plus stored-valid to failure.

Note

Medium Risk
Changes global authentication precedence for every command using EnsureAuthenticated; workflows that relied on silent fallback to drconfig.yaml will now fail (intentional), but partial env vars still behave as before.

Overview
Fixes silent wrong-instance auth: when both DATAROBOT_ENDPOINT (or DATAROBOT_API_ENDPOINT) and DATAROBOT_API_TOKEN are set but verification fails, commands now fail instead of using the stored CLI profile or starting login—so scripts with a stale project .env no longer hit the wrong DataRobot instance with exit 0.

Shared env error reporting: ReportEnvCredentialsError centralizes classification (timeout, malformed endpoint, missing scheme, transport/DNS, invalid token) and is used from EnsureAuthenticated (stderr) and dr auth check. Transport failures no longer suggest unsetting the token. reportStoredProfileNotUsed names the requested vs stored endpoints when a profile exists.

Other: EnvCredentials.EndpointVar drives error text for the SDK fallback var; lipgloss styles bind to the destination writer for redirected stderr/tests. Docs describe env-first precedence and the unreachable-endpoint example. Regression tests cover env-invalid + stored-valid, unreachable endpoint, and error message branches.

Reviewed by Cursor Bugbot for commit 118d6cd. Configure here.

chasdr added 4 commits August 11, 2026 20:20
… silently using the stored profile

Why:
- EnsureAuthenticated verified DATAROBOT_ENDPOINT/DATAROBOT_API_TOKEN but on failure fell back to the stored profile with no output when the stored token was valid. a script passing a project's .env creds got the caller's own instance with exit 0, so dr llm-gateway list returned the wrong catalog.
- dr auth check and dr auth export already treat a complete env pair as authoritative. EnsureAuthenticated was the one path that substituted silently.

Changes:
- a complete env pair that fails verification now fails the command before the stored-profile check. classified reason (timeout, malformed endpoint, invalid token) goes to stderr plus a line naming both the requested endpoint and the stored profile that was not used.
- extracted the classification into ReportEnvCredentialsError, shared with dr auth check (drops its duplicated block).
- partial or absent env credentials keep the existing fallback and login flow.
- regression tests: env-invalid with stored-valid must return false and must not start the login flow; malformed quoted endpoint variant; classifier and refusal-message unit tests.
…rror

Why:
- a transport failure (connection refused, DNS, TLS) fell through to the "DATAROBOT_API_TOKEN is invalid or expired, unset it" message. harmful advice when the token was never judged because the instance was never reached.
- failure messages always named DATAROBOT_ENDPOINT even when the endpoint came from the SDK-style DATAROBOT_API_ENDPOINT fallback var, telling the user to fix a variable that is unset.
- the tui styles probe stdout for color support, so styled stderr output carried ANSI codes when stderr was redirected while stdout stayed a TTY.

Changes:
- classify *url.Error from VerifyToken as "Could not connect to <host>" before the invalid-token fallthrough. a rejected token is a plain non-200 error, so the fallthrough now only fires when the instance actually answered.
- EnvCredentials carries EndpointVar (which env var supplied the endpoint); the malformed-endpoint and could-not-connect messages name it.
- writerStyles binds BaseTextStyle/InfoStyle to the destination writer's renderer in the three writer-taking message funcs.
- tests: unreachable-endpoint classification (unit + end-to-end via a closed port, proving VerifyToken transport errors are *url.Error), DATAROBOT_API_ENDPOINT naming.
@chasdr
chasdr requested a review from a team as a code owner August 12, 2026 01:08
@datarobot-pr-review-router

Copy link
Copy Markdown

🎫 Jira: CFX-7263 — dr silently falls back to its stored profile when passed-in credentials fail to verify

@github-actions github-actions Bot added the go Pull requests that update go code label Aug 12, 2026
@chasdr
chasdr requested a balanced review from Copilot August 12, 2026 01:12

This comment was marked as resolved.

Comment thread internal/auth/auth.go
Comment thread internal/auth/auth.go
chasdr added 3 commits August 12, 2026 11:27
…ot could-not-connect

Cursor flagged the scheme-less case: ValidateEndpoint forgives what
SchemeHostOnly can clean up while VerifyToken dials the raw value, so the
transport branch printed a normalized https host that was never requested.
Fixed the whole class, not just that case: a missing scheme and a raw
url.Parse failure (Op parse, e.g. leading whitespace) both classify as an
invalid endpoint now, so the could-not-connect branch only ever names a
host that was actually dialed. Two classifier tests added.

This comment was marked as resolved.

@chasdr

chasdr commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 118d6cd. Configure here.

@datarobot-pr-review-router

Copy link
Copy Markdown

Code Ownership

Cli Maintainers

  • cmd/auth/check/cmd.go
  • docs/commands/auth.md
  • docs/development/authentication.md
  • internal/auth/auth.go
  • internal/auth/auth_test.go

Review requested from the teams above. Labels will be removed automatically upon approval.

Comment thread internal/auth/auth.go Outdated
Comment on lines +165 to +169
// VerifyToken dials the raw endpoint value, while ValidateEndpoint above
// forgives what SchemeHostOnly can clean up (a bare host without a
// scheme, stray whitespace). Catch those as endpoint problems here so the
// transport branch below only ever names a host that was actually dialed.
var urlErr *url.Error

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I'm a little confused by this comment existing here.

Also what does 'dials' here mean in "dials the raw endpoint value"?

@c-h-russell-walker c-h-russell-walker left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks great 🚀

Made one comment where I didn't really get the context/placement of a comment and some wording - but no blocking merge.

@ajalon1 ajalon1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concerned how this interacts with dr workload, please hold

@ajalon1 ajalon1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aha, I know why this triggered my spidey sense. I tried changing this in #616

@ajalon1

ajalon1 commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Manual CLI interaction testing — CFX-7263 (PR #751) with PR #750 locally merged

Note on scope: PR #750 (aj/CFX-6414-dotenv-setup-propagate, "fix(dotenv): make --if-needed skip only when .env is complete") is not part of this PR's remote diff. It was locally merged into chas/CFX-7263 solely to exercise the combination of the two changes. The rows below marked "(#750)" test #750's behavior; rows marked "(#751)" test the auth-precedence change; R15 is the cross-PR interaction. Reviewers should not expect #750's commits in this PR's remote diff.

Tested commit: f37f77ee0debb9c3c821d70285977ef61f571a97Merge branch 'pr-750' into chas/CFX-7263 (local merge, clean, no conflicts)
Binary: ./dist/dr built via task build at that commit (v0.2.82-13-gf37f77ee0debb9).
Credentials: Fake/unreachable endpoints (http://127.0.0.1:1/api/v2, closed port) and a local 127.0.0.1:8765 HTTP server returning 401 to simulate a reachable-but-rejecting endpoint. Dummy tokens only. No real DataRobot instance was contacted; DR_API_TOKEN was not set; no smoke tests were run. A temp HOME / XDG_CONFIG_HOME was used for every invocation so the reviewer's real config was never touched.

Summary verdict

All 9 exercised rows PASS. The two changes compose correctly: a stale .env loaded into the process environment now fails loudly (#751) instead of silently falling back to the stored profile, and dotenv setup --if-needed skips only when the .env file itself is complete (#750), ignoring OS environment variables for the skip decision.

Per-row results

Row Command (abbreviated) Expected Result
R13 (#750) dr dotenv setup --if-needed --skip-auth.env missing core vars, DATAROBOT_ENDPOINT+DATAROBOT_API_TOKEN exported in env Does NOT skip; wizard/flow proceeds PASS — no skip message; proceeded to launch wizard TUI (failed only on no-TTY in the non-interactive harness)
R14 (#750) dr dotenv setup --if-needed --skip-auth.env has all core vars (dummy) Skips PASS — exit 0, Configuration already exists, skipping setup.
R15 (#751+#750) dr llm-gateway list — complete bad env pair (127.0.0.1:1, expired) Fails with env-credential error on stderr; no silent fallback; non-zero exit PASS — exit 1, Could not connect to http://127.0.0.1:1: ... on stderr; no profile fallback
R16 (#751) dr auth check — repo .env with dummy creds + complete bad env pair Checks .env creds first, then CLI creds; reports env-credential failure via shared ReportEnvCredentialsError PASS — .env token error printed, then Could not connect ... (ReportEnvCredentialsError classification)
R2 (#751) dr llm-gateway list — complete bad pair, 401 (invalid token), stored profile present Fails, no fallback to stored profile PASS — DATAROBOT_API_TOKEN ... invalid or expired. + not falling back to the stored profile for https://app.datarobot.com.
R4 (#751) dr llm-gateway list — unreachable endpoint (127.0.0.1:1) Could not connect, not unset token PASS — Could not connect to http://127.0.0.1:1: ...; no unset DATAROBOT_API_TOKEN advice
R10 (#751) dr llm-gateway listDATAROBOT_API_ENDPOINT (not DATAROBOT_ENDPOINT) + token, bad Error names DATAROBOT_API_ENDPOINT PASS — Check DATAROBOT_API_ENDPOINT and your network; does not name DATAROBOT_ENDPOINT
R11 (#751) dr llm-gateway list 2>err.log — bad pair err.log contains no ANSI escape codes PASS — 0 ANSI escapes in err.log (renderer probes the file stream and disables color)
R12 (#751) dr llm-gateway list --output-format json — bad pair stdout pure JSON or empty; error on stderr; non-zero exit PASS — stdout 0 bytes; classified error on stderr; exit 1

Manual CLI test output

$ # R13 — .env missing core vars, env has them (--skip-auth isolates #750 skip logic)
$ dr dotenv setup --if-needed --skip-auth
EXIT: 1
# stderr: WARN ... --skip-auth ...; INFO Parsing prompts ...; INFO Adding variable INFRA_ENABLE_LLM ...
# stderr: Error: could not open a new TTY: open /dev/tty: device not configured
# stdout: (no "Configuration already exists, skipping setup." message)
# -> did NOT skip; wizard launch attempted (failed only because the harness has no TTY)

$ # R14 — .env has all core vars (dummy)
$ dr dotenv setup --if-needed --skip-auth
EXIT: 0
# stdout: Configuration already exists, skipping setup.
# -> skipped

$ # R15 — cross-PR interaction: complete bad env pair via llm-gateway list
$ DATAROBOT_ENDPOINT=http://127.0.0.1:1/api/v2 DATAROBOT_API_TOKEN=expired dr llm-gateway list
EXIT: 1
# stderr:
#   ❌ Could not connect to http://127.0.0.1:1: dial tcp 127.0.0.1:1: connect: connection refused
#   Check DATAROBOT_ENDPOINT and your network, then try again.
#   Error: Authentication failed.
# -> fails loudly, no silent profile fallback

$ # R16 — dr auth check in repo with .env dummy creds + complete bad env pair
$ DATAROBOT_ENDPOINT=http://127.0.0.1:1/api/v2 DATAROBOT_API_TOKEN=expired dr auth check
EXIT: 1
# stdout:
#   ❌ DATAROBOT_API_TOKEN in '.env' is invalid or expired.
#   Run dr dotenv update to refresh credentials.
#   ❌ Could not connect to http://127.0.0.1:1: dial tcp 127.0.0.1:1: connect: connection refused
#   Check DATAROBOT_ENDPOINT and your network, then try again.
# -> .env creds checked first (verifyDotenvToken), then CLI creds (ReportEnvCredentialsError)

$ # R2 — complete bad pair (401 => invalid token) with a stored profile present
$ DATAROBOT_ENDPOINT=http://127.0.0.1:8765/api/v2 DATAROBOT_API_TOKEN=expired dr llm-gateway list
EXIT: 1
# stderr:
#   ❌ DATAROBOT_API_TOKEN environment variable is invalid or expired.
#   Unset it and try again:
#     unset DATAROBOT_API_TOKEN (or Remove-Item Env:\DATAROBOT_API_TOKEN on Windows)
#   Environment credentials for http://127.0.0.1:8765 failed to verify; not falling back to the stored profile for https://app.datarobot.com.
#   Error: Authentication failed.

$ # R4 — unreachable endpoint
$ DATAROBOT_ENDPOINT=http://127.0.0.1:1/api/v2 DATAROBOT_API_TOKEN=expired dr llm-gateway list
EXIT: 1
# stderr:
#   ❌ Could not connect to http://127.0.0.1:1: dial tcp 127.0.0.1:1: connect: connection refused
#   Check DATAROBOT_ENDPOINT and your network, then try again.
#   Error: Authentication failed.
# (no "unset DATAROBOT_API_TOKEN" advice)

$ # R10 — DATAROBOT_API_ENDPOINT (not DATAROBOT_ENDPOINT) + token, bad
$ DATAROBOT_API_ENDPOINT=http://127.0.0.1:1/api/v2 DATAROBOT_API_TOKEN=expired dr llm-gateway list
EXIT: 1
# stderr:
#   ❌ Could not connect to http://127.0.0.1:1: dial tcp 127.0.0.1:1: connect: connection refused
#   Check DATAROBOT_API_ENDPOINT and your network, then try again.
#   Error: Authentication failed.

$ # R11 — stderr redirected to a file; confirm no ANSI escape codes
$ dr llm-gateway list 2>err.log   # (bad env pair)
EXIT: 1
# err.log (cat -v): M-bM-^]M-^L Could not connect to ... (the M-… bytes are the ❌ emoji, not ANSI)
# ANSI escape count in err.log: 0

$ # R12 — --output-format json with a bad env pair
$ dr llm-gateway list --output-format json   # (bad env pair)
EXIT: 1
# stdout: 0 bytes (empty)
# stderr:
#   ❌ Could not connect to http://127.0.0.1:1: dial tcp 127.0.0.1:1: connect: connection refused
#   Check DATAROBOT_ENDPOINT and your network, then try again.
#   Error: Authentication failed.

Unit tests

Targeted packages covering both changes, with -race -count=1:

$ go test -race -count=1 ./internal/auth/... ./cmd/auth/... ./cmd/dotenv/... ./internal/envbuilder/...
ok      github.com/datarobot/cli/internal/auth        1.580s
?       github.com/datarobot/cli/cmd/auth              [no test files]
ok      github.com/datarobot/cli/cmd/auth/check        1.326s
ok      github.com/datarobot/cli/cmd/auth/export      1.206s
?       github.com/datarobot/cli/cmd/auth/login        [no test files]
?       github.com/datarobot/cli/cmd/auth/logout       [no test files]
?       github.com/datarobot/cli/cmd/auth/seturl       [no test files]
ok      github.com/datarobot/cli/cmd/dotenv           15.373s
ok      github.com/datarobot/cli/internal/envbuilder  1.598s

All packages pass (race detector enabled, no failures).

Lint

Per the task brief, task lint was already run (0 issues across all LINT_GOOS_TARGETS: linux darwin windows). Not re-run here.

Notes / caveats

@ajalon1

ajalon1 commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

What my 🤖 was trying to say is that ... I was concerned that #750 would conflict with #751, but they seem to handle different layers. The interaction-test droid I kicked off checked a bunch of scenarios, so I'm fine with merging both in now.

You should merge this one, I'll then merge #750 after dealing w. review comments, and then we'll revisit #616.

One nit below, everything from here on out is informational and non-blocking.


N2 — dr auth check omits the "not falling back" line (optional, not requesting a change)

dr auth check and every other command now share ReportEnvCredentialsError, but only the regular command path prints reportStoredProfileNotUsed ("not falling back to the stored profile for X"). dr auth check deliberately doesn't, but the asymmetry isn't obvious from the code. A one-line comment on checkCLICredentials noting why it intentionally skips reportStoredProfileNotUsed would save the next reader a minute.

🤖 Why the two paths diverge

cmd/auth/check/cmd.go's Cmd() has its own RunE and no EnsureAuthenticated PreRunE, so it never goes through the new early-fail branch in internal/auth/auth.go::EnsureAuthenticated. Its checkCLICredentials calls auth.ReportEnvCredentialsError(w, creds, err) directly (good — shared classification) but stops short of reportStoredProfileNotUsed, because auth check then goes on to evaluate the stored profile on its own and reports that result independently. Naming the stored profile in the env-error line would be redundant there. The only ask is a comment making that intent explicit so a future reader doesn't "fix" the inconsistency by adding the call.

Praise

  • The main regression test guards both sides of the bug. TestEnsureAuthenticated_EnvInvalidStoredValid sets up a valid stored profile and an expired env token, asserts the command fails, and asserts the login flow never starts (the callback calls t.Error). It pins the exact silent-wrong-instance behavior this PR exists to kill, from both directions. The malformed-endpoint and unreachable-endpoint variants round it out.

  • Error classification points the user at the right thing. A scheme-less endpoint (app.example.com/...) is reported as "missing URL scheme" rather than "could not connect to app.example.com" — the user is told to fix the URL, not chase a network problem that isn't there. The test "scheme-less endpoint is an endpoint problem, not transport" pins this; it's subtle and easy to get wrong.

  • Styled text is bound to the stream it's written to. writerStyles(w) rebinds the lipgloss renderer to the destination writer, so redirected stderr (and test buffers) don't pick up ANSI codes the stream can't display. Small, correct, and verified by asserting on bytes.Buffer output.

  • Errors name the variable that's actually set. When the endpoint came from the SDK-style DATAROBOT_API_ENDPOINT fallback, the error names that variable, not the default DATAROBOT_ENDPOINT — so the user fixes the one they really set. Tested explicitly.

Nits

Nits (non-blocking)
  • EnsureAuthenticatedE still returns errors.New("Authentication failed.") with a capital "A" — pre-existing, not introduced here, but you're already in this function so it's a cheap s/Authentication failed/authentication failed/ if you follow the Go error-string convention. Not requesting.
  • endpointVarName() is an unexported method on *EnvCredentials used only by ReportEnvCredentialsError. Reads cleanly as-is; could be a package-level func taking the string, but no need to change.
  • //nolint: cyclop on EnsureAuthenticated is still warranted — the function grew one more branch. No action.

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Smoke tests triggered! Running on Linux and Windows...

@github-actions

Copy link
Copy Markdown
Contributor

All smoke tests passed!

✅ Linux: success
✅ Windows: success

View run details

@chasdr

chasdr commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Manual CLI interaction testing — CFX-7263 (PR #751) with PR #750 locally merged

this is amazing

@chasdr
chasdr merged commit c4f9ab2 into main Aug 13, 2026
20 checks passed
@chasdr
chasdr deleted the chas/CFX-7263 branch August 13, 2026 18:41
chasdr added a commit that referenced this pull request Aug 13, 2026
…sable ones

Both bots landed on the same two gaps. The fixes overlap in auth.go, so they
share a commit.

Userinfo leak (cursor, copilot):
- VerifyToken redacted the URL it stored on the error, but the messages printed
  the caller's endpoint raw, so http://user:pw@host/api/v2 put the password on
  screen for a 404, a 5xx, a transport failure, and a timeout.
- Every path that prints an endpoint now goes through hostOrEndpoint, which
  redacts. That also closes the timeout and stored-profile-not-used lines,
  which leaked the same way before this branch.

Unusable endpoints read as transport failures (cursor, copilot):
- A bare host in '.env' reported "Could not connect to https://app.example.com",
  naming the URL SchemeHostOnly invented rather than the one requested. The
  stored profile called ftp:// a connection failure, which is the exact
  wrong-blame this ticket removes from the env pair.
- ValidateEndpoint now rejects a scheme-less endpoint too, and reportUnjudged
  runs it before treating a failure as transport. The env leg's own
  missing-scheme guard is gone, since ValidateEndpoint returns the same text.

Verified against a local server: the env leg's wording for a bare host, a
quoted URL, whitespace, and ftp:// is unchanged from #751.
chasdr added a commit that referenced this pull request Aug 13, 2026
EnsureAuthenticated runs in PreRunE, so the stored-profile diagnostic I added
last commit was writing to the command's own stdout. dr llm list
--output-format json emitted 176 bytes of prose ahead of nothing, breaking the
zero-byte-stdout contract the env-credential path has held since #751.

Changes:
- ReportUnjudged writes to os.Stderr, matching ReportEnvCredentialsError.
- A test captures both streams and asserts stdout stays empty.
- setupTestEnvironment clears the env pair. Without it the developer's own
  DATAROBOT_ENDPOINT and DATAROBOT_API_TOKEN reached EnsureAuthenticated and it
  verified against their real instance, so the new test passed only because
  another test had leaked a dead endpoint into the process env.
chasdr added a commit that referenced this pull request Aug 13, 2026
…problem

A stored or '.env' endpoint with leading whitespace passes ValidateEndpoint,
which trims, then fails VerifyToken's raw url.Parse. ReportUnjudged read that
as transport and printed "Could not connect to <host>: first path segment in
URL cannot contain colon" with a check-your-network line. The env-var path has
named it an invalid endpoint since #751.

One rule instead of a second special case: unusableEndpoint reports either a
ValidateEndpoint failure or a parse-op url.Error, and ReportUnjudged prints
whichever it gets.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

go Pull requests that update go code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants