-
Notifications
You must be signed in to change notification settings - Fork 1k
feat(sdk/go): add Go SDK foundation, types, and sandbox client (A) #2271
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
rhuss
wants to merge
7
commits into
NVIDIA:main
Choose a base branch
from
rhuss:go-sdk-a-foundation
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
8a49061
feat(sdk/go): add Go SDK foundation, types, and sandbox client (A)
rhuss d1f87a7
fix(sdk/go): address review feedback on PR #2271
rhuss 0cddb90
fix(sdk/go): address principal engineer review findings
rhuss b56ca0d
refactor(sdk/go): migrate mise config to centralized task include
rhuss 3927c02
refactor(sdk/go): remove UPSTREAM_VERSION standalone repo artifact
rhuss 39ae5da
refactor(sdk/go): switch proto generation from protoc to buf
rhuss 1fb8dd4
test(sdk/go): add proto-converter field coverage detection
rhuss File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
| # SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| # Repo-level buf module. Declares proto/ as the single module so buf generate, | ||
| # buf lint, buf breaking, and the editor LSP all resolve imports the same way. | ||
| # Code generation lives with each consumer (see sdk/go/buf.gen.yaml, | ||
| # sdk/typescript/buf.gen.yaml); this file owns the module boundary and proto | ||
| # validation policy. | ||
| version: v2 | ||
| modules: | ||
| - path: proto | ||
| lint: | ||
| use: | ||
| - STANDARD | ||
| except: | ||
| # Flat proto/ layout: all files live in one directory with nested | ||
| # packages (openshell.v1, openshell.sandbox.v1, ...). Adopting these | ||
| # would require restructuring the tree into openshell/<svc>/v1/ and | ||
| # updating every Rust/Python/TS codegen path and import. | ||
| - DIRECTORY_SAME_PACKAGE | ||
| - PACKAGE_DIRECTORY_MATCH | ||
| # Established API shape: services are unsuffixed (OpenShell, not | ||
| # OpenShellService) and RPCs reuse shared request/response messages with | ||
| # short names. Renaming these is a breaking change across the codebase. | ||
| - RPC_REQUEST_RESPONSE_UNIQUE | ||
| - RPC_REQUEST_STANDARD_NAME | ||
| - RPC_RESPONSE_STANDARD_NAME | ||
| - SERVICE_SUFFIX | ||
| breaking: | ||
| use: | ||
| - FILE |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| MISE := $(shell command -v mise 2>/dev/null) | ||
|
|
||
| .PHONY: test test-integration lint fmt build ci docs-check proto | ||
|
|
||
| test: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:test | ||
|
|
||
| test-integration: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:test:integration | ||
|
|
||
| lint: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:lint | ||
|
|
||
| fmt: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:fmt | ||
|
|
||
| build: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:build | ||
|
|
||
| ci: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:ci | ||
|
|
||
| docs-check: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:docs:check | ||
|
|
||
| proto: | ||
| ifndef MISE | ||
| $(error mise is not installed. Install from https://mise.jdx.dev) | ||
| endif | ||
| mise run go:proto:gen |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
| # SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| # Code generation for the Go SDK. The proto module boundary and validation | ||
| # policy live in the repo-level buf.yaml; this template only drives generation. | ||
| # buf compiles the module with its own compiler and runs protoc-gen-go / | ||
| # protoc-gen-go-grpc from mise-managed binaries. Limited to the client-surface | ||
| # closure (openshell, datamodel, sandbox, options); well-known types resolve | ||
| # through google.golang.org/protobuf and are not generated. | ||
| version: v2 | ||
|
|
||
| inputs: | ||
| - directory: ../../proto | ||
| paths: | ||
| - ../../proto/openshell.proto | ||
| - ../../proto/datamodel.proto | ||
| - ../../proto/sandbox.proto | ||
| - ../../proto/options.proto | ||
|
|
||
| plugins: | ||
| - local: protoc-gen-go | ||
| out: . | ||
| opt: | ||
| - module=github.com/NVIDIA/OpenShell/sdk/go | ||
| - Mopenshell.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/openshellv1 | ||
| - Mdatamodel.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/datamodelv1 | ||
| - Msandbox.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/sandboxv1 | ||
| - Moptions.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/optionsv1 | ||
| - local: protoc-gen-go-grpc | ||
| out: . | ||
| opt: | ||
| - module=github.com/NVIDIA/OpenShell/sdk/go | ||
| - Mopenshell.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/openshellv1 | ||
| - Mdatamodel.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/datamodelv1 | ||
| - Msandbox.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/sandboxv1 | ||
| - Moptions.proto=github.com/NVIDIA/OpenShell/sdk/go/proto/optionsv1 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| module github.com/NVIDIA/OpenShell/sdk/go | ||
|
|
||
| go 1.24.0 | ||
|
|
||
| toolchain go1.26.4 | ||
|
|
||
| require ( | ||
| github.com/stretchr/testify v1.11.1 | ||
| golang.org/x/oauth2 v0.35.0 | ||
| google.golang.org/grpc v1.80.0 | ||
| google.golang.org/protobuf v1.36.11 | ||
| ) | ||
|
|
||
| require ( | ||
| github.com/davecgh/go-spew v1.1.1 // indirect | ||
| github.com/pmezard/go-difflib v1.0.0 // indirect | ||
| golang.org/x/net v0.49.0 // indirect | ||
| golang.org/x/sys v0.41.0 // indirect | ||
| golang.org/x/text v0.33.0 // indirect | ||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516 // indirect | ||
| gopkg.in/yaml.v3 v3.0.1 // indirect | ||
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= | ||
| github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||
| github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= | ||
| github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||
| github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||
| github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= | ||
| github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= | ||
| github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= | ||
| github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= | ||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||
| github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= | ||
| github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= | ||
| go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= | ||
| go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= | ||
| go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= | ||
| go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= | ||
| go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= | ||
| go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= | ||
| go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= | ||
| go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= | ||
| go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= | ||
| go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= | ||
| go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= | ||
| go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= | ||
| golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= | ||
| golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= | ||
| golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= | ||
| golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= | ||
| golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= | ||
| golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= | ||
| golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= | ||
| golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= | ||
| gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= | ||
| gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= | ||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516 h1:sNrWoksmOyF5bvJUcnmbeAmQi8baNhqg5IWaI3llQqU= | ||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= | ||
| google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= | ||
| google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= | ||
| google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= | ||
| google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= | ||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||
| gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
| // SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| package v1 | ||
|
|
||
| import ( | ||
| "context" | ||
|
|
||
| "github.com/NVIDIA/OpenShell/sdk/go/openshell/v1/types" | ||
| ) | ||
|
|
||
| // AuthProvider supplies per-RPC credentials. It implements the | ||
| // grpc credentials.PerRPCCredentials interface. | ||
| type AuthProvider = types.AuthProvider | ||
|
|
||
| type noAuth struct{} | ||
|
|
||
| // NoAuth returns an AuthProvider that sends no credentials. | ||
| func NoAuth() AuthProvider { | ||
| return &noAuth{} | ||
| } | ||
|
|
||
| func (n *noAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { | ||
| return nil, nil | ||
| } | ||
|
|
||
| func (n *noAuth) RequireTransportSecurity() bool { | ||
| return false | ||
| } | ||
|
|
||
| type staticToken struct { | ||
| token string | ||
| } | ||
|
|
||
| // StaticToken returns an AuthProvider that sends a fixed Bearer token. | ||
| func StaticToken(token string) AuthProvider { | ||
| return &staticToken{token: token} | ||
| } | ||
|
|
||
| func (s *staticToken) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { | ||
| return map[string]string{ | ||
| "authorization": "Bearer " + s.token, | ||
| }, nil | ||
| } | ||
|
|
||
| func (s *staticToken) RequireTransportSecurity() bool { | ||
| return true | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems superfluous given our use of mise. Is there a reason to have this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The Makefile is intentional as an entry point for Go developers. In the Go ecosystem, mise is essentially unknown, and Makefiles are the standard build tool (most Go projects use
make test,make lint, etc.). Since the SDK targets external Go contributors who may never have seen mise, the Makefile picks them up where they are and reduces onboarding friction.That said, it's a thin convenience layer and I don't feel strongly about it. Happy to drop it if the team prefers mise-only consistency across the repo.