From 18bce369f352554f450b44f13deb8c15b236f02f Mon Sep 17 00:00:00 2001 From: Baha Aiman Date: Mon, 22 Sep 2025 14:53:12 -0700 Subject: [PATCH 01/23] fix(firestore): Initialize readSettings in queries to prevent panic (#12898) This commit fixes a panic and incorrect behavior that occurs when using WithReadOptions in firestore queries. The readSettings field in the Query struct was not always initialized, leading to a nil pointer dereference when WithReadOptions was called. This affected CollectionGroupRef and CollectionRef in three distinct scenarios as reported in the issue. This commit addresses the issue by implementing the following changes: - **Initialized readSettings in CollectionGroupRef**: The newCollectionGroupRef function in collgroupref.go now initializes the readSettings field on the embedded Query object, preventing panics when WithReadOptions is used on a collection group query. - **Shared readSettings in CollectionRef**: The newTopLevelCollRef and newCollRefWithParent functions in collref.go now create a single readSettings instance that is shared between the CollectionRef and its embedded Query object. This ensures that read options set on a CollectionRef are correctly propagated to its queries. - **Added Nil Check for Robustness**: A nil check has been added to the WithReadOptions method in query.go. This makes the method more robust by initializing readSettings if it hasn't been already, preventing potential panics from manually constructed Query objects. These changes ensure that readSettings is always initialized before use, providing consistent and panic-free behavior for WithReadOptions across all query types. Fixes #12448 --- firestore/collgroupref.go | 1 + firestore/collref.go | 8 ++++++-- firestore/query.go | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/firestore/collgroupref.go b/firestore/collgroupref.go index 8ab27e3ae3f5..7220cc97b165 100644 --- a/firestore/collgroupref.go +++ b/firestore/collgroupref.go @@ -43,6 +43,7 @@ func newCollectionGroupRef(c *Client, dbPath, collectionID string) *CollectionGr path: dbPath, parentPath: dbPath + "/documents", allDescendants: true, + readSettings: &readSettings{}, }, } } diff --git a/firestore/collref.go b/firestore/collref.go index 0366f1e00e03..b0dd02bc57da 100644 --- a/firestore/collref.go +++ b/firestore/collref.go @@ -56,6 +56,7 @@ type CollectionRef struct { } func newTopLevelCollRef(c *Client, dbPath, id string) *CollectionRef { + readSettings := &readSettings{} return &CollectionRef{ c: c, ID: id, @@ -67,13 +68,15 @@ func newTopLevelCollRef(c *Client, dbPath, id string) *CollectionRef { collectionID: id, path: dbPath + "/documents/" + id, parentPath: dbPath + "/documents", + readSettings: readSettings, }, - readSettings: &readSettings{}, + readSettings: readSettings, } } func newCollRefWithParent(c *Client, parent *DocumentRef, id string) *CollectionRef { selfPath := parent.shortPath + "/" + id + readSettings := &readSettings{} return &CollectionRef{ c: c, Parent: parent, @@ -86,8 +89,9 @@ func newCollRefWithParent(c *Client, parent *DocumentRef, id string) *Collection collectionID: id, path: parent.Path + "/" + id, parentPath: parent.Path, + readSettings: readSettings, }, - readSettings: &readSettings{}, + readSettings: readSettings, } } diff --git a/firestore/query.go b/firestore/query.go index cef6197f0f24..d2e56be7245f 100644 --- a/firestore/query.go +++ b/firestore/query.go @@ -1548,6 +1548,9 @@ func (*btreeDocumentIterator) getExplainMetrics() (*ExplainMetrics, error) { // WithReadOptions specifies constraints for accessing documents from the database, // e.g. at what time snapshot to read the documents. func (q *Query) WithReadOptions(opts ...ReadOption) *Query { + if q.readSettings == nil { + q.readSettings = &readSettings{} + } for _, ro := range opts { ro.apply(q.readSettings) } From beb7d97545c6a55b873f0232f4d0710ee4c9d030 Mon Sep 17 00:00:00 2001 From: Baha Aiman Date: Mon, 22 Sep 2025 14:55:36 -0700 Subject: [PATCH 02/23] fix(firestore): Add dedicated lock to BulkWriter to prevent race (#12896) Fixes: https://github.com/googleapis/google-cloud-go/issues/12444 This PR resolves a concurrent map read and map write panic in BulkWriter when it's used from multiple goroutines. **Problem** The docUpdatePaths map, which tracks documents already added to the writer, was not protected by a mutex. Concurrent calls to BulkWriter.Create, BulkWriter.Set, etc., would all call checkWriteConditions, leading to simultaneous writes to this map and causing a fatal race condition. **Solution** This PR introduces a new docUpdatePathsLock sync.Mutex to the BulkWriter struct. This new lock is used exclusively within the checkWriteConditions function to wrap the read and write operations on the docUpdatePaths map. This ensures all access to the map is thread-safe. This approach resolves the race condition by adding the necessary protection where it was missing. --- firestore/bulkwriter.go | 23 ++++++----- firestore/bulkwriter_test.go | 79 ++++++++++++++++++++++++++++++++++++ firestore/mock_test.go | 8 ++++ 3 files changed, 100 insertions(+), 10 deletions(-) diff --git a/firestore/bulkwriter.go b/firestore/bulkwriter.go index c004d2e1a98c..84a206a89266 100644 --- a/firestore/bulkwriter.go +++ b/firestore/bulkwriter.go @@ -112,16 +112,17 @@ func (j *BulkWriterJob) setError(e error) { // independent of each other. Bulkwriter does not apply writes in any set order; // thus a document can't have set on it immediately after creation. type BulkWriter struct { - database string // the database as resource name: projects/[PROJECT]/databases/[DATABASE] - start time.Time // when this BulkWriter was started; used to calculate qps and rate increases - vc *vkit.Client // internal client - maxOpsPerSecond int // number of requests that can be sent per second - docUpdatePaths map[string]bool // document paths with corresponding writes in the queue - limiter rate.Limiter // limit requests to server to <= 500 qps - bundler *bundler.Bundler // handle bundling up writes to Firestore - ctx context.Context // context for canceling all BulkWriter operations - isOpenLock sync.RWMutex // guards against setting isOpen concurrently - isOpen bool // flag that the BulkWriter is closed + database string // the database as resource name: projects/[PROJECT]/databases/[DATABASE] + start time.Time // when this BulkWriter was started; used to calculate qps and rate increases + vc *vkit.Client // internal client + maxOpsPerSecond int // number of requests that can be sent per second + docUpdatePaths map[string]bool // document paths with corresponding writes in the queue + docUpdatePathsLock sync.Mutex // guards docUpdatePaths + limiter rate.Limiter // limit requests to server to <= 500 qps + bundler *bundler.Bundler // handle bundling up writes to Firestore + ctx context.Context // context for canceling all BulkWriter operations + isOpenLock sync.RWMutex // guards against setting isOpen concurrently + isOpen bool // flag that the BulkWriter is closed } // newBulkWriter creates a new instance of the BulkWriter. @@ -270,6 +271,8 @@ func (bw *BulkWriter) checkWriteConditions(doc *DocumentRef) error { return errors.New("firestore: nil document contents") } + bw.docUpdatePathsLock.Lock() + defer bw.docUpdatePathsLock.Unlock() _, havePath := bw.docUpdatePaths[doc.shortPath] if havePath { return fmt.Errorf("firestore: BulkWriter received duplicate write for path: %v", doc.shortPath) diff --git a/firestore/bulkwriter_test.go b/firestore/bulkwriter_test.go index 4e36282e29bf..6e1041bc38c1 100644 --- a/firestore/bulkwriter_test.go +++ b/firestore/bulkwriter_test.go @@ -16,6 +16,8 @@ package firestore import ( "context" + "fmt" + "sync" "testing" pb "cloud.google.com/go/firestore/apiv1/firestorepb" @@ -400,3 +402,80 @@ func TestBulkWriterRetries(t *testing.T) { }) } } + +// TestBulkWriterConcurrent checks for race conditions when adding writes +// from multiple goroutines. +func TestBulkWriterConcurrent(t *testing.T) { + c, srv, cleanup := newMock(t) + defer cleanup() + + const numWrites = 100 + const batchSize = 20 + const numBatches = numWrites / batchSize + + // 1. Setup the mock server to accept 5 batches (100 / 20 = 5). + // We use `nil` for the request to avoid flaky order-dependent checks. + // We are testing for a client-side race, not server-side request generation. + for i := 0; i < numBatches; i++ { + resp := &pb.BatchWriteResponse{} + // Create a full batch of 20 successful responses + for j := 0; j < batchSize; j++ { + resp.WriteResults = append(resp.WriteResults, &pb.WriteResult{UpdateTime: aTimestamp}) + resp.Status = append(resp.Status, &status.Status{Code: int32(codes.OK)}) + } + srv.addRPC(nil, resp) + } + + ctx := context.Background() + bw := c.BulkWriter(ctx) + + var wg sync.WaitGroup + jobs := make([]*BulkWriterJob, numWrites) + // Use a channel to safely report errors from goroutines + errChan := make(chan error, numWrites) + + // 2. Launch 100 goroutines to add writes concurrently. + for i := 0; i < numWrites; i++ { + wg.Add(1) + go func(docNum int) { + defer wg.Done() + + docID := fmt.Sprintf("C/doc%d", docNum) + + docRef := c.Doc(docID) + job, err := bw.Create(docRef, testData) + if err != nil { + errChan <- fmt.Errorf("bw.Create failed for doc %s: %v", docID, err) + return + } + jobs[docNum] = job + }(i) + } + + // 3. Wait for all goroutines to finish adding their writes + wg.Wait() + close(errChan) + + // Check for any errors during the "add" phase + for err := range errChan { + t.Error(err) + } + + // 4. Flush all writes to the server + bw.Flush() + + // 5. Check all results + for i, job := range jobs { + if job == nil { + t.Errorf("job %d is nil", i) + continue + } + wr, err := job.Results() + if err != nil { + t.Errorf("job %d returned error: %v", i, err) + } + if wr == nil && err == nil { + t.Errorf("job %d returned nil WriteResult and nil error", i) + } + } +} diff --git a/firestore/mock_test.go b/firestore/mock_test.go index 2fce298957ca..7e178e0d98a5 100644 --- a/firestore/mock_test.go +++ b/firestore/mock_test.go @@ -22,6 +22,7 @@ import ( "reflect" "sort" "strings" + "sync" pb "cloud.google.com/go/firestore/apiv1/firestorepb" "cloud.google.com/go/internal/testutil" @@ -36,6 +37,7 @@ type mockServer struct { pb.FirestoreServer Addr string + mu sync.Mutex reqItems []reqItem resps []interface{} @@ -75,6 +77,8 @@ func (s *mockServer) addRPC(wantReq proto.Message, resp interface{}) { // to tweak the requests before comparison, for example to adjust for // randomness. func (s *mockServer) addRPCAdjust(wantReq proto.Message, resp interface{}, adjust func(proto.Message)) { + s.mu.Lock() + defer s.mu.Unlock() s.reqItems = append(s.reqItems, reqItem{wantReq, adjust}) s.resps = append(s.resps, resp) } @@ -83,6 +87,8 @@ func (s *mockServer) addRPCAdjust(wantReq proto.Message, resp interface{}, adjus // It returns the response, or an error if the request doesn't match what // was expected or there are no expected rpcs. func (s *mockServer) popRPC(gotReq proto.Message) (interface{}, error) { + s.mu.Lock() + defer s.mu.Unlock() if len(s.reqItems) == 0 { panic(fmt.Sprintf("out of RPCs, saw %v", reflect.TypeOf(gotReq))) } @@ -127,6 +133,8 @@ func (a ByFieldPath) Less(i, j int) bool { return a[i].FieldPath < a[j].FieldPat type ByFieldPath []*pb.DocumentTransform_FieldTransform func (s *mockServer) reset() { + s.mu.Lock() + defer s.mu.Unlock() s.reqItems = nil s.resps = nil } From f1252dad4fa4e97af1961ca4d302c03b5e09c782 Mon Sep 17 00:00:00 2001 From: Chris Cotter Date: Tue, 23 Sep 2025 03:36:10 -0400 Subject: [PATCH 03/23] test(storage): update codec leak test to do retry (#12924) Add retry test cases to the emulator test which checks for leaks in the BidiReadObject codec. --- storage/client_test.go | 70 ++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 17 deletions(-) diff --git a/storage/client_test.go b/storage/client_test.go index 1f6cea0830c0..935aa53ee92b 100644 --- a/storage/client_test.go +++ b/storage/client_test.go @@ -3073,28 +3073,28 @@ func TestReadCodecLeaksEmulated(t *testing.T) { // Test multiple download paths. testCases := []struct { name string - downloadFunc func(obj *ObjectHandle) ([]byte, error) + downloadFunc func(ctx context.Context, obj *ObjectHandle) ([]byte, error) }{ { name: "Reader.Read", - downloadFunc: func(obj *ObjectHandle) ([]byte, error) { + downloadFunc: func(ctx context.Context, obj *ObjectHandle) ([]byte, error) { r, err := obj.NewReader(ctx) - defer r.Close() if err != nil { return nil, err } + defer r.Close() gotContents, err := io.ReadAll(r) return gotContents, err }, }, { name: "Reader.WriteTo", - downloadFunc: func(obj *ObjectHandle) ([]byte, error) { + downloadFunc: func(ctx context.Context, obj *ObjectHandle) ([]byte, error) { r, err := obj.NewReader(ctx) - defer r.Close() if err != nil { return nil, err } + defer r.Close() buf := bytes.NewBuffer([]byte{}) _, err = r.WriteTo(buf) return buf.Bytes(), err @@ -3102,8 +3102,11 @@ func TestReadCodecLeaksEmulated(t *testing.T) { }, { name: "MultiRangeDownloader 3MiB ranges", - downloadFunc: func(obj *ObjectHandle) ([]byte, error) { + downloadFunc: func(ctx context.Context, obj *ObjectHandle) ([]byte, error) { mrd, err := obj.NewMultiRangeDownloader(ctx) + if err != nil { + return nil, err + } var bufs []*bytes.Buffer var currOff int64 var increment int64 = 3 * MiB @@ -3125,8 +3128,11 @@ func TestReadCodecLeaksEmulated(t *testing.T) { }}, { name: "MultiRangeDownloader 256k ranges", - downloadFunc: func(obj *ObjectHandle) ([]byte, error) { + downloadFunc: func(ctx context.Context, obj *ObjectHandle) ([]byte, error) { mrd, err := obj.NewMultiRangeDownloader(ctx) + if err != nil { + return nil, err + } var bufs []*bytes.Buffer var currOff int64 var increment int64 = 256 * 1024 @@ -3147,19 +3153,49 @@ func TestReadCodecLeaksEmulated(t *testing.T) { return b, err }}, } + retryCases := []struct { + name string + instructions map[string][]string + }{ + { + name: "no retry", + instructions: nil, + }, + { + name: "retry at 0 bytes", + instructions: map[string][]string{"storage.objects.get": {"return-503"}}, + }, + { + name: "retry at 256k", + instructions: map[string][]string{"storage.objects.get": {"return-broken-stream-after-256K"}}, + }, + { + name: "retry at 4MiB", + instructions: map[string][]string{"storage.objects.get": {"return-503-after-4097K"}}, + }, + } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - gotContents, err := tc.downloadFunc(obj) - if err != nil { - t.Fatalf("downloading content: %v", err) - } - if !bytes.Equal(gotContents, contents) { - t.Errorf("downloaded bytes did not match; got %v bytes, want %v", len(gotContents), len(contents)) - } - allocs, frees := bp.getAllocsAndFrees() - if allocs != frees { - t.Errorf("download: alloc'd bytes %v not equal to freed bytes %v", allocs, frees) + for _, rc := range retryCases { + t.Run(rc.name, func(t *testing.T) { + testCtx := ctx + if rc.instructions != nil { + testID := createRetryTest(t, client.tc, rc.instructions) + testCtx = callctx.SetHeaders(testCtx, "x-retry-test-id", testID) + } + gotContents, err := tc.downloadFunc(testCtx, obj) + if err != nil { + t.Fatalf("downloading content: %v", err) + } + if !bytes.Equal(gotContents, contents) { + t.Errorf("downloaded bytes did not match; got %v bytes, want %v", len(gotContents), len(contents)) + } + allocs, frees := bp.getAllocsAndFrees() + if allocs != frees { + t.Errorf("download: alloc'd bytes %v not equal to freed bytes %v", allocs, frees) + } + }) } }) } From f95fef97183d06a4545235268ecbecd4f82d8256 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:12:26 +0000 Subject: [PATCH 04/23] chore(main): release storage 1.57.0 (#12749) :robot: I have created a release *beep* *boop* --- ## [1.57.0](https://togithub.com/googleapis/google-cloud-go/compare/storage/v1.56.1...storage/v1.57.0) (2025-09-23) ### Features * **storage/control:** Add new GetIamPolicy, SetIamPolicy, and TestIamPermissions RPCs ([d73f912](https://togithub.com/googleapis/google-cloud-go/commit/d73f9123be77bb3278f48d510cd0fb22feb605bc)) * **storage:** Post support dynamic key name ([#12677](https://togithub.com/googleapis/google-cloud-go/issues/12677)) ([9e761f9](https://togithub.com/googleapis/google-cloud-go/commit/9e761f961a2c4351b3e0793ed655314ac5853903)) * **storage:** WithMeterProvider allows custom meter provider configuration ([#12668](https://togithub.com/googleapis/google-cloud-go/issues/12668)) ([7f574b0](https://togithub.com/googleapis/google-cloud-go/commit/7f574b01e0b454c1ef5c13e6a58075e394ee990d)) ### Bug Fixes * **storage:** Free buffers in Bidi Reader ([#12839](https://togithub.com/googleapis/google-cloud-go/issues/12839)) ([bc247fd](https://togithub.com/googleapis/google-cloud-go/commit/bc247fdc3f5234a8bd6934e58d5b0b578f1335cb)) * **storage:** Make Writer thread-safe. ([#12753](https://togithub.com/googleapis/google-cloud-go/issues/12753)) ([9ea380b](https://togithub.com/googleapis/google-cloud-go/commit/9ea380bea5b980a9054d201be4f315a195da2182)) * **storage:** No progress report for oneshot write ([#12746](https://togithub.com/googleapis/google-cloud-go/issues/12746)) ([b97c286](https://togithub.com/googleapis/google-cloud-go/commit/b97c286ec369a10a81b1a8a3a1aae18b46d2dfbc)) ### Performance Improvements * **storage:** Pipeline gRPC writes ([#12422](https://togithub.com/googleapis/google-cloud-go/issues/12422)) ([1f2c5fe](https://togithub.com/googleapis/google-cloud-go/commit/1f2c5fe2843724302086fe04cb8dab8b515969c5)) --- This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please). --- .release-please-manifest-individual.json | 2 +- storage/CHANGES.md | 21 +++++++++++++++++++++ storage/internal/version.go | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest-individual.json b/.release-please-manifest-individual.json index 3eb6c9dcd5a4..0da5b09f65f5 100644 --- a/.release-please-manifest-individual.json +++ b/.release-please-manifest-individual.json @@ -12,6 +12,6 @@ "pubsub/v2": "2.0.1", "pubsublite": "1.8.2", "spanner": "1.85.1", - "storage": "1.56.1", + "storage": "1.57.0", "vertexai": "0.15.0" } diff --git a/storage/CHANGES.md b/storage/CHANGES.md index adb9cc85371c..c4872fbebb9f 100644 --- a/storage/CHANGES.md +++ b/storage/CHANGES.md @@ -1,6 +1,27 @@ # Changes +## [1.57.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.56.1...storage/v1.57.0) (2025-09-23) + + +### Features + +* **storage/control:** Add new GetIamPolicy, SetIamPolicy, and TestIamPermissions RPCs ([d73f912](https://github.com/googleapis/google-cloud-go/commit/d73f9123be77bb3278f48d510cd0fb22feb605bc)) +* **storage:** Post support dynamic key name ([#12677](https://github.com/googleapis/google-cloud-go/issues/12677)) ([9e761f9](https://github.com/googleapis/google-cloud-go/commit/9e761f961a2c4351b3e0793ed655314ac5853903)) +* **storage:** WithMeterProvider allows custom meter provider configuration ([#12668](https://github.com/googleapis/google-cloud-go/issues/12668)) ([7f574b0](https://github.com/googleapis/google-cloud-go/commit/7f574b01e0b454c1ef5c13e6a58075e394ee990d)) + + +### Bug Fixes + +* **storage:** Free buffers in Bidi Reader ([#12839](https://github.com/googleapis/google-cloud-go/issues/12839)) ([bc247fd](https://github.com/googleapis/google-cloud-go/commit/bc247fdc3f5234a8bd6934e58d5b0b578f1335cb)) +* **storage:** Make Writer thread-safe. ([#12753](https://github.com/googleapis/google-cloud-go/issues/12753)) ([9ea380b](https://github.com/googleapis/google-cloud-go/commit/9ea380bea5b980a9054d201be4f315a195da2182)) +* **storage:** No progress report for oneshot write ([#12746](https://github.com/googleapis/google-cloud-go/issues/12746)) ([b97c286](https://github.com/googleapis/google-cloud-go/commit/b97c286ec369a10a81b1a8a3a1aae18b46d2dfbc)) + + +### Performance Improvements + +* **storage:** Pipeline gRPC writes ([#12422](https://github.com/googleapis/google-cloud-go/issues/12422)) ([1f2c5fe](https://github.com/googleapis/google-cloud-go/commit/1f2c5fe2843724302086fe04cb8dab8b515969c5)) + ## [1.56.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.56.0...storage/v1.56.1) (2025-08-19) diff --git a/storage/internal/version.go b/storage/internal/version.go index 54603c25c471..07cfc2811f78 100644 --- a/storage/internal/version.go +++ b/storage/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.56.1" +const Version = "1.57.0" From b25be45eb7bf565b491586749de00ed9aa0fbdab Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Wed, 24 Sep 2025 16:06:10 +0100 Subject: [PATCH 05/23] feat(stategen): populate release_exclude_paths for snippets (#12942) This should simplify the first release after migration. Additionally, we only conditionally mention snippets at all, which simplifies handwritten/core migration. Fixes https://github.com/googleapis/librarian/issues/2335 --- internal/stategen/main.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/internal/stategen/main.go b/internal/stategen/main.go index 190e26920f3f..75aafa54ec37 100644 --- a/internal/stategen/main.go +++ b/internal/stategen/main.go @@ -124,10 +124,6 @@ func addModule(repoRoot string, ppc *postProcessorConfig, state *LibrarianState, LastGeneratedCommit: googleapisCommit, SourceRoots: []string{ moduleName, - "internal/generated/snippets/" + moduleName, - }, - RemoveRegex: []string{ - "^internal/generated/snippets/" + moduleName + "/", }, TagFormat: "{id}/v{version}", } @@ -140,6 +136,15 @@ func addModule(repoRoot string, ppc *postProcessorConfig, state *LibrarianState, addAPIProtoPaths(ppc, moduleName, library) + if len(library.APIs) > 0 { + library.SourceRoots = append(library.SourceRoots, "internal/generated/snippets/"+moduleName) + library.RemoveRegex = append(library.RemoveRegex, "^internal/generated/snippets/"+moduleName+"/") + // Probably irrelevant after the first release, but changes within the snippets aren't release-relevant; + // for the first release after onboarding, we will see an OwlBot commit updating snippet metadata with the + // final release-please-based commit, and we don't want to use that. + library.ReleaseExcludePaths = append(library.ReleaseExcludePaths, "internal/generated/snippets/"+moduleName+"/") + } + if err := addGeneratedCodeRemovals(repoRoot, moduleRoot, library); err != nil { return err } From 446c457200d99d60816575407b3b04aa0375d0f5 Mon Sep 17 00:00:00 2001 From: Chris Cotter Date: Wed, 24 Sep 2025 14:29:32 -0400 Subject: [PATCH 06/23] test(storage): fix concurrent MRD test (#12946) This test has been flaky and the flakes cause a panic which crashes the test run. This fix makes the flake issue fail only this test Updates #12655 Fixes #12766 Fixes #12767 Fixes #12768 Fixes #12769 Fixes #12770 --- storage/integration_test.go | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/storage/integration_test.go b/storage/integration_test.go index 6ae710cb236e..13f6b7788feb 100644 --- a/storage/integration_test.go +++ b/storage/integration_test.go @@ -590,25 +590,24 @@ func TestIntegration_ReadSameFileConcurrentlyUsingMultiRangeDownloader(t *testin } reader.Wait() - for _, k := range res { - if k.offset < 0 { - k.offset += int64(len(content)) + if err = reader.Close(); err != nil { + t.Fatalf("Error while closing reader %v", err) + } + for id, k := range res { + if k.err != nil { + t.Fatalf("reading range %v: %v", id, k.err) } - want := content[k.offset:] - if k.limit != 0 { - want = content[k.offset : k.offset+k.limit] + if got, want := k.offset, 0; got != int64(want) { + t.Errorf("range id %v: got callback offset %v, want %v", id, got, want) } - if k.err != nil { - t.Errorf("read range %v to %v : %v", k.offset, k.limit, k.err) + if got, want := k.limit, len(content); got != int64(want) { + t.Errorf("range id %v: got callback limit %v, want %v", id, got, want) } - if !bytes.Equal(k.buf.Bytes(), want) { - t.Errorf("Error in read range offset %v, limit %v, got: %v; want: %v", - k.offset, k.limit, len(k.buf.Bytes()), len(want)) + if !bytes.Equal(k.buf.Bytes(), content) { + t.Errorf("content mismatch in read range %v: got %v bytes, want %v bytes", + id, len(k.buf.Bytes()), len(content)) } } - if err = reader.Close(); err != nil { - t.Fatalf("Error while closing reader %v", err) - } }) } From 7b2365446764b0bba37198a55644954b437bddd0 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:41:55 -0600 Subject: [PATCH 07/23] chore: release main (#12935) :robot: I have created a release *beep* *boop* ---
compute/metadata: 0.9.0 ## [0.9.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.4...compute/metadata/v0.9.0) (2025-09-24) ### Features * **compute/metadata:** Retry on HTTP 429 ([#12932](https://github.com/googleapis/google-cloud-go/issues/12932)) ([1e91f5c](https://github.com/googleapis/google-cloud-go/commit/1e91f5c07acacd38ecdd4ff3e83e092b745e0bc2))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- .release-please-manifest-submodules.json | 2 +- compute/metadata/CHANGES.md | 7 +++++++ compute/metadata/internal/version.go | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest-submodules.json b/.release-please-manifest-submodules.json index 17b6e61cdcc3..a301de31e96d 100644 --- a/.release-please-manifest-submodules.json +++ b/.release-please-manifest-submodules.json @@ -38,7 +38,7 @@ "cloudtasks": "1.13.7", "commerce": "1.2.6", "compute": "1.47.0", - "compute/metadata": "0.8.4", + "compute/metadata": "0.9.0", "confidentialcomputing": "1.10.1", "config": "1.5.1", "configdelivery": "0.1.1", diff --git a/compute/metadata/CHANGES.md b/compute/metadata/CHANGES.md index c231cd895d72..e384683c501e 100644 --- a/compute/metadata/CHANGES.md +++ b/compute/metadata/CHANGES.md @@ -1,5 +1,12 @@ # Changes +## [0.9.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.4...compute/metadata/v0.9.0) (2025-09-24) + + +### Features + +* **compute/metadata:** Retry on HTTP 429 ([#12932](https://github.com/googleapis/google-cloud-go/issues/12932)) ([1e91f5c](https://github.com/googleapis/google-cloud-go/commit/1e91f5c07acacd38ecdd4ff3e83e092b745e0bc2)) + ## [0.8.4](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.3...compute/metadata/v0.8.4) (2025-09-18) diff --git a/compute/metadata/internal/version.go b/compute/metadata/internal/version.go index bde53896a23e..dd2351b41737 100644 --- a/compute/metadata/internal/version.go +++ b/compute/metadata/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "0.8.4" +const Version = "0.9.0" From 740274410123c067379ec3edd10296073c6a89eb Mon Sep 17 00:00:00 2001 From: Chris Cotter Date: Wed, 24 Sep 2025 17:07:34 -0400 Subject: [PATCH 08/23] test(storage): fix append edge case test (#12947) The expected behavior for overwriting an appendable object has changed on the server side, which caused the test to start failing. Update the test to fix this. Fixes #12850 --- storage/integration_test.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/storage/integration_test.go b/storage/integration_test.go index 13f6b7788feb..d4f086fa2b65 100644 --- a/storage/integration_test.go +++ b/storage/integration_test.go @@ -3624,21 +3624,20 @@ func TestIntegration_WriterAppendEdgeCases(t *testing.T) { t.Fatalf("w.Write: got error %v, want FailedPrecondition or Aborted", err) } - // Another NewWriter to the unfinalized object should also return an - // error when data is flushed. + // Another NewWriter to the unfinalized object should be able to + // overwrite the existing object. w2 := obj.NewWriter(ctx) w2.Append = true if _, err := w2.Write([]byte("hello world")); err != nil { t.Fatalf("w2.Write: %v", err) } - _, err = w2.Flush() - if code := status.Code(err); !(code == codes.FailedPrecondition || code == codes.Aborted) { - t.Fatalf("w2.Flush: got error %v, want FailedPrecondition or Aborted", err) + if err := w2.Close(); err != nil { + t.Fatalf("w2.Close: %v", err) } // If we add yet another takeover writer to finalize and delete the object, - // tw should also return an error on flush. - tw2, _, err := obj.Generation(w.Attrs().Generation).NewWriterFromAppendableObject(ctx, &AppendableWriterOpts{ + // tw should return an error on flush. + tw2, _, err := obj.Generation(w2.Attrs().Generation).NewWriterFromAppendableObject(ctx, &AppendableWriterOpts{ FinalizeOnClose: true, }) if err != nil { From 2c713d7b9291627b1e55757024a542180188ce3f Mon Sep 17 00:00:00 2001 From: Sushan Bhattarai Date: Wed, 24 Sep 2025 18:42:05 -0400 Subject: [PATCH 09/23] fix(bigtable): use stable stats.NewMetricSet (#12941) removes experiment stat dep --- bigtable/otel_metrics.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bigtable/otel_metrics.go b/bigtable/otel_metrics.go index c3fd0ff25d57..2f150de0dcf5 100644 --- a/bigtable/otel_metrics.go +++ b/bigtable/otel_metrics.go @@ -30,7 +30,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" "google.golang.org/api/option" "google.golang.org/grpc" - "google.golang.org/grpc/experimental/stats" + "google.golang.org/grpc/stats" "google.golang.org/grpc/stats/opentelemetry" ) @@ -190,7 +190,7 @@ func newOtelMetricsContext(ctx context.Context, cfg metricsConfig) (*metricsCont provider := metric.NewMeterProvider(meterOpts...) mo := opentelemetry.MetricsOptions{ MeterProvider: provider, - Metrics: stats.NewMetrics( + Metrics: stats.NewMetricSet( "grpc.client.attempt.duration", "grpc.lb.rls.default_target_picks", "grpc.lb.rls.target_picks", From 9a0559e2e4b60998ab3cdaa567b77bd57dfa9b75 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Thu, 25 Sep 2025 10:50:51 -0600 Subject: [PATCH 10/23] chore(dataproc): migrate dataproc to Librarian (#12949) * Includes repo-config.yaml entries for all known special cases. refs: googleapis/librarian#888 --- .github/.OwlBot.yaml | 7 -- .librarian/generator-input/repo-config.yaml | 78 +++++++++++++++++++ .librarian/state.yaml | 24 ++++++ .release-please-manifest-submodules.json | 1 - dataproc/apiv1/autoscaling_policy_client.go | 0 dataproc/apiv1/auxiliary.go | 0 dataproc/apiv1/auxiliary_go123.go | 0 dataproc/apiv1/batch_controller_client.go | 0 dataproc/apiv1/cluster_controller_client.go | 0 .../dataprocpb/autoscaling_policies.pb.go | 5 +- .../autoscaling_policies_grpc.pb.go | 1 + dataproc/apiv1/dataprocpb/batches.pb.go | 5 +- dataproc/apiv1/dataprocpb/batches_grpc.pb.go | 3 +- dataproc/apiv1/dataprocpb/clusters.pb.go | 5 +- dataproc/apiv1/dataprocpb/clusters_grpc.pb.go | 3 +- dataproc/apiv1/dataprocpb/jobs.pb.go | 5 +- dataproc/apiv1/dataprocpb/jobs_grpc.pb.go | 3 +- dataproc/apiv1/dataprocpb/node_groups.pb.go | 5 +- .../apiv1/dataprocpb/node_groups_grpc.pb.go | 3 +- dataproc/apiv1/dataprocpb/operations.pb.go | 5 +- .../apiv1/dataprocpb/operations_grpc.pb.go | 3 - .../apiv1/dataprocpb/session_templates.pb.go | 5 +- .../dataprocpb/session_templates_grpc.pb.go | 1 + dataproc/apiv1/dataprocpb/sessions.pb.go | 5 +- dataproc/apiv1/dataprocpb/sessions_grpc.pb.go | 3 +- dataproc/apiv1/dataprocpb/shared.pb.go | 5 +- dataproc/apiv1/dataprocpb/shared_grpc.pb.go | 3 - .../apiv1/dataprocpb/workflow_templates.pb.go | 5 +- .../dataprocpb/workflow_templates_grpc.pb.go | 3 +- dataproc/apiv1/doc.go | 0 dataproc/apiv1/helpers.go | 0 dataproc/apiv1/job_controller_client.go | 0 .../apiv1/node_group_controller_client.go | 0 dataproc/apiv1/session_controller_client.go | 0 .../session_template_controller_client.go | 0 dataproc/apiv1/workflow_template_client.go | 0 internal/postprocessor/config.yaml | 5 -- release-please-config-yoshi-submodules.json | 3 - 38 files changed, 146 insertions(+), 48 deletions(-) mode change 100755 => 100644 dataproc/apiv1/autoscaling_policy_client.go mode change 100755 => 100644 dataproc/apiv1/auxiliary.go mode change 100755 => 100644 dataproc/apiv1/auxiliary_go123.go mode change 100755 => 100644 dataproc/apiv1/batch_controller_client.go mode change 100755 => 100644 dataproc/apiv1/cluster_controller_client.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/autoscaling_policies.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/autoscaling_policies_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/batches.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/batches_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/clusters.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/clusters_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/jobs.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/jobs_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/node_groups.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/node_groups_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/operations.pb.go delete mode 100755 dataproc/apiv1/dataprocpb/operations_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/session_templates.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/session_templates_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/sessions.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/sessions_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/shared.pb.go delete mode 100755 dataproc/apiv1/dataprocpb/shared_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/workflow_templates.pb.go mode change 100755 => 100644 dataproc/apiv1/dataprocpb/workflow_templates_grpc.pb.go mode change 100755 => 100644 dataproc/apiv1/doc.go mode change 100755 => 100644 dataproc/apiv1/helpers.go mode change 100755 => 100644 dataproc/apiv1/job_controller_client.go mode change 100755 => 100644 dataproc/apiv1/node_group_controller_client.go mode change 100755 => 100644 dataproc/apiv1/session_controller_client.go mode change 100755 => 100644 dataproc/apiv1/session_template_controller_client.go mode change 100755 => 100644 dataproc/apiv1/workflow_template_client.go diff --git a/.github/.OwlBot.yaml b/.github/.OwlBot.yaml index 8dd446e937dc..2cbcc8d32a52 100644 --- a/.github/.OwlBot.yaml +++ b/.github/.OwlBot.yaml @@ -110,7 +110,6 @@ deep-remove-regex: - /datafusion/apiv1/ - /datalabeling/apiv1beta1/ - /dataplex/apiv1/ - - /dataproc/apiv1/ - /dataqna/apiv1alpha/ - /datastore/admin/apiv1/ - /datastore/apiv1/ @@ -261,7 +260,6 @@ deep-remove-regex: - /internal/generated/snippets/datafusion/apiv1/ - /internal/generated/snippets/datalabeling/apiv1beta1/ - /internal/generated/snippets/dataplex/apiv1/ - - /internal/generated/snippets/dataproc/apiv1/ - /internal/generated/snippets/dataqna/apiv1alpha/ - /internal/generated/snippets/datastore/admin/apiv1/ - /internal/generated/snippets/datastream/apiv1/ @@ -692,7 +690,6 @@ deep-preserve-regex: - /spanner/admin/instance/apiv1/init.go - /spanner/apiv1/spanner_client_options.go - /storage/internal/apiv2/metadata.go - - /dataproc/apiv1/longrunning.go - /longrunning/autogen/from_conn.go - /containeranalysis/apiv1beta1/grafeas/.* # Must preserve these even though they aren't generated anymore @@ -922,10 +919,6 @@ deep-copy-regex: dest: / - source: /google/cloud/dataplex/v1/cloud.google.com/go dest: / - - source: /google/cloud/dataproc/v1/cloud.google.com/go/dataproc/v2/apiv1 - dest: /dataproc/apiv1 - - source: /google/cloud/dataproc/v1/cloud.google.com/go/internal/generated/snippets/dataproc/v2/apiv1 - dest: /internal/generated/snippets/dataproc/apiv1 - source: /google/cloud/dataqna/v1alpha/cloud.google.com/go dest: / - source: /google/datastore/admin/v1/cloud.google.com/go diff --git a/.librarian/generator-input/repo-config.yaml b/.librarian/generator-input/repo-config.yaml index b1c3e04bd8e5..19f0b6050982 100644 --- a/.librarian/generator-input/repo-config.yaml +++ b/.librarian/generator-input/repo-config.yaml @@ -1,3 +1,81 @@ # Configuration file for libraries where the container needs # more information than is readily available. +modules: + - name: bigquery + apis: + - path: google/bigquery/v2 + client_directory: v2/apiv2 + - name: bigtable + apis: + - path: google/bigtable/v2 + disable_gapic: true + - path: google/bigtable/admin/v2 + disable_gapic: true + + - name: cloudbuild + apis: + - path: google/devtools/cloudbuild/v1 + client_directory: apiv1/v2 + + - name: cloudtasks + apis: + - path: google/cloud/tasks/v2 + client_directory: apiv2 + - path: google/cloud/tasks/v2beta2 + client_directory: apiv2beta2 + - path: google/cloud/tasks/v2beta3 + client_directory: apiv2beta3 + + - name: dataproc + module_path_version: v2 + + - name: datastore + apis: + - path: google/datastore/v1 + disable_gapic: true + + - name: firestore + apis: + - path: google/firestore/admin/v1 + client_directory: apiv1/admin + + - name: longrunning + apis: + - path: google/longrunning + client_directory: autogen + + - name: maps + apis: + - path: google/maps/fleetengine/v1 + proto_package: maps.fleetengine.v1 + - path: google/maps/fleetengine/delivery/v1 + proto_package: maps.fleetengine.delivery.v1 + + - name: monitoring + apis: + - path: google/monitoring/v3 + client_directory: apiv3/v2 + + - name: pubsub + apis: + - path: google/pubsub/v1 + client_directory: v2/apiv1 + + - name: recaptchaenterprise + module_path_version: v2 + + - name: trace + apis: + - path: google/devtools/cloudtrace/v1 + client_directory: apiv1 + - path: google/devtools/cloudtrace/v2 + client_directory: apiv2 + + - name: translate + apis: + - path: google/cloud/translate/v3 + proto_package: google.cloud.translation.v3 + + - name: vision + module_path_version: v2 diff --git a/.librarian/state.yaml b/.librarian/state.yaml index 70a43668bf4d..870bc12be37f 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -22,3 +22,27 @@ libraries: - ^dlp/apiv2/helpers\.go$ - ^dlp/apiv2/dlppb/.*$ tag_format: '{id}/v{version}' + - id: dataproc + version: 2.14.1 + last_generated_commit: 329ace5e3712a2e37d6159d4dcd998d8c73f261e + apis: + - path: google/cloud/dataproc/v1 + service_config: "" + source_roots: + - dataproc + - internal/generated/snippets/dataproc + preserve_regex: [] + remove_regex: + - ^internal/generated/snippets/dataproc/ + - ^dataproc/apiv1/[^/]*_client\.go$ + - ^dataproc/apiv1/[^/]*_client_example_go123_test\.go$ + - ^dataproc/apiv1/[^/]*_client_example_test\.go$ + - ^dataproc/apiv1/auxiliary\.go$ + - ^dataproc/apiv1/auxiliary_go123\.go$ + - ^dataproc/apiv1/doc\.go$ + - ^dataproc/apiv1/gapic_metadata\.json$ + - ^dataproc/apiv1/helpers\.go$ + - ^dataproc/apiv1/dataprocpb/.*$ + release_exclude_paths: + - internal/generated/snippets/dataproc/ + tag_format: '{id}/v{version}' diff --git a/.release-please-manifest-submodules.json b/.release-please-manifest-submodules.json index a301de31e96d..79b461dda73e 100644 --- a/.release-please-manifest-submodules.json +++ b/.release-please-manifest-submodules.json @@ -51,7 +51,6 @@ "datafusion": "1.8.7", "datalabeling": "0.9.7", "dataplex": "1.27.1", - "dataproc": "2.14.1", "dataqna": "0.9.7", "datastream": "1.15.1", "deploy": "1.27.3", diff --git a/dataproc/apiv1/autoscaling_policy_client.go b/dataproc/apiv1/autoscaling_policy_client.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/auxiliary.go b/dataproc/apiv1/auxiliary.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/auxiliary_go123.go b/dataproc/apiv1/auxiliary_go123.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/batch_controller_client.go b/dataproc/apiv1/batch_controller_client.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/cluster_controller_client.go b/dataproc/apiv1/cluster_controller_client.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/dataprocpb/autoscaling_policies.pb.go b/dataproc/apiv1/dataprocpb/autoscaling_policies.pb.go old mode 100755 new mode 100644 index 852f374ea30b..479a5eabbc7e --- a/dataproc/apiv1/dataprocpb/autoscaling_policies.pb.go +++ b/dataproc/apiv1/dataprocpb/autoscaling_policies.pb.go @@ -21,13 +21,14 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/autoscaling_policies_grpc.pb.go b/dataproc/apiv1/dataprocpb/autoscaling_policies_grpc.pb.go old mode 100755 new mode 100644 index debee54028c3..bcc59d0b2467 --- a/dataproc/apiv1/dataprocpb/autoscaling_policies_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/autoscaling_policies_grpc.pb.go @@ -22,6 +22,7 @@ package dataprocpb import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/dataprocpb/batches.pb.go b/dataproc/apiv1/dataprocpb/batches.pb.go old mode 100755 new mode 100644 index 5a2449a7c9c9..1193e117f78a --- a/dataproc/apiv1/dataprocpb/batches.pb.go +++ b/dataproc/apiv1/dataprocpb/batches.pb.go @@ -21,14 +21,15 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/batches_grpc.pb.go b/dataproc/apiv1/dataprocpb/batches_grpc.pb.go old mode 100755 new mode 100644 index f755e953965d..04d29d444fa1 --- a/dataproc/apiv1/dataprocpb/batches_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/batches_grpc.pb.go @@ -21,8 +21,9 @@ package dataprocpb import ( - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" context "context" + + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/dataprocpb/clusters.pb.go b/dataproc/apiv1/dataprocpb/clusters.pb.go old mode 100755 new mode 100644 index 83fdbfef6c08..eafb79f519c6 --- a/dataproc/apiv1/dataprocpb/clusters.pb.go +++ b/dataproc/apiv1/dataprocpb/clusters.pb.go @@ -21,6 +21,9 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" _ "google.golang.org/genproto/googleapis/api/annotations" interval "google.golang.org/genproto/googleapis/type/interval" @@ -31,8 +34,6 @@ import ( fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" _ "google.golang.org/protobuf/types/known/wrapperspb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/clusters_grpc.pb.go b/dataproc/apiv1/dataprocpb/clusters_grpc.pb.go old mode 100755 new mode 100644 index 41956ef3bc5c..5e71983de495 --- a/dataproc/apiv1/dataprocpb/clusters_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/clusters_grpc.pb.go @@ -21,8 +21,9 @@ package dataprocpb import ( - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" context "context" + + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/dataprocpb/jobs.pb.go b/dataproc/apiv1/dataprocpb/jobs.pb.go old mode 100755 new mode 100644 index 53aae6bec697..99f63b35d570 --- a/dataproc/apiv1/dataprocpb/jobs.pb.go +++ b/dataproc/apiv1/dataprocpb/jobs.pb.go @@ -21,6 +21,9 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -28,8 +31,6 @@ import ( emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/jobs_grpc.pb.go b/dataproc/apiv1/dataprocpb/jobs_grpc.pb.go old mode 100755 new mode 100644 index 2a4091d0beee..054cae223d7a --- a/dataproc/apiv1/dataprocpb/jobs_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/jobs_grpc.pb.go @@ -21,8 +21,9 @@ package dataprocpb import ( - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" context "context" + + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/dataprocpb/node_groups.pb.go b/dataproc/apiv1/dataprocpb/node_groups.pb.go old mode 100755 new mode 100644 index 90fbed9be730..2c50f642c054 --- a/dataproc/apiv1/dataprocpb/node_groups.pb.go +++ b/dataproc/apiv1/dataprocpb/node_groups.pb.go @@ -21,13 +21,14 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/node_groups_grpc.pb.go b/dataproc/apiv1/dataprocpb/node_groups_grpc.pb.go old mode 100755 new mode 100644 index ef94157bacb9..3968f685080e --- a/dataproc/apiv1/dataprocpb/node_groups_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/node_groups_grpc.pb.go @@ -21,8 +21,9 @@ package dataprocpb import ( - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" context "context" + + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/dataprocpb/operations.pb.go b/dataproc/apiv1/dataprocpb/operations.pb.go old mode 100755 new mode 100644 index 8c9fbef76854..28c57f8189d9 --- a/dataproc/apiv1/dataprocpb/operations.pb.go +++ b/dataproc/apiv1/dataprocpb/operations.pb.go @@ -21,12 +21,13 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/operations_grpc.pb.go b/dataproc/apiv1/dataprocpb/operations_grpc.pb.go deleted file mode 100755 index b76fb6098a37..000000000000 --- a/dataproc/apiv1/dataprocpb/operations_grpc.pb.go +++ /dev/null @@ -1,3 +0,0 @@ -// +build ignore - -package ignore \ No newline at end of file diff --git a/dataproc/apiv1/dataprocpb/session_templates.pb.go b/dataproc/apiv1/dataprocpb/session_templates.pb.go old mode 100755 new mode 100644 index d6e9c3779eab..f1c044c56fea --- a/dataproc/apiv1/dataprocpb/session_templates.pb.go +++ b/dataproc/apiv1/dataprocpb/session_templates.pb.go @@ -21,13 +21,14 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/session_templates_grpc.pb.go b/dataproc/apiv1/dataprocpb/session_templates_grpc.pb.go old mode 100755 new mode 100644 index 4a39b508bc0b..c494d541e8bb --- a/dataproc/apiv1/dataprocpb/session_templates_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/session_templates_grpc.pb.go @@ -22,6 +22,7 @@ package dataprocpb import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/dataprocpb/sessions.pb.go b/dataproc/apiv1/dataprocpb/sessions.pb.go old mode 100755 new mode 100644 index 8e1974dd1eec..eb497751d4b4 --- a/dataproc/apiv1/dataprocpb/sessions.pb.go +++ b/dataproc/apiv1/dataprocpb/sessions.pb.go @@ -21,13 +21,14 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/sessions_grpc.pb.go b/dataproc/apiv1/dataprocpb/sessions_grpc.pb.go old mode 100755 new mode 100644 index ab1e1eb80271..0577ec37db9b --- a/dataproc/apiv1/dataprocpb/sessions_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/sessions_grpc.pb.go @@ -21,8 +21,9 @@ package dataprocpb import ( - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" context "context" + + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/dataprocpb/shared.pb.go b/dataproc/apiv1/dataprocpb/shared.pb.go old mode 100755 new mode 100644 index 9fdb515ddf8c..2b382ac01b72 --- a/dataproc/apiv1/dataprocpb/shared.pb.go +++ b/dataproc/apiv1/dataprocpb/shared.pb.go @@ -21,13 +21,14 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/shared_grpc.pb.go b/dataproc/apiv1/dataprocpb/shared_grpc.pb.go deleted file mode 100755 index b76fb6098a37..000000000000 --- a/dataproc/apiv1/dataprocpb/shared_grpc.pb.go +++ /dev/null @@ -1,3 +0,0 @@ -// +build ignore - -package ignore \ No newline at end of file diff --git a/dataproc/apiv1/dataprocpb/workflow_templates.pb.go b/dataproc/apiv1/dataprocpb/workflow_templates.pb.go old mode 100755 new mode 100644 index 73d8a2af3940..7eef27785d5f --- a/dataproc/apiv1/dataprocpb/workflow_templates.pb.go +++ b/dataproc/apiv1/dataprocpb/workflow_templates.pb.go @@ -21,6 +21,9 @@ package dataprocpb import ( + reflect "reflect" + sync "sync" + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -28,8 +31,6 @@ import ( durationpb "google.golang.org/protobuf/types/known/durationpb" emptypb "google.golang.org/protobuf/types/known/emptypb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/dataproc/apiv1/dataprocpb/workflow_templates_grpc.pb.go b/dataproc/apiv1/dataprocpb/workflow_templates_grpc.pb.go old mode 100755 new mode 100644 index a190dca7f466..592fb1e26557 --- a/dataproc/apiv1/dataprocpb/workflow_templates_grpc.pb.go +++ b/dataproc/apiv1/dataprocpb/workflow_templates_grpc.pb.go @@ -21,8 +21,9 @@ package dataprocpb import ( - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" context "context" + + longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/dataproc/apiv1/doc.go b/dataproc/apiv1/doc.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/helpers.go b/dataproc/apiv1/helpers.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/job_controller_client.go b/dataproc/apiv1/job_controller_client.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/node_group_controller_client.go b/dataproc/apiv1/node_group_controller_client.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/session_controller_client.go b/dataproc/apiv1/session_controller_client.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/session_template_controller_client.go b/dataproc/apiv1/session_template_controller_client.go old mode 100755 new mode 100644 diff --git a/dataproc/apiv1/workflow_template_client.go b/dataproc/apiv1/workflow_template_client.go old mode 100755 new mode 100644 diff --git a/internal/postprocessor/config.yaml b/internal/postprocessor/config.yaml index d8f2cb0a4b98..4a250584ac4d 100644 --- a/internal/postprocessor/config.yaml +++ b/internal/postprocessor/config.yaml @@ -56,7 +56,6 @@ modules: - datafusion - datalabeling - dataplex - - dataproc - dataqna - datastore - datastream @@ -589,10 +588,6 @@ service-configs: - input-directory: google/cloud/dataplex/v1 service-config: dataplex_v1.yaml import-path: cloud.google.com/go/dataplex/apiv1 - - input-directory: google/cloud/dataproc/v1 - service-config: dataproc_v1.yaml - import-path: cloud.google.com/go/dataproc/v2/apiv1 - rel-path: /dataproc/apiv1 - input-directory: google/cloud/dataqna/v1alpha service-config: dataqna_v1alpha.yaml import-path: cloud.google.com/go/dataqna/apiv1alpha diff --git a/release-please-config-yoshi-submodules.json b/release-please-config-yoshi-submodules.json index a0b13db0253b..fbafe25f2e4c 100644 --- a/release-please-config-yoshi-submodules.json +++ b/release-please-config-yoshi-submodules.json @@ -159,9 +159,6 @@ "dataplex": { "component": "dataplex" }, - "dataproc": { - "component": "dataproc" - }, "dataqna": { "component": "dataqna" }, From a67a146a6a88a6f1ba10c409dfce8015ecd60a64 Mon Sep 17 00:00:00 2001 From: nbayati <99771966+nbayati@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:36:02 -0700 Subject: [PATCH 11/23] feat(auth): add trust boundary support for external accounts (#12864) --- auth/credentials/detect.go | 4 +- auth/credentials/filetypes.go | 86 ++++++-- .../external_accounts_config_providers.go | 100 ++++++++++ ...external_accounts_config_providers_test.go | 183 ++++++++++++++++++ auth/internal/trustboundary/trust_boundary.go | 42 ++-- .../trustboundary/trust_boundary_test.go | 56 +++--- 6 files changed, 401 insertions(+), 70 deletions(-) create mode 100644 auth/internal/trustboundary/external_accounts_config_providers.go create mode 100644 auth/internal/trustboundary/external_accounts_config_providers_test.go diff --git a/auth/credentials/detect.go b/auth/credentials/detect.go index 10004ea6caaa..6700e33e1486 100644 --- a/auth/credentials/detect.go +++ b/auth/credentials/detect.go @@ -130,9 +130,9 @@ func DetectDefault(opts *DetectOptions) (*auth.Credentials, error) { tp := computeTokenProvider(opts, metadataClient) if trustBoundaryEnabled { - gceTBConfigProvider := trustboundary.NewGCETrustBoundaryConfigProvider(gceUniverseDomainProvider) + gceConfigProvider := trustboundary.NewGCEConfigProvider(gceUniverseDomainProvider) var err error - tp, err = trustboundary.NewProvider(opts.client(), gceTBConfigProvider, opts.logger(), tp) + tp, err = trustboundary.NewProvider(opts.client(), gceConfigProvider, opts.logger(), tp) if err != nil { return nil, fmt.Errorf("credentials: failed to initialize GCE trust boundary provider: %w", err) } diff --git a/auth/credentials/filetypes.go b/auth/credentials/filetypes.go index ed3c5c50471e..d2a042470231 100644 --- a/auth/credentials/filetypes.go +++ b/auth/credentials/filetypes.go @@ -160,12 +160,11 @@ func handleServiceAccount(f *credsfile.ServiceAccountFile, opts *DetectOptions) if err != nil { return nil, err } - if trustBoundaryEnabled { - saTrustBoundaryConfig := trustboundary.NewServiceAccountTrustBoundaryConfig(opts2LO.Email, opts2LO.UniverseDomain) - return trustboundary.NewProvider(opts.client(), saTrustBoundaryConfig, opts.logger(), tp) + if !trustBoundaryEnabled { + return tp, nil } - - return tp, nil + saConfig := trustboundary.NewServiceAccountConfigProvider(opts2LO.Email, opts2LO.UniverseDomain) + return trustboundary.NewProvider(opts.client(), saConfig, opts.logger(), tp) } func handleUserCredential(f *credsfile.UserCredentialsFile, opts *DetectOptions) (auth.TokenProvider, error) { @@ -204,7 +203,39 @@ func handleExternalAccount(f *credsfile.ExternalAccountFile, opts *DetectOptions if f.ServiceAccountImpersonation != nil { externalOpts.ServiceAccountImpersonationLifetimeSeconds = f.ServiceAccountImpersonation.TokenLifetimeSeconds } - return externalaccount.NewTokenProvider(externalOpts) + tp, err := externalaccount.NewTokenProvider(externalOpts) + if err != nil { + return nil, err + } + trustBoundaryEnabled, err := trustboundary.IsEnabled() + if err != nil { + return nil, err + } + if !trustBoundaryEnabled { + return tp, nil + } + + ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) + var configProvider trustboundary.ConfigProvider + + if f.ServiceAccountImpersonationURL == "" { + // No impersonation, this is a direct external account credential. + // The trust boundary is based on the workload/workforce pool. + var err error + configProvider, err = trustboundary.NewExternalAccountConfigProvider(f.Audience, ud) + if err != nil { + return nil, err + } + } else { + // Impersonation is used. The trust boundary is based on the target service account. + targetSAEmail, err := impersonate.ExtractServiceAccountEmail(f.ServiceAccountImpersonationURL) + if err != nil { + return nil, fmt.Errorf("credentials: could not extract target service account email for trust boundary: %w", err) + } + configProvider = trustboundary.NewServiceAccountConfigProvider(targetSAEmail, ud) + } + + return trustboundary.NewProvider(opts.client(), configProvider, opts.logger(), tp) } func handleExternalAccountAuthorizedUser(f *credsfile.ExternalAccountAuthorizedUserFile, opts *DetectOptions) (auth.TokenProvider, error) { @@ -219,7 +250,24 @@ func handleExternalAccountAuthorizedUser(f *credsfile.ExternalAccountAuthorizedU Client: opts.client(), Logger: opts.logger(), } - return externalaccountuser.NewTokenProvider(externalOpts) + tp, err := externalaccountuser.NewTokenProvider(externalOpts) + if err != nil { + return nil, err + } + trustBoundaryEnabled, err := trustboundary.IsEnabled() + if err != nil { + return nil, err + } + if !trustBoundaryEnabled { + return tp, nil + } + + ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) + configProvider, err := trustboundary.NewExternalAccountConfigProvider(f.Audience, ud) + if err != nil { + return nil, err + } + return trustboundary.NewProvider(opts.client(), configProvider, opts.logger(), tp) } func handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) { @@ -232,10 +280,6 @@ func handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFil return nil, err } ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) - trustBoundaryEnabled, err := trustboundary.IsEnabled() - if err != nil { - return nil, err - } impOpts := &impersonate.Options{ URL: f.ServiceAccountImpersonationURL, Scopes: opts.scopes(), @@ -249,15 +293,19 @@ func handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFil if err != nil { return nil, err } - if trustBoundaryEnabled { - targetSAEmail, err := impersonate.ExtractServiceAccountEmail(f.ServiceAccountImpersonationURL) - if err != nil { - return nil, fmt.Errorf("credentials: could not extract target service account email for trust boundary: %w", err) - } - targetSATrustBoundaryConfig := trustboundary.NewServiceAccountTrustBoundaryConfig(targetSAEmail, ud) - return trustboundary.NewProvider(opts.client(), targetSATrustBoundaryConfig, opts.logger(), tp) + trustBoundaryEnabled, err := trustboundary.IsEnabled() + if err != nil { + return nil, err + } + if !trustBoundaryEnabled { + return tp, nil + } + targetSAEmail, err := impersonate.ExtractServiceAccountEmail(f.ServiceAccountImpersonationURL) + if err != nil { + return nil, fmt.Errorf("credentials: could not extract target service account email for trust boundary: %w", err) } - return tp, nil + targetSAConfig := trustboundary.NewServiceAccountConfigProvider(targetSAEmail, ud) + return trustboundary.NewProvider(opts.client(), targetSAConfig, opts.logger(), tp) } func handleGDCHServiceAccount(f *credsfile.GDCHServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) { return gdch.NewTokenProvider(f, &gdch.Options{ diff --git a/auth/internal/trustboundary/external_accounts_config_providers.go b/auth/internal/trustboundary/external_accounts_config_providers.go new file mode 100644 index 000000000000..8fa5600bdcb0 --- /dev/null +++ b/auth/internal/trustboundary/external_accounts_config_providers.go @@ -0,0 +1,100 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trustboundary + +import ( + "context" + "fmt" + "regexp" +) + +const ( + workloadAllowedLocationsEndpoint = "https://iamcredentials.%s/v1/projects/%s/locations/global/workloadIdentityPools/%s/allowedLocations" + workforceAllowedLocationsEndpoint = "https://iamcredentials.%s/v1/locations/global/workforcePools/%s/allowedLocations" +) + +var ( + workforceAudiencePattern = regexp.MustCompile(`//iam\.([^/]+)/locations/global/workforcePools/([^/]+)`) + workloadAudiencePattern = regexp.MustCompile(`//iam\.([^/]+)/projects/([^/]+)/locations/global/workloadIdentityPools/([^/]+)`) +) + +// NewExternalAccountConfigProvider creates a new ConfigProvider for external accounts. +func NewExternalAccountConfigProvider(audience, inputUniverseDomain string) (ConfigProvider, error) { + var audienceDomain, projectNumber, poolID string + var isWorkload bool + + matches := workloadAudiencePattern.FindStringSubmatch(audience) + if len(matches) == 4 { // Expecting full match, domain, projectNumber, poolID + audienceDomain = matches[1] + projectNumber = matches[2] + poolID = matches[3] + isWorkload = true + } else { + matches = workforceAudiencePattern.FindStringSubmatch(audience) + if len(matches) == 3 { // Expecting full match, domain, poolID + audienceDomain = matches[1] + poolID = matches[2] + isWorkload = false + } else { + return nil, fmt.Errorf("trustboundary: unknown audience format: %q", audience) + } + } + + effectiveUniverseDomain := inputUniverseDomain + if effectiveUniverseDomain == "" { + effectiveUniverseDomain = audienceDomain + } else if audienceDomain != "" && effectiveUniverseDomain != audienceDomain { + return nil, fmt.Errorf("trustboundary: provided universe domain (%q) does not match domain in audience (%q)", inputUniverseDomain, audienceDomain) + } + + if isWorkload { + return &workloadIdentityPoolConfigProvider{ + projectNumber: projectNumber, + poolID: poolID, + universeDomain: effectiveUniverseDomain, + }, nil + } + return &workforcePoolConfigProvider{ + poolID: poolID, + universeDomain: effectiveUniverseDomain, + }, nil +} + +type workforcePoolConfigProvider struct { + poolID string + universeDomain string +} + +func (p *workforcePoolConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) { + return fmt.Sprintf(workforceAllowedLocationsEndpoint, p.universeDomain, p.poolID), nil +} + +func (p *workforcePoolConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) { + return p.universeDomain, nil +} + +type workloadIdentityPoolConfigProvider struct { + projectNumber string + poolID string + universeDomain string +} + +func (p *workloadIdentityPoolConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) { + return fmt.Sprintf(workloadAllowedLocationsEndpoint, p.universeDomain, p.projectNumber, p.poolID), nil +} + +func (p *workloadIdentityPoolConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) { + return p.universeDomain, nil +} diff --git a/auth/internal/trustboundary/external_accounts_config_providers_test.go b/auth/internal/trustboundary/external_accounts_config_providers_test.go new file mode 100644 index 000000000000..e3beda3fd811 --- /dev/null +++ b/auth/internal/trustboundary/external_accounts_config_providers_test.go @@ -0,0 +1,183 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trustboundary + +import ( + "context" + "strings" + "testing" +) + +func TestNewExternalAccountConfigProvider(t *testing.T) { + tests := []struct { + name string + audience string + universeDomain string + wantProvider ConfigProvider + wantErr string + }{ + { + name: "workload identity pool with matching explicit universe domain", + audience: "//iam.googleapis.com/projects/12345/locations/global/workloadIdentityPools/my-pool", + universeDomain: "googleapis.com", + wantProvider: &workloadIdentityPoolConfigProvider{ + projectNumber: "12345", + poolID: "my-pool", + universeDomain: "googleapis.com", + }, + }, + { + name: "workload identity pool with universe domain from audience", + audience: "//iam.custom.com/projects/12345/locations/global/workloadIdentityPools/my-pool", + universeDomain: "", + wantProvider: &workloadIdentityPoolConfigProvider{ + projectNumber: "12345", + poolID: "my-pool", + universeDomain: "custom.com", + }, + }, + { + name: "workload identity pool with non-matching universe domain", + audience: "//iam.custom.com/projects/12345/locations/global/workloadIdentityPools/my-pool", + universeDomain: "example.com", + wantErr: "provided universe domain (\"example.com\") does not match domain in audience", + }, + { + name: "workforce pool with matching explicit universe domain", + audience: "//iam.googleapis.com/locations/global/workforcePools/my-pool", + universeDomain: "googleapis.com", + wantProvider: &workforcePoolConfigProvider{ + poolID: "my-pool", + universeDomain: "googleapis.com", + }, + }, + { + name: "workforce pool with universe domain from audience", + audience: "//iam.custom.com/locations/global/workforcePools/my-pool", + universeDomain: "", + wantProvider: &workforcePoolConfigProvider{ + poolID: "my-pool", + universeDomain: "custom.com", + }, + }, + { + name: "workforce pool with non-matching universe domain", + audience: "//iam.custom.com/locations/global/workforcePools/my-pool", + universeDomain: "example.com", + wantErr: "provided universe domain (\"example.com\") does not match domain in audience", + }, + { + name: "unknown audience format", + audience: "invalid-audience-format", + universeDomain: "", + wantErr: "unknown audience format", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + provider, err := NewExternalAccountConfigProvider(tt.audience, tt.universeDomain) + + if tt.wantErr != "" { + if err == nil || !strings.Contains(err.Error(), tt.wantErr) { + t.Errorf("NewExternalAccountConfigProvider() error = %v, wantErr %q", err, tt.wantErr) + } + return + } + if err != nil { + t.Fatalf("NewExternalAccountConfigProvider() unexpected error: %v", err) + } + switch want := tt.wantProvider.(type) { + case *workloadIdentityPoolConfigProvider: + got, ok := provider.(*workloadIdentityPoolConfigProvider) + if !ok { + t.Fatalf("NewExternalAccountConfigProvider() got provider type %T, want %T", provider, want) + } + if *got != *want { + t.Errorf("NewExternalAccountConfigProvider() got = %v, want %v", got, want) + } + case *workforcePoolConfigProvider: + got, ok := provider.(*workforcePoolConfigProvider) + if !ok { + t.Fatalf("NewExternalAccountConfigProvider() got provider type %T, want %T", provider, want) + } + if *got != *want { + t.Errorf("NewExternalAccountConfigProvider() got = %v, want %v", got, want) + } + default: + t.Fatalf("unexpected provider type in test setup: %T", want) + } + }) + } +} + +func TestWorkloadIdentityPoolConfigProvider(t *testing.T) { + ctx := context.Background() + p := &workloadIdentityPoolConfigProvider{ + projectNumber: "12345", + poolID: "my-pool", + universeDomain: "example.com", + } + + t.Run("GetUniverseDomain", func(t *testing.T) { + ud, err := p.GetUniverseDomain(ctx) + if err != nil { + t.Fatalf("GetUniverseDomain() unexpected error: %v", err) + } + if ud != "example.com" { + t.Errorf("GetUniverseDomain() = %q, want %q", ud, "example.com") + } + }) + + t.Run("GetTrustBoundaryEndpoint", func(t *testing.T) { + want := "https://iamcredentials.example.com/v1/projects/12345/locations/global/workloadIdentityPools/my-pool/allowedLocations" + endpoint, err := p.GetTrustBoundaryEndpoint(ctx) + if err != nil { + t.Fatalf("GetTrustBoundaryEndpoint() unexpected error: %v", err) + } + if endpoint != want { + t.Errorf("GetTrustBoundaryEndpoint() = %q, want %q", endpoint, want) + } + }) +} + +func TestWorkforcePoolConfigProvider(t *testing.T) { + ctx := context.Background() + p := &workforcePoolConfigProvider{ + poolID: "my-pool", + universeDomain: "example.com", + } + + t.Run("GetUniverseDomain", func(t *testing.T) { + ud, err := p.GetUniverseDomain(ctx) + if err != nil { + t.Fatalf("GetUniverseDomain() unexpected error: %v", err) + } + if ud != "example.com" { + t.Errorf("GetUniverseDomain() = %q, want %q", ud, "example.com") + } + }) + + t.Run("GetTrustBoundaryEndpoint", func(t *testing.T) { + want := "https://iamcredentials.example.com/v1/locations/global/workforcePools/my-pool/allowedLocations" + endpoint, err := p.GetTrustBoundaryEndpoint(ctx) + if err != nil { + t.Fatalf("GetTrustBoundaryEndpoint() unexpected error: %v", err) + } + if endpoint != want { + t.Errorf("GetTrustBoundaryEndpoint() = %q, want %q", endpoint, want) + } + }) +} diff --git a/auth/internal/trustboundary/trust_boundary.go b/auth/internal/trustboundary/trust_boundary.go index d8879ed58dac..bf898fffd697 100644 --- a/auth/internal/trustboundary/trust_boundary.go +++ b/auth/internal/trustboundary/trust_boundary.go @@ -171,16 +171,16 @@ func fetchTrustBoundaryData(ctx context.Context, client *http.Client, url string return internal.NewTrustBoundaryData(apiResponse.Locations, apiResponse.EncodedLocations), nil } -// ServiceAccountTrustBoundaryConfig holds configuration for SA trust boundary lookups. -// It implements the TrustBoundaryConfigProvider interface. -type ServiceAccountTrustBoundaryConfig struct { +// serviceAccountConfig holds configuration for SA trust boundary lookups. +// It implements the ConfigProvider interface. +type serviceAccountConfig struct { ServiceAccountEmail string UniverseDomain string } -// NewServiceAccountTrustBoundaryConfig creates a new config for service accounts. -func NewServiceAccountTrustBoundaryConfig(saEmail, universeDomain string) *ServiceAccountTrustBoundaryConfig { - return &ServiceAccountTrustBoundaryConfig{ +// NewServiceAccountConfigProvider creates a new config for service accounts. +func NewServiceAccountConfigProvider(saEmail, universeDomain string) ConfigProvider { + return &serviceAccountConfig{ ServiceAccountEmail: saEmail, UniverseDomain: universeDomain, } @@ -188,7 +188,7 @@ func NewServiceAccountTrustBoundaryConfig(saEmail, universeDomain string) *Servi // GetTrustBoundaryEndpoint returns the formatted URL for fetching allowed locations // for the configured service account and universe domain. -func (sac *ServiceAccountTrustBoundaryConfig) GetTrustBoundaryEndpoint(ctx context.Context) (url string, err error) { +func (sac *serviceAccountConfig) GetTrustBoundaryEndpoint(ctx context.Context) (url string, err error) { if sac.ServiceAccountEmail == "" { return "", errors.New("trustboundary: service account email cannot be empty for config") } @@ -201,7 +201,7 @@ func (sac *ServiceAccountTrustBoundaryConfig) GetTrustBoundaryEndpoint(ctx conte // GetUniverseDomain returns the configured universe domain, defaulting to // [internal.DefaultUniverseDomain] if not explicitly set. -func (sac *ServiceAccountTrustBoundaryConfig) GetUniverseDomain(ctx context.Context) (string, error) { +func (sac *serviceAccountConfig) GetUniverseDomain(ctx context.Context) (string, error) { if sac.UniverseDomain == "" { return internal.DefaultUniverseDomain, nil } @@ -225,10 +225,10 @@ type DataProvider struct { // metadata. func NewProvider(client *http.Client, configProvider ConfigProvider, logger *slog.Logger, base auth.TokenProvider) (*DataProvider, error) { if client == nil { - return nil, errors.New("trustboundary: HTTP client cannot be nil for TrustBoundaryDataProvider") + return nil, errors.New("trustboundary: HTTP client cannot be nil for DataProvider") } if configProvider == nil { - return nil, errors.New("trustboundary: TrustBoundaryConfigProvider cannot be nil for TrustBoundaryDataProvider") + return nil, errors.New("trustboundary: ConfigProvider cannot be nil for DataProvider") } p := &DataProvider{ client: client, @@ -309,10 +309,10 @@ func (p *DataProvider) GetTrustBoundaryData(ctx context.Context, token *auth.Tok return newData, nil } -// GCETrustBoundaryConfigProvider implements TrustBoundaryConfigProvider for GCE environments. +// GCEConfigProvider implements ConfigProvider for GCE environments. // It lazily fetches and caches the necessary metadata (service account email, universe domain) // from the GCE metadata server. -type GCETrustBoundaryConfigProvider struct { +type GCEConfigProvider struct { // universeDomainProvider provides the universe domain and underlying metadata client. universeDomainProvider *internal.ComputeUniverseDomainProvider @@ -327,19 +327,19 @@ type GCETrustBoundaryConfigProvider struct { udErr error } -// NewGCETrustBoundaryConfigProvider creates a new GCETrustBoundaryConfigProvider +// NewGCEConfigProvider creates a new GCEConfigProvider // which uses the provided gceUDP to interact with the GCE metadata server. -func NewGCETrustBoundaryConfigProvider(gceUDP *internal.ComputeUniverseDomainProvider) *GCETrustBoundaryConfigProvider { +func NewGCEConfigProvider(gceUDP *internal.ComputeUniverseDomainProvider) *GCEConfigProvider { // The validity of gceUDP and its internal MetadataClient will be checked // within the GetTrustBoundaryEndpoint and GetUniverseDomain methods. - return &GCETrustBoundaryConfigProvider{ + return &GCEConfigProvider{ universeDomainProvider: gceUDP, } } -func (g *GCETrustBoundaryConfigProvider) fetchSA(ctx context.Context) { +func (g *GCEConfigProvider) fetchSA(ctx context.Context) { if g.universeDomainProvider == nil || g.universeDomainProvider.MetadataClient == nil { - g.saEmailErr = errors.New("trustboundary: GCETrustBoundaryConfigProvider not properly initialized (missing ComputeUniverseDomainProvider or MetadataClient)") + g.saEmailErr = errors.New("trustboundary: GCEConfigProvider not properly initialized (missing ComputeUniverseDomainProvider or MetadataClient)") return } mdClient := g.universeDomainProvider.MetadataClient @@ -351,9 +351,9 @@ func (g *GCETrustBoundaryConfigProvider) fetchSA(ctx context.Context) { g.saEmail = saEmail } -func (g *GCETrustBoundaryConfigProvider) fetchUD(ctx context.Context) { +func (g *GCEConfigProvider) fetchUD(ctx context.Context) { if g.universeDomainProvider == nil || g.universeDomainProvider.MetadataClient == nil { - g.udErr = errors.New("trustboundary: GCETrustBoundaryConfigProvider not properly initialized (missing ComputeUniverseDomainProvider or MetadataClient)") + g.udErr = errors.New("trustboundary: GCEConfigProvider not properly initialized (missing ComputeUniverseDomainProvider or MetadataClient)") return } ud, err := g.universeDomainProvider.GetProperty(ctx) @@ -369,7 +369,7 @@ func (g *GCETrustBoundaryConfigProvider) fetchUD(ctx context.Context) { // GetTrustBoundaryEndpoint constructs the trust boundary lookup URL for a GCE environment. // It uses cached metadata (service account email, universe domain) after the first call. -func (g *GCETrustBoundaryConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) { +func (g *GCEConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) { g.saOnce.Do(func() { g.fetchSA(ctx) }) if g.saEmailErr != nil { return "", g.saEmailErr @@ -383,7 +383,7 @@ func (g *GCETrustBoundaryConfigProvider) GetTrustBoundaryEndpoint(ctx context.Co // GetUniverseDomain retrieves the universe domain from the GCE metadata server. // It uses a cached value after the first call. -func (g *GCETrustBoundaryConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) { +func (g *GCEConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) { g.udOnce.Do(func() { g.fetchUD(ctx) }) if g.udErr != nil { return "", g.udErr diff --git a/auth/internal/trustboundary/trust_boundary_test.go b/auth/internal/trustboundary/trust_boundary_test.go index c77d5f1af5f2..b3182e7811ce 100644 --- a/auth/internal/trustboundary/trust_boundary_test.go +++ b/auth/internal/trustboundary/trust_boundary_test.go @@ -315,17 +315,17 @@ func TestIsTrustBoundaryEnabled(t *testing.T) { } } -func TestServiceAccountTrustBoundaryConfig(t *testing.T) { +func TestServiceAccountConfig(t *testing.T) { saEmail := "test-sa@example.iam.gserviceaccount.com" ud := "example.com" - cfg := NewServiceAccountTrustBoundaryConfig(saEmail, ud) + cfg := NewServiceAccountConfigProvider(saEmail, ud).(*serviceAccountConfig) if cfg.ServiceAccountEmail != saEmail { - t.Errorf("NewServiceAccountTrustBoundaryConfig().ServiceAccountEmail = %q, want %q", cfg.ServiceAccountEmail, saEmail) + t.Errorf("NewServiceAccountConfigProvider().ServiceAccountEmail = %q, want %q", cfg.ServiceAccountEmail, saEmail) } if cfg.UniverseDomain != ud { - t.Errorf("NewServiceAccountTrustBoundaryConfig().UniverseDomain = %q, want %q", cfg.UniverseDomain, ud) + t.Errorf("NewServiceAccountConfigProvider().UniverseDomain = %q, want %q", cfg.UniverseDomain, ud) } t.Run("GetTrustBoundaryEndpoint", func(t *testing.T) { @@ -356,7 +356,7 @@ func TestServiceAccountTrustBoundaryConfig(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - cfg := NewServiceAccountTrustBoundaryConfig(tt.saEmail, tt.ud) + cfg := NewServiceAccountConfigProvider(tt.saEmail, tt.ud) url, err := cfg.GetTrustBoundaryEndpoint(context.Background()) if (err != nil && err.Error() != tt.wantErr) || (err == nil && tt.wantErr != "") { t.Errorf("GetTrustBoundaryEndpoint() error = %v, wantErr %q", err, tt.wantErr) @@ -388,7 +388,7 @@ func TestServiceAccountTrustBoundaryConfig(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - cfg := NewServiceAccountTrustBoundaryConfig("test-sa@example.com", tt.inputUD) + cfg := NewServiceAccountConfigProvider("test-sa@example.com", tt.inputUD) gotUD, err := cfg.GetUniverseDomain(context.Background()) if err != nil { t.Fatalf("GetUniverseDomain() unexpected error: %v", err) @@ -401,7 +401,7 @@ func TestServiceAccountTrustBoundaryConfig(t *testing.T) { }) } -func TestGCETrustBoundaryConfigProvider(t *testing.T) { +func TestGCEConfigProvider(t *testing.T) { defaultTestEmail := "test-sa@example.iam.gserviceaccount.com" defaultTestUD := "example.com" defaultExpectedEndpoint := fmt.Sprintf(serviceAccountAllowedLocationsEndpoint, defaultTestUD, defaultTestEmail) @@ -475,8 +475,8 @@ func TestGCETrustBoundaryConfigProvider(t *testing.T) { { name: "Nil ComputeUniverseDomainProvider", gceUDP: nil, - wantErrEndpoint: "trustboundary: GCETrustBoundaryConfigProvider not properly initialized", - wantErrUD: "trustboundary: GCETrustBoundaryConfigProvider not properly initialized", + wantErrEndpoint: "trustboundary: GCEConfigProvider not properly initialized", + wantErrUD: "trustboundary: GCEConfigProvider not properly initialized", skipServerConfiguration: true, }, { @@ -484,8 +484,8 @@ func TestGCETrustBoundaryConfigProvider(t *testing.T) { gceUDP: &internal.ComputeUniverseDomainProvider{ MetadataClient: nil, }, - wantErrEndpoint: "trustboundary: GCETrustBoundaryConfigProvider not properly initialized", - wantErrUD: "trustboundary: GCETrustBoundaryConfigProvider not properly initialized", + wantErrEndpoint: "trustboundary: GCEConfigProvider not properly initialized", + wantErrUD: "trustboundary: GCEConfigProvider not properly initialized", skipServerConfiguration: true, }, { @@ -543,10 +543,10 @@ func TestGCETrustBoundaryConfigProvider(t *testing.T) { udp := &internal.ComputeUniverseDomainProvider{ MetadataClient: mdClient, } - provider = NewGCETrustBoundaryConfigProvider(udp) + provider = NewGCEConfigProvider(udp) } else { os.Unsetenv("GCE_METADATA_HOST") - provider = NewGCETrustBoundaryConfigProvider(tt.gceUDP) + provider = NewGCEConfigProvider(tt.gceUDP) } endpoint, err := provider.GetTrustBoundaryEndpoint(ctx) @@ -578,7 +578,7 @@ func TestGCETrustBoundaryConfigProvider(t *testing.T) { } } -func TestGCETrustBoundaryConfigProvider_CachesResults(t *testing.T) { +func TestGCEConfigProvider_CachesResults(t *testing.T) { originalGCEHost := os.Getenv("GCE_METADATA_HOST") defer os.Setenv("GCE_METADATA_HOST", originalGCEHost) @@ -600,7 +600,7 @@ func TestGCETrustBoundaryConfigProvider_CachesResults(t *testing.T) { os.Setenv("GCE_METADATA_HOST", parsedURL.Host) mdClient := metadata.NewClient(server.Client()) udp := &internal.ComputeUniverseDomainProvider{MetadataClient: mdClient} - provider := NewGCETrustBoundaryConfigProvider(udp) + provider := NewGCEConfigProvider(udp) for i := 0; i < 5; i++ { t.Run(fmt.Sprintf("call-%d", i+1), func(t *testing.T) { @@ -614,7 +614,7 @@ func TestGCETrustBoundaryConfigProvider_CachesResults(t *testing.T) { } } -type mockTrustBoundaryConfigProvider struct { +type mockConfigProvider struct { endpointCallCount int universeCallCount int endpointToReturn string @@ -623,17 +623,17 @@ type mockTrustBoundaryConfigProvider struct { universeErrToReturn error } -func (m *mockTrustBoundaryConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) { +func (m *mockConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) { m.endpointCallCount++ return m.endpointToReturn, m.endpointErrToReturn } -func (m *mockTrustBoundaryConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) { +func (m *mockConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) { m.universeCallCount++ return m.universeToReturn, m.universeErrToReturn } -func (m *mockTrustBoundaryConfigProvider) Reset() { +func (m *mockConfigProvider) Reset() { m.endpointCallCount = 0 m.universeCallCount = 0 } @@ -657,7 +657,7 @@ func TestDataProvider_Token(t *testing.T) { tests := []struct { name string - mockConfig *mockTrustBoundaryConfigProvider + mockConfig *mockConfigProvider serverResponse *serverResponse // for fetchTrustBoundaryData baseProvider *mockTokenProvider wantDataOnToken *internal.TrustBoundaryData @@ -676,7 +676,7 @@ func TestDataProvider_Token(t *testing.T) { }{ { name: "Non-default universe domain returns NoOp", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeToReturn: "example.com", }, baseProvider: &mockTokenProvider{ @@ -688,7 +688,7 @@ func TestDataProvider_Token(t *testing.T) { }, { name: "Default universe, no cache, successful fetch", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeToReturn: internal.DefaultUniverseDomain, }, baseProvider: &mockTokenProvider{ @@ -704,7 +704,7 @@ func TestDataProvider_Token(t *testing.T) { }, { name: "Default universe, fetch fails, no cache, returns error", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeToReturn: internal.DefaultUniverseDomain, }, baseProvider: &mockTokenProvider{ @@ -721,7 +721,7 @@ func TestDataProvider_Token(t *testing.T) { }, { name: "Error from GetUniverseDomain", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeErrToReturn: errors.New("universe domain error"), }, baseProvider: &mockTokenProvider{ @@ -734,7 +734,7 @@ func TestDataProvider_Token(t *testing.T) { }, { name: "Error from GetTrustBoundaryEndpoint", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeToReturn: internal.DefaultUniverseDomain, endpointErrToReturn: errors.New("endpoint error"), }, @@ -748,7 +748,7 @@ func TestDataProvider_Token(t *testing.T) { }, { name: "Cache fallback on second call", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeToReturn: internal.DefaultUniverseDomain, }, baseProvider: &mockTokenProvider{ @@ -781,7 +781,7 @@ func TestDataProvider_Token(t *testing.T) { }, { name: "Non-default universe caches NoOp", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeToReturn: "example.com", }, baseProvider: &mockTokenProvider{ @@ -805,7 +805,7 @@ func TestDataProvider_Token(t *testing.T) { }, { name: "API-retrieved NoOp is cached", - mockConfig: &mockTrustBoundaryConfigProvider{ + mockConfig: &mockConfigProvider{ universeToReturn: internal.DefaultUniverseDomain, }, baseProvider: &mockTokenProvider{ From 14c3887819c7bfdf3de661ec807fa82b6bb3183e Mon Sep 17 00:00:00 2001 From: Alex Hong <9397363+hongalex@users.noreply.github.com> Date: Thu, 25 Sep 2025 14:33:46 -0700 Subject: [PATCH 12/23] feat(pubsub/v2): add subscriber shutdown options (#12829) This introduces the ability to tell the client library how you want your messages to behave when shutdown is initiated. You can configure the behavior as `ShutdownOptions.Behavior` as `ShutdownBehaviorWaitForProcessing` or `ShutdownBehaviorNackImmediately`. In addition, you can specify `ShutdownOptions.Timeout` to configure how long you want to wait for messages to be processed, or provide a timeout to the nack calls before returning. --- pubsub/v2/integration_test.go | 2 +- pubsub/v2/iterator.go | 41 +++++--- pubsub/v2/shutdown.go | 57 +++++++++++ pubsub/v2/shutdown_test.go | 157 +++++++++++++++++++++++++++++++ pubsub/v2/streaming_pull_test.go | 4 +- pubsub/v2/subscriber.go | 111 +++++++++++++++++++--- pubsub/v2/subscriber_test.go | 2 - 7 files changed, 344 insertions(+), 30 deletions(-) create mode 100644 pubsub/v2/shutdown.go create mode 100644 pubsub/v2/shutdown_test.go diff --git a/pubsub/v2/integration_test.go b/pubsub/v2/integration_test.go index a1e0e194473e..66fdb8ed83f8 100644 --- a/pubsub/v2/integration_test.go +++ b/pubsub/v2/integration_test.go @@ -317,7 +317,7 @@ func TestIntegration_CancelReceive(t *testing.T) { return default: publisher.Publish(ctx, &Message{Data: []byte("some msg")}) - time.Sleep(time.Second) + time.Sleep(10 * time.Second) } } }() diff --git a/pubsub/v2/iterator.go b/pubsub/v2/iterator.go index 72cbc4bd4b17..eef85d2c17ef 100644 --- a/pubsub/v2/iterator.go +++ b/pubsub/v2/iterator.go @@ -263,6 +263,8 @@ func (it *messageIterator) receive(maxToPull int32) ([]*Message, error) { var rmsgs []*pb.ReceivedMessage var err error + // This is a blocking call, because reading from the stream blocks. + // We want to make sure this is canceled. rmsgs, err = it.recvMessages() // If stopping the iterator results in the grpc stream getting shut down and // returning an error here, treat the same as above and return EOF. @@ -359,9 +361,9 @@ func (it *messageIterator) receive(maxToPull int32) ([]*Message, error) { // If exactly once is enabled, we should wait until modack responses are successes // before attempting to process messages. - it.sendModAck(ackIDs, deadline, false, true) + ctx := context.Background() + it.sendModAck(ctx, ackIDs, deadline, false, true) for ackID, ar := range ackIDs { - ctx := context.Background() _, err := ar.Get(ctx) if err != nil { delete(pendingMessages, ackID) @@ -508,16 +510,16 @@ func (it *messageIterator) sender() { } if sendNacks { // Nack indicated by modifying the deadline to zero. - it.sendModAck(nacks, 0, false, false) + it.sendModAck(context.Background(), nacks, 0, false, false) } if sendModAcks { - it.sendModAck(modAcks, dl, true, false) + it.sendModAck(context.Background(), modAcks, dl, true, false) } if sendPing { it.pingStream() } if sendReceipt { - it.sendModAck(receipts, dl, true, true) + it.sendModAck(context.Background(), receipts, dl, true, true) } } } @@ -559,7 +561,7 @@ type ackFunc = func(ctx context.Context, subName string, ackIds []string) error type ackRecordStat = func(ctx context.Context, toSend []string) type retryAckFunc = func(toRetry map[string]*ipubsub.AckResult) -func (it *messageIterator) sendAckWithFunc(m map[string]*AckResult, ackFunc ackFunc, retryAckFunc retryAckFunc, ackRecordStat ackRecordStat) { +func (it *messageIterator) sendAckWithFunc(ctx context.Context, m map[string]*AckResult, ackFunc ackFunc, retryAckFunc retryAckFunc, ackRecordStat ackRecordStat) { ackIDs := make([]string, 0, len(m)) for ackID := range m { ackIDs = append(ackIDs, ackID) @@ -575,9 +577,7 @@ func (it *messageIterator) sendAckWithFunc(m map[string]*AckResult, ackFunc ackF go func(toSend []string) { defer wg.Done() ackRecordStat(it.ctx, toSend) - // Use context.Background() as the call's context, not it.ctx. We don't - // want to cancel this RPC when the iterator is stopped. - cctx, cancel2 := context.WithTimeout(context.Background(), 60*time.Second) + cctx, cancel2 := context.WithTimeout(ctx, 60*time.Second) defer cancel2() err := ackFunc(cctx, it.subName, toSend) if exactlyOnceDelivery { @@ -602,7 +602,8 @@ func (it *messageIterator) sendAckWithFunc(m map[string]*AckResult, ackFunc ackF // sendAck is used to confirm acknowledgement of a message. If exactly once delivery is // enabled, we'll retry these messages for a short duration in a goroutine. func (it *messageIterator) sendAck(m map[string]*AckResult) { - it.sendAckWithFunc(m, func(ctx context.Context, subName string, ackIDs []string) error { + ctx := context.Background() + it.sendAckWithFunc(ctx, m, func(ctx context.Context, subName string, ackIDs []string) error { // For each ackID (message), setup links to the main subscribe span. // If this is a nack, also remove it from active spans. // If the ackID is not found, don't create any more spans. @@ -667,7 +668,7 @@ func (it *messageIterator) sendAck(m map[string]*AckResult) { // percentile in order to capture the highest amount of time necessary without // considering 1% outliers. If the ModAck RPC fails and exactly once delivery is // enabled, we retry it in a separate goroutine for a short duration. -func (it *messageIterator) sendModAck(m map[string]*AckResult, deadline time.Duration, logOnInvalid, isReceipt bool) { +func (it *messageIterator) sendModAck(ctx context.Context, m map[string]*AckResult, deadline time.Duration, logOnInvalid, isReceipt bool) { deadlineSec := int32(deadline / time.Second) isNack := deadline == 0 var spanName, eventStart, eventEnd string @@ -680,7 +681,7 @@ func (it *messageIterator) sendModAck(m map[string]*AckResult, deadline time.Dur eventStart = eventModackStart eventEnd = eventModackEnd } - it.sendAckWithFunc(m, func(ctx context.Context, subName string, ackIDs []string) error { + it.sendAckWithFunc(ctx, m, func(ctx context.Context, subName string, ackIDs []string) error { if it.enableTracing { // For each ackID (message), link back to the main subscribe span. // If this is a nack, also remove it from active spans. @@ -1016,3 +1017,19 @@ func processResults(errorStatus *status.Status, ackResMap map[string]*AckResult, } return completedResults, retryResults } + +// nackInventory nacks all the current messages being held by the iterator. +// This does not stop the existing callbacks, and does not try to remove +// messages from the scheduler. This is used specifically for when the +// user configured ShutdownOptions is set to NackImmediately +func (it *messageIterator) nackInventory(ctx context.Context) { + it.mu.Lock() + defer it.mu.Unlock() + + toNack := make(map[string]*ipubsub.AckResult) + for ackID := range it.keepAliveDeadlines { + // Use a dummy AckResult since we don't propagate nacks back to the user. + toNack[ackID] = newSuccessAckResult() + } + it.sendModAck(ctx, toNack, 0, false, false) +} diff --git a/pubsub/v2/shutdown.go b/pubsub/v2/shutdown.go new file mode 100644 index 000000000000..98df0027dedc --- /dev/null +++ b/pubsub/v2/shutdown.go @@ -0,0 +1,57 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pubsub + +import "time" + +// ShutdownOptions configures the shutdown behavior of the subscriber. +// When ShutdownOptions is nil, the client library will +// assume disabled/infinite timeout. +// +// Warning: The interaction between Timeout and Behavior might be surprising. +// Read about the interaction of these below to ensure you +// get the desired behavior. +type ShutdownOptions struct { + // Timeout specifies the time the subscriber should wait + // before forcefully shutting down.. + // In ShutdownBehaviorNackImmediately mode, this configures the timeout + // for message nacks before shutting down. + // + // Set to zero to immediately shutdown. + // Set to a negative value to disable timeout. + // Both zero and negative values overrides the ShutdownBehavior. + Timeout time.Duration + + // Behavior defines the strategy the subscriber should use when + // shutting down (wait or nack messages). + // When ShutdownOptions is set, but Timeout is unspecified, the default zero-value + // will result in immediate shutdown. When needing a specific a behavior, + // always set a non-zero Timeout. + Behavior ShutdownBehavior +} + +// ShutdownBehavior defines the strategy the subscriber should take when +// shutting down. Current options are graceful shutdown vs nacking messages. +type ShutdownBehavior int + +const ( + // ShutdownBehaviorWaitForProcessing means the subscriber client will wait for + // outstanding messages to be processed. + ShutdownBehaviorWaitForProcessing = iota + + // ShutdownBehaviorNackImmediately means the subscriber client will nack all + // outstanding messages before closing. + ShutdownBehaviorNackImmediately +) diff --git a/pubsub/v2/shutdown_test.go b/pubsub/v2/shutdown_test.go new file mode 100644 index 000000000000..96ad85a11217 --- /dev/null +++ b/pubsub/v2/shutdown_test.go @@ -0,0 +1,157 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pubsub + +import ( + "context" + "sync" + "testing" + "time" + + pb "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" +) + +func TestShutdown_NackImmediately(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + client, srv := newFake(t) + defer client.Close() + defer srv.Close() + + topic := mustCreateTopic(t, client, "projects/p/topics/t") + sub := mustCreateSubConfig(t, client, &pb.Subscription{ + Name: "projects/p/subscriptions/s", + Topic: topic.String(), + }) + + // Part of this test: pretend to extend the min duration quite a bit so we can test + // if the message has been properly nacked. + sub.ReceiveSettings.MinDurationPerAckExtension = 10 * time.Minute + sub.ReceiveSettings.ShutdownOptions = &ShutdownOptions{ + Behavior: ShutdownBehaviorNackImmediately, + Timeout: 1 * time.Minute, + } + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + _, err := topic.Publish(ctx, &Message{Data: []byte("m1")}).Get(ctx) + if err != nil { + t.Errorf("Publish().Get() got err: %v", err) + } + }() + wg.Wait() + + cctx, ccancel := context.WithCancel(ctx) + go sub.Receive(cctx, func(ctx context.Context, m *Message) { + // First time receiving, cancel the context to trigger shutdown. + // Don't cancel away to avoid race condition with fake. + time.AfterFunc(2*time.Second, ccancel) + }) + + // Wait for the message to be redelivered. + time.Sleep(5 * time.Second) + + var received int + var receiveLock sync.Mutex + ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) + err := sub.Receive(ctx2, func(ctx context.Context, m *Message) { + receiveLock.Lock() + defer receiveLock.Unlock() + received++ + m.Ack() + cancel() + }) + if err != nil { + t.Errorf("got err from recv: %v", err) + } + if received != 1 { + t.Errorf("expected 1 delivery, got %d", received) + } +} + +func TestShutdown_WaitForProcessing(t *testing.T) { + t.Parallel() + tests := []struct { + name string + shutdownTimeout time.Duration + expectedTimeout time.Duration + minTime time.Duration + }{ + { + name: "BailImmediately", + shutdownTimeout: 0 * time.Second, + expectedTimeout: 5 * time.Second, + }, + { + name: "WithTimeout", + shutdownTimeout: 5 * time.Second, + expectedTimeout: 6 * time.Second, + minTime: 4 * time.Second, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + client, srv := newFake(t) + defer client.Close() + defer srv.Close() + + topic := mustCreateTopic(t, client, "projects/p/topics/t") + sub := mustCreateSubConfig(t, client, &pb.Subscription{ + Name: "projects/p/subscriptions/s", + Topic: topic.String(), + }) + sub.ReceiveSettings.ShutdownOptions = &ShutdownOptions{ + Behavior: ShutdownBehaviorWaitForProcessing, + Timeout: tc.shutdownTimeout, + } + processingTime := 1 * time.Hour + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + _, err := topic.Publish(ctx, &Message{Data: []byte("m1")}).Get(ctx) + if err != nil { + t.Errorf("Publish().Get() got err: %v", err) + } + }() + wg.Wait() + + cctx, cancel2 := context.WithCancel(ctx) + defer cancel2() + start := time.Now() + sub.Receive(cctx, func(ctx context.Context, m *Message) { + cancel() + // Simulate a long processing message that we want to cancel right away. + // The message should never be acked since we expect the client to bail early. + time.Sleep(processingTime) + m.Ack() + }) + + elapsed := time.Since(start) + if elapsed > tc.expectedTimeout { + t.Errorf("expected quick cancellation, elapsed: %v, want less than: %v", elapsed, tc.expectedTimeout) + } + if tc.minTime > 0 && elapsed < tc.minTime { + t.Errorf("expected to wait for shutdown, elapsed: %v, want greater than: %v", elapsed, tc.minTime) + } + }) + } +} diff --git a/pubsub/v2/streaming_pull_test.go b/pubsub/v2/streaming_pull_test.go index 66dc6cfcba91..35116457512a 100644 --- a/pubsub/v2/streaming_pull_test.go +++ b/pubsub/v2/streaming_pull_test.go @@ -114,6 +114,8 @@ func testStreamingPullIteration(t *testing.T, client *Client, server *mockServer } } server.wait() + server.mu.Lock() + defer server.mu.Unlock() for i := 0; i < len(msgs); i++ { id := msgs[i].AckId if i%2 == 0 { @@ -183,8 +185,8 @@ func TestStreamingPullCancel(t *testing.T) { } func TestStreamingPullRetry(t *testing.T) { - // Check that we retry on io.EOF or Unavailable. t.Parallel() + // Check that we retry on io.EOF or Unavailable. client, server := newMock(t) defer server.srv.Close() defer client.Close() diff --git a/pubsub/v2/subscriber.go b/pubsub/v2/subscriber.go index aa21b87d2c7d..01fe4f40933b 100644 --- a/pubsub/v2/subscriber.go +++ b/pubsub/v2/subscriber.go @@ -148,6 +148,11 @@ type ReceiveSettings struct { // function passed to Receive on them. To limit the number of messages being // processed concurrently, set MaxOutstandingMessages. NumGoroutines int + + // ShutdownOptions configures the shutdown behavior of the subscriber. + // Default: if unset / nil, the client library will wait + // indefinitely for all in messages inflight to be acked/nacked. + ShutdownOptions *ShutdownOptions } // DefaultReceiveSettings holds the default values for ReceiveSettings. @@ -223,6 +228,18 @@ func (s *Subscriber) Receive(ctx context.Context, f func(context.Context, *Messa if minExtPeriod < 0 { minExtPeriod = DefaultReceiveSettings.MinDurationPerAckExtension } + var shutdownOpts ShutdownOptions + if s.ReceiveSettings.ShutdownOptions != nil { + shutdownOpts = *s.ReceiveSettings.ShutdownOptions + } else { + // We can't store these in DefaultReceiveSettings because + // ShutdownOptions is a pointer, and editing one client's + /// ReceiveSettings will update the underlying ShutdownOptions value. + shutdownOpts = ShutdownOptions{ + Behavior: ShutdownBehaviorWaitForProcessing, + Timeout: -1, + } + } var numGoroutines int switch { @@ -266,6 +283,10 @@ func (s *Subscriber) Receive(ctx context.Context, f func(context.Context, *Messa ctx2, cancel2 := context.WithCancel(gctx) defer cancel2() + // This context is for forcefully shutting down the application if ShutdownTimeout + // is exceeded. + shutdownKillCtx, shutdownKillCancel := context.WithCancel(context.Background()) + for i := 0; i < numGoroutines; i++ { // The iterator does not use the context passed to Receive. If it did, // canceling that context would immediately stop the iterator without @@ -295,13 +316,33 @@ func (s *Subscriber) Receive(ctx context.Context, f func(context.Context, *Messa default: } - msgs, err := iter.receive(maxToPull) - if errors.Is(err, io.EOF) { + // This is used to communicate the result of iter.receive. + msgChan := make(chan []*Message) + errChan := make(chan error) + go func() { + msgs, err := iter.receive(maxToPull) + if errors.Is(err, io.EOF) { + errChan <- nil + return + } + if err != nil { + errChan <- err + return + } + msgChan <- msgs + }() + + // Make message pulling dependent on iterator for context cancellation + // If the context is cancelled while pulling messages, stop reading from stream early. + var msgs []*Message + select { + case <-ctx.Done(): return nil - } - if err != nil { + case err := <-errChan: return err + case msgs = <-msgChan: } + // If context is done and messages have been pulled, // nack them. select { @@ -314,7 +355,6 @@ func (s *Subscriber) Receive(ctx context.Context, f func(context.Context, *Messa } for i, msg := range msgs { - msg := msg iter.eoMu.RLock() ackh, _ := msgAckHandler(msg, iter.enableExactlyOnceDelivery) iter.eoMu.RUnlock() @@ -393,7 +433,19 @@ func (s *Subscriber) Receive(ctx context.Context, f func(context.Context, *Messa } } defer fc.release(ctx, msgLen) - f(otelCtx, m) + + cbDone := make(chan struct{}) + go func() { + defer close(cbDone) + f(otelCtx, m) + }() + + select { + case <-cbDone: + // Callback finished gracefully. + case <-shutdownKillCtx.Done(): + // Shutdown timeout exceeded, stop waiting for callback. + } }); err != nil { wg.Done() // TODO(hongalex): propagate these errors to an otel span. @@ -413,18 +465,49 @@ func (s *Subscriber) Receive(ctx context.Context, f func(context.Context, *Messa } go func() { + // Detected cancellation (either user initiated or permanent error). <-ctx2.Done() - // Wait for all iterators to stop. - for _, p := range pairs { - p.iter.stop() - p.wg.Done() + // Once shutdown is initiated, start the timer for forceful shutdown. + if shutdownOpts.Timeout == 0 { + // Stop all the pullstreams as the first thing we do to prevent new messages. + for _, p := range pairs { + p.iter.ps.cancel() + } + shutdownKillCancel() // Immediate forceful shutdown. + } else if shutdownOpts.Timeout > 0 { + // Stop all the pullstreams as the first thing we do to prevent new messages. + for _, p := range pairs { + p.iter.ps.cancel() + } + time.AfterFunc(shutdownOpts.Timeout, shutdownKillCancel) + for _, p := range pairs { + p.iter.nackInventory(shutdownKillCtx) + } } - // This _must_ happen after every iterator has stopped, or some - // iterator will still have undelivered messages but the scheduler will - // already be shut down. - sched.Shutdown() + if shutdownOpts.Timeout >= 0 { // Timed shutdown + go func() { + for _, p := range pairs { + // Since we aren't looking for graceful timeout, call + // each iterator.stop asynchronously. + go func() { + p.iter.stop() + }() + p.wg.Done() + } + sched.Shutdown() + }() + } else { // Graceful shutdown + for _, p := range pairs { + p.iter.stop() + p.wg.Done() + } + // This _must_ happen after every iterator has stopped, or some + // iterator will still have undelivered messages but the scheduler will + // already be shut down. + sched.Shutdown() + } }() return group.Wait() diff --git a/pubsub/v2/subscriber_test.go b/pubsub/v2/subscriber_test.go index 2d272cd7bd56..efa5d3cfc70c 100644 --- a/pubsub/v2/subscriber_test.go +++ b/pubsub/v2/subscriber_test.go @@ -18,7 +18,6 @@ import ( "context" "errors" "fmt" - "log" "testing" "time" @@ -251,7 +250,6 @@ func TestExactlyOnceDelivery_AckRetryDeadlineExceeded(t *testing.T) { // Override the default timeout here so this test doesn't take 10 minutes. exactlyOnceDeliveryRetryDeadline = 10 * time.Second err = s.Receive(ctx, func(ctx context.Context, msg *Message) { - log.Printf("received message: %v\n", msg) ar := msg.AckWithResult() s, err := ar.Get(ctx) if s != AcknowledgeStatusOther { From bdf8afb3fe79ab7cedf989ef71d4b4362f0baf0d Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 15:58:23 -0700 Subject: [PATCH 13/23] chore(main): release pubsub/v2 2.1.0 (#12953) :robot: I have created a release *beep* *boop* --- ## [2.1.0](https://github.com/googleapis/google-cloud-go/compare/pubsub/v2/v2.0.1...pubsub/v2/v2.1.0) (2025-09-25) ### Features * **pubsub/v2:** Add subscriber shutdown options ([#12829](https://github.com/googleapis/google-cloud-go/issues/12829)) ([14c3887](https://github.com/googleapis/google-cloud-go/commit/14c3887819c7bfdf3de661ec807fa82b6bb3183e)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- .release-please-manifest-individual.json | 2 +- pubsub/v2/CHANGES.md | 7 +++++++ pubsub/v2/internal/version.go | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest-individual.json b/.release-please-manifest-individual.json index 0da5b09f65f5..3ac765ad71cd 100644 --- a/.release-please-manifest-individual.json +++ b/.release-please-manifest-individual.json @@ -9,7 +9,7 @@ "logging": "1.13.0", "profiler": "0.4.3", "pubsub": "1.50.1", - "pubsub/v2": "2.0.1", + "pubsub/v2": "2.1.0", "pubsublite": "1.8.2", "spanner": "1.85.1", "storage": "1.57.0", diff --git a/pubsub/v2/CHANGES.md b/pubsub/v2/CHANGES.md index 5aad9c4a17d5..3adef08b7682 100644 --- a/pubsub/v2/CHANGES.md +++ b/pubsub/v2/CHANGES.md @@ -1,5 +1,12 @@ # Changelog +## [2.1.0](https://github.com/googleapis/google-cloud-go/compare/pubsub/v2/v2.0.1...pubsub/v2/v2.1.0) (2025-09-25) + + +### Features + +* **pubsub/v2:** Add subscriber shutdown options ([#12829](https://github.com/googleapis/google-cloud-go/issues/12829)) ([14c3887](https://github.com/googleapis/google-cloud-go/commit/14c3887819c7bfdf3de661ec807fa82b6bb3183e)) + ## [2.0.1](https://github.com/googleapis/google-cloud-go/compare/pubsub/v2/v2.0.0...pubsub/v2/v2.0.1) (2025-09-03) diff --git a/pubsub/v2/internal/version.go b/pubsub/v2/internal/version.go index a2be53cd582c..3dc0e1b3e89c 100644 --- a/pubsub/v2/internal/version.go +++ b/pubsub/v2/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "2.0.1" +const Version = "2.1.0" From 0464d0beed74e91c158f08672f8742d453a62320 Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Fri, 26 Sep 2025 14:51:07 +0100 Subject: [PATCH 14/23] fix(internal/stategen): write state.yaml with the same code as librarian CLI (#12955) Fixes https://github.com/googleapis/librarian/issues/2385 --- internal/stategen/state.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/stategen/state.go b/internal/stategen/state.go index 090b2fbb8f1c..57848a8a4bb6 100644 --- a/internal/stategen/state.go +++ b/internal/stategen/state.go @@ -15,6 +15,7 @@ package main import ( + "bytes" "fmt" "os" @@ -97,11 +98,14 @@ type Change struct { // Copied from https://github.com/googleapis/librarian/blob/main/internal/librarian/state.go // with minimal modification func saveLibrarianState(path string, state *LibrarianState) error { - bytes, err := yaml.Marshal(state) + var buffer bytes.Buffer + encoder := yaml.NewEncoder(&buffer) + encoder.SetIndent(2) + err := encoder.Encode(state) if err != nil { return err } - return os.WriteFile(path, bytes, 0644) + return os.WriteFile(path, buffer.Bytes(), 0644) } func parseLibrarianState(path string) (*LibrarianState, error) { From fdcdde809db710633e3102440d11b3365bdd1fd4 Mon Sep 17 00:00:00 2001 From: Sushan Bhattarai Date: Fri, 26 Sep 2025 12:21:10 -0400 Subject: [PATCH 15/23] feat(bigtable): add an e2e flow for direct access with instructions (#12939) This function attempts to establish a connection to the Bigtable instance using settings that force the use of DirectAccess. It then checks if the underlying gRPC connection is indeed using a DirectPath IP address. --- bigtable/direct_access_check.go | 129 +++++++++++++++++++++++++++ bigtable/direct_access_check_test.go | 45 ++++++++++ bigtable/integration_test.go | 2 - 3 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 bigtable/direct_access_check.go create mode 100644 bigtable/direct_access_check_test.go diff --git a/bigtable/direct_access_check.go b/bigtable/direct_access_check.go new file mode 100644 index 000000000000..51bd52acbbd4 --- /dev/null +++ b/bigtable/direct_access_check.go @@ -0,0 +1,129 @@ +/* +Copyright 2025 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package bigtable + +import ( + "context" + "errors" + "fmt" + "os" + "strconv" + "strings" + + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/peer" +) + +const ( + directPathIPV6Prefix = "[2001:4860:8040" + directPathIPV4Prefix = "34.126" +) + +// This function attempts to establish a connection to the Bigtable instance using +// Direct Access. It then checks if the underlying +// gRPC connection is indeed using a DirectPath IP address. +// +// Prerequisites for successful Direct Access connectivity: +// 1. The environment variable `CBT_ENABLE_DIRECTPATH` must be set to "true". +// 2. The code must be running in a Google Cloud environment (e.g., GCE VM, GKE) +// that is properly configured for Direct Access. This includes ensuring +// that your routes and firewall rules allow egress traffic to the +// Direct Access IP ranges: 34.126.0.0/18 and 2001:4860:8040::/42. +// 3. The service account must have the necessary IAM permissions. +// +// Parameters: +// - ctx: The context for the operation. +// - project: The Google Cloud project ID. +// - instance: The Cloud Bigtable instance ID. +// - appProfile: The application profile ID to use for the connection. Defaults to "default" if empty. +// - opts: Additional option.ClientOption to configure the Bigtable client. These are +// appended to the options used to force DirectPath. +// +// Returns: +// - bool: True if DirectPath is successfully used for the connection, False otherwise. +// - error: An error if the check could not be completed, or if DirectPath is not +// enabled/configured. Specific error causes include: +// - "CBT_ENABLE_DIRECTPATH=true is not set in env var": The required environment variable is missing. +// - Failure to create the Bigtable client (e.g., invalid project/instance). +// - Failure during the PingAndWarm call (e.g., network issue, permissions). +// + +// CheckDirectAccessSupported verifies if Direct Access connectivity is enabled, configured, +// and actively being used for the given Cloud Bigtable instance. +func CheckDirectAccessSupported(ctx context.Context, project, instance, appProfile string, opts ...option.ClientOption) (bool, error) { + // Check if env variable is set to true + // Inside the function + envVal := os.Getenv("CBT_ENABLE_DIRECTPATH") + if envVal == "" { + return false, errors.New("CBT_ENABLE_DIRECTPATH environment variable is not set") + } + isEnvEnabled, err := strconv.ParseBool(envVal) + if err != nil { + return false, fmt.Errorf("invalid value for CBT_ENABLE_DIRECTPATH: %s, must be true or false: %w", envVal, err) + } + if !isEnvEnabled { + return false, errors.New("CBT_ENABLE_DIRECTPATH is not set to true") + } + isDirectPathUsed := false + // Define the unary client interceptor + interceptor := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, callOpts ...grpc.CallOption) error { + // Create a new context with a peer to be captured by FromContext + peerInfo := &peer.Peer{} + allCallOpts := append(callOpts, grpc.Peer(peerInfo)) + + // Invoke the original RPC call + err := invoker(ctx, method, req, reply, cc, allCallOpts...) + if err != nil { + return err + } + + // After the call, store the captured peer address + if peerInfo.Addr != nil { + remoteIP := peerInfo.Addr.String() + if strings.HasPrefix(remoteIP, directPathIPV4Prefix) || strings.HasPrefix(remoteIP, directPathIPV6Prefix) { + isDirectPathUsed = true + } + } + + return nil + } + + // register the interceptor + allOpts := append([]option.ClientOption{ + option.WithGRPCDialOption(grpc.WithUnaryInterceptor(interceptor)), + }, opts...) + + config := ClientConfig{ + AppProfile: appProfile, + MetricsProvider: NoopMetricsProvider{}, + } + + client, err := NewClientWithConfig(ctx, project, instance, config, allOpts...) + if err != nil { + return false, fmt.Errorf("CheckDirectConnectivitySupported: failed to create Bigtable client for checking DirectAccess %w", err) + } + defer client.Close() + + // Call the PingAndWarm method + err = client.PingAndWarm(ctx) + if err != nil { + return false, fmt.Errorf("CheckDirectConnectivitySupported: PingAndWarm failed: %w", err) + } + + return isDirectPathUsed, nil +} diff --git a/bigtable/direct_access_check_test.go b/bigtable/direct_access_check_test.go new file mode 100644 index 000000000000..f803bce92714 --- /dev/null +++ b/bigtable/direct_access_check_test.go @@ -0,0 +1,45 @@ +/* +Copyright 2025 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package bigtable + +import ( + "context" + "log" + "os" +) + +func ExampleCheckDirectAccessSupported() { + // Example Usage: + ctx := context.Background() + projectID := "my-project" + instanceID := "my-instance" + appProfileID := "default" + + // Set the environment variable if not already set + os.Setenv("CBT_ENABLE_DIRECTPATH", "true") + + isDirectPath, err := CheckDirectAccessSupported(ctx, projectID, instanceID, appProfileID) + if err != nil { + log.Fatalf("DirectPath check failed: %v", err) + } + + if isDirectPath { + log.Printf("DirectPath connectivity is active for %s/%s", projectID, instanceID) + } else { + log.Printf("DirectPath connectivity is NOT active for %s/%s", projectID, instanceID) + } +} diff --git a/bigtable/integration_test.go b/bigtable/integration_test.go index b3825f26f4cf..fb04d447d306 100644 --- a/bigtable/integration_test.go +++ b/bigtable/integration_test.go @@ -58,8 +58,6 @@ import ( ) const ( - directPathIPV6Prefix = "[2001:4860:8040" - directPathIPV4Prefix = "34.126" timeUntilResourceCleanup = time.Hour * 12 // 12 hours prefixOfInstanceResources = "bt-it-" prefixOfClusterResources = "bt-c-" From bcc36ed8a3f261eb20368da437f2fddc122d8f04 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Fri, 26 Sep 2025 11:01:33 -0600 Subject: [PATCH 16/23] chore(internal/stategen): add module prep and OwlBot/release-please cleanup (#12950) refs: https://github.com/googleapis/librarian/issues/888 --- internal/postprocessor/config.yaml | 4 +- internal/stategen/.gitignore | 1 + internal/stategen/README.md | 22 +- internal/stategen/cleanup.go | 251 +++ internal/stategen/cleanup_test.go | 77 + internal/stategen/go.mod | 5 +- internal/stategen/go.sum | 2 + internal/stategen/main.go | 8 + internal/stategen/prepare.go | 120 ++ .../testdata/golden/.github/.OwlBot.yaml | 1374 ++++++++++++++++ .../.release-please-manifest-individual.json | 17 + .../.release-please-manifest-submodules.json | 165 ++ .../golden/internal/postprocessor/config.yaml | 1340 ++++++++++++++++ .../release-please-config-individual.json | 59 + ...elease-please-config-yoshi-submodules.json | 499 ++++++ .../testdata/source/.github/.OwlBot.yaml | 1391 +++++++++++++++++ .../.release-please-manifest-individual.json | 17 + .../.release-please-manifest-submodules.json | 166 ++ .../source/internal/postprocessor/config.yaml | 1352 ++++++++++++++++ .../release-please-config-individual.json | 59 + ...elease-please-config-yoshi-submodules.json | 502 ++++++ 21 files changed, 7428 insertions(+), 3 deletions(-) create mode 100644 internal/stategen/.gitignore create mode 100644 internal/stategen/cleanup.go create mode 100644 internal/stategen/cleanup_test.go create mode 100644 internal/stategen/prepare.go create mode 100644 internal/stategen/testdata/golden/.github/.OwlBot.yaml create mode 100644 internal/stategen/testdata/golden/.release-please-manifest-individual.json create mode 100644 internal/stategen/testdata/golden/.release-please-manifest-submodules.json create mode 100644 internal/stategen/testdata/golden/internal/postprocessor/config.yaml create mode 100644 internal/stategen/testdata/golden/release-please-config-individual.json create mode 100644 internal/stategen/testdata/golden/release-please-config-yoshi-submodules.json create mode 100644 internal/stategen/testdata/source/.github/.OwlBot.yaml create mode 100644 internal/stategen/testdata/source/.release-please-manifest-individual.json create mode 100644 internal/stategen/testdata/source/.release-please-manifest-submodules.json create mode 100644 internal/stategen/testdata/source/internal/postprocessor/config.yaml create mode 100644 internal/stategen/testdata/source/release-please-config-individual.json create mode 100644 internal/stategen/testdata/source/release-please-config-yoshi-submodules.json diff --git a/internal/postprocessor/config.yaml b/internal/postprocessor/config.yaml index 4a250584ac4d..5ae289cec905 100644 --- a/internal/postprocessor/config.yaml +++ b/internal/postprocessor/config.yaml @@ -1323,6 +1323,9 @@ service-configs: skip-module-scan-paths: # ignore the root module - . + # Librarian released modules + - dataproc + - dlp # individually released modules - auth - auth/oauth2adapt @@ -1330,7 +1333,6 @@ skip-module-scan-paths: - bigquery/v2 - bigtable - datastore - - dlp - errorreporting - firestore - logging diff --git a/internal/stategen/.gitignore b/internal/stategen/.gitignore new file mode 100644 index 000000000000..e9266eae11fb --- /dev/null +++ b/internal/stategen/.gitignore @@ -0,0 +1 @@ +stategen diff --git a/internal/stategen/README.md b/internal/stategen/README.md index 5ce8fd47f47d..a0d6254ece0d 100644 --- a/internal/stategen/README.md +++ b/internal/stategen/README.md @@ -1,4 +1,4 @@ -# Librarian state file generator +# Librarian state file generator (MIGRATION TOOL) This is a state file generator for Librarian, for google-cloud-go. @@ -16,3 +16,23 @@ $ go run ./internal/stategen . spanner apphub It is expected that the state file (`.librarian/state.yaml`) already exists. Any libraries that already exist within the state file are ignored, even if they're listed in the command line. + +**NOTE:** This is a one-time migration tool to assist in moving modules from the legacy OwlBot/release-please workflow to the new Librarian workflow. + +This tool performs the following steps: + +1. Add the modules to the `.librarian/state.yaml` file. +2. Prepare the modules for Librarian management: + 1. Remove executable file permissions from Go files. + 2. Run `goimports`. + 3. Remove empty and ignored gRPC files. +3. Remove the legacy configuration the modules from the following files: + +- `.github/.OwlBot.yaml` +- `internal/postprocessor/config.yaml` +- `release-please-config.json` +- `release-please-config-individual.json` +- `release-please-config-yoshi-submodules.json` +- `.release-please-manifest.json` +- `.release-please-manifest-individual.json` +- `.release-please-manifest-submodules.json` \ No newline at end of file diff --git a/internal/stategen/cleanup.go b/internal/stategen/cleanup.go new file mode 100644 index 000000000000..cb53c1e762cc --- /dev/null +++ b/internal/stategen/cleanup.go @@ -0,0 +1,251 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "strings" +) + +// cleanupLegacyConfigs is the entrypoint for removing OwlBot and release-please +// configuration for a module being migrated to Librarian. +func cleanupLegacyConfigs(repoRoot, moduleName string) error { + if err := cleanupOwlBotYaml(repoRoot, moduleName); err != nil { + return fmt.Errorf("cleaning up .OwlBot.yaml: %w", err) + } + if err := cleanupPostProcessorConfig(repoRoot, moduleName); err != nil { + return fmt.Errorf("cleaning up postprocessor config: %w", err) + } + + // release-please JSON files to clean up. + jsonFiles := []string{ + "release-please-config-individual.json", + "release-please-config-yoshi-submodules.json", + ".release-please-manifest-individual.json", + ".release-please-manifest-submodules.json", + } + for _, f := range jsonFiles { + if err := cleanupJSONFile(filepath.Join(repoRoot, f), moduleName); err != nil { + return fmt.Errorf("cleaning up %s: %w", f, err) + } + } + return nil +} + +// cleanupJSONFile removes all module entries from a given JSON file. +func cleanupJSONFile(path, moduleName string) error { + fileBytes, err := os.ReadFile(path) + if err != nil { + return err + } + + lines := strings.Split(string(fileBytes), "\n") + var newLines []string + inPackages := false + inBlock := false + braceCount := 0 + for _, line := range lines { + if strings.Contains(line, "\"packages\":") { + inPackages = true + } + if inPackages && strings.Contains(line, "\""+moduleName+"\":") { + inBlock = true + } + + if inBlock { + braceCount += strings.Count(line, "{") + braceCount -= strings.Count(line, "}") + if braceCount == 0 { + inBlock = false + } + continue + } + + // Handle manifest files and non-package blocks. + if strings.Contains(line, "\""+moduleName+"\":") { + // Check if it's the last line in a block without a trailing comma. + trimmedLine := strings.TrimSpace(line) + if !strings.HasSuffix(trimmedLine, ",") { + if len(newLines) > 0 { + lastLine := strings.TrimSpace(newLines[len(newLines)-1]) + if strings.HasSuffix(lastLine, ",") { + newLines[len(newLines)-1] = strings.TrimSuffix(newLines[len(newLines)-1], ",") + } + } + } + continue + } + + newLines = append(newLines, line) + } + + output := strings.Join(newLines, "\n") + if bytes.Equal([]byte(output), fileBytes) { + return nil + } + + return os.WriteFile(path, []byte(output), 0644) +} + +// cleanupPostProcessorConfig removes the module and service-config entries for +// a given module from the internal/postprocessor/config.yaml file. It also adds +// the module to the skip-module-scan-paths list. +// NOTE: This function does not remove modules from manual-clients. +func cleanupPostProcessorConfig(repoRoot, moduleName string) error { + configPath := filepath.Join(repoRoot, "internal", "postprocessor", "config.yaml") + fileBytes, err := os.ReadFile(configPath) + if err != nil { + return err + } + + lines := strings.Split(string(fileBytes), "\n") + var newLines []string + + // First pass: remove from modules list. + inModules := false + for _, line := range lines { + if strings.HasPrefix(line, "modules:") { + inModules = true + } else if !strings.HasPrefix(line, " ") { // top-level key + inModules = false + } + if inModules && strings.TrimSpace(line) == "- "+moduleName { + continue + } + newLines = append(newLines, line) + } + + // Second pass: remove from service-configs. + lines = newLines + newLines = []string{} + inServiceConfigs := false + var serviceConfigBlock []string + isTargetServiceConfig := false + for _, line := range lines { + if strings.HasPrefix(line, "service-configs:") { + inServiceConfigs = true + newLines = append(newLines, line) + continue + } + if !strings.HasPrefix(line, " ") { // top-level key + if inServiceConfigs { + if !isTargetServiceConfig { + newLines = append(newLines, serviceConfigBlock...) + } + isTargetServiceConfig = false + serviceConfigBlock = nil + } + inServiceConfigs = false + } + + if !inServiceConfigs { + newLines = append(newLines, line) + continue + } + + // In service-configs section + if strings.HasPrefix(line, " - input-directory:") { + if !isTargetServiceConfig { + newLines = append(newLines, serviceConfigBlock...) + } + serviceConfigBlock = []string{line} + isTargetServiceConfig = false + } else { + serviceConfigBlock = append(serviceConfigBlock, line) + } + + if strings.Contains(line, "import-path:") { + path := strings.TrimSpace(strings.Split(line, ":")[1]) + if strings.HasPrefix(path, "cloud.google.com/go/"+moduleName+"/") { + isTargetServiceConfig = true + } + } + } + // flush last block + if inServiceConfigs && !isTargetServiceConfig { + newLines = append(newLines, serviceConfigBlock...) + } + + // Third pass: add to skip-module-scan-paths. + lines = newLines + newLines = []string{} + skipScanPathsIndex := -1 + librarianReleasedIndex := -1 + for i, line := range lines { + if strings.HasPrefix(line, "skip-module-scan-paths:") { + skipScanPathsIndex = i + } + if skipScanPathsIndex != -1 && strings.TrimSpace(line) == "# Librarian released modules" { + librarianReleasedIndex = i + break // Found it, no need to continue. + } + } + + if skipScanPathsIndex == -1 || librarianReleasedIndex == -1 { + return fmt.Errorf("'skip-module-scan-paths:' or '# Librarian released modules' not found in postprocessor config") + } + + // Reconstruct the file with the new line added. + newLines = append(newLines, lines[:librarianReleasedIndex+1]...) + newLines = append(newLines, " - "+moduleName) + newLines = append(newLines, lines[librarianReleasedIndex+1:]...) + + output := strings.Join(newLines, "\n") + if bytes.Equal([]byte(output), fileBytes) { + return nil + } + + return os.WriteFile(configPath, []byte(output), 0644) +} + +// cleanupOwlBotYaml removes entries for a given module from the +// .github/.OwlBot.yaml file. +func cleanupOwlBotYaml(repoRoot, moduleName string) error { + owlBotPath := filepath.Join(repoRoot, ".github", ".OwlBot.yaml") + fileBytes, err := os.ReadFile(owlBotPath) + if err != nil { + return err + } + + modulePathFragment := "/" + moduleName + "/" + lines := strings.Split(string(fileBytes), "\n") + var newLines []string + for i := 0; i < len(lines); i++ { + line := lines[i] + if strings.Contains(line, "source:") { + // It's a source line, check it for the module name. + if strings.Contains(line, modulePathFragment) { + if i+1 < len(lines) { + i++ // Remove both source and dest lines. + } + continue + } + } + if strings.Contains(line, modulePathFragment) { + // Remove any non-source line containing the module name. + continue + } + newLines = append(newLines, line) + } + + output := strings.Join(newLines, "\n") + if bytes.Equal([]byte(output), fileBytes) { + return nil + } + return os.WriteFile(owlBotPath, []byte(output), 0644) +} diff --git a/internal/stategen/cleanup_test.go b/internal/stategen/cleanup_test.go new file mode 100644 index 000000000000..ac89ce6cecc5 --- /dev/null +++ b/internal/stategen/cleanup_test.go @@ -0,0 +1,77 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "os" + "path/filepath" + "testing" + + "github.com/google/go-cmp/cmp" +) + +const ( + // Test using `ai` because it is a substring of `aiplatform`. + testModuleName = "ai" +) + +func TestCleanupLegacyConfigs(t *testing.T) { + t.Parallel() + // Create a temporary directory for the test repo. + repoRoot := t.TempDir() + + // Set up the initial directory structure and copy testdata files. + files := []string{ + ".github/.OwlBot.yaml", + "internal/postprocessor/config.yaml", + "release-please-config-individual.json", + "release-please-config-yoshi-submodules.json", + ".release-please-manifest-individual.json", + ".release-please-manifest-submodules.json", + } + + for _, f := range files { + content, err := os.ReadFile("testdata/source/" + f) + if err != nil { + t.Fatalf("Failed to read testdata file %s: %v", f, err) + } + destPath := filepath.Join(repoRoot, f) + if err := os.MkdirAll(filepath.Dir(destPath), 0755); err != nil { + t.Fatalf("Failed to create directory for %s: %v", f, err) + } + if err := os.WriteFile(destPath, content, 0644); err != nil { + t.Fatalf("Failed to write initial file %s: %v", f, err) + } + } + + if err := cleanupLegacyConfigs(repoRoot, testModuleName); err != nil { + t.Fatalf("cleanupLegacyConfigs failed: %v", err) + } + + for _, f := range files { + got, err := os.ReadFile(filepath.Join(repoRoot, f)) + if err != nil { + t.Fatalf("Failed to read modified file %s: %v", f, err) + } + gf := "testdata/golden/" + f + want, err := os.ReadFile(gf) + if err != nil { + t.Fatalf("Failed to read golden file %s: %v", gf, err) + } + if diff := cmp.Diff(string(want), string(got)); diff != "" { + t.Errorf("File %s mismatch (-want +got):\n%s", f, diff) + } + } +} diff --git a/internal/stategen/go.mod b/internal/stategen/go.mod index 5b4ed5494267..3e9967b7877b 100644 --- a/internal/stategen/go.mod +++ b/internal/stategen/go.mod @@ -2,4 +2,7 @@ module cloud.google.com/go/internal/stategen go 1.24.0 -require gopkg.in/yaml.v3 v3.0.1 +require ( + github.com/google/go-cmp v0.7.0 + gopkg.in/yaml.v3 v3.0.1 +) diff --git a/internal/stategen/go.sum b/internal/stategen/go.sum index a62c313c5b0c..267d9c47c78c 100644 --- a/internal/stategen/go.sum +++ b/internal/stategen/go.sum @@ -1,3 +1,5 @@ +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 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= diff --git a/internal/stategen/main.go b/internal/stategen/main.go index 75aafa54ec37..03cff80ab657 100644 --- a/internal/stategen/main.go +++ b/internal/stategen/main.go @@ -73,10 +73,18 @@ func run(args []string) error { slog.Info("skipping existing module", "module", moduleName) continue } + moduleRoot := filepath.Join(repoRoot, moduleName) + if err := prepareModule(moduleRoot); err != nil { + return fmt.Errorf("preparing module %s: %w", moduleName, err) + } if err := addModule(repoRoot, ppc, state, moduleName, googleapisCommit); err != nil { return err } + if err := cleanupLegacyConfigs(repoRoot, moduleName); err != nil { + return err + } } + return saveLibrarianState(stateFilePath, state) } diff --git a/internal/stategen/prepare.go b/internal/stategen/prepare.go new file mode 100644 index 000000000000..169934c99710 --- /dev/null +++ b/internal/stategen/prepare.go @@ -0,0 +1,120 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bytes" + "fmt" + "io/fs" + "log/slog" + "os" + "os/exec" + "path/filepath" + "strings" +) + +const buildIgnore = "// +build ignore" + +// prepareModule runs a series of cleanup and formatting operations on the given +// moduleRoot directory tree. +func prepareModule(moduleRoot string) error { + slog.Info("preparing module", "path", moduleRoot) + + if err := removeGoExecutePermissions(moduleRoot); err != nil { + return fmt.Errorf("removing execute permissions: %w", err) + } + if err := runGoImports(moduleRoot); err != nil { + return fmt.Errorf("running goimports: %w", err) + } + if err := removeIgnoredGrpcFiles(moduleRoot); err != nil { + return fmt.Errorf("removing ignored gRPC files: %w", err) + } + return nil +} + +// removeGoExecutePermissions runs equivalent of: chmod -x $(find . -name '*.go') +func removeGoExecutePermissions(moduleRoot string) error { + slog.Info("removing execute permissions recursively for *.go", "dir", moduleRoot) + return filepath.WalkDir(moduleRoot, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() || !strings.HasSuffix(d.Name(), ".go") { + return nil + } + info, err := d.Info() + if err != nil { + return err + } + perm := info.Mode().Perm() + // Check if any execute bit is set + if perm&0111 != 0 { + slog.Debug("removing execute permission", "file", path) + // Set permissions to current permissions minus execute bits + if err := os.Chmod(path, perm&^0111); err != nil { + return fmt.Errorf("chmod failed for %s: %w", path, err) + } + } + return nil + }) +} + +// runGoImports runs: goimports -w . +func runGoImports(moduleRoot string) error { + slog.Info("running goimports -w .", "dir", moduleRoot) + cmd := exec.Command("goimports", "-w", ".") + cmd.Dir = moduleRoot + var stderr bytes.Buffer + cmd.Stderr = &stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("goimports failed: %w\n%s", err, stderr.String()) + } + return nil +} + +// removeIgnoredGrpcFiles runs the equivalent of: +// +// for file in $(find . -name '*_grpc.pb.go') +// do +// +// if grep -q '// +build ignore' $file +// then +// echo "Deleting $file" +// rm $file +// fi +// +// done +func removeIgnoredGrpcFiles(moduleRoot string) error { + slog.Info("deleting empty *_grpc.pb.go files", "dir", moduleRoot) + return filepath.WalkDir(moduleRoot, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() || !strings.HasSuffix(d.Name(), "_grpc.pb.go") { + return nil + } + content, err := os.ReadFile(path) + if err != nil { + return fmt.Errorf("reading %s: %w", path, err) + } + if strings.Contains(string(content), buildIgnore) { + slog.Debug("deleting empty *_grpc.pb.go file", "file", path) + if err := os.Remove(path); err != nil { + return fmt.Errorf("deleting %s: %w", path, err) + } + } + return nil + }) +} diff --git a/internal/stategen/testdata/golden/.github/.OwlBot.yaml b/internal/stategen/testdata/golden/.github/.OwlBot.yaml new file mode 100644 index 000000000000..4802a718dafd --- /dev/null +++ b/internal/stategen/testdata/golden/.github/.OwlBot.yaml @@ -0,0 +1,1374 @@ +docker: + image: gcr.io/cloud-devrel-public-resources/owlbot-go:latest + +deep-remove-regex: + - /accessapproval/apiv1/ + - /accesscontextmanager/apiv1/ + - /aiplatform/apiv1/ + - /aiplatform/apiv1beta1/ + - /advisorynotifications/apiv1/ + - /alloydb/apiv1/ + - /alloydb/apiv1alpha/ + - /alloydb/apiv1beta/ + - /alloydb/connectors/apiv1/ + - /alloydb/connectors/apiv1alpha/ + - /alloydb/connectors/apiv1beta/ + - /analytics/admin/apiv1alpha/ + - /apigateway/apiv1/ + - /apigeeconnect/apiv1/ + - /apigeeregistry/apiv1/ + - /apihub/apiv1/ + - /apikeys/apiv2/ + - /appengine/apiv1/ + - /apphub/apiv1/ + - /apps/events/subscriptions/apiv1/ + - /apps/events/subscriptions/apiv1beta/ + - /apps/meet/apiv2/ + - /apps/meet/apiv2beta/ + - /area120/tables/apiv1alpha1/ + - /artifactregistry/apiv1/ + - /artifactregistry/apiv1beta2/ + - /asset/apiv1/ + - /asset/apiv1p2beta1/ + - /asset/apiv1p5beta1/ + - /assuredworkloads/apiv1/ + - /assuredworkloads/apiv1beta1/ + - /automl/apiv1/ + - /automl/apiv1beta1/ + - /backupdr/apiv1/ + - /baremetalsolution/apiv2/ + - /batch/apiv1/ + - /beyondcorp/appconnections/apiv1/ + - /beyondcorp/appconnectors/apiv1/ + - /beyondcorp/appgateways/apiv1/ + - /beyondcorp/clientconnectorservices/apiv1/ + - /beyondcorp/clientgateways/apiv1/ + - /bigquery/analyticshub/apiv1/ + - /bigquery/biglake/apiv1/ + - /bigquery/biglake/apiv1alpha1/ + - /bigquery/connection/apiv1/ + - /bigquery/connection/apiv1beta1/ + - /bigquery/dataexchange/apiv1beta1/ + - /bigquery/datapolicies/apiv1/ + - /bigquery/datapolicies/apiv1beta1/ + - /bigquery/datapolicies/apiv2/ + - /bigquery/datapolicies/apiv2beta1/ + - /bigquery/datatransfer/apiv1/ + - /bigquery/migration/apiv2/ + - /bigquery/migration/apiv2alpha/ + - /bigquery/reservation/apiv1/ + - /bigquery/storage/apiv1/ + - /bigquery/storage/apiv1alpha/ + - /bigquery/storage/apiv1beta/ + - /bigquery/storage/apiv1beta1/ + - /bigquery/storage/apiv1beta2/ + - /bigquery/v2/apiv2/ + - /bigtable/admin/apiv2/ + - /bigtable/apiv2/ + - /billing/apiv1/ + - /billing/budgets/apiv1/ + - /billing/budgets/apiv1beta1/ + - /binaryauthorization/apiv1/ + - /binaryauthorization/apiv1beta1/ + - /capacityplanner/apiv1beta/ + - /certificatemanager/apiv1/ + - /channel/apiv1/ + - /chat/apiv1/ + - /chronicle/apiv1/ + - /cloudbuild/apiv1/v2/ + - /cloudbuild/apiv2/ + - /cloudcontrolspartner/apiv1/ + - /cloudcontrolspartner/apiv1beta/ + - /clouddms/apiv1/ + - /cloudprofiler/apiv2/ + - /cloudquotas/apiv1/ + - /cloudquotas/apiv1beta/ + - /cloudtasks/apiv2/ + - /cloudtasks/apiv2beta2/ + - /cloudtasks/apiv2beta3/ + - /commerce/consumer/procurement/apiv1 + - /compute/apiv1 + - /compute/apiv1beta + - /confidentialcomputing/apiv1 + - /confidentialcomputing/apiv1alpha1 + - /config/apiv1/ + - /configdelivery/apiv1/ + - /configdelivery/apiv1beta/ + - /contactcenterinsights/apiv1/ + - /container/apiv1/ + - /containeranalysis/apiv1beta1/ + - /datacatalog/apiv1/ + - /datacatalog/apiv1beta1/ + - /datacatalog/lineage/apiv1/ + - /dataflow/apiv1beta3/ + - /dataform/apiv1/ + - /dataform/apiv1beta1/ + - /datafusion/apiv1/ + - /datalabeling/apiv1beta1/ + - /dataplex/apiv1/ + - /dataproc/apiv1/ + - /dataqna/apiv1alpha/ + - /datastore/admin/apiv1/ + - /datastore/apiv1/ + - /datastream/apiv1/ + - /datastream/apiv1alpha1/ + - /deploy/apiv1/ + - /developerconnect/apiv1/ + - /devicestreaming/apiv1/ + - /dialogflow/apiv2/ + - /dialogflow/apiv2beta1/ + - /dialogflow/cx/apiv3/ + - /dialogflow/cx/apiv3beta1/ + - /discoveryengine/apiv1/ + - /discoveryengine/apiv1beta/ + - /discoveryengine/apiv1alpha/ + - /documentai/apiv1/ + - /documentai/apiv1beta3/ + - /domains/apiv1beta1/ + - /edgecontainer/apiv1/ + - /edgenetwork/apiv1/ + # - /errorreporting/apiv1beta1/ + - /essentialcontacts/apiv1/ + - /eventarc/apiv1/ + - /eventarc/publishing/apiv1/ + - /filestore/apiv1/ + - /financialservices/apiv1/ + - /firestore/apiv1/ + - /firestore/apiv1/admin/ + - /functions/apiv1/ + - /functions/apiv2/ + - /functions/apiv2beta/ + - /geminidataanalytics/apiv1beta/ + - /gkebackup/apiv1/ + - /gkeconnect/gateway/apiv1beta1/ + - /gkeconnect/gateway/apiv1/ + - /gkehub/apiv1beta1/ + - /gkemulticloud/apiv1/ + - /gsuiteaddons/apiv1/ + - /iam/apiv1/ + - /iam/apiv2/ + - /iam/apiv3/ + - /iam/apiv3beta/ + - /iam/credentials/apiv1/ + - /iap/apiv1/ + - /identitytoolkit/apiv2/ + - /ids/apiv1/ + # START snippets + - /internal/generated/snippets/accessapproval/apiv1/ + - /internal/generated/snippets/accesscontextmanager/apiv1/ + - /internal/generated/snippets/aiplatform/apiv1/ + - /internal/generated/snippets/aiplatform/apiv1beta1/ + - /internal/generated/snippets/advisorynotifications/apiv1/ + - /internal/generated/snippets/alloydb/apiv1/ + - /internal/generated/snippets/alloydb/apiv1alpha/ + - /internal/generated/snippets/alloydb/apiv1beta/ + - /internal/generated/snippets/analytics/admin/apiv1alpha/ + - /internal/generated/snippets/apigateway/apiv1/ + - /internal/generated/snippets/apigeeconnect/apiv1/ + - /internal/generated/snippets/apigeeregistry/apiv1/ + - /internal/generated/snippets/apihub/apiv1/ + - /internal/generated/snippets/apikeys/apiv2/ + - /internal/generated/snippets/appengine/apiv1/ + - /internal/generated/snippets/apphub/apiv1/ + - /internal/generated/snippets/apps/events/subscriptions/apiv1/ + - /internal/generated/snippets/apps/events/subscriptions/apiv1beta/ + - /internal/generated/snippets/apps/meet/apiv2/ + - /internal/generated/snippets/apps/meet/apiv2beta/ + - /internal/generated/snippets/area120/tables/apiv1alpha1/ + - /internal/generated/snippets/artifactregistry/apiv1/ + - /internal/generated/snippets/artifactregistry/apiv1beta2/ + - /internal/generated/snippets/asset/apiv1/ + - /internal/generated/snippets/asset/apiv1p2beta1/ + - /internal/generated/snippets/asset/apiv1p5beta1/ + - /internal/generated/snippets/assuredworkloads/apiv1/ + - /internal/generated/snippets/assuredworkloads/apiv1beta1/ + - /internal/generated/snippets/automl/apiv1/ + - /internal/generated/snippets/automl/apiv1beta1/ + - /internal/generated/snippets/backupdr/apiv1/ + - /internal/generated/snippets/baremetalsolution/apiv2/ + - /internal/generated/snippets/batch/apiv1/ + - /internal/generated/snippets/beyondcorp/appconnections/apiv1/ + - /internal/generated/snippets/beyondcorp/appconnectors/apiv1/ + - /internal/generated/snippets/beyondcorp/appgateways/apiv1/ + - /internal/generated/snippets/beyondcorp/clientconnectorservices/apiv1/ + - /internal/generated/snippets/beyondcorp/clientgateways/apiv1/ + - /internal/generated/snippets/bigquery/analyticshub/apiv1/ + - /internal/generated/snippets/bigquery/biglake/apiv1/ + - /internal/generated/snippets/bigquery/biglake/apiv1alpha1/ + - /internal/generated/snippets/bigquery/connection/apiv1/ + - /internal/generated/snippets/bigquery/connection/apiv1beta1/ + - /internal/generated/snippets/bigquery/dataexchange/apiv1beta1/ + - /internal/generated/snippets/bigquery/datapolicies/apiv1/ + - /internal/generated/snippets/bigquery/datapolicies/apiv1beta1/ + - /internal/generated/snippets/bigquery/datapolicies/apiv2/ + - /internal/generated/snippets/bigquery/datapolicies/apiv2beta1/ + - /internal/generated/snippets/bigquery/datatransfer/apiv1/ + - /internal/generated/snippets/bigquery/migration/apiv2/ + - /internal/generated/snippets/bigquery/migration/apiv2alpha/ + - /internal/generated/snippets/bigquery/reservation/apiv1/ + - /internal/generated/snippets/bigquery/storage/apiv1/ + - /internal/generated/snippets/bigquery/storage/apiv1alpha/ + - /internal/generated/snippets/bigquery/storage/apiv1beta/ + - /internal/generated/snippets/bigquery/storage/apiv1beta1/ + - /internal/generated/snippets/bigquery/storage/apiv1beta2/ + - /internal/generated/snippets/bigquery/v2/apiv2/ + - /internal/generated/snippets/billing/apiv1/ + - /internal/generated/snippets/billing/budgets/apiv1/ + - /internal/generated/snippets/billing/budgets/apiv1beta1/ + - /internal/generated/snippets/binaryauthorization/apiv1/ + - /internal/generated/snippets/binaryauthorization/apiv1beta1/ + - /internal/generated/snippets/capacityplanner/apiv1beta/ + - /internal/generated/snippets/certificatemanager/apiv1/ + - /internal/generated/snippets/channel/apiv1/ + - /internal/generated/snippets/chat/apiv1/ + - /internal/generated/snippets/chronicle/apiv1/ + - /internal/generated/snippets/cloudbuild/apiv1/v2/ + - /internal/generated/snippets/cloudbuild/apiv2/ + - /internal/generated/snippets/cloudcontrolspartner/apiv1/ + - /internal/generated/snippets/cloudcontrolspartner/apiv1beta/ + - /internal/generated/snippets/clouddms/apiv1/ + - /internal/generated/snippets/cloudprofiler/apiv2/ + - /internal/generated/snippets/cloudquotas/apiv1/ + - /internal/generated/snippets/cloudquotas/apiv1beta/ + - /internal/generated/snippets/cloudtasks/apiv2/ + - /internal/generated/snippets/cloudtasks/apiv2beta2/ + - /internal/generated/snippets/cloudtasks/apiv2beta3/ + - /internal/generated/snippets/commerce/consumer/procurement/apiv1 + - /internal/generated/snippets/compute/apiv1 + - /internal/generated/snippets/compute/apiv1beta + - /internal/generated/snippets/confidentialcomputing/apiv1 + - /internal/generated/snippets/confidentialcomputing/apiv1alpha1 + - /internal/generated/snippets/config/apiv1/ + - /internal/generated/snippets/configdelivery/apiv1/ + - /internal/generated/snippets/configdelivery/apiv1beta/ + - /internal/generated/snippets/contactcenterinsights/apiv1/ + - /internal/generated/snippets/container/apiv1/ + - /internal/generated/snippets/containeranalysis/apiv1beta1/ + - /internal/generated/snippets/datacatalog/apiv1/ + - /internal/generated/snippets/datacatalog/apiv1beta1/ + - /internal/generated/snippets/datacatalog/lineage/apiv1/ + - /internal/generated/snippets/dataflow/apiv1beta3/ + - /internal/generated/snippets/dataform/apiv1/ + - /internal/generated/snippets/dataform/apiv1beta1/ + - /internal/generated/snippets/datafusion/apiv1/ + - /internal/generated/snippets/datalabeling/apiv1beta1/ + - /internal/generated/snippets/dataplex/apiv1/ + - /internal/generated/snippets/dataproc/apiv1/ + - /internal/generated/snippets/dataqna/apiv1alpha/ + - /internal/generated/snippets/datastore/admin/apiv1/ + - /internal/generated/snippets/datastream/apiv1/ + - /internal/generated/snippets/datastream/apiv1alpha1/ + - /internal/generated/snippets/deploy/apiv1/ + - /internal/generated/snippets//developerconnect/apiv1/ + - /internal/generated/snippets//devicestreaming/apiv1/ + - /internal/generated/snippets/dialogflow/apiv2/ + - /internal/generated/snippets/dialogflow/apiv2beta1/ + - /internal/generated/snippets/dialogflow/cx/apiv3/ + - /internal/generated/snippets/dialogflow/cx/apiv3beta1/ + - /internal/generated/snippets/discoveryengine/apiv1/ + - /internal/generated/snippets/discoveryengine/apiv1beta/ + - /internal/generated/snippets/discoveryengine/apiv1alpha/ + - /internal/generated/snippets/documentai/apiv1/ + - /internal/generated/snippets/documentai/apiv1beta3/ + - /internal/generated/snippets/domains/apiv1beta1/ + - /internal/generated/snippets/edgecontainer/apiv1/ + - /internal/generated/snippets/edgenetwork/apiv1/ + # - /internal/generated/snippets/errorreporting/apiv1beta1/ + - /internal/generated/snippets/essentialcontacts/apiv1/ + - /internal/generated/snippets/eventarc/apiv1/ + - /internal/generated/snippets/eventarc/publishing/apiv1/ + - /internal/generated/snippets/filestore/apiv1/ + - /internal/generated/snippets/financialservices/apiv1/ + - /internal/generated/snippets/firestore/apiv1/ + - /internal/generated/snippets/firestore/apiv1/admin/ + - /internal/generated/snippets/functions/apiv1/ + - /internal/generated/snippets/functions/apiv2/ + - /internal/generated/snippets/functions/apiv2beta/ + - /internal/generated/snippets/geminidataanalytics/apiv1beta/ + - /internal/generated/snippets/gkebackup/apiv1/ + - /internal/generated/snippets/gkeconnect/gateway/apiv1beta1/ + - /internal/generated/snippets/gkeconnect/gateway/apiv1/ + - /internal/generated/snippets/gkehub/apiv1beta1/ + - /internal/generated/snippets/gkemulticloud/apiv1/ + - /internal/generated/snippets/gsuiteaddons/apiv1/ + - /internal/generated/snippets/iam/apiv1/ + - /internal/generated/snippets/iam/apiv2/ + - /internal/generated/snippets/iam/apiv3/ + - /internal/generated/snippets/iam/apiv3beta/ + - /internal/generated/snippets/iam/credentials/apiv1/ + - /internal/generated/snippets/iap/apiv1/ + - /internal/generated/snippets/identitytoolkit/apiv2/ + - /internal/generated/snippets/ids/apiv1/ + - /internal/generated/snippets/iot/apiv1/ + - /internal/generated/snippets/kms/apiv1/ + - /internal/generated/snippets/kms/inventory/apiv1/ + - /internal/generated/snippets/language/apiv1/ + - /internal/generated/snippets/language/apiv1beta2/ + - /internal/generated/snippets/language/apiv2/ + - /internal/generated/snippets/licensemanager/apiv1/ + - /internal/generated/snippets/lifesciences/apiv2beta/ + - /internal/generated/snippets/locationfinder/apiv1/ + - /internal/generated/snippets/logging/apiv2/ + - /internal/generated/snippets/longrunning/autogen/ + - /internal/generated/snippets/lustre/apiv1/ + - /internal/generated/snippets/maintenance/api/apiv1beta/ + - /internal/generated/snippets/managedidentities/apiv1/ + - /internal/generated/snippets/managedkafka/apiv1/ + - /internal/generated/snippets/managedkafka/schemaregistry/apiv1/ + - /internal/generated/snippets/maps/addressvalidation/apiv1/ + - /internal/generated/snippets/maps/areainsights/apiv1/ + - /internal/generated/snippets/maps/fleetengine/apiv1/ + - /internal/generated/snippets/maps/fleetengine/delivery/apiv1/ + - /internal/generated/snippets/maps/places/apiv1/ + - /internal/generated/snippets/maps/routeoptimization/apiv1/ + - /internal/generated/snippets/maps/routing/apiv2/ + - /internal/generated/snippets/maps/solar/apiv1/ + - /internal/generated/snippets/mediatranslation/apiv1beta1/ + - /internal/generated/snippets/memcache/apiv1/ + - /internal/generated/snippets/memcache/apiv1beta2/ + - /internal/generated/snippets/memorystore/apiv1/ + - /internal/generated/snippets/memorystore/apiv1beta/ + - /internal/generated/snippets/metastore/apiv1/ + - /internal/generated/snippets/metastore/apiv1alpha/ + - /internal/generated/snippets/metastore/apiv1beta/ + - /internal/generated/snippets/migrationcenter/apiv1/ + - /internal/generated/snippets/monitoring/apiv3/v2/ + - /internal/generated/snippets/monitoring/dashboard/apiv1/ + - /internal/generated/snippets/monitoring/metricsscope/apiv1/ + - /internal/generated/snippets/netapp/apiv1/ + - /internal/generated/snippets/networkconnectivity/apiv1/ + - /internal/generated/snippets/networkconnectivity/apiv1alpha1/ + - /internal/generated/snippets/networkmanagement/apiv1/ + - /internal/generated/snippets/networksecurity/apiv1beta1/ + - /internal/generated/snippets/networkservices/apiv1/ + - /internal/generated/snippets/notebooks/apiv1/ + - /internal/generated/snippets/notebooks/apiv1beta1/ + - /internal/generated/snippets/notebooks/apiv2/ + - /internal/generated/snippets/optimization/apiv1/ + - /internal/generated/snippets/oracledatabase/apiv1/ + - /internal/generated/snippets/orchestration/airflow/service/apiv1/ + - /internal/generated/snippets/orgpolicy/apiv2/ + - /internal/generated/snippets/osconfig/agentendpoint/apiv1/ + - /internal/generated/snippets/osconfig/agentendpoint/apiv1beta/ + - /internal/generated/snippets/osconfig/apiv1/ + - /internal/generated/snippets/osconfig/apiv1alpha/ + - /internal/generated/snippets/osconfig/apiv1beta/ + - /internal/generated/snippets/oslogin/apiv1/ + - /internal/generated/snippets/oslogin/apiv1beta/ + - /internal/generated/snippets/parallelstore/apiv1/ + - /internal/generated/snippets/parallelstore/apiv1beta/ + - /internal/generated/snippets/parametermanager/apiv1/ + - /internal/generated/snippets/phishingprotection/apiv1beta1/ + - /internal/generated/snippets/policysimulator/apiv1/ + - /internal/generated/snippets/policytroubleshooter/apiv1/ + - /internal/generated/snippets/policytroubleshooter/iam/apiv3/ + - /internal/generated/snippets/privatecatalog/apiv1beta1/ + - /internal/generated/snippets/privilegedaccessmanager/apiv1/ + - /internal/generated/snippets/pubsub/apiv1/ + - /internal/generated/snippets/pubsublite/apiv1/ + - /internal/generated/snippets/rapidmigrationassessment/apiv1/ + - /internal/generated/snippets/recaptchaenterprise/apiv1/ + - /internal/generated/snippets/recaptchaenterprise/apiv1beta1/ + - /internal/generated/snippets/recommendationengine/apiv1beta1/ + - /internal/generated/snippets/recommender/apiv1/ + - /internal/generated/snippets/recommender/apiv1beta1/ + - /internal/generated/snippets/redis/apiv1/ + - /internal/generated/snippets/redis/apiv1beta1/ + - /internal/generated/snippets/redis/cluster/apiv1/ + - /internal/generated/snippets/resourcemanager/apiv2/ + - /internal/generated/snippets/resourcemanager/apiv3/ + - /internal/generated/snippets/retail/apiv2/ + - /internal/generated/snippets/retail/apiv2alpha/ + - /internal/generated/snippets/retail/apiv2beta/ + - /internal/generated/snippets/run/apiv2/ + - /internal/generated/snippets/scheduler/apiv1/ + - /internal/generated/snippets/scheduler/apiv1beta1/ + - /internal/generated/snippets/secretmanager/apiv1/ + - /internal/generated/snippets/secretmanager/apiv1beta2/ + - /internal/generated/snippets/securesourcemanager/apiv1/ + - /internal/generated/snippets/security/privateca/apiv1/ + - /internal/generated/snippets/security/publicca/apiv1beta1/ + - /internal/generated/snippets/security/publicca/apiv1/ + - /internal/generated/snippets/securitycenter/apiv1/ + - /internal/generated/snippets/securitycenter/apiv1beta1/ + - /internal/generated/snippets/securitycenter/apiv1p1beta1/ + - /internal/generated/snippets/securitycenter/apiv2/ + - /internal/generated/snippets/securitycenter/settings/apiv1beta1/ + - /internal/generated/snippets/securitycentermanagement/apiv1/ + - /internal/generated/snippets/securityposture/apiv1/ + - /internal/generated/snippets/servicecontrol/apiv1/ + - /internal/generated/snippets/servicedirectory/apiv1/ + - /internal/generated/snippets/servicedirectory/apiv1beta1/ + - /internal/generated/snippets/servicehealth/apiv1/ + - /internal/generated/snippets/servicemanagement/apiv1/ + - /internal/generated/snippets/serviceusage/apiv1/ + - /internal/generated/snippets/shell/apiv1/ + - /internal/generated/snippets/shopping/css/apiv1/ + - /internal/generated/snippets/shopping/merchant/accounts/apiv1/ + - /internal/generated/snippets/shopping/merchant/accounts/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/conversions/apiv1/ + - /internal/generated/snippets/shopping/merchant/conversions/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/datasources/apiv1/ + - /internal/generated/snippets/shopping/merchant/datasources/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/notifications/apiv1/ + - /internal/generated/snippets/shopping/merchant/notifications/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/ordertracking/apiv1/ + - /internal/generated/snippets/shopping/merchant/ordertracking/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/products/apiv1/ + - /internal/generated/snippets/shopping/merchant/products/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/productstudio/apiv1alpha/ + - /internal/generated/snippets/shopping/merchant/promotions/apiv1/ + - /internal/generated/snippets/shopping/merchant/promotions/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/quota/apiv1/ + - /internal/generated/snippets/shopping/merchant/quota/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/inventories/apiv1/ + - /internal/generated/snippets/shopping/merchant/inventories/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/issueresolution/apiv1/ + - /internal/generated/snippets/shopping/merchant/issueresolution/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/reports/apiv1/ + - /internal/generated/snippets/shopping/merchant/reports/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/reviews/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/lfp/apiv1/ + - /internal/generated/snippets/shopping/merchant/lfp/apiv1beta/ + - /internal/generated/snippets/spanner/adapter/apiv1/ + - /internal/generated/snippets/spanner/admin/database/apiv1/ + - /internal/generated/snippets/spanner/admin/instance/apiv1/ + - /internal/generated/snippets/spanner/apiv1/ + - /internal/generated/snippets/speech/apiv1/ + - /internal/generated/snippets/speech/apiv1p1beta1/ + - /internal/generated/snippets/speech/apiv2/ + - /internal/generated/snippets/storage/control/apiv2/ + - /internal/generated/snippets/storagebatchoperations/apiv1/ + - /internal/generated/snippets/storageinsights/apiv1/ + - /internal/generated/snippets/storagetransfer/apiv1/ + - /internal/generated/snippets/streetview/publish/apiv1/ + - /internal/generated/snippets/support/apiv2/ + - /internal/generated/snippets/support/apiv2beta/ + - /internal/generated/snippets/talent/apiv4/ + - /internal/generated/snippets/talent/apiv4beta1/ + - /internal/generated/snippets/telcoautomation/apiv1/ + - /internal/generated/snippets/texttospeech/apiv1/ + - /internal/generated/snippets/tpu/apiv1/ + - /internal/generated/snippets/trace/apiv1/ + - /internal/generated/snippets/trace/apiv2/ + - /internal/generated/snippets/translate/apiv3/ + - /internal/generated/snippets/video/livestream/apiv1/ + - /internal/generated/snippets/video/stitcher/apiv1/ + - /internal/generated/snippets/video/transcoder/apiv1/ + - /internal/generated/snippets/videointelligence/apiv1/ + - /internal/generated/snippets/videointelligence/apiv1beta2/ + - /internal/generated/snippets/videointelligence/apiv1p3beta1/ + - /internal/generated/snippets/vision/v2/apiv1/ + - /internal/generated/snippets/vision/v2/apiv1p1beta1/ + - /internal/generated/snippets/visionai/apiv1/ + - /internal/generated/snippets/vmmigration/apiv1/ + - /internal/generated/snippets/vmwareengine/apiv1/ + - /internal/generated/snippets/vpcaccess/apiv1/ + - /internal/generated/snippets/webrisk/apiv1/ + - /internal/generated/snippets/webrisk/apiv1beta1/ + - /internal/generated/snippets/websecurityscanner/apiv1/ + - /internal/generated/snippets/workflows/apiv1/ + - /internal/generated/snippets/workflows/apiv1beta/ + - /internal/generated/snippets/workflows/executions/apiv1/ + - /internal/generated/snippets/workflows/executions/apiv1beta/ + - /internal/generated/snippets/workstations/apiv1/ + - /internal/generated/snippets/workstations/apiv1beta/ + # END snippets + - /iot/apiv1/ + - /kms/apiv1/ + - /kms/inventory/apiv1/ + - /language/apiv1/ + - /language/apiv1beta2/ + - /language/apiv2/ + - /licensemanager/apiv1/ + - /lifesciences/apiv2beta/ + - /locationfinder/apiv1/ + - /logging/apiv2/ + - /longrunning/autogen/ + - /lustre/apiv1/ + - /maintenance/api/apiv1beta/ + - /managedidentities/apiv1/ + - /managedkafka/apiv1/ + - /managedkafka/schemaregistry/apiv1/ + - /maps/addressvalidation/apiv1/ + - /maps/areainsights/apiv1/ + - /maps/fleetengine/apiv1/ + - /maps/fleetengine/delivery/apiv1/ + - /maps/places/apiv1/ + - /maps/routeoptimization/apiv1/ + - /maps/routing/apiv2/ + - /maps/solar/apiv1/ + - /mediatranslation/apiv1beta1/ + - /memcache/apiv1/ + - /memcache/apiv1beta2/ + - /memorystore/apiv1/ + - /memorystore/apiv1beta/ + - /metastore/apiv1/ + - /metastore/apiv1alpha/ + - /metastore/apiv1beta/ + - /migrationcenter/apiv1/ + - /modelarmor/apiv1/ + - /modelarmor/apiv1beta/ + - /monitoring/apiv3/v2/ + - /monitoring/dashboard/apiv1/ + - /monitoring/metricsscope/apiv1/ + - /netapp/apiv1/ + - /networkconnectivity/apiv1/ + - /networkconnectivity/apiv1alpha1/ + - /networkmanagement/apiv1/ + - /networksecurity/apiv1beta1/ + - /networkservices/apiv1/ + - /notebooks/apiv1/ + - /notebooks/apiv1beta1/ + - /notebooks/apiv2/ + - /optimization/apiv1/ + - /oracledatabase/apiv1/ + - /orchestration/airflow/service/apiv1/ + - /orgpolicy/apiv1/ + - /orgpolicy/apiv2/ + - /osconfig/agentendpoint/apiv1/ + - /osconfig/agentendpoint/apiv1beta/ + - /osconfig/apiv1/ + - /osconfig/apiv1alpha/ + - /osconfig/apiv1beta/ + - /oslogin/apiv1/ + - /oslogin/apiv1beta/ + - /oslogin/common/ + - /parallelstore/apiv1/ + - /parallelstore/apiv1beta/ + - /parametermanager/apiv1/ + - /phishingprotection/apiv1beta1/ + - /policysimulator/apiv1/ + - /policytroubleshooter/apiv1/ + - /policytroubleshooter/iam/apiv3/ + - /privatecatalog/apiv1beta1/ + - /privilegedaccessmanager/apiv1/ + - /pubsub/v2/apiv1/ + - /pubsublite/apiv1/ + - /rapidmigrationassessment/apiv1/ + - /recaptchaenterprise/apiv1/ + - /recaptchaenterprise/apiv1beta1/ + - /recommendationengine/apiv1beta1/ + - /recommender/apiv1/ + - /recommender/apiv1beta1/ + - /redis/apiv1/ + - /redis/apiv1beta1/ + - /redis/cluster/apiv1/ + - /resourcemanager/apiv2/ + - /resourcemanager/apiv3/ + - /retail/apiv2/ + - /retail/apiv2alpha/ + - /retail/apiv2beta/ + - /run/apiv2/ + - /scheduler/apiv1/ + - /scheduler/apiv1beta1/ + - /secretmanager/apiv1/ + - /secretmanager/apiv1beta2/ + - /securesourcemanager/apiv1/ + - /security/privateca/apiv1/ + - /security/publicca/apiv1beta1/ + - /security/publicca/apiv1/ + - /securitycenter/apiv1/ + - /securitycenter/apiv1beta1/ + - /securitycenter/apiv1p1beta1/ + - /securitycenter/apiv2/ + - /securitycenter/settings/apiv1beta1/ + - /securitycentermanagement/apiv1/ + - /securityposture/apiv1/ + - /servicecontrol/apiv1/ + - /servicedirectory/apiv1/ + - /servicedirectory/apiv1beta1/ + - /servicehealth/apiv1/ + - /servicemanagement/apiv1/ + - /serviceusage/apiv1/ + - /shell/apiv1/ + - /shopping/css/apiv1/ + - /shopping/merchant/accounts/apiv1/ + - /shopping/merchant/accounts/apiv1beta/ + - /shopping/merchant/conversions/apiv1/ + - /shopping/merchant/conversions/apiv1beta/ + - /shopping/merchant/datasources/apiv1/ + - /shopping/merchant/datasources/apiv1beta/ + - /shopping/merchant/notifications/apiv1/ + - /shopping/merchant/notifications/apiv1beta/ + - /shopping/merchant/ordertracking/apiv1/ + - /shopping/merchant/ordertracking/apiv1beta/ + - /shopping/merchant/products/apiv1/ + - /shopping/merchant/products/apiv1beta/ + - /shopping/merchant/productstudio/apiv1alpha/ + - /shopping/merchant/promotions/apiv1/ + - /shopping/merchant/promotions/apiv1beta/ + - /shopping/merchant/quota/apiv1/ + - /shopping/merchant/quota/apiv1beta/ + - /shopping/merchant/inventories/apiv1/ + - /shopping/merchant/inventories/apiv1beta/ + - /shopping/merchant/issueresolution/apiv1/ + - /shopping/merchant/issueresolution/apiv1beta/ + - /shopping/merchant/lfp/apiv1/ + - /shopping/merchant/lfp/apiv1beta/ + - /shopping/merchant/reports/apiv1/ + - /shopping/merchant/reports/apiv1beta/ + - /shopping/merchant/reviews/apiv1beta/ + - /shopping/type/ + - /spanner/adapter/apiv1/ + - /spanner/admin/database/apiv1/ + - /spanner/admin/instance/apiv1/ + - /spanner/apiv1/ + - /spanner/executor/apiv1/ + - /speech/apiv1/ + - /speech/apiv1p1beta1/ + - /speech/apiv2/ + - /storage/control/apiv2/ + - /storage/internal/apiv2/ + - /storagebatchoperations/apiv1/ + - /storageinsights/apiv1/ + - /storagetransfer/apiv1/ + - /streetview/publish/apiv1/ + - /support/apiv2/ + - /support/apiv2beta/ + - /talent/apiv4/ + - /talent/apiv4beta1/ + - /telcoautomation/apiv1/ + - /texttospeech/apiv1/ + - /tpu/apiv1/ + - /trace/apiv1/ + - /trace/apiv2/ + - /translate/apiv3/ + - /video/livestream/apiv1/ + - /video/stitcher/apiv1/ + - /video/transcoder/apiv1/ + - /videointelligence/apiv1/ + - /videointelligence/apiv1beta2/ + - /videointelligence/apiv1p3beta1/ + - /vision/apiv1/ + - /vision/apiv1p1beta1/ + - /visionai/apiv1/ + - /vmmigration/apiv1/ + - /vmwareengine/apiv1/ + - /vpcaccess/apiv1/ + - /webrisk/apiv1/ + - /webrisk/apiv1beta1/ + - /websecurityscanner/apiv1/ + - /workflows/apiv1/ + - /workflows/apiv1beta/ + - /workflows/executions/apiv1/ + - /workflows/executions/apiv1beta/ + - /workstations/apiv1/ + - /workstations/apiv1beta/ + +deep-preserve-regex: + - /.*/info.go + - /.*/path_funcs.go + - /.*/version.go + - /container/apiv1/ListClusters_smoke_test.go + - /kms/apiv1/iam.go + - /kms/apiv1/iam_example_test.go + - /logging/apiv2/WriteLogEntries_smoke_test.go + # TODO(#7336): Remove these networkconnectivity lines once breaking change is handled. + - /networkconnectivity/apiv1/policy_based_routing_client.go + - /networkconnectivity/apiv1/policy_based_routing_client_example_test.go + - /networkconnectivity/apiv1/networkconnectivitypb/policy_based_routing.pb.go + # Preserve pubsub apiv1 until deprecation date in a year even though it's not generated. + - /pubsub/apiv1/.* + - /pubsub/v2/apiv1/iam.go + - /pubsub/v2/apiv1/ListTopics_smoke_test.go + - /secretmanager/apiv1/iam.go + - /secretmanager/apiv1/iam_example_test.go + - /spanner/admin/database/apiv1/backup.go + - /spanner/admin/database/apiv1/backup_test.go + - /spanner/admin/database/apiv1/database.go + - /spanner/admin/database/apiv1/database_test.go + - /spanner/admin/database/apiv1/init.go + - /spanner/admin/database/apiv1/mock_test.go + - /spanner/admin/instance/apiv1/init.go + - /spanner/apiv1/spanner_client_options.go + - /storage/internal/apiv2/metadata.go + - /dataproc/apiv1/longrunning.go + - /longrunning/autogen/from_conn.go + - /containeranalysis/apiv1beta1/grafeas/.* + # Must preserve these even though they aren't generated anymore + - /vmmigration/apiv1/iam_policy_client.go + - /datastream/apiv1/iam_policy_client.go + - /batch/apiv1/iam_policy_client.go + - /datacatalog/apiv1/iam_policy_client.go + - /run/apiv2/locations_client.go + - /datacatalog/apiv1/iam_policy_client.go + - /compute/apiv1/smoke_test.go + +deep-copy-regex: + - source: /google/cloud/accessapproval/v1/cloud.google.com/go + dest: / + - source: /google/identity/accesscontextmanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/aiplatform/v1/cloud.google.com/go + dest: / + - source: /google/cloud/aiplatform/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/advisorynotifications/v1/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/v1/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/connectors/v1/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/connectors/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/connectors/v1beta/cloud.google.com/go + dest: / + - source: /google/analytics/admin/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/apigateway/v1/cloud.google.com/go + dest: / + - source: /google/cloud/apigeeconnect/v1/cloud.google.com/go + dest: / + - source: /google/cloud/apigeeregistry/v1/cloud.google.com/go + dest: / + - source: /google/cloud/asset/v1/cloud.google.com/go + dest: / + - source: /google/cloud/asset/v1p2beta1/cloud.google.com/go + dest: / + - source: /google/cloud/asset/v1p5beta1/cloud.google.com/go + dest: / + - source: /google/cloud/apihub/v1/cloud.google.com/go + dest: / + - source: /google/api/apikeys/v2/cloud.google.com/go + dest: / + - source: /google/api/cloudquotas/v1/cloud.google.com/go + dest: / + - source: /google/api/cloudquotas/v1beta/cloud.google.com/go + dest: / + - source: /google/appengine/v1/cloud.google.com/go + dest: / + - source: /google/cloud/apphub/v1/cloud.google.com/go + dest: / + - source: /google/apps/events/subscriptions/v1/cloud.google.com/go + dest: / + - source: /google/apps/events/subscriptions/v1beta/cloud.google.com/go + dest: / + - source: /google/apps/meet/v2/cloud.google.com/go + dest: / + - source: /google/apps/meet/v2beta/cloud.google.com/go + dest: / + - source: /google/area120/tables/v1alpha1/cloud.google.com/go + dest: / + # Just copy the bigtable protos for now + - source: /google/bigtable/admin/v2/cloud.google.com/go/bigtable/admin/apiv2/adminpb + dest: /bigtable/admin/apiv2/adminpb + - source: /google/bigtable/v2/cloud.google.com/go/bigtable/apiv2/bigtablepb + dest: /bigtable/apiv2/bigtablepb + - source: /google/devtools/artifactregistry/v1/cloud.google.com/go + dest: / + - source: /google/devtools/artifactregistry/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/assuredworkloads/v1/cloud.google.com/go + dest: / + - source: /google/cloud/assuredworkloads/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/automl/v1/cloud.google.com/go + dest: / + - source: /google/cloud/automl/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/backupdr/v1/cloud.google.com/go + dest: / + - source: /google/cloud/baremetalsolution/v2/cloud.google.com/go + dest: / + - source: /google/cloud/batch/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/appconnections/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/appconnectors/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/appgateways/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/clientconnectorservices/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/clientgateways/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/analyticshub/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/biglake/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/biglake/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/connection/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/connection/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/dataexchange/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v2/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v2beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datatransfer/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/migration/v2/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/migration/v2alpha/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/reservation/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/v2/cloud.google.com/go + dest: / + - source: /google/cloud/billing/v1/cloud.google.com/go + dest: / + - source: /google/cloud/billing/budgets/v1/cloud.google.com/go + dest: / + - source: /google/cloud/billing/budgets/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/binaryauthorization/v1/cloud.google.com/go + dest: / + - source: /google/cloud/binaryauthorization/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/capacityplanner/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/certificatemanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/channel/v1/cloud.google.com/go + dest: / + - source: /google/chat/v1/cloud.google.com/go + dest: / + - source: /google/cloud/chronicle/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudbuild/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudbuild/v2/cloud.google.com/go + dest: / + - source: /google/cloud/cloudcontrolspartner/v1/cloud.google.com/go + dest: / + - source: /google/cloud/cloudcontrolspartner/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/clouddms/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudprofiler/v2/cloud.google.com/go + dest: / + - source: /google/cloud/tasks/v2/cloud.google.com/go + dest: / + - source: /google/cloud/tasks/v2beta2/cloud.google.com/go + dest: / + - source: /google/cloud/tasks/v2beta3/cloud.google.com/go + dest: / + - source: /google/cloud/commerce/consumer/procurement/v1/cloud.google.com/go + dest: / + - source: /google/cloud/compute/v1/cloud.google.com/go + dest: / + - source: /google/cloud/compute/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/confidentialcomputing/v1/cloud.google.com/go + dest: / + - source: /google/cloud/confidentialcomputing/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/config/v1/cloud.google.com/go + dest: / + - source: /google/cloud/configdelivery/v1/cloud.google.com/go + dest: / + - source: /google/cloud/configdelivery/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/contactcenterinsights/v1/cloud.google.com/go + dest: / + - source: /google/container/v1/cloud.google.com/go + dest: / + - source: /google/devtools/containeranalysis/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/datacatalog/v1/cloud.google.com/go + dest: / + - source: /google/cloud/datacatalog/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/datacatalog/lineage/v1/cloud.google.com/go + dest: / + - source: /google/dataflow/v1beta3/cloud.google.com/go + dest: / + - source: /google/cloud/dataform/v1/cloud.google.com/go + dest: / + - source: /google/cloud/dataform/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/datafusion/v1/cloud.google.com/go + dest: / + - source: /google/cloud/datalabeling/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/dataplex/v1/cloud.google.com/go + dest: / + - source: /google/cloud/dataproc/v1/cloud.google.com/go/dataproc/v2/apiv1 + dest: /dataproc/apiv1 + - source: /google/cloud/dataproc/v1/cloud.google.com/go/internal/generated/snippets/dataproc/v2/apiv1 + dest: /internal/generated/snippets/dataproc/apiv1 + - source: /google/cloud/dataqna/v1alpha/cloud.google.com/go + dest: / + - source: /google/datastore/admin/v1/cloud.google.com/go + dest: / + # Just copy the datastore protos for now + - source: /google/datastore/v1/cloud.google.com/go/datastore/apiv1/datastorepb + dest: /datastore/apiv1/datastorepb + - source: /google/cloud/datastream/v1/cloud.google.com/go + dest: / + - source: /google/cloud/datastream/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/deploy/v1/cloud.google.com/go + dest: / + - source: /google/cloud/developerconnect/v1/cloud.google.com/go + dest: / + - source: /google/cloud/devicestreaming/v1/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/v2/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/v2beta1/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/cx/v3/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/cx/v3beta1/cloud.google.com/go + dest: / + - source: /google/cloud/discoveryengine/v1/cloud.google.com/go + dest: / + - source: /google/cloud/discoveryengine/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/discoveryengine/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/documentai/v1/cloud.google.com/go + dest: / + - source: /google/cloud/documentai/v1beta3/cloud.google.com/go + dest: / + - source: /google/cloud/domains/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/edgecontainer/v1/cloud.google.com/go + dest: / + - source: /google/cloud/edgenetwork/v1/cloud.google.com/go + dest: / + # - source: /google/devtools/clouderrorreporting/v1beta1/cloud.google.com/go + # dest: / + - source: /google/cloud/essentialcontacts/v1/cloud.google.com/go + dest: / + - source: /google/cloud/eventarc/v1/cloud.google.com/go + dest: / + - source: /google/cloud/eventarc/publishing/v1/cloud.google.com/go + dest: / + - source: /google/cloud/filestore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/financialservices/v1/cloud.google.com/go + dest: / + - source: /google/firestore/v1/cloud.google.com/go + dest: / + - source: /google/firestore/admin/v1/cloud.google.com/go + dest: / + - source: /google/cloud/functions/v1/cloud.google.com/go + dest: / + - source: /google/cloud/functions/v2/cloud.google.com/go + dest: / + - source: /google/cloud/functions/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/geminidataanalytics/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/gkebackup/v1/cloud.google.com/go + dest: / + - source: /google/cloud/gkeconnect/gateway/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/gkeconnect/gateway/v1/cloud.google.com/go + dest: / + - source: /google/cloud/gkehub/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/gkemulticloud/v1/cloud.google.com/go + dest: / + - source: /google/cloud/gsuiteaddons/v1/cloud.google.com/go + dest: / + - source: /google/iam/v1/cloud.google.com/go + dest: / + - source: /google/iam/v2/cloud.google.com/go + dest: / + - source: /google/iam/v3/cloud.google.com/go + dest: / + - source: /google/iam/v3beta/cloud.google.com/go + dest: / + - source: /google/iam/credentials/v1/cloud.google.com/go + dest: / + - source: /google/cloud/iap/v1/cloud.google.com/go + dest: / + - source: /google/cloud/identitytoolkit/v2/cloud.google.com/go + dest: / + - source: /google/cloud/ids/v1/cloud.google.com/go + dest: / + - source: /google/cloud/iot/v1/cloud.google.com/go + dest: / + - source: /google/cloud/kms/v1/cloud.google.com/go + dest: / + - source: /google/cloud/kms/inventory/v1/cloud.google.com/go + dest: / + - source: /google/cloud/language/v1/cloud.google.com/go + dest: / + - source: /google/cloud/language/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/language/v2/cloud.google.com/go + dest: / + - source: /google/cloud/licensemanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/lifesciences/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/locationfinder/v1/cloud.google.com/go + dest: / + - source: /google/logging/v2/cloud.google.com/go + dest: / + - source: /google/longrunning/cloud.google.com/go + dest: / + - source: /google/cloud/lustre/v1/cloud.google.com/go + dest: / + - source: /google/cloud/maintenance/api/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/managedidentities/v1/cloud.google.com/go + dest: / + - source: /google/cloud/managedkafka/v1/cloud.google.com/go + dest: / + - source: /google/cloud/managedkafka/schemaregistry/v1/cloud.google.com/go + dest: / + - source: /google/maps/addressvalidation/v1/cloud.google.com/go + dest: / + - source: /google/maps/areainsights/v1/cloud.google.com/go + dest: / + - source: /google/maps/fleetengine/v1/cloud.google.com/go + dest: / + - source: /google/maps/fleetengine/delivery/v1/cloud.google.com/go + dest: / + - source: /google/maps/places/v1/cloud.google.com/go + dest: / + - source: /google/maps/routeoptimization/v1/cloud.google.com/go + dest: / + - source: /google/maps/routing/v2/cloud.google.com/go + dest: / + - source: /google/maps/solar/v1/cloud.google.com/go + dest: / + - source: /google/cloud/mediatranslation/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/memcache/v1/cloud.google.com/go + dest: / + - source: /google/cloud/memcache/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/memorystore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/memorystore/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/metastore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/metastore/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/metastore/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/migrationcenter/v1/cloud.google.com/go + dest: / + - source: /google/cloud/modelarmor/v1/cloud.google.com/go + dest: / + - source: /google/cloud/modelarmor/v1beta/cloud.google.com/go + dest: / + - source: /google/monitoring/v3/cloud.google.com/go + dest: / + - source: /google/monitoring/dashboard/v1/cloud.google.com/go + dest: / + - source: /google/monitoring/metricsscope/v1/cloud.google.com/go + dest: / + - source: /google/cloud/netapp/v1/cloud.google.com/go + dest: / + - source: /google/cloud/networkconnectivity/v1/cloud.google.com/go + dest: / + - source: /google/cloud/networkconnectivity/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/networkmanagement/v1/cloud.google.com/go + dest: / + - source: /google/cloud/networksecurity/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/networkservices/v1/cloud.google.com/go + dest: / + - source: /google/cloud/notebooks/v1/cloud.google.com/go + dest: / + - source: /google/cloud/notebooks/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/notebooks/v2/cloud.google.com/go + dest: / + - source: /google/cloud/optimization/v1/cloud.google.com/go + dest: / + - source: /google/cloud/oracledatabase/v1/cloud.google.com/go + dest: / + - source: /google/cloud/orchestration/airflow/service/v1/cloud.google.com/go + dest: / + - source: /google/cloud/orgpolicy/v1/cloud.google.com/go + dest: / + - source: /google/cloud/orgpolicy/v2/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/agentendpoint/v1/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/agentendpoint/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/v1/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/oslogin/v1/cloud.google.com/go + dest: / + - source: /google/cloud/oslogin/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/oslogin/common/cloud.google.com/go + dest: / + - source: /google/cloud/parallelstore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/parallelstore/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/parametermanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/phishingprotection/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/policysimulator/v1/cloud.google.com/go + dest: / + - source: /google/cloud/policytroubleshooter/iam/v3/cloud.google.com/go + dest: / + - source: /google/cloud/policytroubleshooter/v1/cloud.google.com/go + dest: / + - source: /google/cloud/privatecatalog/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/privilegedaccessmanager/v1/cloud.google.com/go + dest: / + - source: /google/pubsub/v1/cloud.google.com/go + dest: / + - source: /google/cloud/pubsublite/v1/cloud.google.com/go + dest: / + - source: /google/cloud/rapidmigrationassessment/v1/cloud.google.com/go + dest: / + - source: /google/cloud/recaptchaenterprise/v1/cloud.google.com/go/recaptchaenterprise/v2/apiv1 + dest: /recaptchaenterprise/apiv1 + - source: /google/cloud/recaptchaenterprise/v1/cloud.google.com/go/internal/generated/snippets/recaptchaenterprise/v2/apiv1 + dest: /internal/generated/snippets/recaptchaenterprise/apiv1 + - source: /google/cloud/recaptchaenterprise/v1beta1/cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1 + dest: /recaptchaenterprise/apiv1beta1 + - source: /google/cloud/recaptchaenterprise/v1beta1/cloud.google.com/go/internal/generated/snippets/recaptchaenterprise/v2/apiv1beta1 + dest: /internal/generated/snippets/recaptchaenterprise/apiv1beta1 + - source: /google/cloud/recommendationengine/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/recommender/v1/cloud.google.com/go + dest: / + - source: /google/cloud/recommender/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/redis/v1/cloud.google.com/go + dest: / + - source: /google/cloud/redis/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/redis/cluster/v1/cloud.google.com/go + dest: / + - source: /google/cloud/resourcemanager/v2/cloud.google.com/go + dest: / + - source: /google/cloud/resourcemanager/v3/cloud.google.com/go + dest: / + - source: /google/cloud/retail/v2/cloud.google.com/go + dest: / + - source: /google/cloud/retail/v2alpha/cloud.google.com/go + dest: / + - source: /google/cloud/retail/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/run/v2/cloud.google.com/go + dest: / + - source: /google/cloud/scheduler/v1/cloud.google.com/go + dest: / + - source: /google/cloud/scheduler/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/secretmanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/secretmanager/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/securesourcemanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/security/privateca/v1/cloud.google.com/go + dest: / + - source: /google/cloud/security/publicca/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/security/publicca/v1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v1p1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v2/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/settings/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycentermanagement/v1/cloud.google.com/go + dest: / + - source: /google/cloud/securityposture/v1/cloud.google.com/go + dest: / + - source: /google/api/servicecontrol/v1/cloud.google.com/go + dest: / + - source: /google/cloud/servicedirectory/v1/cloud.google.com/go + dest: / + - source: /google/cloud/servicedirectory/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/servicehealth/v1/cloud.google.com/go + dest: / + - source: /google/api/servicemanagement/v1/cloud.google.com/go + dest: / + - source: /google/api/serviceusage/v1/cloud.google.com/go + dest: / + - source: /google/cloud/shell/v1/cloud.google.com/go + dest: / + - source: /google/shopping/css/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/accounts/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/accounts/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/conversions/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/conversions/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/datasources/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/datasources/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/notifications/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/notifications/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/ordertracking/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/ordertracking/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/products/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/products/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/productstudio/v1alpha/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/promotions/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/promotions/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/quota/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/quota/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/inventories/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/inventories/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/issueresolution/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/issueresolution/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/lfp/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/lfp/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/reports/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/reports/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/reviews/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/type/cloud.google.com/go + dest: / + - source: /google/spanner/adapter/v1/cloud.google.com/go + dest: / + - source: /google/spanner/admin/database/v1/cloud.google.com/go + dest: / + - source: /google/spanner/admin/instance/v1/cloud.google.com/go + dest: / + - source: /google/spanner/v1/cloud.google.com/go + dest: / + - source: /google/spanner/executor/v1/cloud.google.com/go + dest: / + - source: /google/cloud/speech/v1/cloud.google.com/go + dest: / + - source: /google/cloud/speech/v1p1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/speech/v2/cloud.google.com/go + dest: / + - source: /google/storage/control/v2/cloud.google.com/go/ + dest: / + - source: /google/storage/v2/cloud.google.com/go/storage/internal/apiv2 + dest: /storage/internal/apiv2 + - source: /google/cloud/storagebatchoperations/v1/cloud.google.com/go + dest: / + - source: /google/cloud/storageinsights/v1/cloud.google.com/go + dest: / + - source: /google/storagetransfer/v1/cloud.google.com/go + dest: / + - source: /google/streetview/publish/v1/cloud.google.com/go + dest: / + - source: /google/cloud/support/v2/cloud.google.com/go + dest: / + - source: /google/cloud/support/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/talent/v4/cloud.google.com/go + dest: / + - source: /google/cloud/talent/v4beta1/cloud.google.com/go + dest: / + - source: /google/cloud/telcoautomation/v1/cloud.google.com/go + dest: / + - source: /google/cloud/texttospeech/v1/cloud.google.com/go + dest: / + - source: /google/cloud/tpu/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudtrace/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudtrace/v2/cloud.google.com/go + dest: / + - source: /google/cloud/translate/v3/cloud.google.com/go + dest: / + - source: /google/cloud/video/livestream/v1/cloud.google.com/go + dest: / + - source: /google/cloud/video/stitcher/v1/cloud.google.com/go + dest: / + - source: /google/cloud/video/transcoder/v1/cloud.google.com/go + dest: / + - source: /google/cloud/videointelligence/v1/cloud.google.com/go + dest: / + - source: /google/cloud/videointelligence/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/videointelligence/v1p3beta1/cloud.google.com/go + dest: / + - source: /google/cloud/vision/v1/cloud.google.com/go/vision/v2/apiv1 + dest: /vision/apiv1 + - source: /google/cloud/vision/v1/cloud.google.com/go/internal/generated/snippets/vision/v2/apiv1 + dest: /internal/generated/snippets/vision/apiv1 + - source: /google/cloud/vision/v1p1beta1/cloud.google.com/go/vision/v2/apiv1p1beta1 + dest: /vision/apiv1p1beta1 + - source: /google/cloud/vision/v1p1beta1/cloud.google.com/go/internal/generated/snippets/vision/v2/apiv1p1beta1 + dest: /internal/generated/snippets/vision/apiv1p1beta1 + - source: /google/cloud/visionai/v1/cloud.google.com/go + dest: / + - source: /google/cloud/vmmigration/v1/cloud.google.com/go + dest: / + - source: /google/cloud/vmwareengine/v1/cloud.google.com/go + dest: / + - source: /google/cloud/vpcaccess/v1/cloud.google.com/go + dest: / + - source: /google/cloud/webrisk/v1/cloud.google.com/go + dest: / + - source: /google/cloud/webrisk/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/websecurityscanner/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/executions/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/executions/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/workstations/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workstations/v1beta/cloud.google.com/go + dest: / diff --git a/internal/stategen/testdata/golden/.release-please-manifest-individual.json b/internal/stategen/testdata/golden/.release-please-manifest-individual.json new file mode 100644 index 000000000000..0da5b09f65f5 --- /dev/null +++ b/internal/stategen/testdata/golden/.release-please-manifest-individual.json @@ -0,0 +1,17 @@ +{ + "auth": "0.16.5", + "auth/oauth2adapt": "0.2.8", + "bigquery": "1.70.0", + "bigtable": "1.40.0", + "datastore": "1.20.0", + "errorreporting": "0.3.2", + "firestore": "1.18.0", + "logging": "1.13.0", + "profiler": "0.4.3", + "pubsub": "1.50.1", + "pubsub/v2": "2.0.1", + "pubsublite": "1.8.2", + "spanner": "1.85.1", + "storage": "1.57.0", + "vertexai": "0.15.0" +} diff --git a/internal/stategen/testdata/golden/.release-please-manifest-submodules.json b/internal/stategen/testdata/golden/.release-please-manifest-submodules.json new file mode 100644 index 000000000000..58fdc4577fba --- /dev/null +++ b/internal/stategen/testdata/golden/.release-please-manifest-submodules.json @@ -0,0 +1,165 @@ +{ + "accessapproval": "1.8.7", + "accesscontextmanager": "1.9.6", + "advisorynotifications": "1.5.6", + "aiplatform": "1.102.0", + "alloydb": "1.18.0", + "analytics": "0.30.0", + "apigateway": "1.7.7", + "apigeeconnect": "1.7.7", + "apigeeregistry": "0.9.6", + "apihub": "0.2.0", + "apikeys": "1.2.7", + "appengine": "1.9.7", + "apphub": "0.3.1", + "apps": "0.8.0", + "area120": "0.9.7", + "artifactregistry": "1.17.1", + "asset": "1.21.1", + "assuredworkloads": "1.12.6", + "automl": "1.14.7", + "backupdr": "1.4.0", + "baremetalsolution": "1.3.6", + "batch": "1.12.2", + "beyondcorp": "1.1.6", + "billing": "1.20.4", + "binaryauthorization": "1.9.5", + "capacityplanner": "0.1.0", + "certificatemanager": "1.9.5", + "channel": "1.20.0", + "chat": "0.15.1", + "chronicle": "0.1.1", + "cloudbuild": "1.23.0", + "cloudcontrolspartner": "1.4.0", + "clouddms": "1.8.8", + "cloudprofiler": "0.4.5", + "cloudquotas": "1.4.0", + "cloudtasks": "1.13.7", + "commerce": "1.2.6", + "compute": "1.47.0", + "compute/metadata": "0.9.0", + "confidentialcomputing": "1.10.1", + "config": "1.5.1", + "configdelivery": "0.1.1", + "contactcenterinsights": "1.17.4", + "container": "1.44.0", + "containeranalysis": "0.14.1", + "datacatalog": "1.26.1", + "dataflow": "0.11.0", + "dataform": "0.12.1", + "datafusion": "1.8.7", + "datalabeling": "0.9.7", + "dataplex": "1.27.1", + "dataproc": "2.14.1", + "dataqna": "0.9.7", + "datastream": "1.15.1", + "deploy": "1.27.3", + "developerconnect": "0.4.1", + "devicestreaming": "0.1.1", + "dialogflow": "1.69.1", + "discoveryengine": "1.21.1", + "documentai": "1.38.1", + "domains": "0.10.7", + "edgecontainer": "1.4.4", + "edgenetwork": "1.2.7", + "essentialcontacts": "1.7.7", + "eventarc": "1.16.1", + "filestore": "1.10.3", + "financialservices": "0.1.4", + "functions": "1.19.7", + "geminidataanalytics": "0.2.1", + "gkebackup": "1.8.1", + "gkeconnect": "0.12.5", + "gkehub": "0.16.0", + "gkemulticloud": "1.5.4", + "grafeas": "0.3.16", + "gsuiteaddons": "1.7.8", + "iam": "1.5.2", + "iap": "1.11.3", + "identitytoolkit": "0.2.6", + "ids": "1.5.7", + "iot": "1.8.7", + "kms": "1.23.0", + "language": "1.14.5", + "licensemanager": "0.1.1", + "lifesciences": "0.10.7", + "locationfinder": "0.1.1", + "longrunning": "0.6.7", + "lustre": "0.2.1", + "maintenance": "0.1.2", + "managedidentities": "1.7.7", + "managedkafka": "0.8.1", + "maps": "1.23.0", + "mediatranslation": "0.9.7", + "memcache": "1.11.7", + "memorystore": "0.3.1", + "metastore": "1.14.8", + "migrationcenter": "1.1.6", + "modelarmor": "0.6.1", + "monitoring": "1.24.2", + "netapp": "1.10.1", + "networkconnectivity": "1.19.1", + "networkmanagement": "1.20.1", + "networksecurity": "0.10.7", + "networkservices": "0.5.1", + "notebooks": "1.12.7", + "optimization": "1.7.7", + "oracledatabase": "0.5.1", + "orchestration": "1.11.10", + "orgpolicy": "1.15.1", + "osconfig": "1.15.1", + "oslogin": "1.14.7", + "parallelstore": "0.11.4", + "parametermanager": "0.3.1", + "phishingprotection": "0.9.7", + "policysimulator": "0.4.1", + "policytroubleshooter": "1.11.7", + "privatecatalog": "0.10.8", + "privilegedaccessmanager": "0.3.1", + "rapidmigrationassessment": "1.1.8", + "recaptchaenterprise": "2.20.5", + "recommendationengine": "0.9.7", + "recommender": "1.13.6", + "redis": "1.18.3", + "resourcemanager": "1.10.7", + "retail": "1.25.1", + "run": "1.12.0", + "scheduler": "1.11.8", + "secretmanager": "1.15.0", + "securesourcemanager": "1.4.1", + "security": "1.19.2", + "securitycenter": "1.38.1", + "securitycentermanagement": "1.1.6", + "securityposture": "0.2.6", + "servicecontrol": "1.14.5", + "servicedirectory": "1.12.7", + "servicehealth": "1.2.4", + "servicemanagement": "1.10.6", + "serviceusage": "1.9.6", + "shell": "1.8.7", + "shopping": "1.1.0", + "spanner/benchmarks": "0.1.0", + "speech": "1.28.0", + "storagebatchoperations": "0.1.1", + "storageinsights": "1.2.1", + "storagetransfer": "1.13.0", + "streetview": "0.2.5", + "support": "1.4.1", + "talent": "1.8.4", + "telcoautomation": "1.1.6", + "texttospeech": "1.15.0", + "tpu": "1.8.4", + "trace": "1.11.6", + "translate": "1.12.6", + "video": "1.27.1", + "videointelligence": "1.12.7", + "vision": "2.9.5", + "visionai": "0.4.6", + "vmmigration": "1.9.1", + "vmwareengine": "1.3.6", + "vpcaccess": "1.8.7", + "webrisk": "1.11.2", + "websecurityscanner": "1.7.7", + "workflows": "1.14.3", + "workstations": "1.1.6" +} diff --git a/internal/stategen/testdata/golden/internal/postprocessor/config.yaml b/internal/stategen/testdata/golden/internal/postprocessor/config.yaml new file mode 100644 index 000000000000..1f2d0b15aa2b --- /dev/null +++ b/internal/stategen/testdata/golden/internal/postprocessor/config.yaml @@ -0,0 +1,1340 @@ +modules: + - accessapproval + - accesscontextmanager + - aiplatform + - advisorynotifications + - alloydb + - analytics + - apigateway + - apigeeconnect + - apigeeregistry + - apihub + - apikeys + - appengine + - apphub + - apps + - area120 + - artifactregistry + - asset + - assuredworkloads + - automl + - backupdr + - baremetalsolution + - batch + - beyondcorp + # List the bigquery/v2 module before the bigquery module so that the contents + # are processed using the correct inner module boundary. + # More info: https://github.com/googleapis/google-cloud-go/issues/12452 + - bigquery/v2 + - bigquery + - bigtable + - billing + - binaryauthorization + - capacityplanner + - certificatemanager + - channel + - chat + - chronicle + - cloudbuild + - cloudcontrolspartner + - clouddms + - cloudprofiler + - cloudquotas + - cloudtasks + - commerce + - compute + - confidentialcomputing + - config + - configdelivery + - contactcenterinsights + - container + - containeranalysis + - datacatalog + - dataflow + - dataform + - datafusion + - datalabeling + - dataplex + - dataproc + - dataqna + - datastore + - datastream + - deploy + - developerconnect + - devicestreaming + - dialogflow + - discoveryengine + - documentai + - domains + - edgecontainer + - edgenetwork + - errorreporting + - essentialcontacts + - eventarc + - filestore + - financialservices + - firestore + - functions + - geminidataanalytics + - gkebackup + - gkeconnect + - gkehub + - gkemulticloud + - grafeas + - gsuiteaddons + - iam + - iap + - identitytoolkit + - ids + - iot + - kms + - language + - licensemanager + - lifesciences + - locationfinder + - logging + - longrunning + - lustre + - maintenance + - managedidentities + - managedkafka + - maps + - mediatranslation + - memcache + - memorystore + - metastore + - migrationcenter + - modelarmor + - monitoring + - netapp + - networkconnectivity + - networkmanagement + - networksecurity + - networkservices + - notebooks + - optimization + - oracledatabase + - orchestration + - orgpolicy + - osconfig + - oslogin + - parallelstore + - parametermanager + - phishingprotection + - policysimulator + - policytroubleshooter + - privatecatalog + - privilegedaccessmanager + - profiler + - pubsub/v2 + - pubsub + - pubsublite + - rapidmigrationassessment + - recaptchaenterprise + - recommendationengine + - recommender + - redis + - resourcemanager + - retail + - run + - scheduler + - secretmanager + - securesourcemanager + - security + - securitycenter + - securitycentermanagement + - securityposture + - servicecontrol + - servicedirectory + - servicehealth + - servicemanagement + - serviceusage + - shell + - shopping + - spanner + - speech + - storage + - storagebatchoperations + - storageinsights + - storagetransfer + - streetview + - support + - talent + - telcoautomation + - texttospeech + - tpu + - trace + - translate + - video + - videointelligence + - vision + - visionai + - vmmigration + - vmwareengine + - vpcaccess + - webrisk + - websecurityscanner + - workflows + - workstations + +manual-clients: + - api-shortname: bigquery + distribution-name: cloud.google.com/go/bigquery + description: BigQuery + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: bigtable + distribution-name: cloud.google.com/go/bigtable + description: Cloud BigTable + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: compute-metadata + distribution-name: cloud.google.com/go/compute/metadata + description: Service Metadata API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/compute/latest/metadata + release-level: stable + library-type: CORE + - api-shortname: datastore + distribution-name: cloud.google.com/go/datastore + description: Cloud Datastore + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: clouderrorreporting + distribution-name: cloud.google.com/go/errorreporting + description: Cloud Error Reporting API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/errorreporting/latest + release-level: preview + library-type: GAPIC_MANUAL + - api-shortname: firestore + distribution-name: cloud.google.com/go/firestore + description: Cloud Firestore API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: firestore-metadata + distribution-name: cloud.google.com/go/functions/metadata + description: Cloud Functions + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/metadata + release-level: preview + library-type: CORE + - api-shortname: iam + distribution-name: cloud.google.com/go/iam + description: Cloud IAM + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest + release-level: stable + library-type: CORE + - api-shortname: logging + distribution-name: cloud.google.com/go/logging + description: Cloud Logging API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/logging/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: cloudprofiler + distribution-name: cloud.google.com/go/profiler + description: Cloud Profiler + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/profiler/latest + release-level: stable + library-type: AGENT + - api-shortname: pubsub + distribution-name: cloud.google.com/go/pubsub + description: Cloud PubSub + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: pubsublite + distribution-name: cloud.google.com/go/pubsublite + description: Cloud PubSub Lite + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsublite/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: rpcreplay + distribution-name: cloud.google.com/go/rpcreplay + description: RPC Replay + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/rpcreplay + release-level: stable + library-type: OTHER + - api-shortname: spanner + distribution-name: cloud.google.com/go/spanner + description: Cloud Spanner + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: storage + distribution-name: cloud.google.com/go/storage + description: Cloud Storage (GCS) + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest + release-level: stable + library-type: GAPIC_MANUAL + +service-configs: + - input-directory: google/analytics/admin/v1alpha + service-config: analyticsadmin_v1alpha.yaml + import-path: cloud.google.com/go/analytics/admin/apiv1alpha + - input-directory: google/api/apikeys/v2 + service-config: apikeys_v2.yaml + import-path: cloud.google.com/go/apikeys/apiv2 + - input-directory: google/appengine/v1 + service-config: appengine_v1.yaml + import-path: cloud.google.com/go/appengine/apiv1 + - input-directory: google/apps/events/subscriptions/v1 + service-config: workspaceevents_v1.yaml + import-path: cloud.google.com/go/apps/events/subscriptions/apiv1 + - input-directory: google/apps/events/subscriptions/v1beta + service-config: workspaceevents_v1beta.yaml + import-path: cloud.google.com/go/apps/events/subscriptions/apiv1beta + - input-directory: google/apps/meet/v2 + service-config: meet_v2.yaml + import-path: cloud.google.com/go/apps/meet/apiv2 + - input-directory: google/apps/meet/v2beta + service-config: meet_v2beta.yaml + import-path: cloud.google.com/go/apps/meet/apiv2beta + - input-directory: google/area120/tables/v1alpha1 + service-config: area120tables_v1alpha1.yaml + import-path: cloud.google.com/go/area120/tables/apiv1alpha1 + - input-directory: google/cloud/accessapproval/v1 + service-config: accessapproval_v1.yaml + import-path: cloud.google.com/go/accessapproval/apiv1 + - input-directory: google/cloud/aiplatform/v1 + service-config: aiplatform_v1.yaml + import-path: cloud.google.com/go/aiplatform/apiv1 + - input-directory: google/cloud/aiplatform/v1beta1 + service-config: aiplatform_v1beta1.yaml + import-path: cloud.google.com/go/aiplatform/apiv1beta1 + - input-directory: google/cloud/advisorynotifications/v1 + service-config: advisorynotifications_v1.yaml + import-path: cloud.google.com/go/advisorynotifications/apiv1 + - input-directory: google/cloud/alloydb/v1 + service-config: alloydb_v1.yaml + import-path: cloud.google.com/go/alloydb/apiv1 + - input-directory: google/cloud/alloydb/v1alpha + service-config: alloydb_v1alpha.yaml + import-path: cloud.google.com/go/alloydb/apiv1alpha + - input-directory: google/cloud/alloydb/v1beta + service-config: alloydb_v1beta.yaml + import-path: cloud.google.com/go/alloydb/apiv1beta + - input-directory: google/cloud/alloydb/connectors/v1 + service-config: connectors_v1.yaml + import-path: cloud.google.com/go/alloydb/connectors/apiv1 + release-level-override: preview + - input-directory: google/cloud/alloydb/connectors/v1alpha + service-config: connectors_v1alpha.yaml + import-path: cloud.google.com/go/alloydb/connectors/apiv1alpha + - input-directory: google/cloud/alloydb/connectors/v1beta + service-config: connectors_v1beta.yaml + import-path: cloud.google.com/go/alloydb/connectors/apiv1beta + - input-directory: google/cloud/apigateway/v1 + service-config: apigateway_v1.yaml + import-path: cloud.google.com/go/apigateway/apiv1 + - input-directory: google/cloud/apigeeconnect/v1 + service-config: apigeeconnect_v1.yaml + import-path: cloud.google.com/go/apigeeconnect/apiv1 + - input-directory: google/cloud/apigeeregistry/v1 + service-config: apigeeregistry_v1.yaml + import-path: cloud.google.com/go/apigeeregistry/apiv1 + - input-directory: google/cloud/apihub/v1 + service-config: apihub_v1.yaml + import-path: cloud.google.com/go/apihub/apiv1 + - input-directory: google/cloud/apphub/v1 + service-config: apphub_v1.yaml + import-path: cloud.google.com/go/apphub/apiv1 + - input-directory: google/cloud/asset/v1 + service-config: cloudasset_v1.yaml + import-path: cloud.google.com/go/asset/apiv1 + - input-directory: google/cloud/asset/v1p2beta1 + service-config: cloudasset_v1p2beta1.yaml + import-path: cloud.google.com/go/asset/apiv1p2beta1 + - input-directory: google/cloud/asset/v1p5beta1 + service-config: cloudasset_v1p5beta1.yaml + import-path: cloud.google.com/go/asset/apiv1p5beta1 + - input-directory: google/cloud/assuredworkloads/v1 + service-config: assuredworkloads_v1.yaml + import-path: cloud.google.com/go/assuredworkloads/apiv1 + - input-directory: google/cloud/assuredworkloads/v1beta1 + service-config: assuredworkloads_v1beta1.yaml + import-path: cloud.google.com/go/assuredworkloads/apiv1beta1 + - input-directory: google/cloud/automl/v1 + service-config: automl_v1.yaml + import-path: cloud.google.com/go/automl/apiv1 + - input-directory: google/cloud/automl/v1beta1 + service-config: automl_v1beta1.yaml + import-path: cloud.google.com/go/automl/apiv1beta1 + - input-directory: google/cloud/backupdr/v1 + service-config: backupdr_v1.yaml + import-path: cloud.google.com/go/backupdr/apiv1 + - input-directory: google/cloud/baremetalsolution/v2 + service-config: baremetalsolution_v2.yaml + import-path: cloud.google.com/go/baremetalsolution/apiv2 + - input-directory: google/cloud/batch/v1 + service-config: batch_v1.yaml + import-path: cloud.google.com/go/batch/apiv1 + - input-directory: google/cloud/beyondcorp/appconnections/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/appconnections/apiv1 + - input-directory: google/cloud/beyondcorp/appconnectors/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/appconnectors/apiv1 + - input-directory: google/cloud/beyondcorp/appgateways/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/appgateways/apiv1 + - input-directory: google/cloud/beyondcorp/clientconnectorservices/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/clientconnectorservices/apiv1 + - input-directory: google/cloud/beyondcorp/clientgateways/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/clientgateways/apiv1 + - input-directory: google/cloud/bigquery/analyticshub/v1 + service-config: analyticshub_v1.yaml + import-path: cloud.google.com/go/bigquery/analyticshub/apiv1 + - input-directory: google/cloud/bigquery/biglake/v1 + service-config: biglake_v1.yaml + import-path: cloud.google.com/go/bigquery/biglake/apiv1 + - input-directory: google/cloud/bigquery/biglake/v1alpha1 + service-config: biglake_v1alpha1.yaml + import-path: cloud.google.com/go/bigquery/biglake/apiv1alpha1 + - input-directory: google/cloud/bigquery/connection/v1 + service-config: bigqueryconnection_v1.yaml + import-path: cloud.google.com/go/bigquery/connection/apiv1 + - input-directory: google/cloud/bigquery/connection/v1beta1 + service-config: bigqueryconnection_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/connection/apiv1beta1 + - input-directory: google/cloud/bigquery/dataexchange/v1beta1 + service-config: analyticshub_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/dataexchange/apiv1beta1 + - input-directory: google/cloud/bigquery/datapolicies/v1 + service-config: bigquerydatapolicy_v1.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv1 + - input-directory: google/cloud/bigquery/datapolicies/v1beta1 + service-config: bigquerydatapolicy_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv1beta1 + - input-directory: google/cloud/bigquery/datapolicies/v2 + service-config: bigquerydatapolicy_v2.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv2 + - input-directory: google/cloud/bigquery/datapolicies/v2beta1 + service-config: bigquerydatapolicy_v2beta1.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv2beta1 + - input-directory: google/cloud/bigquery/datatransfer/v1 + service-config: bigquerydatatransfer_v1.yaml + import-path: cloud.google.com/go/bigquery/datatransfer/apiv1 + - input-directory: google/cloud/bigquery/migration/v2 + service-config: bigquerymigration_v2.yaml + import-path: cloud.google.com/go/bigquery/migration/apiv2 + - input-directory: google/cloud/bigquery/migration/v2alpha + service-config: bigquerymigration_v2alpha.yaml + import-path: cloud.google.com/go/bigquery/migration/apiv2alpha + - input-directory: google/cloud/bigquery/reservation/v1 + service-config: bigqueryreservation_v1.yaml + import-path: cloud.google.com/go/bigquery/reservation/apiv1 + - input-directory: google/cloud/bigquery/storage/v1 + service-config: bigquerystorage_v1.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1 + - input-directory: google/cloud/bigquery/storage/v1alpha + service-config: bigquerystorage_v1alpha.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1alpha + - input-directory: google/cloud/bigquery/storage/v1beta + service-config: bigquerystorage_v1beta.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1beta + - input-directory: google/cloud/bigquery/storage/v1beta1 + service-config: bigquerystorage_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1beta1 + - input-directory: google/cloud/bigquery/storage/v1beta2 + service-config: bigquerystorage_v1beta2.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1beta2 + - input-directory: google/cloud/bigquery/v2 + service-config: bigquery_v2.yaml + import-path: cloud.google.com/go/bigquery/v2/apiv2 + - input-directory: google/bigtable/admin/v2 + service-config: bigtableadmin_v2.yaml + import-path: cloud.google.com/go/bigtable/admin/apiv2 + release-level-override: stable + - input-directory: google/bigtable/v2 + service-config: bigtable_v2.yaml + import-path: cloud.google.com/go/bigtable/apiv2 + release-level-override: stable + - input-directory: google/cloud/billing/budgets/v1 + service-config: billingbudgets.yaml + import-path: cloud.google.com/go/billing/budgets/apiv1 + - input-directory: google/cloud/billing/budgets/v1beta1 + service-config: billingbudgets.yaml + import-path: cloud.google.com/go/billing/budgets/apiv1beta1 + - input-directory: google/cloud/billing/v1 + service-config: cloudbilling_v1.yaml + import-path: cloud.google.com/go/billing/apiv1 + - input-directory: google/cloud/binaryauthorization/v1 + service-config: binaryauthorization_v1.yaml + import-path: cloud.google.com/go/binaryauthorization/apiv1 + - input-directory: google/cloud/binaryauthorization/v1beta1 + service-config: binaryauthorization_v1beta1.yaml + import-path: cloud.google.com/go/binaryauthorization/apiv1beta1 + - input-directory: google/cloud/capacityplanner/v1beta + service-config: capacityplanner_v1beta.yaml + import-path: cloud.google.com/go/capacityplanner/apiv1beta + - input-directory: google/cloud/certificatemanager/v1 + service-config: certificatemanager_v1.yaml + import-path: cloud.google.com/go/certificatemanager/apiv1 + - input-directory: google/cloud/channel/v1 + service-config: cloudchannel_v1.yaml + import-path: cloud.google.com/go/channel/apiv1 + - input-directory: google/chat/v1 + service-config: chat_v1.yaml + import-path: cloud.google.com/go/chat/apiv1 + - input-directory: google/cloud/chronicle/v1 + service-config: chronicle_v1.yaml + import-path: cloud.google.com/go/chronicle/apiv1 + - input-directory: google/cloud/cloudcontrolspartner/v1 + service-config: cloudcontrolspartner_v1.yaml + import-path: cloud.google.com/go/cloudcontrolspartner/apiv1 + - input-directory: google/cloud/cloudcontrolspartner/v1beta + service-config: cloudcontrolspartner_v1beta.yaml + import-path: cloud.google.com/go/cloudcontrolspartner/apiv1beta + - input-directory: google/cloud/clouddms/v1 + service-config: datamigration_v1.yaml + import-path: cloud.google.com/go/clouddms/apiv1 + - input-directory: google/devtools/cloudprofiler/v2 + service-config: cloudprofiler_v2.yaml + import-path: cloud.google.com/go/cloudprofiler/apiv2 + - input-directory: google/api/cloudquotas/v1 + service-config: cloudquotas_v1.yaml + import-path: cloud.google.com/go/cloudquotas/apiv1 + - input-directory: google/api/cloudquotas/v1beta + service-config: cloudquotas_v1beta.yaml + import-path: cloud.google.com/go/cloudquotas/apiv1beta + - input-directory: google/cloud/commerce/consumer/procurement/v1 + service-config: cloudcommerceconsumerprocurement_v1.yaml + import-path: cloud.google.com/go/commerce/consumer/procurement/apiv1 + - input-directory: google/cloud/compute/v1 + service-config: compute_v1.yaml + import-path: cloud.google.com/go/compute/apiv1 + - input-directory: google/cloud/compute/v1beta + service-config: compute_v1beta.yaml + import-path: cloud.google.com/go/compute/apiv1beta + - input-directory: google/cloud/config/v1 + service-config: config_v1.yaml + import-path: cloud.google.com/go/config/apiv1 + - input-directory: google/cloud/configdelivery/v1 + service-config: configdelivery_v1.yaml + import-path: cloud.google.com/go/configdelivery/apiv1 + - input-directory: google/cloud/configdelivery/v1beta + service-config: configdelivery_v1beta.yaml + import-path: cloud.google.com/go/configdelivery/apiv1beta + - input-directory: google/cloud/contactcenterinsights/v1 + service-config: contactcenterinsights_v1.yaml + import-path: cloud.google.com/go/contactcenterinsights/apiv1 + - input-directory: google/cloud/datacatalog/lineage/v1 + service-config: datalineage_v1.yaml + import-path: cloud.google.com/go/datacatalog/lineage/apiv1 + - input-directory: google/cloud/datacatalog/v1 + service-config: datacatalog_v1.yaml + import-path: cloud.google.com/go/datacatalog/apiv1 + - input-directory: google/cloud/datacatalog/v1beta1 + service-config: datacatalog_v1beta1.yaml + import-path: cloud.google.com/go/datacatalog/apiv1beta1 + - input-directory: google/cloud/dataform/v1 + service-config: dataform_v1.yaml + import-path: cloud.google.com/go/dataform/apiv1 + - input-directory: google/cloud/dataform/v1beta1 + service-config: dataform_v1beta1.yaml + import-path: cloud.google.com/go/dataform/apiv1beta1 + - input-directory: google/cloud/datafusion/v1 + service-config: datafusion_v1.yaml + import-path: cloud.google.com/go/datafusion/apiv1 + - input-directory: google/cloud/datalabeling/v1beta1 + service-config: datalabeling_v1beta1.yaml + import-path: cloud.google.com/go/datalabeling/apiv1beta1 + - input-directory: google/cloud/dataplex/v1 + service-config: dataplex_v1.yaml + import-path: cloud.google.com/go/dataplex/apiv1 + - input-directory: google/cloud/dataproc/v1 + service-config: dataproc_v1.yaml + import-path: cloud.google.com/go/dataproc/v2/apiv1 + rel-path: /dataproc/apiv1 + - input-directory: google/cloud/dataqna/v1alpha + service-config: dataqna_v1alpha.yaml + import-path: cloud.google.com/go/dataqna/apiv1alpha + - input-directory: google/cloud/datastream/v1 + service-config: datastream_v1.yaml + import-path: cloud.google.com/go/datastream/apiv1 + - input-directory: google/cloud/datastream/v1alpha1 + service-config: datastream_v1alpha1.yaml + import-path: cloud.google.com/go/datastream/apiv1alpha1 + - input-directory: google/cloud/deploy/v1 + service-config: clouddeploy_v1.yaml + import-path: cloud.google.com/go/deploy/apiv1 + - input-directory: google/cloud/developerconnect/v1 + service-config: developerconnect_v1.yaml + import-path: cloud.google.com/go/developerconnect/apiv1 + - input-directory: google/cloud/devicestreaming/v1 + service-config: devicestreaming_v1.yaml + import-path: cloud.google.com/go/devicestreaming/apiv1 + - input-directory: google/cloud/dialogflow/cx/v3 + service-config: dialogflow_v3.yaml + import-path: cloud.google.com/go/dialogflow/cx/apiv3 + - input-directory: google/cloud/dialogflow/cx/v3beta1 + service-config: dialogflow_v3beta1.yaml + import-path: cloud.google.com/go/dialogflow/cx/apiv3beta1 + - input-directory: google/cloud/dialogflow/v2 + service-config: dialogflow_v2.yaml + import-path: cloud.google.com/go/dialogflow/apiv2 + - input-directory: google/cloud/dialogflow/v2beta1 + service-config: dialogflow_v2beta1.yaml + import-path: cloud.google.com/go/dialogflow/apiv2beta1 + - input-directory: google/cloud/discoveryengine/v1 + service-config: discoveryengine_v1.yaml + import-path: cloud.google.com/go/discoveryengine/apiv1 + - input-directory: google/cloud/discoveryengine/v1beta + service-config: discoveryengine_v1beta.yaml + import-path: cloud.google.com/go/discoveryengine/apiv1beta + - input-directory: google/cloud/discoveryengine/v1alpha + service-config: discoveryengine_v1alpha.yaml + import-path: cloud.google.com/go/discoveryengine/apiv1alpha + - input-directory: google/cloud/documentai/v1 + service-config: documentai_v1.yaml + import-path: cloud.google.com/go/documentai/apiv1 + - input-directory: google/cloud/documentai/v1beta3 + service-config: documentai_v1beta3.yaml + import-path: cloud.google.com/go/documentai/apiv1beta3 + - input-directory: google/cloud/domains/v1beta1 + service-config: domains_v1beta1.yaml + import-path: cloud.google.com/go/domains/apiv1beta1 + - input-directory: google/cloud/edgecontainer/v1 + service-config: edgecontainer_v1.yaml + import-path: cloud.google.com/go/edgecontainer/apiv1 + - input-directory: google/cloud/edgenetwork/v1 + service-config: edgenetwork_v1.yaml + import-path: cloud.google.com/go/edgenetwork/apiv1 + - input-directory: google/cloud/essentialcontacts/v1 + service-config: essentialcontacts_v1.yaml + import-path: cloud.google.com/go/essentialcontacts/apiv1 + - input-directory: google/cloud/eventarc/v1 + service-config: eventarc_v1.yaml + import-path: cloud.google.com/go/eventarc/apiv1 + - input-directory: google/cloud/eventarc/publishing/v1 + service-config: eventarcpublishing_v1.yaml + import-path: cloud.google.com/go/eventarc/publishing/apiv1 + - input-directory: google/cloud/filestore/v1 + service-config: file_v1.yaml + import-path: cloud.google.com/go/filestore/apiv1 + - input-directory: google/cloud/financialservices/v1 + service-config: financialservices_v1.yaml + import-path: cloud.google.com/go/financialservices/apiv1 + - input-directory: google/cloud/functions/v1 + service-config: cloudfunctions_v1.yaml + import-path: cloud.google.com/go/functions/apiv1 + - input-directory: google/cloud/functions/v2 + service-config: cloudfunctions_v2.yaml + import-path: cloud.google.com/go/functions/apiv2 + - input-directory: google/cloud/functions/v2beta + service-config: cloudfunctions_v2beta.yaml + import-path: cloud.google.com/go/functions/apiv2beta + - input-directory: google/cloud/geminidataanalytics/v1beta + service-config: geminidataanalytics_v1beta.yaml + import-path: cloud.google.com/go/geminidataanalytics/apiv1beta + - input-directory: google/cloud/gkebackup/v1 + service-config: gkebackup_v1.yaml + import-path: cloud.google.com/go/gkebackup/apiv1 + - input-directory: google/cloud/gkeconnect/gateway/v1beta1 + service-config: connectgateway_v1beta1.yaml + import-path: cloud.google.com/go/gkeconnect/gateway/apiv1beta1 + - input-directory: google/cloud/gkeconnect/gateway/v1 + service-config: connectgateway_v1.yaml + import-path: cloud.google.com/go/gkeconnect/gateway/apiv1 + - input-directory: google/cloud/gkehub/v1beta1 + service-config: gkehub_v1beta1.yaml + import-path: cloud.google.com/go/gkehub/apiv1beta1 + - input-directory: google/cloud/gkemulticloud/v1 + service-config: gkemulticloud_v1.yaml + import-path: cloud.google.com/go/gkemulticloud/apiv1 + - input-directory: google/cloud/gsuiteaddons/v1 + service-config: gsuiteaddons_v1.yaml + import-path: cloud.google.com/go/gsuiteaddons/apiv1 + - input-directory: google/cloud/iap/v1 + service-config: iap_v1.yaml + import-path: cloud.google.com/go/iap/apiv1 + - input-directory: google/cloud/identitytoolkit/v2 + service-config: identitytoolkit_v2.yaml + import-path: cloud.google.com/go/identitytoolkit/apiv2 + - input-directory: google/cloud/ids/v1 + service-config: ids_v1.yaml + import-path: cloud.google.com/go/ids/apiv1 + - input-directory: google/cloud/iot/v1 + service-config: cloudiot_v1.yaml + import-path: cloud.google.com/go/iot/apiv1 + - input-directory: google/cloud/kms/v1 + service-config: cloudkms_v1.yaml + import-path: cloud.google.com/go/kms/apiv1 + - input-directory: google/cloud/kms/inventory/v1 + service-config: kmsinventory_v1.yaml + import-path: cloud.google.com/go/kms/inventory/apiv1 + - input-directory: google/cloud/language/v1 + service-config: language_v1.yaml + import-path: cloud.google.com/go/language/apiv1 + - input-directory: google/cloud/language/v1beta2 + service-config: language_v1beta2.yaml + import-path: cloud.google.com/go/language/apiv1beta2 + - input-directory: google/cloud/language/v2 + service-config: language_v2.yaml + import-path: cloud.google.com/go/language/apiv2 + - input-directory: google/cloud/licensemanager/v1 + service-config: licensemanager_v1.yaml + import-path: cloud.google.com/go/licensemanager/apiv1 + - input-directory: google/cloud/lifesciences/v2beta + service-config: lifesciences_v2beta.yaml + import-path: cloud.google.com/go/lifesciences/apiv2beta + - input-directory: google/cloud/locationfinder/v1 + service-config: cloudlocationfinder_v1.yaml + import-path: cloud.google.com/go/locationfinder/apiv1 + - input-directory: google/cloud/lustre/v1 + service-config: lustre_v1.yaml + import-path: cloud.google.com/go/lustre/apiv1 + - input-directory: google/cloud/maintenance/api/v1beta + service-config: maintenance_v1beta.yaml + import-path: cloud.google.com/go/maintenance/api/apiv1beta + - input-directory: google/cloud/managedidentities/v1 + service-config: managedidentities_v1.yaml + import-path: cloud.google.com/go/managedidentities/apiv1 + - input-directory: google/cloud/managedkafka/v1 + service-config: managedkafka_v1.yaml + import-path: cloud.google.com/go/managedkafka/apiv1 + - input-directory: google/cloud/managedkafka/schemaregistry/v1 + service-config: managedkafka_v1.yaml + import-path: cloud.google.com/go/managedkafka/schemaregistry/apiv1 + - input-directory: google/cloud/mediatranslation/v1beta1 + service-config: mediatranslation_v1beta1.yaml + import-path: cloud.google.com/go/mediatranslation/apiv1beta1 + - input-directory: google/cloud/memcache/v1 + service-config: memcache_v1.yaml + import-path: cloud.google.com/go/memcache/apiv1 + - input-directory: google/cloud/memcache/v1beta2 + service-config: memcache_v1beta2.yaml + import-path: cloud.google.com/go/memcache/apiv1beta2 + - input-directory: google/cloud/memorystore/v1 + service-config: memorystore_v1.yaml + import-path: cloud.google.com/go/memorystore/apiv1 + - input-directory: google/cloud/memorystore/v1beta + service-config: memorystore_v1beta.yaml + import-path: cloud.google.com/go/memorystore/apiv1beta + - input-directory: google/cloud/metastore/v1 + service-config: metastore_v1.yaml + import-path: cloud.google.com/go/metastore/apiv1 + - input-directory: google/cloud/metastore/v1alpha + service-config: metastore_v1alpha.yaml + import-path: cloud.google.com/go/metastore/apiv1alpha + - input-directory: google/cloud/metastore/v1beta + service-config: metastore_v1beta.yaml + import-path: cloud.google.com/go/metastore/apiv1beta + - input-directory: google/cloud/migrationcenter/v1 + service-config: migrationcenter_v1.yaml + import-path: cloud.google.com/go/migrationcenter/apiv1 + - input-directory: google/cloud/netapp/v1 + service-config: netapp_v1.yaml + import-path: cloud.google.com/go/netapp/apiv1 + - input-directory: google/cloud/networkconnectivity/v1 + service-config: networkconnectivity_v1.yaml + import-path: cloud.google.com/go/networkconnectivity/apiv1 + - input-directory: google/cloud/networkconnectivity/v1alpha1 + service-config: networkconnectivity_v1alpha1.yaml + import-path: cloud.google.com/go/networkconnectivity/apiv1alpha1 + - input-directory: google/cloud/networkmanagement/v1 + service-config: networkmanagement_v1.yaml + import-path: cloud.google.com/go/networkmanagement/apiv1 + - input-directory: google/cloud/networksecurity/v1beta1 + service-config: networksecurity_v1beta1.yaml + import-path: cloud.google.com/go/networksecurity/apiv1beta1 + - input-directory: google/cloud/networkservices/v1 + service-config: networkservices_v1.yaml + import-path: cloud.google.com/go/networkservices/apiv1 + - input-directory: google/cloud/notebooks/v1 + service-config: notebooks_v1.yaml + import-path: cloud.google.com/go/notebooks/apiv1 + - input-directory: google/cloud/notebooks/v1beta1 + service-config: notebooks_v1beta1.yaml + import-path: cloud.google.com/go/notebooks/apiv1beta1 + - input-directory: google/cloud/notebooks/v2 + service-config: notebooks_v2.yaml + import-path: cloud.google.com/go/notebooks/apiv2 + - input-directory: google/cloud/optimization/v1 + service-config: cloudoptimization_v1.yaml + import-path: cloud.google.com/go/optimization/apiv1 + - input-directory: google/cloud/oracledatabase/v1 + service-config: oracledatabase_v1.yaml + import-path: cloud.google.com/go/oracledatabase/apiv1 + - input-directory: google/cloud/orchestration/airflow/service/v1 + service-config: composer_v1.yaml + import-path: cloud.google.com/go/orchestration/airflow/service/apiv1 + - input-directory: google/cloud/orgpolicy/v1 + service-config: + import-path: cloud.google.com/go/orgpolicy/apiv1 + - input-directory: google/cloud/orgpolicy/v2 + service-config: orgpolicy_v2.yaml + import-path: cloud.google.com/go/orgpolicy/apiv2 + - input-directory: google/cloud/osconfig/agentendpoint/v1 + service-config: osconfig_v1.yaml + import-path: cloud.google.com/go/osconfig/agentendpoint/apiv1 + - input-directory: google/cloud/osconfig/agentendpoint/v1beta + service-config: osconfig_v1beta.yaml + import-path: cloud.google.com/go/osconfig/agentendpoint/apiv1beta + - input-directory: google/cloud/osconfig/v1 + service-config: osconfig_v1.yaml + import-path: cloud.google.com/go/osconfig/apiv1 + - input-directory: google/cloud/osconfig/v1alpha + service-config: osconfig_v1alpha.yaml + import-path: cloud.google.com/go/osconfig/apiv1alpha + - input-directory: google/cloud/osconfig/v1beta + service-config: osconfig_v1beta.yaml + import-path: cloud.google.com/go/osconfig/apiv1beta + - input-directory: google/cloud/oslogin/v1 + service-config: oslogin_v1.yaml + import-path: cloud.google.com/go/oslogin/apiv1 + - input-directory: google/cloud/oslogin/v1beta + service-config: oslogin_v1beta.yaml + import-path: cloud.google.com/go/oslogin/apiv1beta + - input-directory: google/cloud/oslogin/common + service-config: + import-path: cloud.google.com/go/oslogin/common + - input-directory: google/cloud/parallelstore/v1 + service-config: parallelstore_v1.yaml + import-path: cloud.google.com/go/parallelstore/apiv1 + - input-directory: google/cloud/parallelstore/v1beta + service-config: parallelstore_v1beta.yaml + import-path: cloud.google.com/go/parallelstore/apiv1beta + - input-directory: google/cloud/parametermanager/v1 + service-config: parametermanager_v1.yaml + import-path: cloud.google.com/go/parametermanager/apiv1 + - input-directory: google/cloud/phishingprotection/v1beta1 + service-config: phishingprotection_v1beta1.yaml + import-path: cloud.google.com/go/phishingprotection/apiv1beta1 + - input-directory: google/cloud/policysimulator/v1 + service-config: policysimulator_v1.yaml + import-path: cloud.google.com/go/policysimulator/apiv1 + - input-directory: google/cloud/policytroubleshooter/iam/v3 + service-config: policytroubleshooter_v3.yaml + import-path: cloud.google.com/go/policytroubleshooter/iam/apiv3 + - input-directory: google/cloud/policytroubleshooter/v1 + service-config: policytroubleshooter_v1.yaml + import-path: cloud.google.com/go/policytroubleshooter/apiv1 + - input-directory: google/cloud/privatecatalog/v1beta1 + service-config: cloudprivatecatalog_v1beta1.yaml + import-path: cloud.google.com/go/privatecatalog/apiv1beta1 + - input-directory: google/cloud/privilegedaccessmanager/v1 + service-config: privilegedaccessmanager_v1.yaml + import-path: cloud.google.com/go/privilegedaccessmanager/apiv1 + - input-directory: google/cloud/pubsublite/v1 + service-config: pubsublite_v1.yaml + import-path: cloud.google.com/go/pubsublite/apiv1 + - input-directory: google/cloud/rapidmigrationassessment/v1 + service-config: rapidmigrationassessment_v1.yaml + import-path: cloud.google.com/go/rapidmigrationassessment/apiv1 + - input-directory: google/cloud/recaptchaenterprise/v1 + service-config: recaptchaenterprise_v1.yaml + import-path: cloud.google.com/go/recaptchaenterprise/v2/apiv1 + rel-path: /recaptchaenterprise/apiv1 + - input-directory: google/cloud/recaptchaenterprise/v1beta1 + service-config: recaptchaenterprise_v1beta1.yaml + import-path: cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1 + rel-path: /recaptchaenterprise/apiv1beta1 + - input-directory: google/cloud/recommendationengine/v1beta1 + service-config: recommendationengine_v1beta1.yaml + import-path: cloud.google.com/go/recommendationengine/apiv1beta1 + - input-directory: google/cloud/recommender/v1 + service-config: recommender_v1.yaml + import-path: cloud.google.com/go/recommender/apiv1 + - input-directory: google/cloud/recommender/v1beta1 + service-config: recommender_v1beta1.yaml + import-path: cloud.google.com/go/recommender/apiv1beta1 + - input-directory: google/cloud/redis/v1 + service-config: redis_v1.yaml + import-path: cloud.google.com/go/redis/apiv1 + - input-directory: google/cloud/redis/v1beta1 + service-config: redis_v1beta1.yaml + import-path: cloud.google.com/go/redis/apiv1beta1 + - input-directory: google/cloud/redis/cluster/v1 + service-config: redis_v1.yaml + import-path: cloud.google.com/go/redis/cluster/apiv1 + - input-directory: google/cloud/resourcemanager/v2 + service-config: cloudresourcemanager_v2.yaml + import-path: cloud.google.com/go/resourcemanager/apiv2 + - input-directory: google/cloud/resourcemanager/v3 + service-config: cloudresourcemanager_v3.yaml + import-path: cloud.google.com/go/resourcemanager/apiv3 + - input-directory: google/cloud/retail/v2 + service-config: retail_v2.yaml + import-path: cloud.google.com/go/retail/apiv2 + - input-directory: google/cloud/retail/v2alpha + service-config: retail_v2alpha.yaml + import-path: cloud.google.com/go/retail/apiv2alpha + - input-directory: google/cloud/retail/v2beta + service-config: retail_v2beta.yaml + import-path: cloud.google.com/go/retail/apiv2beta + - input-directory: google/cloud/run/v2 + service-config: run_v2.yaml + import-path: cloud.google.com/go/run/apiv2 + - input-directory: google/cloud/scheduler/v1 + service-config: cloudscheduler_v1.yaml + import-path: cloud.google.com/go/scheduler/apiv1 + - input-directory: google/cloud/scheduler/v1beta1 + service-config: cloudscheduler_v1beta1.yaml + import-path: cloud.google.com/go/scheduler/apiv1beta1 + - input-directory: google/cloud/secretmanager/v1 + service-config: secretmanager_v1.yaml + import-path: cloud.google.com/go/secretmanager/apiv1 + - input-directory: google/cloud/secretmanager/v1beta2 + service-config: secretmanager_v1beta2.yaml + import-path: cloud.google.com/go/secretmanager/apiv1beta2 + - input-directory: google/cloud/securesourcemanager/v1 + service-config: securesourcemanager_v1.yaml + import-path: cloud.google.com/go/securesourcemanager/apiv1 + - input-directory: google/cloud/security/privateca/v1 + service-config: privateca_v1.yaml + import-path: cloud.google.com/go/security/privateca/apiv1 + - input-directory: google/cloud/security/publicca/v1beta1 + service-config: publicca_v1beta1.yaml + import-path: cloud.google.com/go/security/publicca/apiv1beta1 + - input-directory: google/cloud/security/publicca/v1 + service-config: publicca_v1.yaml + import-path: cloud.google.com/go/security/publicca/apiv1 + - input-directory: google/cloud/securitycenter/settings/v1beta1 + service-config: securitycenter_settings.yaml + import-path: cloud.google.com/go/securitycenter/settings/apiv1beta1 + - input-directory: google/cloud/securitycenter/v1 + service-config: securitycenter_v1.yaml + import-path: cloud.google.com/go/securitycenter/apiv1 + - input-directory: google/cloud/securitycenter/v1beta1 + service-config: securitycenter_v1beta1.yaml + import-path: cloud.google.com/go/securitycenter/apiv1beta1 + - input-directory: google/cloud/securitycenter/v1p1beta1 + service-config: securitycenter_v1p1beta1.yaml + import-path: cloud.google.com/go/securitycenter/apiv1p1beta1 + - input-directory: google/cloud/securitycenter/v2 + service-config: securitycenter_v2.yaml + import-path: cloud.google.com/go/securitycenter/apiv2 + - input-directory: google/cloud/securitycentermanagement/v1 + service-config: securitycentermanagement_v1.yaml + import-path: cloud.google.com/go/securitycentermanagement/apiv1 + - input-directory: google/cloud/securityposture/v1 + service-config: securityposture_v1.yaml + import-path: cloud.google.com/go/securityposture/apiv1 + - input-directory: google/api/servicecontrol/v1 + service-config: servicecontrol.yaml + import-path: cloud.google.com/go/servicecontrol/apiv1 + - input-directory: google/cloud/servicedirectory/v1 + service-config: servicedirectory_v1.yaml + import-path: cloud.google.com/go/servicedirectory/apiv1 + - input-directory: google/cloud/servicedirectory/v1beta1 + service-config: servicedirectory_v1beta1.yaml + import-path: cloud.google.com/go/servicedirectory/apiv1beta1 + - input-directory: google/cloud/servicehealth/v1 + service-config: servicehealth_v1.yaml + import-path: cloud.google.com/go/servicehealth/apiv1 + - input-directory: google/api/servicemanagement/v1 + service-config: servicemanagement_v1.yaml + import-path: cloud.google.com/go/servicemanagement/apiv1 + - input-directory: google/api/serviceusage/v1 + service-config: serviceusage_v1.yaml + import-path: cloud.google.com/go/serviceusage/apiv1 + - input-directory: google/cloud/shell/v1 + service-config: cloudshell_v1.yaml + import-path: cloud.google.com/go/shell/apiv1 + - input-directory: google/shopping/css/v1 + service-config: css_v1.yaml + import-path: cloud.google.com/go/shopping/css/apiv1 + - input-directory: google/shopping/merchant/accounts/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/accounts/apiv1 + - input-directory: google/shopping/merchant/accounts/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/accounts/apiv1beta + - input-directory: google/shopping/merchant/conversions/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/conversions/apiv1 + - input-directory: google/shopping/merchant/conversions/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/conversions/apiv1beta + - input-directory: google/shopping/merchant/datasources/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/datasources/apiv1 + - input-directory: google/shopping/merchant/datasources/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/datasources/apiv1beta + - input-directory: google/shopping/merchant/notifications/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/notifications/apiv1 + - input-directory: google/shopping/merchant/notifications/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/notifications/apiv1beta + - input-directory: google/shopping/merchant/ordertracking/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/ordertracking/apiv1 + - input-directory: google/shopping/merchant/ordertracking/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta + - input-directory: google/shopping/merchant/products/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/products/apiv1 + - input-directory: google/shopping/merchant/products/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/products/apiv1beta + - input-directory: google/shopping/merchant/productstudio/v1alpha + service-config: merchantapi_v1alpha.yaml + import-path: cloud.google.com/go/shopping/merchant/productstudio/apiv1alpha + - input-directory: google/shopping/merchant/promotions/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/promotions/apiv1 + - input-directory: google/shopping/merchant/promotions/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/promotions/apiv1beta + - input-directory: google/shopping/merchant/quota/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/quota/apiv1 + - input-directory: google/shopping/merchant/quota/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/quota/apiv1beta + - input-directory: google/shopping/merchant/inventories/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/inventories/apiv1 + - input-directory: google/shopping/merchant/inventories/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/inventories/apiv1beta + - input-directory: google/shopping/merchant/issueresolution/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/issueresolution/apiv1 + - input-directory: google/shopping/merchant/issueresolution/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta + - input-directory: google/shopping/merchant/lfp/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/lfp/apiv1 + - input-directory: google/shopping/merchant/lfp/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/lfp/apiv1beta + - input-directory: google/shopping/merchant/reports/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/reports/apiv1 + - input-directory: google/shopping/merchant/reports/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/reports/apiv1beta + - input-directory: google/shopping/merchant/reviews/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/reviews/apiv1beta + - input-directory: google/shopping/type + service-config: + import-path: cloud.google.com/go/shopping/type + - input-directory: google/cloud/speech/v1 + service-config: speech_v1.yaml + import-path: cloud.google.com/go/speech/apiv1 + - input-directory: google/cloud/speech/v1p1beta1 + service-config: speech_v1p1beta1.yaml + import-path: cloud.google.com/go/speech/apiv1p1beta1 + - input-directory: google/cloud/speech/v2 + service-config: speech_v2.yaml + import-path: cloud.google.com/go/speech/apiv2 + - input-directory: google/cloud/storagebatchoperations/v1 + service-config: storagebatchoperations_v1.yaml + import-path: cloud.google.com/go/storagebatchoperations/apiv1 + - input-directory: google/cloud/storageinsights/v1 + service-config: storageinsights_v1.yaml + import-path: cloud.google.com/go/storageinsights/apiv1 + - input-directory: google/cloud/support/v2 + service-config: cloudsupport_v2.yaml + import-path: cloud.google.com/go/support/apiv2 + - input-directory: google/cloud/support/v2beta + service-config: cloudsupport_v2beta.yaml + import-path: cloud.google.com/go/support/apiv2beta + - input-directory: google/cloud/talent/v4 + service-config: jobs_v4.yaml + import-path: cloud.google.com/go/talent/apiv4 + - input-directory: google/cloud/talent/v4beta1 + service-config: jobs_v4beta1.yaml + import-path: cloud.google.com/go/talent/apiv4beta1 + - input-directory: google/cloud/tasks/v2 + service-config: cloudtasks_v2.yaml + import-path: cloud.google.com/go/cloudtasks/apiv2 + - input-directory: google/cloud/tasks/v2beta2 + service-config: cloudtasks_v2beta2.yaml + import-path: cloud.google.com/go/cloudtasks/apiv2beta2 + - input-directory: google/cloud/tasks/v2beta3 + service-config: cloudtasks_v2beta3.yaml + import-path: cloud.google.com/go/cloudtasks/apiv2beta3 + - input-directory: google/cloud/telcoautomation/v1 + service-config: telcoautomation_v1.yaml + import-path: cloud.google.com/go/telcoautomation/apiv1 + - input-directory: google/cloud/texttospeech/v1 + service-config: texttospeech_v1.yaml + import-path: cloud.google.com/go/texttospeech/apiv1 + - input-directory: google/cloud/tpu/v1 + service-config: tpu_v1.yaml + import-path: cloud.google.com/go/tpu/apiv1 + - input-directory: google/cloud/translate/v3 + service-config: translate_v3.yaml + import-path: cloud.google.com/go/translate/apiv3 + - input-directory: google/devtools/clouderrorreporting/v1beta1 + service-config: clouderrorreporting_v1beta1.yaml + import-path: cloud.google.com/go/errorreporting/apiv1beta1 + - input-directory: google/devtools/cloudtrace/v1 + service-config: cloudtrace_v1.yaml + import-path: cloud.google.com/go/trace/apiv1 + - input-directory: google/devtools/cloudtrace/v2 + service-config: cloudtrace_v2.yaml + import-path: cloud.google.com/go/trace/apiv2 + - input-directory: google/cloud/video/livestream/v1 + service-config: livestream_v1.yaml + import-path: cloud.google.com/go/video/livestream/apiv1 + - input-directory: google/cloud/video/transcoder/v1 + service-config: transcoder_v1.yaml + import-path: cloud.google.com/go/video/transcoder/apiv1 + - input-directory: google/cloud/videointelligence/v1 + service-config: videointelligence_v1.yaml + import-path: cloud.google.com/go/videointelligence/apiv1 + - input-directory: google/cloud/videointelligence/v1beta2 + service-config: videointelligence_v1beta2.yaml + import-path: cloud.google.com/go/videointelligence/apiv1beta2 + - input-directory: google/cloud/videointelligence/v1p3beta1 + service-config: videointelligence_v1p3beta1.yaml + import-path: cloud.google.com/go/videointelligence/apiv1p3beta1 + - input-directory: google/cloud/vision/v1 + service-config: vision_v1.yaml + import-path: cloud.google.com/go/vision/v2/apiv1 + rel-path: /vision/apiv1 + - input-directory: google/cloud/vision/v1p1beta1 + service-config: vision_v1p1beta1.yaml + import-path: cloud.google.com/go/vision/v2/apiv1p1beta1 + rel-path: /vision/apiv1p1beta1 + - input-directory: google/cloud/visionai/v1 + service-config: visionai_v1.yaml + import-path: cloud.google.com/go/visionai/apiv1 + - input-directory: google/cloud/vmmigration/v1 + service-config: vmmigration_v1.yaml + import-path: cloud.google.com/go/vmmigration/apiv1 + - input-directory: google/cloud/vmwareengine/v1 + service-config: vmwareengine_v1.yaml + import-path: cloud.google.com/go/vmwareengine/apiv1 + - input-directory: google/cloud/vpcaccess/v1 + service-config: vpcaccess_v1.yaml + import-path: cloud.google.com/go/vpcaccess/apiv1 + - input-directory: google/cloud/webrisk/v1 + service-config: webrisk_v1.yaml + import-path: cloud.google.com/go/webrisk/apiv1 + - input-directory: google/cloud/webrisk/v1beta1 + service-config: webrisk_v1beta1.yaml + import-path: cloud.google.com/go/webrisk/apiv1beta1 + - input-directory: google/cloud/websecurityscanner/v1 + service-config: websecurityscanner_v1.yaml + import-path: cloud.google.com/go/websecurityscanner/apiv1 + - input-directory: google/cloud/workflows/executions/v1 + service-config: workflowexecutions_v1.yaml + import-path: cloud.google.com/go/workflows/executions/apiv1 + - input-directory: google/cloud/workflows/executions/v1beta + service-config: workflowexecutions_v1beta.yaml + import-path: cloud.google.com/go/workflows/executions/apiv1beta + - input-directory: google/cloud/workflows/v1 + service-config: workflows_v1.yaml + import-path: cloud.google.com/go/workflows/apiv1 + - input-directory: google/cloud/workflows/v1beta + service-config: workflows_v1beta.yaml + import-path: cloud.google.com/go/workflows/apiv1beta + - input-directory: google/cloud/workstations/v1beta + service-config: workstations_v1beta.yaml + import-path: cloud.google.com/go/workstations/apiv1beta + - input-directory: google/cloud/workstations/v1 + service-config: workstations_v1.yaml + import-path: cloud.google.com/go/workstations/apiv1 + - input-directory: google/container/v1 + service-config: container_v1.yaml + import-path: cloud.google.com/go/container/apiv1 + - input-directory: google/dataflow/v1beta3 + service-config: dataflow_v1beta3.yaml + import-path: cloud.google.com/go/dataflow/apiv1beta3 + - input-directory: google/datastore/admin/v1 + service-config: datastore_v1.yaml + import-path: cloud.google.com/go/datastore/admin/apiv1 + - input-directory: google/datastore/v1 + service-config: datastore_v1.yaml + import-path: cloud.google.com/go/datastore/apiv1 + release-level-override: stable + - input-directory: google/devtools/artifactregistry/v1 + service-config: artifactregistry_v1.yaml + import-path: cloud.google.com/go/artifactregistry/apiv1 + - input-directory: google/devtools/artifactregistry/v1beta2 + service-config: artifactregistry_v1beta2.yaml + import-path: cloud.google.com/go/artifactregistry/apiv1beta2 + - input-directory: google/devtools/cloudbuild/v1 + service-config: cloudbuild_v1.yaml + import-path: cloud.google.com/go/cloudbuild/apiv1/v2 + - input-directory: google/devtools/cloudbuild/v2 + service-config: cloudbuild_v2.yaml + import-path: cloud.google.com/go/cloudbuild/apiv2 + - input-directory: google/cloud/confidentialcomputing/v1 + service-config: confidentialcomputing_v1.yaml + import-path: cloud.google.com/go/confidentialcomputing/apiv1 + - input-directory: google/cloud/confidentialcomputing/v1alpha1 + service-config: confidentialcomputing_v1alpha1.yaml + import-path: cloud.google.com/go/confidentialcomputing/apiv1alpha1 + - input-directory: google/devtools/containeranalysis/v1beta1 + service-config: containeranalysis_v1beta1.yaml + import-path: cloud.google.com/go/containeranalysis/apiv1beta1 + - input-directory: google/firestore/admin/v1 + service-config: firestore_v1.yaml + import-path: cloud.google.com/go/firestore/apiv1/admin + - input-directory: google/firestore/v1 + service-config: firestore_v1.yaml + import-path: cloud.google.com/go/firestore/apiv1 + - input-directory: google/iam/credentials/v1 + service-config: iamcredentials_v1.yaml + import-path: cloud.google.com/go/iam/credentials/apiv1 + - input-directory: google/iam/v1 + service-config: iam_meta_api.yaml + import-path: cloud.google.com/go/iam/apiv1 + - input-directory: google/iam/v2 + service-config: iam_v2.yaml + import-path: cloud.google.com/go/iam/apiv2 + - input-directory: google/iam/v3 + service-config: iam_v3.yaml + import-path: cloud.google.com/go/iam/apiv3 + - input-directory: google/iam/v3beta + service-config: iam_v3beta.yaml + import-path: cloud.google.com/go/iam/apiv3beta + - input-directory: google/identity/accesscontextmanager/v1 + service-config: accesscontextmanager_v1.yaml + import-path: cloud.google.com/go/accesscontextmanager/apiv1 + - input-directory: google/logging/v2 + service-config: logging_v2.yaml + import-path: cloud.google.com/go/logging/apiv2 + - input-directory: google/longrunning + service-config: longrunning.yaml + import-path: cloud.google.com/go/longrunning/autogen + - input-directory: google/maps/addressvalidation/v1 + service-config: addressvalidation_v1.yaml + import-path: cloud.google.com/go/maps/addressvalidation/apiv1 + - input-directory: google/maps/areainsights/v1 + service-config: areainsights_v1.yaml + import-path: cloud.google.com/go/maps/areainsights/apiv1 + - input-directory: google/maps/fleetengine/v1 + service-config: fleetengine_v1.yaml + import-path: cloud.google.com/go/maps/fleetengine/apiv1 + - input-directory: google/maps/fleetengine/delivery/v1 + service-config: fleetengine_v1.yaml + import-path: cloud.google.com/go/maps/fleetengine/delivery/apiv1 + - input-directory: google/maps/places/v1 + service-config: places_v1.yaml + import-path: cloud.google.com/go/maps/places/apiv1 + - input-directory: google/maps/routeoptimization/v1 + service-config: routeoptimization_v1.yaml + import-path: cloud.google.com/go/maps/routeoptimization/apiv1 + - input-directory: google/maps/routing/v2 + service-config: routes_v2.yaml + import-path: cloud.google.com/go/maps/routing/apiv2 + - input-directory: google/maps/solar/v1 + service-config: solar_v1.yaml + import-path: cloud.google.com/go/maps/solar/apiv1 + - input-directory: google/cloud/modelarmor/v1 + service-config: modelarmor_v1.yaml + import-path: cloud.google.com/go/modelarmor/apiv1 + - input-directory: google/cloud/modelarmor/v1beta + service-config: modelarmor_v1beta.yaml + import-path: cloud.google.com/go/modelarmor/apiv1beta + - input-directory: google/monitoring/dashboard/v1 + service-config: monitoring.yaml + import-path: cloud.google.com/go/monitoring/dashboard/apiv1 + - input-directory: google/monitoring/metricsscope/v1 + service-config: monitoring.yaml + import-path: cloud.google.com/go/monitoring/metricsscope/apiv1 + - input-directory: google/monitoring/v3 + service-config: monitoring.yaml + import-path: cloud.google.com/go/monitoring/apiv3/v2 + - input-directory: google/pubsub/v1 + service-config: pubsub_v1.yaml + import-path: cloud.google.com/go/pubsub/v2/apiv1 + - input-directory: google/spanner/adapter/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/adapter/apiv1 + - input-directory: google/spanner/admin/database/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/admin/database/apiv1 + - input-directory: google/spanner/admin/instance/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/admin/instance/apiv1 + - input-directory: google/spanner/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/apiv1 + - input-directory: google/spanner/executor/v1 + service-config: spanner_cloud_executor.yaml + import-path: cloud.google.com/go/spanner/executor/apiv1 + - input-directory: google/storage/control/v2 + service-config: storage_v2.yaml + import-path: cloud.google.com/go/storage/control/apiv2 + - input-directory: google/storage/v2 + service-config: storage_v2.yaml + import-path: cloud.google.com/go/storage/internal/apiv2 + - input-directory: google/storagetransfer/v1 + service-config: storagetransfer_v1.yaml + import-path: cloud.google.com/go/storagetransfer/apiv1 + - input-directory: google/streetview/publish/v1 + service-config: streetviewpublish.yaml + import-path: cloud.google.com/go/streetview/publish/apiv1 + # All entries below are clients that are not currently copied by owlbot. They + # explicitly express their import path for some code gen. + - input-directory: google/devtools/containeranalysis/v1beta1/grafeas + service-config: ../containeranalysis_v1beta1.yaml + import-path: cloud.google.com/go/containeranalysis/apiv1beta1 + rel-path: /containeranalysis/apiv1beta1 + - input-directory: google/cloud/video/stitcher/v1 + service-config: videostitcher_v1.yaml + import-path: cloud.google.com/go/video/stitcher/apiv1 + +skip-module-scan-paths: + # ignore the root module + - . + # Librarian released modules + - ai + - dataproc + - dlp + # individually released modules + - auth + - auth/oauth2adapt + - bigquery + - bigquery/v2 + - bigtable + - datastore + - errorreporting + - firestore + - logging + - profiler + - pubsub/v2 + - pubsub + - pubsublite + - spanner + - storage + - vertexai + # unreleased modules + - spanner/test/opentelemetry/test diff --git a/internal/stategen/testdata/golden/release-please-config-individual.json b/internal/stategen/testdata/golden/release-please-config-individual.json new file mode 100644 index 000000000000..32ea9f8208b0 --- /dev/null +++ b/internal/stategen/testdata/golden/release-please-config-individual.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "go-yoshi", + "include-component-in-tag": true, + "separate-pull-requests": true, + "tag-separator": "/", + "packages": { + "auth": { + "component": "auth" + }, + "auth/oauth2adapt": { + "component": "auth/oauth2adapt" + }, + "bigquery": { + "component": "bigquery", + "exclude-paths": ["bigquery/v2"] + }, + "bigtable": { + "component": "bigtable" + }, + "datastore": { + "component": "datastore" + }, + "errorreporting": { + "component": "errorreporting" + }, + "firestore": { + "component": "firestore" + }, + "logging": { + "component": "logging" + }, + "profiler": { + "component": "profiler" + }, + "pubsub": { + "component": "pubsub", + "exclude-paths": ["pubsub/v2"] + }, + "pubsub/v2": { + "component": "pubsub/v2" + }, + "pubsublite": { + "component": "pubsublite" + }, + "spanner": { + "component": "spanner" + }, + "storage": { + "component": "storage" + }, + "vertexai": { + "component": "vertexai" + } + }, + "plugins": [ + "sentence-case" + ] +} diff --git a/internal/stategen/testdata/golden/release-please-config-yoshi-submodules.json b/internal/stategen/testdata/golden/release-please-config-yoshi-submodules.json new file mode 100644 index 000000000000..3428066af3b7 --- /dev/null +++ b/internal/stategen/testdata/golden/release-please-config-yoshi-submodules.json @@ -0,0 +1,499 @@ +{ + "release-type": "go-yoshi", + "include-component-in-tag": true, + "tag-separator": "/", + "packages": { + "accessapproval": { + "component": "accessapproval" + }, + "accesscontextmanager": { + "component": "accesscontextmanager" + }, + "advisorynotifications": { + "component": "advisorynotifications" + }, + "aiplatform": { + "component": "aiplatform" + }, + "alloydb": { + "component": "alloydb" + }, + "analytics": { + "component": "analytics" + }, + "apigateway": { + "component": "apigateway" + }, + "apigeeconnect": { + "component": "apigeeconnect" + }, + "apigeeregistry": { + "component": "apigeeregistry" + }, + "apihub": { + "component": "apihub" + }, + "apikeys": { + "component": "apikeys" + }, + "appengine": { + "component": "appengine" + }, + "apphub": { + "component": "apphub" + }, + "apps": { + "component": "apps" + }, + "area120": { + "component": "area120" + }, + "artifactregistry": { + "component": "artifactregistry" + }, + "asset": { + "component": "asset" + }, + "assuredworkloads": { + "component": "assuredworkloads" + }, + "automl": { + "component": "automl" + }, + "backupdr": { + "component": "backupdr" + }, + "baremetalsolution": { + "component": "baremetalsolution" + }, + "batch": { + "component": "batch" + }, + "beyondcorp": { + "component": "beyondcorp" + }, + "billing": { + "component": "billing" + }, + "binaryauthorization": { + "component": "binaryauthorization" + }, + "capacityplanner": { + "component": "capacityplanner" + }, + "certificatemanager": { + "component": "certificatemanager" + }, + "channel": { + "component": "channel" + }, + "chat": { + "component": "chat" + }, + "chronicle": { + "component": "chronicle" + }, + "cloudbuild": { + "component": "cloudbuild" + }, + "cloudcontrolspartner": { + "component": "cloudcontrolspartner" + }, + "clouddms": { + "component": "clouddms" + }, + "cloudprofiler": { + "component": "cloudprofiler" + }, + "cloudquotas": { + "component": "cloudquotas" + }, + "cloudtasks": { + "component": "cloudtasks" + }, + "commerce": { + "component": "commerce" + }, + "compute": { + "component": "compute" + }, + "compute/metadata": { + "component": "compute/metadata" + }, + "confidentialcomputing": { + "component": "confidentialcomputing" + }, + "config": { + "component": "config" + }, + "configdelivery": { + "component": "configdelivery" + }, + "contactcenterinsights": { + "component": "contactcenterinsights" + }, + "container": { + "component": "container" + }, + "containeranalysis": { + "component": "containeranalysis" + }, + "datacatalog": { + "component": "datacatalog" + }, + "dataflow": { + "component": "dataflow" + }, + "dataform": { + "component": "dataform" + }, + "datafusion": { + "component": "datafusion" + }, + "datalabeling": { + "component": "datalabeling" + }, + "dataplex": { + "component": "dataplex" + }, + "dataproc": { + "component": "dataproc" + }, + "dataqna": { + "component": "dataqna" + }, + "datastream": { + "component": "datastream" + }, + "deploy": { + "component": "deploy" + }, + "developerconnect": { + "component": "developerconnect" + }, + "devicestreaming": { + "component": "devicestreaming" + }, + "dialogflow": { + "component": "dialogflow" + }, + "discoveryengine": { + "component": "discoveryengine" + }, + "documentai": { + "component": "documentai" + }, + "domains": { + "component": "domains" + }, + "edgecontainer": { + "component": "edgecontainer" + }, + "edgenetwork": { + "component": "edgenetwork" + }, + "essentialcontacts": { + "component": "essentialcontacts" + }, + "eventarc": { + "component": "eventarc" + }, + "filestore": { + "component": "filestore" + }, + "financialservices": { + "component": "financialservices" + }, + "functions": { + "component": "functions" + }, + "geminidataanalytics": { + "component": "geminidataanalytics" + }, + "gkebackup": { + "component": "gkebackup" + }, + "gkeconnect": { + "component": "gkeconnect" + }, + "gkehub": { + "component": "gkehub" + }, + "gkemulticloud": { + "component": "gkemulticloud" + }, + "grafeas": { + "component": "grafeas" + }, + "gsuiteaddons": { + "component": "gsuiteaddons" + }, + "iam": { + "component": "iam" + }, + "iap": { + "component": "iap" + }, + "identitytoolkit": { + "component": "identitytoolkit" + }, + "ids": { + "component": "ids" + }, + "iot": { + "component": "iot" + }, + "kms": { + "component": "kms" + }, + "language": { + "component": "language" + }, + "licensemanager": { + "component": "licensemanager" + }, + "lifesciences": { + "component": "lifesciences" + }, + "locationfinder": { + "component": "locationfinder" + }, + "longrunning": { + "component": "longrunning" + }, + "lustre": { + "component": "lustre" + }, + "maintenance": { + "component": "maintenance" + }, + "managedidentities": { + "component": "managedidentities" + }, + "managedkafka": { + "component": "managedkafka" + }, + "maps": { + "component": "maps" + }, + "mediatranslation": { + "component": "mediatranslation" + }, + "memcache": { + "component": "memcache" + }, + "memorystore": { + "component": "memorystore" + }, + "metastore": { + "component": "metastore" + }, + "migrationcenter": { + "component": "migrationcenter" + }, + "modelarmor": { + "component": "modelarmor" + }, + "monitoring": { + "component": "monitoring" + }, + "netapp": { + "component": "netapp" + }, + "networkconnectivity": { + "component": "networkconnectivity" + }, + "networkmanagement": { + "component": "networkmanagement" + }, + "networksecurity": { + "component": "networksecurity" + }, + "networkservices": { + "component": "networkservices" + }, + "notebooks": { + "component": "notebooks" + }, + "optimization": { + "component": "optimization" + }, + "oracledatabase": { + "component": "oracledatabase" + }, + "orchestration": { + "component": "orchestration" + }, + "orgpolicy": { + "component": "orgpolicy" + }, + "osconfig": { + "component": "osconfig" + }, + "oslogin": { + "component": "oslogin" + }, + "parallelstore": { + "component": "parallelstore" + }, + "parametermanager": { + "component": "parametermanager" + }, + "phishingprotection": { + "component": "phishingprotection" + }, + "policysimulator": { + "component": "policysimulator" + }, + "policytroubleshooter": { + "component": "policytroubleshooter" + }, + "privatecatalog": { + "component": "privatecatalog" + }, + "privilegedaccessmanager": { + "component": "privilegedaccessmanager" + }, + "rapidmigrationassessment": { + "component": "rapidmigrationassessment" + }, + "recaptchaenterprise": { + "component": "recaptchaenterprise" + }, + "recommendationengine": { + "component": "recommendationengine" + }, + "recommender": { + "component": "recommender" + }, + "redis": { + "component": "redis" + }, + "resourcemanager": { + "component": "resourcemanager" + }, + "retail": { + "component": "retail" + }, + "run": { + "component": "run" + }, + "scheduler": { + "component": "scheduler" + }, + "secretmanager": { + "component": "secretmanager" + }, + "securesourcemanager": { + "component": "securesourcemanager" + }, + "security": { + "component": "security" + }, + "securitycenter": { + "component": "securitycenter" + }, + "securitycentermanagement": { + "component": "securitycentermanagement" + }, + "securityposture": { + "component": "securityposture" + }, + "servicecontrol": { + "component": "servicecontrol" + }, + "servicedirectory": { + "component": "servicedirectory" + }, + "servicehealth": { + "component": "servicehealth" + }, + "servicemanagement": { + "component": "servicemanagement" + }, + "serviceusage": { + "component": "serviceusage" + }, + "shell": { + "component": "shell" + }, + "shopping": { + "component": "shopping" + }, + "spanner/benchmarks": { + "component": "spanner/benchmarks" + }, + "speech": { + "component": "speech" + }, + "storagebatchoperations": { + "component": "storagebatchoperations" + }, + "storageinsights": { + "component": "storageinsights" + }, + "storagetransfer": { + "component": "storagetransfer" + }, + "streetview": { + "component": "streetview" + }, + "support": { + "component": "support" + }, + "talent": { + "component": "talent" + }, + "telcoautomation": { + "component": "telcoautomation" + }, + "texttospeech": { + "component": "texttospeech" + }, + "tpu": { + "component": "tpu" + }, + "trace": { + "component": "trace" + }, + "translate": { + "component": "translate" + }, + "video": { + "component": "video" + }, + "videointelligence": { + "component": "videointelligence" + }, + "vision": { + "component": "vision" + }, + "visionai": { + "component": "visionai" + }, + "vmmigration": { + "component": "vmmigration" + }, + "vmwareengine": { + "component": "vmwareengine" + }, + "vpcaccess": { + "component": "vpcaccess" + }, + "webrisk": { + "component": "webrisk" + }, + "websecurityscanner": { + "component": "websecurityscanner" + }, + "workflows": { + "component": "workflows" + }, + "workstations": { + "component": "workstations" + } + }, + "plugins": [ + "sentence-case" + ] +} diff --git a/internal/stategen/testdata/source/.github/.OwlBot.yaml b/internal/stategen/testdata/source/.github/.OwlBot.yaml new file mode 100644 index 000000000000..8dd446e937dc --- /dev/null +++ b/internal/stategen/testdata/source/.github/.OwlBot.yaml @@ -0,0 +1,1391 @@ +docker: + image: gcr.io/cloud-devrel-public-resources/owlbot-go:latest + +deep-remove-regex: + - /accessapproval/apiv1/ + - /accesscontextmanager/apiv1/ + - /ai/generativelanguage/apiv1/ + - /ai/generativelanguage/apiv1alpha/ + - /ai/generativelanguage/apiv1beta/ + - /ai/generativelanguage/apiv1beta2/ + - /aiplatform/apiv1/ + - /aiplatform/apiv1beta1/ + - /advisorynotifications/apiv1/ + - /alloydb/apiv1/ + - /alloydb/apiv1alpha/ + - /alloydb/apiv1beta/ + - /alloydb/connectors/apiv1/ + - /alloydb/connectors/apiv1alpha/ + - /alloydb/connectors/apiv1beta/ + - /analytics/admin/apiv1alpha/ + - /apigateway/apiv1/ + - /apigeeconnect/apiv1/ + - /apigeeregistry/apiv1/ + - /apihub/apiv1/ + - /apikeys/apiv2/ + - /appengine/apiv1/ + - /apphub/apiv1/ + - /apps/events/subscriptions/apiv1/ + - /apps/events/subscriptions/apiv1beta/ + - /apps/meet/apiv2/ + - /apps/meet/apiv2beta/ + - /area120/tables/apiv1alpha1/ + - /artifactregistry/apiv1/ + - /artifactregistry/apiv1beta2/ + - /asset/apiv1/ + - /asset/apiv1p2beta1/ + - /asset/apiv1p5beta1/ + - /assuredworkloads/apiv1/ + - /assuredworkloads/apiv1beta1/ + - /automl/apiv1/ + - /automl/apiv1beta1/ + - /backupdr/apiv1/ + - /baremetalsolution/apiv2/ + - /batch/apiv1/ + - /beyondcorp/appconnections/apiv1/ + - /beyondcorp/appconnectors/apiv1/ + - /beyondcorp/appgateways/apiv1/ + - /beyondcorp/clientconnectorservices/apiv1/ + - /beyondcorp/clientgateways/apiv1/ + - /bigquery/analyticshub/apiv1/ + - /bigquery/biglake/apiv1/ + - /bigquery/biglake/apiv1alpha1/ + - /bigquery/connection/apiv1/ + - /bigquery/connection/apiv1beta1/ + - /bigquery/dataexchange/apiv1beta1/ + - /bigquery/datapolicies/apiv1/ + - /bigquery/datapolicies/apiv1beta1/ + - /bigquery/datapolicies/apiv2/ + - /bigquery/datapolicies/apiv2beta1/ + - /bigquery/datatransfer/apiv1/ + - /bigquery/migration/apiv2/ + - /bigquery/migration/apiv2alpha/ + - /bigquery/reservation/apiv1/ + - /bigquery/storage/apiv1/ + - /bigquery/storage/apiv1alpha/ + - /bigquery/storage/apiv1beta/ + - /bigquery/storage/apiv1beta1/ + - /bigquery/storage/apiv1beta2/ + - /bigquery/v2/apiv2/ + - /bigtable/admin/apiv2/ + - /bigtable/apiv2/ + - /billing/apiv1/ + - /billing/budgets/apiv1/ + - /billing/budgets/apiv1beta1/ + - /binaryauthorization/apiv1/ + - /binaryauthorization/apiv1beta1/ + - /capacityplanner/apiv1beta/ + - /certificatemanager/apiv1/ + - /channel/apiv1/ + - /chat/apiv1/ + - /chronicle/apiv1/ + - /cloudbuild/apiv1/v2/ + - /cloudbuild/apiv2/ + - /cloudcontrolspartner/apiv1/ + - /cloudcontrolspartner/apiv1beta/ + - /clouddms/apiv1/ + - /cloudprofiler/apiv2/ + - /cloudquotas/apiv1/ + - /cloudquotas/apiv1beta/ + - /cloudtasks/apiv2/ + - /cloudtasks/apiv2beta2/ + - /cloudtasks/apiv2beta3/ + - /commerce/consumer/procurement/apiv1 + - /compute/apiv1 + - /compute/apiv1beta + - /confidentialcomputing/apiv1 + - /confidentialcomputing/apiv1alpha1 + - /config/apiv1/ + - /configdelivery/apiv1/ + - /configdelivery/apiv1beta/ + - /contactcenterinsights/apiv1/ + - /container/apiv1/ + - /containeranalysis/apiv1beta1/ + - /datacatalog/apiv1/ + - /datacatalog/apiv1beta1/ + - /datacatalog/lineage/apiv1/ + - /dataflow/apiv1beta3/ + - /dataform/apiv1/ + - /dataform/apiv1beta1/ + - /datafusion/apiv1/ + - /datalabeling/apiv1beta1/ + - /dataplex/apiv1/ + - /dataproc/apiv1/ + - /dataqna/apiv1alpha/ + - /datastore/admin/apiv1/ + - /datastore/apiv1/ + - /datastream/apiv1/ + - /datastream/apiv1alpha1/ + - /deploy/apiv1/ + - /developerconnect/apiv1/ + - /devicestreaming/apiv1/ + - /dialogflow/apiv2/ + - /dialogflow/apiv2beta1/ + - /dialogflow/cx/apiv3/ + - /dialogflow/cx/apiv3beta1/ + - /discoveryengine/apiv1/ + - /discoveryengine/apiv1beta/ + - /discoveryengine/apiv1alpha/ + - /documentai/apiv1/ + - /documentai/apiv1beta3/ + - /domains/apiv1beta1/ + - /edgecontainer/apiv1/ + - /edgenetwork/apiv1/ + # - /errorreporting/apiv1beta1/ + - /essentialcontacts/apiv1/ + - /eventarc/apiv1/ + - /eventarc/publishing/apiv1/ + - /filestore/apiv1/ + - /financialservices/apiv1/ + - /firestore/apiv1/ + - /firestore/apiv1/admin/ + - /functions/apiv1/ + - /functions/apiv2/ + - /functions/apiv2beta/ + - /geminidataanalytics/apiv1beta/ + - /gkebackup/apiv1/ + - /gkeconnect/gateway/apiv1beta1/ + - /gkeconnect/gateway/apiv1/ + - /gkehub/apiv1beta1/ + - /gkemulticloud/apiv1/ + - /gsuiteaddons/apiv1/ + - /iam/apiv1/ + - /iam/apiv2/ + - /iam/apiv3/ + - /iam/apiv3beta/ + - /iam/credentials/apiv1/ + - /iap/apiv1/ + - /identitytoolkit/apiv2/ + - /ids/apiv1/ + # START snippets + - /internal/generated/snippets/accessapproval/apiv1/ + - /internal/generated/snippets/accesscontextmanager/apiv1/ + - /internal/generated/snippets/ai/generativelanguage/apiv1/ + - /internal/generated/snippets/ai/generativelanguage/apiv1alpha/ + - /internal/generated/snippets/ai/generativelanguage/apiv1beta/ + - /internal/generated/snippets/ai/generativelanguage/apiv1beta2/ + - /internal/generated/snippets/aiplatform/apiv1/ + - /internal/generated/snippets/aiplatform/apiv1beta1/ + - /internal/generated/snippets/advisorynotifications/apiv1/ + - /internal/generated/snippets/alloydb/apiv1/ + - /internal/generated/snippets/alloydb/apiv1alpha/ + - /internal/generated/snippets/alloydb/apiv1beta/ + - /internal/generated/snippets/analytics/admin/apiv1alpha/ + - /internal/generated/snippets/apigateway/apiv1/ + - /internal/generated/snippets/apigeeconnect/apiv1/ + - /internal/generated/snippets/apigeeregistry/apiv1/ + - /internal/generated/snippets/apihub/apiv1/ + - /internal/generated/snippets/apikeys/apiv2/ + - /internal/generated/snippets/appengine/apiv1/ + - /internal/generated/snippets/apphub/apiv1/ + - /internal/generated/snippets/apps/events/subscriptions/apiv1/ + - /internal/generated/snippets/apps/events/subscriptions/apiv1beta/ + - /internal/generated/snippets/apps/meet/apiv2/ + - /internal/generated/snippets/apps/meet/apiv2beta/ + - /internal/generated/snippets/area120/tables/apiv1alpha1/ + - /internal/generated/snippets/artifactregistry/apiv1/ + - /internal/generated/snippets/artifactregistry/apiv1beta2/ + - /internal/generated/snippets/asset/apiv1/ + - /internal/generated/snippets/asset/apiv1p2beta1/ + - /internal/generated/snippets/asset/apiv1p5beta1/ + - /internal/generated/snippets/assuredworkloads/apiv1/ + - /internal/generated/snippets/assuredworkloads/apiv1beta1/ + - /internal/generated/snippets/automl/apiv1/ + - /internal/generated/snippets/automl/apiv1beta1/ + - /internal/generated/snippets/backupdr/apiv1/ + - /internal/generated/snippets/baremetalsolution/apiv2/ + - /internal/generated/snippets/batch/apiv1/ + - /internal/generated/snippets/beyondcorp/appconnections/apiv1/ + - /internal/generated/snippets/beyondcorp/appconnectors/apiv1/ + - /internal/generated/snippets/beyondcorp/appgateways/apiv1/ + - /internal/generated/snippets/beyondcorp/clientconnectorservices/apiv1/ + - /internal/generated/snippets/beyondcorp/clientgateways/apiv1/ + - /internal/generated/snippets/bigquery/analyticshub/apiv1/ + - /internal/generated/snippets/bigquery/biglake/apiv1/ + - /internal/generated/snippets/bigquery/biglake/apiv1alpha1/ + - /internal/generated/snippets/bigquery/connection/apiv1/ + - /internal/generated/snippets/bigquery/connection/apiv1beta1/ + - /internal/generated/snippets/bigquery/dataexchange/apiv1beta1/ + - /internal/generated/snippets/bigquery/datapolicies/apiv1/ + - /internal/generated/snippets/bigquery/datapolicies/apiv1beta1/ + - /internal/generated/snippets/bigquery/datapolicies/apiv2/ + - /internal/generated/snippets/bigquery/datapolicies/apiv2beta1/ + - /internal/generated/snippets/bigquery/datatransfer/apiv1/ + - /internal/generated/snippets/bigquery/migration/apiv2/ + - /internal/generated/snippets/bigquery/migration/apiv2alpha/ + - /internal/generated/snippets/bigquery/reservation/apiv1/ + - /internal/generated/snippets/bigquery/storage/apiv1/ + - /internal/generated/snippets/bigquery/storage/apiv1alpha/ + - /internal/generated/snippets/bigquery/storage/apiv1beta/ + - /internal/generated/snippets/bigquery/storage/apiv1beta1/ + - /internal/generated/snippets/bigquery/storage/apiv1beta2/ + - /internal/generated/snippets/bigquery/v2/apiv2/ + - /internal/generated/snippets/billing/apiv1/ + - /internal/generated/snippets/billing/budgets/apiv1/ + - /internal/generated/snippets/billing/budgets/apiv1beta1/ + - /internal/generated/snippets/binaryauthorization/apiv1/ + - /internal/generated/snippets/binaryauthorization/apiv1beta1/ + - /internal/generated/snippets/capacityplanner/apiv1beta/ + - /internal/generated/snippets/certificatemanager/apiv1/ + - /internal/generated/snippets/channel/apiv1/ + - /internal/generated/snippets/chat/apiv1/ + - /internal/generated/snippets/chronicle/apiv1/ + - /internal/generated/snippets/cloudbuild/apiv1/v2/ + - /internal/generated/snippets/cloudbuild/apiv2/ + - /internal/generated/snippets/cloudcontrolspartner/apiv1/ + - /internal/generated/snippets/cloudcontrolspartner/apiv1beta/ + - /internal/generated/snippets/clouddms/apiv1/ + - /internal/generated/snippets/cloudprofiler/apiv2/ + - /internal/generated/snippets/cloudquotas/apiv1/ + - /internal/generated/snippets/cloudquotas/apiv1beta/ + - /internal/generated/snippets/cloudtasks/apiv2/ + - /internal/generated/snippets/cloudtasks/apiv2beta2/ + - /internal/generated/snippets/cloudtasks/apiv2beta3/ + - /internal/generated/snippets/commerce/consumer/procurement/apiv1 + - /internal/generated/snippets/compute/apiv1 + - /internal/generated/snippets/compute/apiv1beta + - /internal/generated/snippets/confidentialcomputing/apiv1 + - /internal/generated/snippets/confidentialcomputing/apiv1alpha1 + - /internal/generated/snippets/config/apiv1/ + - /internal/generated/snippets/configdelivery/apiv1/ + - /internal/generated/snippets/configdelivery/apiv1beta/ + - /internal/generated/snippets/contactcenterinsights/apiv1/ + - /internal/generated/snippets/container/apiv1/ + - /internal/generated/snippets/containeranalysis/apiv1beta1/ + - /internal/generated/snippets/datacatalog/apiv1/ + - /internal/generated/snippets/datacatalog/apiv1beta1/ + - /internal/generated/snippets/datacatalog/lineage/apiv1/ + - /internal/generated/snippets/dataflow/apiv1beta3/ + - /internal/generated/snippets/dataform/apiv1/ + - /internal/generated/snippets/dataform/apiv1beta1/ + - /internal/generated/snippets/datafusion/apiv1/ + - /internal/generated/snippets/datalabeling/apiv1beta1/ + - /internal/generated/snippets/dataplex/apiv1/ + - /internal/generated/snippets/dataproc/apiv1/ + - /internal/generated/snippets/dataqna/apiv1alpha/ + - /internal/generated/snippets/datastore/admin/apiv1/ + - /internal/generated/snippets/datastream/apiv1/ + - /internal/generated/snippets/datastream/apiv1alpha1/ + - /internal/generated/snippets/deploy/apiv1/ + - /internal/generated/snippets//developerconnect/apiv1/ + - /internal/generated/snippets//devicestreaming/apiv1/ + - /internal/generated/snippets/dialogflow/apiv2/ + - /internal/generated/snippets/dialogflow/apiv2beta1/ + - /internal/generated/snippets/dialogflow/cx/apiv3/ + - /internal/generated/snippets/dialogflow/cx/apiv3beta1/ + - /internal/generated/snippets/discoveryengine/apiv1/ + - /internal/generated/snippets/discoveryengine/apiv1beta/ + - /internal/generated/snippets/discoveryengine/apiv1alpha/ + - /internal/generated/snippets/documentai/apiv1/ + - /internal/generated/snippets/documentai/apiv1beta3/ + - /internal/generated/snippets/domains/apiv1beta1/ + - /internal/generated/snippets/edgecontainer/apiv1/ + - /internal/generated/snippets/edgenetwork/apiv1/ + # - /internal/generated/snippets/errorreporting/apiv1beta1/ + - /internal/generated/snippets/essentialcontacts/apiv1/ + - /internal/generated/snippets/eventarc/apiv1/ + - /internal/generated/snippets/eventarc/publishing/apiv1/ + - /internal/generated/snippets/filestore/apiv1/ + - /internal/generated/snippets/financialservices/apiv1/ + - /internal/generated/snippets/firestore/apiv1/ + - /internal/generated/snippets/firestore/apiv1/admin/ + - /internal/generated/snippets/functions/apiv1/ + - /internal/generated/snippets/functions/apiv2/ + - /internal/generated/snippets/functions/apiv2beta/ + - /internal/generated/snippets/geminidataanalytics/apiv1beta/ + - /internal/generated/snippets/gkebackup/apiv1/ + - /internal/generated/snippets/gkeconnect/gateway/apiv1beta1/ + - /internal/generated/snippets/gkeconnect/gateway/apiv1/ + - /internal/generated/snippets/gkehub/apiv1beta1/ + - /internal/generated/snippets/gkemulticloud/apiv1/ + - /internal/generated/snippets/gsuiteaddons/apiv1/ + - /internal/generated/snippets/iam/apiv1/ + - /internal/generated/snippets/iam/apiv2/ + - /internal/generated/snippets/iam/apiv3/ + - /internal/generated/snippets/iam/apiv3beta/ + - /internal/generated/snippets/iam/credentials/apiv1/ + - /internal/generated/snippets/iap/apiv1/ + - /internal/generated/snippets/identitytoolkit/apiv2/ + - /internal/generated/snippets/ids/apiv1/ + - /internal/generated/snippets/iot/apiv1/ + - /internal/generated/snippets/kms/apiv1/ + - /internal/generated/snippets/kms/inventory/apiv1/ + - /internal/generated/snippets/language/apiv1/ + - /internal/generated/snippets/language/apiv1beta2/ + - /internal/generated/snippets/language/apiv2/ + - /internal/generated/snippets/licensemanager/apiv1/ + - /internal/generated/snippets/lifesciences/apiv2beta/ + - /internal/generated/snippets/locationfinder/apiv1/ + - /internal/generated/snippets/logging/apiv2/ + - /internal/generated/snippets/longrunning/autogen/ + - /internal/generated/snippets/lustre/apiv1/ + - /internal/generated/snippets/maintenance/api/apiv1beta/ + - /internal/generated/snippets/managedidentities/apiv1/ + - /internal/generated/snippets/managedkafka/apiv1/ + - /internal/generated/snippets/managedkafka/schemaregistry/apiv1/ + - /internal/generated/snippets/maps/addressvalidation/apiv1/ + - /internal/generated/snippets/maps/areainsights/apiv1/ + - /internal/generated/snippets/maps/fleetengine/apiv1/ + - /internal/generated/snippets/maps/fleetengine/delivery/apiv1/ + - /internal/generated/snippets/maps/places/apiv1/ + - /internal/generated/snippets/maps/routeoptimization/apiv1/ + - /internal/generated/snippets/maps/routing/apiv2/ + - /internal/generated/snippets/maps/solar/apiv1/ + - /internal/generated/snippets/mediatranslation/apiv1beta1/ + - /internal/generated/snippets/memcache/apiv1/ + - /internal/generated/snippets/memcache/apiv1beta2/ + - /internal/generated/snippets/memorystore/apiv1/ + - /internal/generated/snippets/memorystore/apiv1beta/ + - /internal/generated/snippets/metastore/apiv1/ + - /internal/generated/snippets/metastore/apiv1alpha/ + - /internal/generated/snippets/metastore/apiv1beta/ + - /internal/generated/snippets/migrationcenter/apiv1/ + - /internal/generated/snippets/monitoring/apiv3/v2/ + - /internal/generated/snippets/monitoring/dashboard/apiv1/ + - /internal/generated/snippets/monitoring/metricsscope/apiv1/ + - /internal/generated/snippets/netapp/apiv1/ + - /internal/generated/snippets/networkconnectivity/apiv1/ + - /internal/generated/snippets/networkconnectivity/apiv1alpha1/ + - /internal/generated/snippets/networkmanagement/apiv1/ + - /internal/generated/snippets/networksecurity/apiv1beta1/ + - /internal/generated/snippets/networkservices/apiv1/ + - /internal/generated/snippets/notebooks/apiv1/ + - /internal/generated/snippets/notebooks/apiv1beta1/ + - /internal/generated/snippets/notebooks/apiv2/ + - /internal/generated/snippets/optimization/apiv1/ + - /internal/generated/snippets/oracledatabase/apiv1/ + - /internal/generated/snippets/orchestration/airflow/service/apiv1/ + - /internal/generated/snippets/orgpolicy/apiv2/ + - /internal/generated/snippets/osconfig/agentendpoint/apiv1/ + - /internal/generated/snippets/osconfig/agentendpoint/apiv1beta/ + - /internal/generated/snippets/osconfig/apiv1/ + - /internal/generated/snippets/osconfig/apiv1alpha/ + - /internal/generated/snippets/osconfig/apiv1beta/ + - /internal/generated/snippets/oslogin/apiv1/ + - /internal/generated/snippets/oslogin/apiv1beta/ + - /internal/generated/snippets/parallelstore/apiv1/ + - /internal/generated/snippets/parallelstore/apiv1beta/ + - /internal/generated/snippets/parametermanager/apiv1/ + - /internal/generated/snippets/phishingprotection/apiv1beta1/ + - /internal/generated/snippets/policysimulator/apiv1/ + - /internal/generated/snippets/policytroubleshooter/apiv1/ + - /internal/generated/snippets/policytroubleshooter/iam/apiv3/ + - /internal/generated/snippets/privatecatalog/apiv1beta1/ + - /internal/generated/snippets/privilegedaccessmanager/apiv1/ + - /internal/generated/snippets/pubsub/apiv1/ + - /internal/generated/snippets/pubsublite/apiv1/ + - /internal/generated/snippets/rapidmigrationassessment/apiv1/ + - /internal/generated/snippets/recaptchaenterprise/apiv1/ + - /internal/generated/snippets/recaptchaenterprise/apiv1beta1/ + - /internal/generated/snippets/recommendationengine/apiv1beta1/ + - /internal/generated/snippets/recommender/apiv1/ + - /internal/generated/snippets/recommender/apiv1beta1/ + - /internal/generated/snippets/redis/apiv1/ + - /internal/generated/snippets/redis/apiv1beta1/ + - /internal/generated/snippets/redis/cluster/apiv1/ + - /internal/generated/snippets/resourcemanager/apiv2/ + - /internal/generated/snippets/resourcemanager/apiv3/ + - /internal/generated/snippets/retail/apiv2/ + - /internal/generated/snippets/retail/apiv2alpha/ + - /internal/generated/snippets/retail/apiv2beta/ + - /internal/generated/snippets/run/apiv2/ + - /internal/generated/snippets/scheduler/apiv1/ + - /internal/generated/snippets/scheduler/apiv1beta1/ + - /internal/generated/snippets/secretmanager/apiv1/ + - /internal/generated/snippets/secretmanager/apiv1beta2/ + - /internal/generated/snippets/securesourcemanager/apiv1/ + - /internal/generated/snippets/security/privateca/apiv1/ + - /internal/generated/snippets/security/publicca/apiv1beta1/ + - /internal/generated/snippets/security/publicca/apiv1/ + - /internal/generated/snippets/securitycenter/apiv1/ + - /internal/generated/snippets/securitycenter/apiv1beta1/ + - /internal/generated/snippets/securitycenter/apiv1p1beta1/ + - /internal/generated/snippets/securitycenter/apiv2/ + - /internal/generated/snippets/securitycenter/settings/apiv1beta1/ + - /internal/generated/snippets/securitycentermanagement/apiv1/ + - /internal/generated/snippets/securityposture/apiv1/ + - /internal/generated/snippets/servicecontrol/apiv1/ + - /internal/generated/snippets/servicedirectory/apiv1/ + - /internal/generated/snippets/servicedirectory/apiv1beta1/ + - /internal/generated/snippets/servicehealth/apiv1/ + - /internal/generated/snippets/servicemanagement/apiv1/ + - /internal/generated/snippets/serviceusage/apiv1/ + - /internal/generated/snippets/shell/apiv1/ + - /internal/generated/snippets/shopping/css/apiv1/ + - /internal/generated/snippets/shopping/merchant/accounts/apiv1/ + - /internal/generated/snippets/shopping/merchant/accounts/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/conversions/apiv1/ + - /internal/generated/snippets/shopping/merchant/conversions/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/datasources/apiv1/ + - /internal/generated/snippets/shopping/merchant/datasources/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/notifications/apiv1/ + - /internal/generated/snippets/shopping/merchant/notifications/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/ordertracking/apiv1/ + - /internal/generated/snippets/shopping/merchant/ordertracking/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/products/apiv1/ + - /internal/generated/snippets/shopping/merchant/products/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/productstudio/apiv1alpha/ + - /internal/generated/snippets/shopping/merchant/promotions/apiv1/ + - /internal/generated/snippets/shopping/merchant/promotions/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/quota/apiv1/ + - /internal/generated/snippets/shopping/merchant/quota/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/inventories/apiv1/ + - /internal/generated/snippets/shopping/merchant/inventories/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/issueresolution/apiv1/ + - /internal/generated/snippets/shopping/merchant/issueresolution/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/reports/apiv1/ + - /internal/generated/snippets/shopping/merchant/reports/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/reviews/apiv1beta/ + - /internal/generated/snippets/shopping/merchant/lfp/apiv1/ + - /internal/generated/snippets/shopping/merchant/lfp/apiv1beta/ + - /internal/generated/snippets/spanner/adapter/apiv1/ + - /internal/generated/snippets/spanner/admin/database/apiv1/ + - /internal/generated/snippets/spanner/admin/instance/apiv1/ + - /internal/generated/snippets/spanner/apiv1/ + - /internal/generated/snippets/speech/apiv1/ + - /internal/generated/snippets/speech/apiv1p1beta1/ + - /internal/generated/snippets/speech/apiv2/ + - /internal/generated/snippets/storage/control/apiv2/ + - /internal/generated/snippets/storagebatchoperations/apiv1/ + - /internal/generated/snippets/storageinsights/apiv1/ + - /internal/generated/snippets/storagetransfer/apiv1/ + - /internal/generated/snippets/streetview/publish/apiv1/ + - /internal/generated/snippets/support/apiv2/ + - /internal/generated/snippets/support/apiv2beta/ + - /internal/generated/snippets/talent/apiv4/ + - /internal/generated/snippets/talent/apiv4beta1/ + - /internal/generated/snippets/telcoautomation/apiv1/ + - /internal/generated/snippets/texttospeech/apiv1/ + - /internal/generated/snippets/tpu/apiv1/ + - /internal/generated/snippets/trace/apiv1/ + - /internal/generated/snippets/trace/apiv2/ + - /internal/generated/snippets/translate/apiv3/ + - /internal/generated/snippets/video/livestream/apiv1/ + - /internal/generated/snippets/video/stitcher/apiv1/ + - /internal/generated/snippets/video/transcoder/apiv1/ + - /internal/generated/snippets/videointelligence/apiv1/ + - /internal/generated/snippets/videointelligence/apiv1beta2/ + - /internal/generated/snippets/videointelligence/apiv1p3beta1/ + - /internal/generated/snippets/vision/v2/apiv1/ + - /internal/generated/snippets/vision/v2/apiv1p1beta1/ + - /internal/generated/snippets/visionai/apiv1/ + - /internal/generated/snippets/vmmigration/apiv1/ + - /internal/generated/snippets/vmwareengine/apiv1/ + - /internal/generated/snippets/vpcaccess/apiv1/ + - /internal/generated/snippets/webrisk/apiv1/ + - /internal/generated/snippets/webrisk/apiv1beta1/ + - /internal/generated/snippets/websecurityscanner/apiv1/ + - /internal/generated/snippets/workflows/apiv1/ + - /internal/generated/snippets/workflows/apiv1beta/ + - /internal/generated/snippets/workflows/executions/apiv1/ + - /internal/generated/snippets/workflows/executions/apiv1beta/ + - /internal/generated/snippets/workstations/apiv1/ + - /internal/generated/snippets/workstations/apiv1beta/ + # END snippets + - /iot/apiv1/ + - /kms/apiv1/ + - /kms/inventory/apiv1/ + - /language/apiv1/ + - /language/apiv1beta2/ + - /language/apiv2/ + - /licensemanager/apiv1/ + - /lifesciences/apiv2beta/ + - /locationfinder/apiv1/ + - /logging/apiv2/ + - /longrunning/autogen/ + - /lustre/apiv1/ + - /maintenance/api/apiv1beta/ + - /managedidentities/apiv1/ + - /managedkafka/apiv1/ + - /managedkafka/schemaregistry/apiv1/ + - /maps/addressvalidation/apiv1/ + - /maps/areainsights/apiv1/ + - /maps/fleetengine/apiv1/ + - /maps/fleetengine/delivery/apiv1/ + - /maps/places/apiv1/ + - /maps/routeoptimization/apiv1/ + - /maps/routing/apiv2/ + - /maps/solar/apiv1/ + - /mediatranslation/apiv1beta1/ + - /memcache/apiv1/ + - /memcache/apiv1beta2/ + - /memorystore/apiv1/ + - /memorystore/apiv1beta/ + - /metastore/apiv1/ + - /metastore/apiv1alpha/ + - /metastore/apiv1beta/ + - /migrationcenter/apiv1/ + - /modelarmor/apiv1/ + - /modelarmor/apiv1beta/ + - /monitoring/apiv3/v2/ + - /monitoring/dashboard/apiv1/ + - /monitoring/metricsscope/apiv1/ + - /netapp/apiv1/ + - /networkconnectivity/apiv1/ + - /networkconnectivity/apiv1alpha1/ + - /networkmanagement/apiv1/ + - /networksecurity/apiv1beta1/ + - /networkservices/apiv1/ + - /notebooks/apiv1/ + - /notebooks/apiv1beta1/ + - /notebooks/apiv2/ + - /optimization/apiv1/ + - /oracledatabase/apiv1/ + - /orchestration/airflow/service/apiv1/ + - /orgpolicy/apiv1/ + - /orgpolicy/apiv2/ + - /osconfig/agentendpoint/apiv1/ + - /osconfig/agentendpoint/apiv1beta/ + - /osconfig/apiv1/ + - /osconfig/apiv1alpha/ + - /osconfig/apiv1beta/ + - /oslogin/apiv1/ + - /oslogin/apiv1beta/ + - /oslogin/common/ + - /parallelstore/apiv1/ + - /parallelstore/apiv1beta/ + - /parametermanager/apiv1/ + - /phishingprotection/apiv1beta1/ + - /policysimulator/apiv1/ + - /policytroubleshooter/apiv1/ + - /policytroubleshooter/iam/apiv3/ + - /privatecatalog/apiv1beta1/ + - /privilegedaccessmanager/apiv1/ + - /pubsub/v2/apiv1/ + - /pubsublite/apiv1/ + - /rapidmigrationassessment/apiv1/ + - /recaptchaenterprise/apiv1/ + - /recaptchaenterprise/apiv1beta1/ + - /recommendationengine/apiv1beta1/ + - /recommender/apiv1/ + - /recommender/apiv1beta1/ + - /redis/apiv1/ + - /redis/apiv1beta1/ + - /redis/cluster/apiv1/ + - /resourcemanager/apiv2/ + - /resourcemanager/apiv3/ + - /retail/apiv2/ + - /retail/apiv2alpha/ + - /retail/apiv2beta/ + - /run/apiv2/ + - /scheduler/apiv1/ + - /scheduler/apiv1beta1/ + - /secretmanager/apiv1/ + - /secretmanager/apiv1beta2/ + - /securesourcemanager/apiv1/ + - /security/privateca/apiv1/ + - /security/publicca/apiv1beta1/ + - /security/publicca/apiv1/ + - /securitycenter/apiv1/ + - /securitycenter/apiv1beta1/ + - /securitycenter/apiv1p1beta1/ + - /securitycenter/apiv2/ + - /securitycenter/settings/apiv1beta1/ + - /securitycentermanagement/apiv1/ + - /securityposture/apiv1/ + - /servicecontrol/apiv1/ + - /servicedirectory/apiv1/ + - /servicedirectory/apiv1beta1/ + - /servicehealth/apiv1/ + - /servicemanagement/apiv1/ + - /serviceusage/apiv1/ + - /shell/apiv1/ + - /shopping/css/apiv1/ + - /shopping/merchant/accounts/apiv1/ + - /shopping/merchant/accounts/apiv1beta/ + - /shopping/merchant/conversions/apiv1/ + - /shopping/merchant/conversions/apiv1beta/ + - /shopping/merchant/datasources/apiv1/ + - /shopping/merchant/datasources/apiv1beta/ + - /shopping/merchant/notifications/apiv1/ + - /shopping/merchant/notifications/apiv1beta/ + - /shopping/merchant/ordertracking/apiv1/ + - /shopping/merchant/ordertracking/apiv1beta/ + - /shopping/merchant/products/apiv1/ + - /shopping/merchant/products/apiv1beta/ + - /shopping/merchant/productstudio/apiv1alpha/ + - /shopping/merchant/promotions/apiv1/ + - /shopping/merchant/promotions/apiv1beta/ + - /shopping/merchant/quota/apiv1/ + - /shopping/merchant/quota/apiv1beta/ + - /shopping/merchant/inventories/apiv1/ + - /shopping/merchant/inventories/apiv1beta/ + - /shopping/merchant/issueresolution/apiv1/ + - /shopping/merchant/issueresolution/apiv1beta/ + - /shopping/merchant/lfp/apiv1/ + - /shopping/merchant/lfp/apiv1beta/ + - /shopping/merchant/reports/apiv1/ + - /shopping/merchant/reports/apiv1beta/ + - /shopping/merchant/reviews/apiv1beta/ + - /shopping/type/ + - /spanner/adapter/apiv1/ + - /spanner/admin/database/apiv1/ + - /spanner/admin/instance/apiv1/ + - /spanner/apiv1/ + - /spanner/executor/apiv1/ + - /speech/apiv1/ + - /speech/apiv1p1beta1/ + - /speech/apiv2/ + - /storage/control/apiv2/ + - /storage/internal/apiv2/ + - /storagebatchoperations/apiv1/ + - /storageinsights/apiv1/ + - /storagetransfer/apiv1/ + - /streetview/publish/apiv1/ + - /support/apiv2/ + - /support/apiv2beta/ + - /talent/apiv4/ + - /talent/apiv4beta1/ + - /telcoautomation/apiv1/ + - /texttospeech/apiv1/ + - /tpu/apiv1/ + - /trace/apiv1/ + - /trace/apiv2/ + - /translate/apiv3/ + - /video/livestream/apiv1/ + - /video/stitcher/apiv1/ + - /video/transcoder/apiv1/ + - /videointelligence/apiv1/ + - /videointelligence/apiv1beta2/ + - /videointelligence/apiv1p3beta1/ + - /vision/apiv1/ + - /vision/apiv1p1beta1/ + - /visionai/apiv1/ + - /vmmigration/apiv1/ + - /vmwareengine/apiv1/ + - /vpcaccess/apiv1/ + - /webrisk/apiv1/ + - /webrisk/apiv1beta1/ + - /websecurityscanner/apiv1/ + - /workflows/apiv1/ + - /workflows/apiv1beta/ + - /workflows/executions/apiv1/ + - /workflows/executions/apiv1beta/ + - /workstations/apiv1/ + - /workstations/apiv1beta/ + +deep-preserve-regex: + - /.*/info.go + - /.*/path_funcs.go + - /.*/version.go + - /ai/generativelanguage/apiv1/doc.go + - /container/apiv1/ListClusters_smoke_test.go + - /kms/apiv1/iam.go + - /kms/apiv1/iam_example_test.go + - /logging/apiv2/WriteLogEntries_smoke_test.go + # TODO(#7336): Remove these networkconnectivity lines once breaking change is handled. + - /networkconnectivity/apiv1/policy_based_routing_client.go + - /networkconnectivity/apiv1/policy_based_routing_client_example_test.go + - /networkconnectivity/apiv1/networkconnectivitypb/policy_based_routing.pb.go + # Preserve pubsub apiv1 until deprecation date in a year even though it's not generated. + - /pubsub/apiv1/.* + - /pubsub/v2/apiv1/iam.go + - /pubsub/v2/apiv1/ListTopics_smoke_test.go + - /secretmanager/apiv1/iam.go + - /secretmanager/apiv1/iam_example_test.go + - /spanner/admin/database/apiv1/backup.go + - /spanner/admin/database/apiv1/backup_test.go + - /spanner/admin/database/apiv1/database.go + - /spanner/admin/database/apiv1/database_test.go + - /spanner/admin/database/apiv1/init.go + - /spanner/admin/database/apiv1/mock_test.go + - /spanner/admin/instance/apiv1/init.go + - /spanner/apiv1/spanner_client_options.go + - /storage/internal/apiv2/metadata.go + - /dataproc/apiv1/longrunning.go + - /longrunning/autogen/from_conn.go + - /containeranalysis/apiv1beta1/grafeas/.* + # Must preserve these even though they aren't generated anymore + - /vmmigration/apiv1/iam_policy_client.go + - /datastream/apiv1/iam_policy_client.go + - /batch/apiv1/iam_policy_client.go + - /datacatalog/apiv1/iam_policy_client.go + - /run/apiv2/locations_client.go + - /datacatalog/apiv1/iam_policy_client.go + - /compute/apiv1/smoke_test.go + +deep-copy-regex: + - source: /google/cloud/accessapproval/v1/cloud.google.com/go + dest: / + - source: /google/identity/accesscontextmanager/v1/cloud.google.com/go + dest: / + - source: /google/ai/generativelanguage/v1/cloud.google.com/go + dest: / + - source: /google/ai/generativelanguage/v1alpha/cloud.google.com/go + dest: / + - source: /google/ai/generativelanguage/v1beta/cloud.google.com/go + dest: / + - source: /google/ai/generativelanguage/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/aiplatform/v1/cloud.google.com/go + dest: / + - source: /google/cloud/aiplatform/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/advisorynotifications/v1/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/v1/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/connectors/v1/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/connectors/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/alloydb/connectors/v1beta/cloud.google.com/go + dest: / + - source: /google/analytics/admin/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/apigateway/v1/cloud.google.com/go + dest: / + - source: /google/cloud/apigeeconnect/v1/cloud.google.com/go + dest: / + - source: /google/cloud/apigeeregistry/v1/cloud.google.com/go + dest: / + - source: /google/cloud/asset/v1/cloud.google.com/go + dest: / + - source: /google/cloud/asset/v1p2beta1/cloud.google.com/go + dest: / + - source: /google/cloud/asset/v1p5beta1/cloud.google.com/go + dest: / + - source: /google/cloud/apihub/v1/cloud.google.com/go + dest: / + - source: /google/api/apikeys/v2/cloud.google.com/go + dest: / + - source: /google/api/cloudquotas/v1/cloud.google.com/go + dest: / + - source: /google/api/cloudquotas/v1beta/cloud.google.com/go + dest: / + - source: /google/appengine/v1/cloud.google.com/go + dest: / + - source: /google/cloud/apphub/v1/cloud.google.com/go + dest: / + - source: /google/apps/events/subscriptions/v1/cloud.google.com/go + dest: / + - source: /google/apps/events/subscriptions/v1beta/cloud.google.com/go + dest: / + - source: /google/apps/meet/v2/cloud.google.com/go + dest: / + - source: /google/apps/meet/v2beta/cloud.google.com/go + dest: / + - source: /google/area120/tables/v1alpha1/cloud.google.com/go + dest: / + # Just copy the bigtable protos for now + - source: /google/bigtable/admin/v2/cloud.google.com/go/bigtable/admin/apiv2/adminpb + dest: /bigtable/admin/apiv2/adminpb + - source: /google/bigtable/v2/cloud.google.com/go/bigtable/apiv2/bigtablepb + dest: /bigtable/apiv2/bigtablepb + - source: /google/devtools/artifactregistry/v1/cloud.google.com/go + dest: / + - source: /google/devtools/artifactregistry/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/assuredworkloads/v1/cloud.google.com/go + dest: / + - source: /google/cloud/assuredworkloads/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/automl/v1/cloud.google.com/go + dest: / + - source: /google/cloud/automl/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/backupdr/v1/cloud.google.com/go + dest: / + - source: /google/cloud/baremetalsolution/v2/cloud.google.com/go + dest: / + - source: /google/cloud/batch/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/appconnections/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/appconnectors/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/appgateways/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/clientconnectorservices/v1/cloud.google.com/go + dest: / + - source: /google/cloud/beyondcorp/clientgateways/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/analyticshub/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/biglake/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/biglake/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/connection/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/connection/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/dataexchange/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v2/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datapolicies/v2beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/datatransfer/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/migration/v2/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/migration/v2alpha/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/reservation/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/storage/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/bigquery/v2/cloud.google.com/go + dest: / + - source: /google/cloud/billing/v1/cloud.google.com/go + dest: / + - source: /google/cloud/billing/budgets/v1/cloud.google.com/go + dest: / + - source: /google/cloud/billing/budgets/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/binaryauthorization/v1/cloud.google.com/go + dest: / + - source: /google/cloud/binaryauthorization/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/capacityplanner/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/certificatemanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/channel/v1/cloud.google.com/go + dest: / + - source: /google/chat/v1/cloud.google.com/go + dest: / + - source: /google/cloud/chronicle/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudbuild/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudbuild/v2/cloud.google.com/go + dest: / + - source: /google/cloud/cloudcontrolspartner/v1/cloud.google.com/go + dest: / + - source: /google/cloud/cloudcontrolspartner/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/clouddms/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudprofiler/v2/cloud.google.com/go + dest: / + - source: /google/cloud/tasks/v2/cloud.google.com/go + dest: / + - source: /google/cloud/tasks/v2beta2/cloud.google.com/go + dest: / + - source: /google/cloud/tasks/v2beta3/cloud.google.com/go + dest: / + - source: /google/cloud/commerce/consumer/procurement/v1/cloud.google.com/go + dest: / + - source: /google/cloud/compute/v1/cloud.google.com/go + dest: / + - source: /google/cloud/compute/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/confidentialcomputing/v1/cloud.google.com/go + dest: / + - source: /google/cloud/confidentialcomputing/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/config/v1/cloud.google.com/go + dest: / + - source: /google/cloud/configdelivery/v1/cloud.google.com/go + dest: / + - source: /google/cloud/configdelivery/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/contactcenterinsights/v1/cloud.google.com/go + dest: / + - source: /google/container/v1/cloud.google.com/go + dest: / + - source: /google/devtools/containeranalysis/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/datacatalog/v1/cloud.google.com/go + dest: / + - source: /google/cloud/datacatalog/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/datacatalog/lineage/v1/cloud.google.com/go + dest: / + - source: /google/dataflow/v1beta3/cloud.google.com/go + dest: / + - source: /google/cloud/dataform/v1/cloud.google.com/go + dest: / + - source: /google/cloud/dataform/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/datafusion/v1/cloud.google.com/go + dest: / + - source: /google/cloud/datalabeling/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/dataplex/v1/cloud.google.com/go + dest: / + - source: /google/cloud/dataproc/v1/cloud.google.com/go/dataproc/v2/apiv1 + dest: /dataproc/apiv1 + - source: /google/cloud/dataproc/v1/cloud.google.com/go/internal/generated/snippets/dataproc/v2/apiv1 + dest: /internal/generated/snippets/dataproc/apiv1 + - source: /google/cloud/dataqna/v1alpha/cloud.google.com/go + dest: / + - source: /google/datastore/admin/v1/cloud.google.com/go + dest: / + # Just copy the datastore protos for now + - source: /google/datastore/v1/cloud.google.com/go/datastore/apiv1/datastorepb + dest: /datastore/apiv1/datastorepb + - source: /google/cloud/datastream/v1/cloud.google.com/go + dest: / + - source: /google/cloud/datastream/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/deploy/v1/cloud.google.com/go + dest: / + - source: /google/cloud/developerconnect/v1/cloud.google.com/go + dest: / + - source: /google/cloud/devicestreaming/v1/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/v2/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/v2beta1/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/cx/v3/cloud.google.com/go + dest: / + - source: /google/cloud/dialogflow/cx/v3beta1/cloud.google.com/go + dest: / + - source: /google/cloud/discoveryengine/v1/cloud.google.com/go + dest: / + - source: /google/cloud/discoveryengine/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/discoveryengine/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/documentai/v1/cloud.google.com/go + dest: / + - source: /google/cloud/documentai/v1beta3/cloud.google.com/go + dest: / + - source: /google/cloud/domains/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/edgecontainer/v1/cloud.google.com/go + dest: / + - source: /google/cloud/edgenetwork/v1/cloud.google.com/go + dest: / + # - source: /google/devtools/clouderrorreporting/v1beta1/cloud.google.com/go + # dest: / + - source: /google/cloud/essentialcontacts/v1/cloud.google.com/go + dest: / + - source: /google/cloud/eventarc/v1/cloud.google.com/go + dest: / + - source: /google/cloud/eventarc/publishing/v1/cloud.google.com/go + dest: / + - source: /google/cloud/filestore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/financialservices/v1/cloud.google.com/go + dest: / + - source: /google/firestore/v1/cloud.google.com/go + dest: / + - source: /google/firestore/admin/v1/cloud.google.com/go + dest: / + - source: /google/cloud/functions/v1/cloud.google.com/go + dest: / + - source: /google/cloud/functions/v2/cloud.google.com/go + dest: / + - source: /google/cloud/functions/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/geminidataanalytics/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/gkebackup/v1/cloud.google.com/go + dest: / + - source: /google/cloud/gkeconnect/gateway/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/gkeconnect/gateway/v1/cloud.google.com/go + dest: / + - source: /google/cloud/gkehub/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/gkemulticloud/v1/cloud.google.com/go + dest: / + - source: /google/cloud/gsuiteaddons/v1/cloud.google.com/go + dest: / + - source: /google/iam/v1/cloud.google.com/go + dest: / + - source: /google/iam/v2/cloud.google.com/go + dest: / + - source: /google/iam/v3/cloud.google.com/go + dest: / + - source: /google/iam/v3beta/cloud.google.com/go + dest: / + - source: /google/iam/credentials/v1/cloud.google.com/go + dest: / + - source: /google/cloud/iap/v1/cloud.google.com/go + dest: / + - source: /google/cloud/identitytoolkit/v2/cloud.google.com/go + dest: / + - source: /google/cloud/ids/v1/cloud.google.com/go + dest: / + - source: /google/cloud/iot/v1/cloud.google.com/go + dest: / + - source: /google/cloud/kms/v1/cloud.google.com/go + dest: / + - source: /google/cloud/kms/inventory/v1/cloud.google.com/go + dest: / + - source: /google/cloud/language/v1/cloud.google.com/go + dest: / + - source: /google/cloud/language/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/language/v2/cloud.google.com/go + dest: / + - source: /google/cloud/licensemanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/lifesciences/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/locationfinder/v1/cloud.google.com/go + dest: / + - source: /google/logging/v2/cloud.google.com/go + dest: / + - source: /google/longrunning/cloud.google.com/go + dest: / + - source: /google/cloud/lustre/v1/cloud.google.com/go + dest: / + - source: /google/cloud/maintenance/api/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/managedidentities/v1/cloud.google.com/go + dest: / + - source: /google/cloud/managedkafka/v1/cloud.google.com/go + dest: / + - source: /google/cloud/managedkafka/schemaregistry/v1/cloud.google.com/go + dest: / + - source: /google/maps/addressvalidation/v1/cloud.google.com/go + dest: / + - source: /google/maps/areainsights/v1/cloud.google.com/go + dest: / + - source: /google/maps/fleetengine/v1/cloud.google.com/go + dest: / + - source: /google/maps/fleetengine/delivery/v1/cloud.google.com/go + dest: / + - source: /google/maps/places/v1/cloud.google.com/go + dest: / + - source: /google/maps/routeoptimization/v1/cloud.google.com/go + dest: / + - source: /google/maps/routing/v2/cloud.google.com/go + dest: / + - source: /google/maps/solar/v1/cloud.google.com/go + dest: / + - source: /google/cloud/mediatranslation/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/memcache/v1/cloud.google.com/go + dest: / + - source: /google/cloud/memcache/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/memorystore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/memorystore/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/metastore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/metastore/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/metastore/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/migrationcenter/v1/cloud.google.com/go + dest: / + - source: /google/cloud/modelarmor/v1/cloud.google.com/go + dest: / + - source: /google/cloud/modelarmor/v1beta/cloud.google.com/go + dest: / + - source: /google/monitoring/v3/cloud.google.com/go + dest: / + - source: /google/monitoring/dashboard/v1/cloud.google.com/go + dest: / + - source: /google/monitoring/metricsscope/v1/cloud.google.com/go + dest: / + - source: /google/cloud/netapp/v1/cloud.google.com/go + dest: / + - source: /google/cloud/networkconnectivity/v1/cloud.google.com/go + dest: / + - source: /google/cloud/networkconnectivity/v1alpha1/cloud.google.com/go + dest: / + - source: /google/cloud/networkmanagement/v1/cloud.google.com/go + dest: / + - source: /google/cloud/networksecurity/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/networkservices/v1/cloud.google.com/go + dest: / + - source: /google/cloud/notebooks/v1/cloud.google.com/go + dest: / + - source: /google/cloud/notebooks/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/notebooks/v2/cloud.google.com/go + dest: / + - source: /google/cloud/optimization/v1/cloud.google.com/go + dest: / + - source: /google/cloud/oracledatabase/v1/cloud.google.com/go + dest: / + - source: /google/cloud/orchestration/airflow/service/v1/cloud.google.com/go + dest: / + - source: /google/cloud/orgpolicy/v1/cloud.google.com/go + dest: / + - source: /google/cloud/orgpolicy/v2/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/agentendpoint/v1/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/agentendpoint/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/v1/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/v1alpha/cloud.google.com/go + dest: / + - source: /google/cloud/osconfig/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/oslogin/v1/cloud.google.com/go + dest: / + - source: /google/cloud/oslogin/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/oslogin/common/cloud.google.com/go + dest: / + - source: /google/cloud/parallelstore/v1/cloud.google.com/go + dest: / + - source: /google/cloud/parallelstore/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/parametermanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/phishingprotection/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/policysimulator/v1/cloud.google.com/go + dest: / + - source: /google/cloud/policytroubleshooter/iam/v3/cloud.google.com/go + dest: / + - source: /google/cloud/policytroubleshooter/v1/cloud.google.com/go + dest: / + - source: /google/cloud/privatecatalog/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/privilegedaccessmanager/v1/cloud.google.com/go + dest: / + - source: /google/pubsub/v1/cloud.google.com/go + dest: / + - source: /google/cloud/pubsublite/v1/cloud.google.com/go + dest: / + - source: /google/cloud/rapidmigrationassessment/v1/cloud.google.com/go + dest: / + - source: /google/cloud/recaptchaenterprise/v1/cloud.google.com/go/recaptchaenterprise/v2/apiv1 + dest: /recaptchaenterprise/apiv1 + - source: /google/cloud/recaptchaenterprise/v1/cloud.google.com/go/internal/generated/snippets/recaptchaenterprise/v2/apiv1 + dest: /internal/generated/snippets/recaptchaenterprise/apiv1 + - source: /google/cloud/recaptchaenterprise/v1beta1/cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1 + dest: /recaptchaenterprise/apiv1beta1 + - source: /google/cloud/recaptchaenterprise/v1beta1/cloud.google.com/go/internal/generated/snippets/recaptchaenterprise/v2/apiv1beta1 + dest: /internal/generated/snippets/recaptchaenterprise/apiv1beta1 + - source: /google/cloud/recommendationengine/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/recommender/v1/cloud.google.com/go + dest: / + - source: /google/cloud/recommender/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/redis/v1/cloud.google.com/go + dest: / + - source: /google/cloud/redis/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/redis/cluster/v1/cloud.google.com/go + dest: / + - source: /google/cloud/resourcemanager/v2/cloud.google.com/go + dest: / + - source: /google/cloud/resourcemanager/v3/cloud.google.com/go + dest: / + - source: /google/cloud/retail/v2/cloud.google.com/go + dest: / + - source: /google/cloud/retail/v2alpha/cloud.google.com/go + dest: / + - source: /google/cloud/retail/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/run/v2/cloud.google.com/go + dest: / + - source: /google/cloud/scheduler/v1/cloud.google.com/go + dest: / + - source: /google/cloud/scheduler/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/secretmanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/secretmanager/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/securesourcemanager/v1/cloud.google.com/go + dest: / + - source: /google/cloud/security/privateca/v1/cloud.google.com/go + dest: / + - source: /google/cloud/security/publicca/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/security/publicca/v1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v1p1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/v2/cloud.google.com/go + dest: / + - source: /google/cloud/securitycenter/settings/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/securitycentermanagement/v1/cloud.google.com/go + dest: / + - source: /google/cloud/securityposture/v1/cloud.google.com/go + dest: / + - source: /google/api/servicecontrol/v1/cloud.google.com/go + dest: / + - source: /google/cloud/servicedirectory/v1/cloud.google.com/go + dest: / + - source: /google/cloud/servicedirectory/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/servicehealth/v1/cloud.google.com/go + dest: / + - source: /google/api/servicemanagement/v1/cloud.google.com/go + dest: / + - source: /google/api/serviceusage/v1/cloud.google.com/go + dest: / + - source: /google/cloud/shell/v1/cloud.google.com/go + dest: / + - source: /google/shopping/css/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/accounts/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/accounts/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/conversions/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/conversions/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/datasources/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/datasources/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/notifications/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/notifications/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/ordertracking/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/ordertracking/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/products/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/products/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/productstudio/v1alpha/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/promotions/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/promotions/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/quota/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/quota/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/inventories/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/inventories/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/issueresolution/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/issueresolution/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/lfp/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/lfp/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/reports/v1/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/reports/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/merchant/reviews/v1beta/cloud.google.com/go + dest: / + - source: /google/shopping/type/cloud.google.com/go + dest: / + - source: /google/spanner/adapter/v1/cloud.google.com/go + dest: / + - source: /google/spanner/admin/database/v1/cloud.google.com/go + dest: / + - source: /google/spanner/admin/instance/v1/cloud.google.com/go + dest: / + - source: /google/spanner/v1/cloud.google.com/go + dest: / + - source: /google/spanner/executor/v1/cloud.google.com/go + dest: / + - source: /google/cloud/speech/v1/cloud.google.com/go + dest: / + - source: /google/cloud/speech/v1p1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/speech/v2/cloud.google.com/go + dest: / + - source: /google/storage/control/v2/cloud.google.com/go/ + dest: / + - source: /google/storage/v2/cloud.google.com/go/storage/internal/apiv2 + dest: /storage/internal/apiv2 + - source: /google/cloud/storagebatchoperations/v1/cloud.google.com/go + dest: / + - source: /google/cloud/storageinsights/v1/cloud.google.com/go + dest: / + - source: /google/storagetransfer/v1/cloud.google.com/go + dest: / + - source: /google/streetview/publish/v1/cloud.google.com/go + dest: / + - source: /google/cloud/support/v2/cloud.google.com/go + dest: / + - source: /google/cloud/support/v2beta/cloud.google.com/go + dest: / + - source: /google/cloud/talent/v4/cloud.google.com/go + dest: / + - source: /google/cloud/talent/v4beta1/cloud.google.com/go + dest: / + - source: /google/cloud/telcoautomation/v1/cloud.google.com/go + dest: / + - source: /google/cloud/texttospeech/v1/cloud.google.com/go + dest: / + - source: /google/cloud/tpu/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudtrace/v1/cloud.google.com/go + dest: / + - source: /google/devtools/cloudtrace/v2/cloud.google.com/go + dest: / + - source: /google/cloud/translate/v3/cloud.google.com/go + dest: / + - source: /google/cloud/video/livestream/v1/cloud.google.com/go + dest: / + - source: /google/cloud/video/stitcher/v1/cloud.google.com/go + dest: / + - source: /google/cloud/video/transcoder/v1/cloud.google.com/go + dest: / + - source: /google/cloud/videointelligence/v1/cloud.google.com/go + dest: / + - source: /google/cloud/videointelligence/v1beta2/cloud.google.com/go + dest: / + - source: /google/cloud/videointelligence/v1p3beta1/cloud.google.com/go + dest: / + - source: /google/cloud/vision/v1/cloud.google.com/go/vision/v2/apiv1 + dest: /vision/apiv1 + - source: /google/cloud/vision/v1/cloud.google.com/go/internal/generated/snippets/vision/v2/apiv1 + dest: /internal/generated/snippets/vision/apiv1 + - source: /google/cloud/vision/v1p1beta1/cloud.google.com/go/vision/v2/apiv1p1beta1 + dest: /vision/apiv1p1beta1 + - source: /google/cloud/vision/v1p1beta1/cloud.google.com/go/internal/generated/snippets/vision/v2/apiv1p1beta1 + dest: /internal/generated/snippets/vision/apiv1p1beta1 + - source: /google/cloud/visionai/v1/cloud.google.com/go + dest: / + - source: /google/cloud/vmmigration/v1/cloud.google.com/go + dest: / + - source: /google/cloud/vmwareengine/v1/cloud.google.com/go + dest: / + - source: /google/cloud/vpcaccess/v1/cloud.google.com/go + dest: / + - source: /google/cloud/webrisk/v1/cloud.google.com/go + dest: / + - source: /google/cloud/webrisk/v1beta1/cloud.google.com/go + dest: / + - source: /google/cloud/websecurityscanner/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/executions/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workflows/executions/v1beta/cloud.google.com/go + dest: / + - source: /google/cloud/workstations/v1/cloud.google.com/go + dest: / + - source: /google/cloud/workstations/v1beta/cloud.google.com/go + dest: / diff --git a/internal/stategen/testdata/source/.release-please-manifest-individual.json b/internal/stategen/testdata/source/.release-please-manifest-individual.json new file mode 100644 index 000000000000..0da5b09f65f5 --- /dev/null +++ b/internal/stategen/testdata/source/.release-please-manifest-individual.json @@ -0,0 +1,17 @@ +{ + "auth": "0.16.5", + "auth/oauth2adapt": "0.2.8", + "bigquery": "1.70.0", + "bigtable": "1.40.0", + "datastore": "1.20.0", + "errorreporting": "0.3.2", + "firestore": "1.18.0", + "logging": "1.13.0", + "profiler": "0.4.3", + "pubsub": "1.50.1", + "pubsub/v2": "2.0.1", + "pubsublite": "1.8.2", + "spanner": "1.85.1", + "storage": "1.57.0", + "vertexai": "0.15.0" +} diff --git a/internal/stategen/testdata/source/.release-please-manifest-submodules.json b/internal/stategen/testdata/source/.release-please-manifest-submodules.json new file mode 100644 index 000000000000..a301de31e96d --- /dev/null +++ b/internal/stategen/testdata/source/.release-please-manifest-submodules.json @@ -0,0 +1,166 @@ +{ + "accessapproval": "1.8.7", + "accesscontextmanager": "1.9.6", + "advisorynotifications": "1.5.6", + "ai": "0.13.0", + "aiplatform": "1.102.0", + "alloydb": "1.18.0", + "analytics": "0.30.0", + "apigateway": "1.7.7", + "apigeeconnect": "1.7.7", + "apigeeregistry": "0.9.6", + "apihub": "0.2.0", + "apikeys": "1.2.7", + "appengine": "1.9.7", + "apphub": "0.3.1", + "apps": "0.8.0", + "area120": "0.9.7", + "artifactregistry": "1.17.1", + "asset": "1.21.1", + "assuredworkloads": "1.12.6", + "automl": "1.14.7", + "backupdr": "1.4.0", + "baremetalsolution": "1.3.6", + "batch": "1.12.2", + "beyondcorp": "1.1.6", + "billing": "1.20.4", + "binaryauthorization": "1.9.5", + "capacityplanner": "0.1.0", + "certificatemanager": "1.9.5", + "channel": "1.20.0", + "chat": "0.15.1", + "chronicle": "0.1.1", + "cloudbuild": "1.23.0", + "cloudcontrolspartner": "1.4.0", + "clouddms": "1.8.8", + "cloudprofiler": "0.4.5", + "cloudquotas": "1.4.0", + "cloudtasks": "1.13.7", + "commerce": "1.2.6", + "compute": "1.47.0", + "compute/metadata": "0.9.0", + "confidentialcomputing": "1.10.1", + "config": "1.5.1", + "configdelivery": "0.1.1", + "contactcenterinsights": "1.17.4", + "container": "1.44.0", + "containeranalysis": "0.14.1", + "datacatalog": "1.26.1", + "dataflow": "0.11.0", + "dataform": "0.12.1", + "datafusion": "1.8.7", + "datalabeling": "0.9.7", + "dataplex": "1.27.1", + "dataproc": "2.14.1", + "dataqna": "0.9.7", + "datastream": "1.15.1", + "deploy": "1.27.3", + "developerconnect": "0.4.1", + "devicestreaming": "0.1.1", + "dialogflow": "1.69.1", + "discoveryengine": "1.21.1", + "documentai": "1.38.1", + "domains": "0.10.7", + "edgecontainer": "1.4.4", + "edgenetwork": "1.2.7", + "essentialcontacts": "1.7.7", + "eventarc": "1.16.1", + "filestore": "1.10.3", + "financialservices": "0.1.4", + "functions": "1.19.7", + "geminidataanalytics": "0.2.1", + "gkebackup": "1.8.1", + "gkeconnect": "0.12.5", + "gkehub": "0.16.0", + "gkemulticloud": "1.5.4", + "grafeas": "0.3.16", + "gsuiteaddons": "1.7.8", + "iam": "1.5.2", + "iap": "1.11.3", + "identitytoolkit": "0.2.6", + "ids": "1.5.7", + "iot": "1.8.7", + "kms": "1.23.0", + "language": "1.14.5", + "licensemanager": "0.1.1", + "lifesciences": "0.10.7", + "locationfinder": "0.1.1", + "longrunning": "0.6.7", + "lustre": "0.2.1", + "maintenance": "0.1.2", + "managedidentities": "1.7.7", + "managedkafka": "0.8.1", + "maps": "1.23.0", + "mediatranslation": "0.9.7", + "memcache": "1.11.7", + "memorystore": "0.3.1", + "metastore": "1.14.8", + "migrationcenter": "1.1.6", + "modelarmor": "0.6.1", + "monitoring": "1.24.2", + "netapp": "1.10.1", + "networkconnectivity": "1.19.1", + "networkmanagement": "1.20.1", + "networksecurity": "0.10.7", + "networkservices": "0.5.1", + "notebooks": "1.12.7", + "optimization": "1.7.7", + "oracledatabase": "0.5.1", + "orchestration": "1.11.10", + "orgpolicy": "1.15.1", + "osconfig": "1.15.1", + "oslogin": "1.14.7", + "parallelstore": "0.11.4", + "parametermanager": "0.3.1", + "phishingprotection": "0.9.7", + "policysimulator": "0.4.1", + "policytroubleshooter": "1.11.7", + "privatecatalog": "0.10.8", + "privilegedaccessmanager": "0.3.1", + "rapidmigrationassessment": "1.1.8", + "recaptchaenterprise": "2.20.5", + "recommendationengine": "0.9.7", + "recommender": "1.13.6", + "redis": "1.18.3", + "resourcemanager": "1.10.7", + "retail": "1.25.1", + "run": "1.12.0", + "scheduler": "1.11.8", + "secretmanager": "1.15.0", + "securesourcemanager": "1.4.1", + "security": "1.19.2", + "securitycenter": "1.38.1", + "securitycentermanagement": "1.1.6", + "securityposture": "0.2.6", + "servicecontrol": "1.14.5", + "servicedirectory": "1.12.7", + "servicehealth": "1.2.4", + "servicemanagement": "1.10.6", + "serviceusage": "1.9.6", + "shell": "1.8.7", + "shopping": "1.1.0", + "spanner/benchmarks": "0.1.0", + "speech": "1.28.0", + "storagebatchoperations": "0.1.1", + "storageinsights": "1.2.1", + "storagetransfer": "1.13.0", + "streetview": "0.2.5", + "support": "1.4.1", + "talent": "1.8.4", + "telcoautomation": "1.1.6", + "texttospeech": "1.15.0", + "tpu": "1.8.4", + "trace": "1.11.6", + "translate": "1.12.6", + "video": "1.27.1", + "videointelligence": "1.12.7", + "vision": "2.9.5", + "visionai": "0.4.6", + "vmmigration": "1.9.1", + "vmwareengine": "1.3.6", + "vpcaccess": "1.8.7", + "webrisk": "1.11.2", + "websecurityscanner": "1.7.7", + "workflows": "1.14.3", + "workstations": "1.1.6" +} diff --git a/internal/stategen/testdata/source/internal/postprocessor/config.yaml b/internal/stategen/testdata/source/internal/postprocessor/config.yaml new file mode 100644 index 000000000000..01c97d26922e --- /dev/null +++ b/internal/stategen/testdata/source/internal/postprocessor/config.yaml @@ -0,0 +1,1352 @@ +modules: + - accessapproval + - accesscontextmanager + - ai + - aiplatform + - advisorynotifications + - alloydb + - analytics + - apigateway + - apigeeconnect + - apigeeregistry + - apihub + - apikeys + - appengine + - apphub + - apps + - area120 + - artifactregistry + - asset + - assuredworkloads + - automl + - backupdr + - baremetalsolution + - batch + - beyondcorp + # List the bigquery/v2 module before the bigquery module so that the contents + # are processed using the correct inner module boundary. + # More info: https://github.com/googleapis/google-cloud-go/issues/12452 + - bigquery/v2 + - bigquery + - bigtable + - billing + - binaryauthorization + - capacityplanner + - certificatemanager + - channel + - chat + - chronicle + - cloudbuild + - cloudcontrolspartner + - clouddms + - cloudprofiler + - cloudquotas + - cloudtasks + - commerce + - compute + - confidentialcomputing + - config + - configdelivery + - contactcenterinsights + - container + - containeranalysis + - datacatalog + - dataflow + - dataform + - datafusion + - datalabeling + - dataplex + - dataproc + - dataqna + - datastore + - datastream + - deploy + - developerconnect + - devicestreaming + - dialogflow + - discoveryengine + - documentai + - domains + - edgecontainer + - edgenetwork + - errorreporting + - essentialcontacts + - eventarc + - filestore + - financialservices + - firestore + - functions + - geminidataanalytics + - gkebackup + - gkeconnect + - gkehub + - gkemulticloud + - grafeas + - gsuiteaddons + - iam + - iap + - identitytoolkit + - ids + - iot + - kms + - language + - licensemanager + - lifesciences + - locationfinder + - logging + - longrunning + - lustre + - maintenance + - managedidentities + - managedkafka + - maps + - mediatranslation + - memcache + - memorystore + - metastore + - migrationcenter + - modelarmor + - monitoring + - netapp + - networkconnectivity + - networkmanagement + - networksecurity + - networkservices + - notebooks + - optimization + - oracledatabase + - orchestration + - orgpolicy + - osconfig + - oslogin + - parallelstore + - parametermanager + - phishingprotection + - policysimulator + - policytroubleshooter + - privatecatalog + - privilegedaccessmanager + - profiler + - pubsub/v2 + - pubsub + - pubsublite + - rapidmigrationassessment + - recaptchaenterprise + - recommendationengine + - recommender + - redis + - resourcemanager + - retail + - run + - scheduler + - secretmanager + - securesourcemanager + - security + - securitycenter + - securitycentermanagement + - securityposture + - servicecontrol + - servicedirectory + - servicehealth + - servicemanagement + - serviceusage + - shell + - shopping + - spanner + - speech + - storage + - storagebatchoperations + - storageinsights + - storagetransfer + - streetview + - support + - talent + - telcoautomation + - texttospeech + - tpu + - trace + - translate + - video + - videointelligence + - vision + - visionai + - vmmigration + - vmwareengine + - vpcaccess + - webrisk + - websecurityscanner + - workflows + - workstations + +manual-clients: + - api-shortname: bigquery + distribution-name: cloud.google.com/go/bigquery + description: BigQuery + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: bigtable + distribution-name: cloud.google.com/go/bigtable + description: Cloud BigTable + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: compute-metadata + distribution-name: cloud.google.com/go/compute/metadata + description: Service Metadata API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/compute/latest/metadata + release-level: stable + library-type: CORE + - api-shortname: datastore + distribution-name: cloud.google.com/go/datastore + description: Cloud Datastore + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: clouderrorreporting + distribution-name: cloud.google.com/go/errorreporting + description: Cloud Error Reporting API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/errorreporting/latest + release-level: preview + library-type: GAPIC_MANUAL + - api-shortname: firestore + distribution-name: cloud.google.com/go/firestore + description: Cloud Firestore API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: firestore-metadata + distribution-name: cloud.google.com/go/functions/metadata + description: Cloud Functions + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/metadata + release-level: preview + library-type: CORE + - api-shortname: iam + distribution-name: cloud.google.com/go/iam + description: Cloud IAM + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest + release-level: stable + library-type: CORE + - api-shortname: logging + distribution-name: cloud.google.com/go/logging + description: Cloud Logging API + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/logging/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: cloudprofiler + distribution-name: cloud.google.com/go/profiler + description: Cloud Profiler + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/profiler/latest + release-level: stable + library-type: AGENT + - api-shortname: pubsub + distribution-name: cloud.google.com/go/pubsub + description: Cloud PubSub + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: pubsublite + distribution-name: cloud.google.com/go/pubsublite + description: Cloud PubSub Lite + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsublite/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: rpcreplay + distribution-name: cloud.google.com/go/rpcreplay + description: RPC Replay + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/rpcreplay + release-level: stable + library-type: OTHER + - api-shortname: spanner + distribution-name: cloud.google.com/go/spanner + description: Cloud Spanner + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest + release-level: stable + library-type: GAPIC_MANUAL + - api-shortname: storage + distribution-name: cloud.google.com/go/storage + description: Cloud Storage (GCS) + language: go + client-library-type: manual + client-documentation: https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest + release-level: stable + library-type: GAPIC_MANUAL + +service-configs: + - input-directory: google/ai/generativelanguage/v1 + service-config: generativelanguage_v1.yaml + import-path: cloud.google.com/go/ai/generativelanguage/apiv1 + - input-directory: google/ai/generativelanguage/v1alpha + service-config: generativelanguage_v1alpha.yaml + import-path: cloud.google.com/go/ai/generativelanguage/apiv1alpha + - input-directory: google/ai/generativelanguage/v1beta + service-config: generativelanguage_v1beta.yaml + import-path: cloud.google.com/go/ai/generativelanguage/apiv1beta + - input-directory: google/ai/generativelanguage/v1beta2 + service-config: generativelanguage_v1beta2.yaml + import-path: cloud.google.com/go/ai/generativelanguage/apiv1beta2 + - input-directory: google/analytics/admin/v1alpha + service-config: analyticsadmin_v1alpha.yaml + import-path: cloud.google.com/go/analytics/admin/apiv1alpha + - input-directory: google/api/apikeys/v2 + service-config: apikeys_v2.yaml + import-path: cloud.google.com/go/apikeys/apiv2 + - input-directory: google/appengine/v1 + service-config: appengine_v1.yaml + import-path: cloud.google.com/go/appengine/apiv1 + - input-directory: google/apps/events/subscriptions/v1 + service-config: workspaceevents_v1.yaml + import-path: cloud.google.com/go/apps/events/subscriptions/apiv1 + - input-directory: google/apps/events/subscriptions/v1beta + service-config: workspaceevents_v1beta.yaml + import-path: cloud.google.com/go/apps/events/subscriptions/apiv1beta + - input-directory: google/apps/meet/v2 + service-config: meet_v2.yaml + import-path: cloud.google.com/go/apps/meet/apiv2 + - input-directory: google/apps/meet/v2beta + service-config: meet_v2beta.yaml + import-path: cloud.google.com/go/apps/meet/apiv2beta + - input-directory: google/area120/tables/v1alpha1 + service-config: area120tables_v1alpha1.yaml + import-path: cloud.google.com/go/area120/tables/apiv1alpha1 + - input-directory: google/cloud/accessapproval/v1 + service-config: accessapproval_v1.yaml + import-path: cloud.google.com/go/accessapproval/apiv1 + - input-directory: google/cloud/aiplatform/v1 + service-config: aiplatform_v1.yaml + import-path: cloud.google.com/go/aiplatform/apiv1 + - input-directory: google/cloud/aiplatform/v1beta1 + service-config: aiplatform_v1beta1.yaml + import-path: cloud.google.com/go/aiplatform/apiv1beta1 + - input-directory: google/cloud/advisorynotifications/v1 + service-config: advisorynotifications_v1.yaml + import-path: cloud.google.com/go/advisorynotifications/apiv1 + - input-directory: google/cloud/alloydb/v1 + service-config: alloydb_v1.yaml + import-path: cloud.google.com/go/alloydb/apiv1 + - input-directory: google/cloud/alloydb/v1alpha + service-config: alloydb_v1alpha.yaml + import-path: cloud.google.com/go/alloydb/apiv1alpha + - input-directory: google/cloud/alloydb/v1beta + service-config: alloydb_v1beta.yaml + import-path: cloud.google.com/go/alloydb/apiv1beta + - input-directory: google/cloud/alloydb/connectors/v1 + service-config: connectors_v1.yaml + import-path: cloud.google.com/go/alloydb/connectors/apiv1 + release-level-override: preview + - input-directory: google/cloud/alloydb/connectors/v1alpha + service-config: connectors_v1alpha.yaml + import-path: cloud.google.com/go/alloydb/connectors/apiv1alpha + - input-directory: google/cloud/alloydb/connectors/v1beta + service-config: connectors_v1beta.yaml + import-path: cloud.google.com/go/alloydb/connectors/apiv1beta + - input-directory: google/cloud/apigateway/v1 + service-config: apigateway_v1.yaml + import-path: cloud.google.com/go/apigateway/apiv1 + - input-directory: google/cloud/apigeeconnect/v1 + service-config: apigeeconnect_v1.yaml + import-path: cloud.google.com/go/apigeeconnect/apiv1 + - input-directory: google/cloud/apigeeregistry/v1 + service-config: apigeeregistry_v1.yaml + import-path: cloud.google.com/go/apigeeregistry/apiv1 + - input-directory: google/cloud/apihub/v1 + service-config: apihub_v1.yaml + import-path: cloud.google.com/go/apihub/apiv1 + - input-directory: google/cloud/apphub/v1 + service-config: apphub_v1.yaml + import-path: cloud.google.com/go/apphub/apiv1 + - input-directory: google/cloud/asset/v1 + service-config: cloudasset_v1.yaml + import-path: cloud.google.com/go/asset/apiv1 + - input-directory: google/cloud/asset/v1p2beta1 + service-config: cloudasset_v1p2beta1.yaml + import-path: cloud.google.com/go/asset/apiv1p2beta1 + - input-directory: google/cloud/asset/v1p5beta1 + service-config: cloudasset_v1p5beta1.yaml + import-path: cloud.google.com/go/asset/apiv1p5beta1 + - input-directory: google/cloud/assuredworkloads/v1 + service-config: assuredworkloads_v1.yaml + import-path: cloud.google.com/go/assuredworkloads/apiv1 + - input-directory: google/cloud/assuredworkloads/v1beta1 + service-config: assuredworkloads_v1beta1.yaml + import-path: cloud.google.com/go/assuredworkloads/apiv1beta1 + - input-directory: google/cloud/automl/v1 + service-config: automl_v1.yaml + import-path: cloud.google.com/go/automl/apiv1 + - input-directory: google/cloud/automl/v1beta1 + service-config: automl_v1beta1.yaml + import-path: cloud.google.com/go/automl/apiv1beta1 + - input-directory: google/cloud/backupdr/v1 + service-config: backupdr_v1.yaml + import-path: cloud.google.com/go/backupdr/apiv1 + - input-directory: google/cloud/baremetalsolution/v2 + service-config: baremetalsolution_v2.yaml + import-path: cloud.google.com/go/baremetalsolution/apiv2 + - input-directory: google/cloud/batch/v1 + service-config: batch_v1.yaml + import-path: cloud.google.com/go/batch/apiv1 + - input-directory: google/cloud/beyondcorp/appconnections/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/appconnections/apiv1 + - input-directory: google/cloud/beyondcorp/appconnectors/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/appconnectors/apiv1 + - input-directory: google/cloud/beyondcorp/appgateways/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/appgateways/apiv1 + - input-directory: google/cloud/beyondcorp/clientconnectorservices/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/clientconnectorservices/apiv1 + - input-directory: google/cloud/beyondcorp/clientgateways/v1 + service-config: beyondcorp_v1.yaml + import-path: cloud.google.com/go/beyondcorp/clientgateways/apiv1 + - input-directory: google/cloud/bigquery/analyticshub/v1 + service-config: analyticshub_v1.yaml + import-path: cloud.google.com/go/bigquery/analyticshub/apiv1 + - input-directory: google/cloud/bigquery/biglake/v1 + service-config: biglake_v1.yaml + import-path: cloud.google.com/go/bigquery/biglake/apiv1 + - input-directory: google/cloud/bigquery/biglake/v1alpha1 + service-config: biglake_v1alpha1.yaml + import-path: cloud.google.com/go/bigquery/biglake/apiv1alpha1 + - input-directory: google/cloud/bigquery/connection/v1 + service-config: bigqueryconnection_v1.yaml + import-path: cloud.google.com/go/bigquery/connection/apiv1 + - input-directory: google/cloud/bigquery/connection/v1beta1 + service-config: bigqueryconnection_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/connection/apiv1beta1 + - input-directory: google/cloud/bigquery/dataexchange/v1beta1 + service-config: analyticshub_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/dataexchange/apiv1beta1 + - input-directory: google/cloud/bigquery/datapolicies/v1 + service-config: bigquerydatapolicy_v1.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv1 + - input-directory: google/cloud/bigquery/datapolicies/v1beta1 + service-config: bigquerydatapolicy_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv1beta1 + - input-directory: google/cloud/bigquery/datapolicies/v2 + service-config: bigquerydatapolicy_v2.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv2 + - input-directory: google/cloud/bigquery/datapolicies/v2beta1 + service-config: bigquerydatapolicy_v2beta1.yaml + import-path: cloud.google.com/go/bigquery/datapolicies/apiv2beta1 + - input-directory: google/cloud/bigquery/datatransfer/v1 + service-config: bigquerydatatransfer_v1.yaml + import-path: cloud.google.com/go/bigquery/datatransfer/apiv1 + - input-directory: google/cloud/bigquery/migration/v2 + service-config: bigquerymigration_v2.yaml + import-path: cloud.google.com/go/bigquery/migration/apiv2 + - input-directory: google/cloud/bigquery/migration/v2alpha + service-config: bigquerymigration_v2alpha.yaml + import-path: cloud.google.com/go/bigquery/migration/apiv2alpha + - input-directory: google/cloud/bigquery/reservation/v1 + service-config: bigqueryreservation_v1.yaml + import-path: cloud.google.com/go/bigquery/reservation/apiv1 + - input-directory: google/cloud/bigquery/storage/v1 + service-config: bigquerystorage_v1.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1 + - input-directory: google/cloud/bigquery/storage/v1alpha + service-config: bigquerystorage_v1alpha.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1alpha + - input-directory: google/cloud/bigquery/storage/v1beta + service-config: bigquerystorage_v1beta.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1beta + - input-directory: google/cloud/bigquery/storage/v1beta1 + service-config: bigquerystorage_v1beta1.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1beta1 + - input-directory: google/cloud/bigquery/storage/v1beta2 + service-config: bigquerystorage_v1beta2.yaml + import-path: cloud.google.com/go/bigquery/storage/apiv1beta2 + - input-directory: google/cloud/bigquery/v2 + service-config: bigquery_v2.yaml + import-path: cloud.google.com/go/bigquery/v2/apiv2 + - input-directory: google/bigtable/admin/v2 + service-config: bigtableadmin_v2.yaml + import-path: cloud.google.com/go/bigtable/admin/apiv2 + release-level-override: stable + - input-directory: google/bigtable/v2 + service-config: bigtable_v2.yaml + import-path: cloud.google.com/go/bigtable/apiv2 + release-level-override: stable + - input-directory: google/cloud/billing/budgets/v1 + service-config: billingbudgets.yaml + import-path: cloud.google.com/go/billing/budgets/apiv1 + - input-directory: google/cloud/billing/budgets/v1beta1 + service-config: billingbudgets.yaml + import-path: cloud.google.com/go/billing/budgets/apiv1beta1 + - input-directory: google/cloud/billing/v1 + service-config: cloudbilling_v1.yaml + import-path: cloud.google.com/go/billing/apiv1 + - input-directory: google/cloud/binaryauthorization/v1 + service-config: binaryauthorization_v1.yaml + import-path: cloud.google.com/go/binaryauthorization/apiv1 + - input-directory: google/cloud/binaryauthorization/v1beta1 + service-config: binaryauthorization_v1beta1.yaml + import-path: cloud.google.com/go/binaryauthorization/apiv1beta1 + - input-directory: google/cloud/capacityplanner/v1beta + service-config: capacityplanner_v1beta.yaml + import-path: cloud.google.com/go/capacityplanner/apiv1beta + - input-directory: google/cloud/certificatemanager/v1 + service-config: certificatemanager_v1.yaml + import-path: cloud.google.com/go/certificatemanager/apiv1 + - input-directory: google/cloud/channel/v1 + service-config: cloudchannel_v1.yaml + import-path: cloud.google.com/go/channel/apiv1 + - input-directory: google/chat/v1 + service-config: chat_v1.yaml + import-path: cloud.google.com/go/chat/apiv1 + - input-directory: google/cloud/chronicle/v1 + service-config: chronicle_v1.yaml + import-path: cloud.google.com/go/chronicle/apiv1 + - input-directory: google/cloud/cloudcontrolspartner/v1 + service-config: cloudcontrolspartner_v1.yaml + import-path: cloud.google.com/go/cloudcontrolspartner/apiv1 + - input-directory: google/cloud/cloudcontrolspartner/v1beta + service-config: cloudcontrolspartner_v1beta.yaml + import-path: cloud.google.com/go/cloudcontrolspartner/apiv1beta + - input-directory: google/cloud/clouddms/v1 + service-config: datamigration_v1.yaml + import-path: cloud.google.com/go/clouddms/apiv1 + - input-directory: google/devtools/cloudprofiler/v2 + service-config: cloudprofiler_v2.yaml + import-path: cloud.google.com/go/cloudprofiler/apiv2 + - input-directory: google/api/cloudquotas/v1 + service-config: cloudquotas_v1.yaml + import-path: cloud.google.com/go/cloudquotas/apiv1 + - input-directory: google/api/cloudquotas/v1beta + service-config: cloudquotas_v1beta.yaml + import-path: cloud.google.com/go/cloudquotas/apiv1beta + - input-directory: google/cloud/commerce/consumer/procurement/v1 + service-config: cloudcommerceconsumerprocurement_v1.yaml + import-path: cloud.google.com/go/commerce/consumer/procurement/apiv1 + - input-directory: google/cloud/compute/v1 + service-config: compute_v1.yaml + import-path: cloud.google.com/go/compute/apiv1 + - input-directory: google/cloud/compute/v1beta + service-config: compute_v1beta.yaml + import-path: cloud.google.com/go/compute/apiv1beta + - input-directory: google/cloud/config/v1 + service-config: config_v1.yaml + import-path: cloud.google.com/go/config/apiv1 + - input-directory: google/cloud/configdelivery/v1 + service-config: configdelivery_v1.yaml + import-path: cloud.google.com/go/configdelivery/apiv1 + - input-directory: google/cloud/configdelivery/v1beta + service-config: configdelivery_v1beta.yaml + import-path: cloud.google.com/go/configdelivery/apiv1beta + - input-directory: google/cloud/contactcenterinsights/v1 + service-config: contactcenterinsights_v1.yaml + import-path: cloud.google.com/go/contactcenterinsights/apiv1 + - input-directory: google/cloud/datacatalog/lineage/v1 + service-config: datalineage_v1.yaml + import-path: cloud.google.com/go/datacatalog/lineage/apiv1 + - input-directory: google/cloud/datacatalog/v1 + service-config: datacatalog_v1.yaml + import-path: cloud.google.com/go/datacatalog/apiv1 + - input-directory: google/cloud/datacatalog/v1beta1 + service-config: datacatalog_v1beta1.yaml + import-path: cloud.google.com/go/datacatalog/apiv1beta1 + - input-directory: google/cloud/dataform/v1 + service-config: dataform_v1.yaml + import-path: cloud.google.com/go/dataform/apiv1 + - input-directory: google/cloud/dataform/v1beta1 + service-config: dataform_v1beta1.yaml + import-path: cloud.google.com/go/dataform/apiv1beta1 + - input-directory: google/cloud/datafusion/v1 + service-config: datafusion_v1.yaml + import-path: cloud.google.com/go/datafusion/apiv1 + - input-directory: google/cloud/datalabeling/v1beta1 + service-config: datalabeling_v1beta1.yaml + import-path: cloud.google.com/go/datalabeling/apiv1beta1 + - input-directory: google/cloud/dataplex/v1 + service-config: dataplex_v1.yaml + import-path: cloud.google.com/go/dataplex/apiv1 + - input-directory: google/cloud/dataproc/v1 + service-config: dataproc_v1.yaml + import-path: cloud.google.com/go/dataproc/v2/apiv1 + rel-path: /dataproc/apiv1 + - input-directory: google/cloud/dataqna/v1alpha + service-config: dataqna_v1alpha.yaml + import-path: cloud.google.com/go/dataqna/apiv1alpha + - input-directory: google/cloud/datastream/v1 + service-config: datastream_v1.yaml + import-path: cloud.google.com/go/datastream/apiv1 + - input-directory: google/cloud/datastream/v1alpha1 + service-config: datastream_v1alpha1.yaml + import-path: cloud.google.com/go/datastream/apiv1alpha1 + - input-directory: google/cloud/deploy/v1 + service-config: clouddeploy_v1.yaml + import-path: cloud.google.com/go/deploy/apiv1 + - input-directory: google/cloud/developerconnect/v1 + service-config: developerconnect_v1.yaml + import-path: cloud.google.com/go/developerconnect/apiv1 + - input-directory: google/cloud/devicestreaming/v1 + service-config: devicestreaming_v1.yaml + import-path: cloud.google.com/go/devicestreaming/apiv1 + - input-directory: google/cloud/dialogflow/cx/v3 + service-config: dialogflow_v3.yaml + import-path: cloud.google.com/go/dialogflow/cx/apiv3 + - input-directory: google/cloud/dialogflow/cx/v3beta1 + service-config: dialogflow_v3beta1.yaml + import-path: cloud.google.com/go/dialogflow/cx/apiv3beta1 + - input-directory: google/cloud/dialogflow/v2 + service-config: dialogflow_v2.yaml + import-path: cloud.google.com/go/dialogflow/apiv2 + - input-directory: google/cloud/dialogflow/v2beta1 + service-config: dialogflow_v2beta1.yaml + import-path: cloud.google.com/go/dialogflow/apiv2beta1 + - input-directory: google/cloud/discoveryengine/v1 + service-config: discoveryengine_v1.yaml + import-path: cloud.google.com/go/discoveryengine/apiv1 + - input-directory: google/cloud/discoveryengine/v1beta + service-config: discoveryengine_v1beta.yaml + import-path: cloud.google.com/go/discoveryengine/apiv1beta + - input-directory: google/cloud/discoveryengine/v1alpha + service-config: discoveryengine_v1alpha.yaml + import-path: cloud.google.com/go/discoveryengine/apiv1alpha + - input-directory: google/cloud/documentai/v1 + service-config: documentai_v1.yaml + import-path: cloud.google.com/go/documentai/apiv1 + - input-directory: google/cloud/documentai/v1beta3 + service-config: documentai_v1beta3.yaml + import-path: cloud.google.com/go/documentai/apiv1beta3 + - input-directory: google/cloud/domains/v1beta1 + service-config: domains_v1beta1.yaml + import-path: cloud.google.com/go/domains/apiv1beta1 + - input-directory: google/cloud/edgecontainer/v1 + service-config: edgecontainer_v1.yaml + import-path: cloud.google.com/go/edgecontainer/apiv1 + - input-directory: google/cloud/edgenetwork/v1 + service-config: edgenetwork_v1.yaml + import-path: cloud.google.com/go/edgenetwork/apiv1 + - input-directory: google/cloud/essentialcontacts/v1 + service-config: essentialcontacts_v1.yaml + import-path: cloud.google.com/go/essentialcontacts/apiv1 + - input-directory: google/cloud/eventarc/v1 + service-config: eventarc_v1.yaml + import-path: cloud.google.com/go/eventarc/apiv1 + - input-directory: google/cloud/eventarc/publishing/v1 + service-config: eventarcpublishing_v1.yaml + import-path: cloud.google.com/go/eventarc/publishing/apiv1 + - input-directory: google/cloud/filestore/v1 + service-config: file_v1.yaml + import-path: cloud.google.com/go/filestore/apiv1 + - input-directory: google/cloud/financialservices/v1 + service-config: financialservices_v1.yaml + import-path: cloud.google.com/go/financialservices/apiv1 + - input-directory: google/cloud/functions/v1 + service-config: cloudfunctions_v1.yaml + import-path: cloud.google.com/go/functions/apiv1 + - input-directory: google/cloud/functions/v2 + service-config: cloudfunctions_v2.yaml + import-path: cloud.google.com/go/functions/apiv2 + - input-directory: google/cloud/functions/v2beta + service-config: cloudfunctions_v2beta.yaml + import-path: cloud.google.com/go/functions/apiv2beta + - input-directory: google/cloud/geminidataanalytics/v1beta + service-config: geminidataanalytics_v1beta.yaml + import-path: cloud.google.com/go/geminidataanalytics/apiv1beta + - input-directory: google/cloud/gkebackup/v1 + service-config: gkebackup_v1.yaml + import-path: cloud.google.com/go/gkebackup/apiv1 + - input-directory: google/cloud/gkeconnect/gateway/v1beta1 + service-config: connectgateway_v1beta1.yaml + import-path: cloud.google.com/go/gkeconnect/gateway/apiv1beta1 + - input-directory: google/cloud/gkeconnect/gateway/v1 + service-config: connectgateway_v1.yaml + import-path: cloud.google.com/go/gkeconnect/gateway/apiv1 + - input-directory: google/cloud/gkehub/v1beta1 + service-config: gkehub_v1beta1.yaml + import-path: cloud.google.com/go/gkehub/apiv1beta1 + - input-directory: google/cloud/gkemulticloud/v1 + service-config: gkemulticloud_v1.yaml + import-path: cloud.google.com/go/gkemulticloud/apiv1 + - input-directory: google/cloud/gsuiteaddons/v1 + service-config: gsuiteaddons_v1.yaml + import-path: cloud.google.com/go/gsuiteaddons/apiv1 + - input-directory: google/cloud/iap/v1 + service-config: iap_v1.yaml + import-path: cloud.google.com/go/iap/apiv1 + - input-directory: google/cloud/identitytoolkit/v2 + service-config: identitytoolkit_v2.yaml + import-path: cloud.google.com/go/identitytoolkit/apiv2 + - input-directory: google/cloud/ids/v1 + service-config: ids_v1.yaml + import-path: cloud.google.com/go/ids/apiv1 + - input-directory: google/cloud/iot/v1 + service-config: cloudiot_v1.yaml + import-path: cloud.google.com/go/iot/apiv1 + - input-directory: google/cloud/kms/v1 + service-config: cloudkms_v1.yaml + import-path: cloud.google.com/go/kms/apiv1 + - input-directory: google/cloud/kms/inventory/v1 + service-config: kmsinventory_v1.yaml + import-path: cloud.google.com/go/kms/inventory/apiv1 + - input-directory: google/cloud/language/v1 + service-config: language_v1.yaml + import-path: cloud.google.com/go/language/apiv1 + - input-directory: google/cloud/language/v1beta2 + service-config: language_v1beta2.yaml + import-path: cloud.google.com/go/language/apiv1beta2 + - input-directory: google/cloud/language/v2 + service-config: language_v2.yaml + import-path: cloud.google.com/go/language/apiv2 + - input-directory: google/cloud/licensemanager/v1 + service-config: licensemanager_v1.yaml + import-path: cloud.google.com/go/licensemanager/apiv1 + - input-directory: google/cloud/lifesciences/v2beta + service-config: lifesciences_v2beta.yaml + import-path: cloud.google.com/go/lifesciences/apiv2beta + - input-directory: google/cloud/locationfinder/v1 + service-config: cloudlocationfinder_v1.yaml + import-path: cloud.google.com/go/locationfinder/apiv1 + - input-directory: google/cloud/lustre/v1 + service-config: lustre_v1.yaml + import-path: cloud.google.com/go/lustre/apiv1 + - input-directory: google/cloud/maintenance/api/v1beta + service-config: maintenance_v1beta.yaml + import-path: cloud.google.com/go/maintenance/api/apiv1beta + - input-directory: google/cloud/managedidentities/v1 + service-config: managedidentities_v1.yaml + import-path: cloud.google.com/go/managedidentities/apiv1 + - input-directory: google/cloud/managedkafka/v1 + service-config: managedkafka_v1.yaml + import-path: cloud.google.com/go/managedkafka/apiv1 + - input-directory: google/cloud/managedkafka/schemaregistry/v1 + service-config: managedkafka_v1.yaml + import-path: cloud.google.com/go/managedkafka/schemaregistry/apiv1 + - input-directory: google/cloud/mediatranslation/v1beta1 + service-config: mediatranslation_v1beta1.yaml + import-path: cloud.google.com/go/mediatranslation/apiv1beta1 + - input-directory: google/cloud/memcache/v1 + service-config: memcache_v1.yaml + import-path: cloud.google.com/go/memcache/apiv1 + - input-directory: google/cloud/memcache/v1beta2 + service-config: memcache_v1beta2.yaml + import-path: cloud.google.com/go/memcache/apiv1beta2 + - input-directory: google/cloud/memorystore/v1 + service-config: memorystore_v1.yaml + import-path: cloud.google.com/go/memorystore/apiv1 + - input-directory: google/cloud/memorystore/v1beta + service-config: memorystore_v1beta.yaml + import-path: cloud.google.com/go/memorystore/apiv1beta + - input-directory: google/cloud/metastore/v1 + service-config: metastore_v1.yaml + import-path: cloud.google.com/go/metastore/apiv1 + - input-directory: google/cloud/metastore/v1alpha + service-config: metastore_v1alpha.yaml + import-path: cloud.google.com/go/metastore/apiv1alpha + - input-directory: google/cloud/metastore/v1beta + service-config: metastore_v1beta.yaml + import-path: cloud.google.com/go/metastore/apiv1beta + - input-directory: google/cloud/migrationcenter/v1 + service-config: migrationcenter_v1.yaml + import-path: cloud.google.com/go/migrationcenter/apiv1 + - input-directory: google/cloud/netapp/v1 + service-config: netapp_v1.yaml + import-path: cloud.google.com/go/netapp/apiv1 + - input-directory: google/cloud/networkconnectivity/v1 + service-config: networkconnectivity_v1.yaml + import-path: cloud.google.com/go/networkconnectivity/apiv1 + - input-directory: google/cloud/networkconnectivity/v1alpha1 + service-config: networkconnectivity_v1alpha1.yaml + import-path: cloud.google.com/go/networkconnectivity/apiv1alpha1 + - input-directory: google/cloud/networkmanagement/v1 + service-config: networkmanagement_v1.yaml + import-path: cloud.google.com/go/networkmanagement/apiv1 + - input-directory: google/cloud/networksecurity/v1beta1 + service-config: networksecurity_v1beta1.yaml + import-path: cloud.google.com/go/networksecurity/apiv1beta1 + - input-directory: google/cloud/networkservices/v1 + service-config: networkservices_v1.yaml + import-path: cloud.google.com/go/networkservices/apiv1 + - input-directory: google/cloud/notebooks/v1 + service-config: notebooks_v1.yaml + import-path: cloud.google.com/go/notebooks/apiv1 + - input-directory: google/cloud/notebooks/v1beta1 + service-config: notebooks_v1beta1.yaml + import-path: cloud.google.com/go/notebooks/apiv1beta1 + - input-directory: google/cloud/notebooks/v2 + service-config: notebooks_v2.yaml + import-path: cloud.google.com/go/notebooks/apiv2 + - input-directory: google/cloud/optimization/v1 + service-config: cloudoptimization_v1.yaml + import-path: cloud.google.com/go/optimization/apiv1 + - input-directory: google/cloud/oracledatabase/v1 + service-config: oracledatabase_v1.yaml + import-path: cloud.google.com/go/oracledatabase/apiv1 + - input-directory: google/cloud/orchestration/airflow/service/v1 + service-config: composer_v1.yaml + import-path: cloud.google.com/go/orchestration/airflow/service/apiv1 + - input-directory: google/cloud/orgpolicy/v1 + service-config: + import-path: cloud.google.com/go/orgpolicy/apiv1 + - input-directory: google/cloud/orgpolicy/v2 + service-config: orgpolicy_v2.yaml + import-path: cloud.google.com/go/orgpolicy/apiv2 + - input-directory: google/cloud/osconfig/agentendpoint/v1 + service-config: osconfig_v1.yaml + import-path: cloud.google.com/go/osconfig/agentendpoint/apiv1 + - input-directory: google/cloud/osconfig/agentendpoint/v1beta + service-config: osconfig_v1beta.yaml + import-path: cloud.google.com/go/osconfig/agentendpoint/apiv1beta + - input-directory: google/cloud/osconfig/v1 + service-config: osconfig_v1.yaml + import-path: cloud.google.com/go/osconfig/apiv1 + - input-directory: google/cloud/osconfig/v1alpha + service-config: osconfig_v1alpha.yaml + import-path: cloud.google.com/go/osconfig/apiv1alpha + - input-directory: google/cloud/osconfig/v1beta + service-config: osconfig_v1beta.yaml + import-path: cloud.google.com/go/osconfig/apiv1beta + - input-directory: google/cloud/oslogin/v1 + service-config: oslogin_v1.yaml + import-path: cloud.google.com/go/oslogin/apiv1 + - input-directory: google/cloud/oslogin/v1beta + service-config: oslogin_v1beta.yaml + import-path: cloud.google.com/go/oslogin/apiv1beta + - input-directory: google/cloud/oslogin/common + service-config: + import-path: cloud.google.com/go/oslogin/common + - input-directory: google/cloud/parallelstore/v1 + service-config: parallelstore_v1.yaml + import-path: cloud.google.com/go/parallelstore/apiv1 + - input-directory: google/cloud/parallelstore/v1beta + service-config: parallelstore_v1beta.yaml + import-path: cloud.google.com/go/parallelstore/apiv1beta + - input-directory: google/cloud/parametermanager/v1 + service-config: parametermanager_v1.yaml + import-path: cloud.google.com/go/parametermanager/apiv1 + - input-directory: google/cloud/phishingprotection/v1beta1 + service-config: phishingprotection_v1beta1.yaml + import-path: cloud.google.com/go/phishingprotection/apiv1beta1 + - input-directory: google/cloud/policysimulator/v1 + service-config: policysimulator_v1.yaml + import-path: cloud.google.com/go/policysimulator/apiv1 + - input-directory: google/cloud/policytroubleshooter/iam/v3 + service-config: policytroubleshooter_v3.yaml + import-path: cloud.google.com/go/policytroubleshooter/iam/apiv3 + - input-directory: google/cloud/policytroubleshooter/v1 + service-config: policytroubleshooter_v1.yaml + import-path: cloud.google.com/go/policytroubleshooter/apiv1 + - input-directory: google/cloud/privatecatalog/v1beta1 + service-config: cloudprivatecatalog_v1beta1.yaml + import-path: cloud.google.com/go/privatecatalog/apiv1beta1 + - input-directory: google/cloud/privilegedaccessmanager/v1 + service-config: privilegedaccessmanager_v1.yaml + import-path: cloud.google.com/go/privilegedaccessmanager/apiv1 + - input-directory: google/cloud/pubsublite/v1 + service-config: pubsublite_v1.yaml + import-path: cloud.google.com/go/pubsublite/apiv1 + - input-directory: google/cloud/rapidmigrationassessment/v1 + service-config: rapidmigrationassessment_v1.yaml + import-path: cloud.google.com/go/rapidmigrationassessment/apiv1 + - input-directory: google/cloud/recaptchaenterprise/v1 + service-config: recaptchaenterprise_v1.yaml + import-path: cloud.google.com/go/recaptchaenterprise/v2/apiv1 + rel-path: /recaptchaenterprise/apiv1 + - input-directory: google/cloud/recaptchaenterprise/v1beta1 + service-config: recaptchaenterprise_v1beta1.yaml + import-path: cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1 + rel-path: /recaptchaenterprise/apiv1beta1 + - input-directory: google/cloud/recommendationengine/v1beta1 + service-config: recommendationengine_v1beta1.yaml + import-path: cloud.google.com/go/recommendationengine/apiv1beta1 + - input-directory: google/cloud/recommender/v1 + service-config: recommender_v1.yaml + import-path: cloud.google.com/go/recommender/apiv1 + - input-directory: google/cloud/recommender/v1beta1 + service-config: recommender_v1beta1.yaml + import-path: cloud.google.com/go/recommender/apiv1beta1 + - input-directory: google/cloud/redis/v1 + service-config: redis_v1.yaml + import-path: cloud.google.com/go/redis/apiv1 + - input-directory: google/cloud/redis/v1beta1 + service-config: redis_v1beta1.yaml + import-path: cloud.google.com/go/redis/apiv1beta1 + - input-directory: google/cloud/redis/cluster/v1 + service-config: redis_v1.yaml + import-path: cloud.google.com/go/redis/cluster/apiv1 + - input-directory: google/cloud/resourcemanager/v2 + service-config: cloudresourcemanager_v2.yaml + import-path: cloud.google.com/go/resourcemanager/apiv2 + - input-directory: google/cloud/resourcemanager/v3 + service-config: cloudresourcemanager_v3.yaml + import-path: cloud.google.com/go/resourcemanager/apiv3 + - input-directory: google/cloud/retail/v2 + service-config: retail_v2.yaml + import-path: cloud.google.com/go/retail/apiv2 + - input-directory: google/cloud/retail/v2alpha + service-config: retail_v2alpha.yaml + import-path: cloud.google.com/go/retail/apiv2alpha + - input-directory: google/cloud/retail/v2beta + service-config: retail_v2beta.yaml + import-path: cloud.google.com/go/retail/apiv2beta + - input-directory: google/cloud/run/v2 + service-config: run_v2.yaml + import-path: cloud.google.com/go/run/apiv2 + - input-directory: google/cloud/scheduler/v1 + service-config: cloudscheduler_v1.yaml + import-path: cloud.google.com/go/scheduler/apiv1 + - input-directory: google/cloud/scheduler/v1beta1 + service-config: cloudscheduler_v1beta1.yaml + import-path: cloud.google.com/go/scheduler/apiv1beta1 + - input-directory: google/cloud/secretmanager/v1 + service-config: secretmanager_v1.yaml + import-path: cloud.google.com/go/secretmanager/apiv1 + - input-directory: google/cloud/secretmanager/v1beta2 + service-config: secretmanager_v1beta2.yaml + import-path: cloud.google.com/go/secretmanager/apiv1beta2 + - input-directory: google/cloud/securesourcemanager/v1 + service-config: securesourcemanager_v1.yaml + import-path: cloud.google.com/go/securesourcemanager/apiv1 + - input-directory: google/cloud/security/privateca/v1 + service-config: privateca_v1.yaml + import-path: cloud.google.com/go/security/privateca/apiv1 + - input-directory: google/cloud/security/publicca/v1beta1 + service-config: publicca_v1beta1.yaml + import-path: cloud.google.com/go/security/publicca/apiv1beta1 + - input-directory: google/cloud/security/publicca/v1 + service-config: publicca_v1.yaml + import-path: cloud.google.com/go/security/publicca/apiv1 + - input-directory: google/cloud/securitycenter/settings/v1beta1 + service-config: securitycenter_settings.yaml + import-path: cloud.google.com/go/securitycenter/settings/apiv1beta1 + - input-directory: google/cloud/securitycenter/v1 + service-config: securitycenter_v1.yaml + import-path: cloud.google.com/go/securitycenter/apiv1 + - input-directory: google/cloud/securitycenter/v1beta1 + service-config: securitycenter_v1beta1.yaml + import-path: cloud.google.com/go/securitycenter/apiv1beta1 + - input-directory: google/cloud/securitycenter/v1p1beta1 + service-config: securitycenter_v1p1beta1.yaml + import-path: cloud.google.com/go/securitycenter/apiv1p1beta1 + - input-directory: google/cloud/securitycenter/v2 + service-config: securitycenter_v2.yaml + import-path: cloud.google.com/go/securitycenter/apiv2 + - input-directory: google/cloud/securitycentermanagement/v1 + service-config: securitycentermanagement_v1.yaml + import-path: cloud.google.com/go/securitycentermanagement/apiv1 + - input-directory: google/cloud/securityposture/v1 + service-config: securityposture_v1.yaml + import-path: cloud.google.com/go/securityposture/apiv1 + - input-directory: google/api/servicecontrol/v1 + service-config: servicecontrol.yaml + import-path: cloud.google.com/go/servicecontrol/apiv1 + - input-directory: google/cloud/servicedirectory/v1 + service-config: servicedirectory_v1.yaml + import-path: cloud.google.com/go/servicedirectory/apiv1 + - input-directory: google/cloud/servicedirectory/v1beta1 + service-config: servicedirectory_v1beta1.yaml + import-path: cloud.google.com/go/servicedirectory/apiv1beta1 + - input-directory: google/cloud/servicehealth/v1 + service-config: servicehealth_v1.yaml + import-path: cloud.google.com/go/servicehealth/apiv1 + - input-directory: google/api/servicemanagement/v1 + service-config: servicemanagement_v1.yaml + import-path: cloud.google.com/go/servicemanagement/apiv1 + - input-directory: google/api/serviceusage/v1 + service-config: serviceusage_v1.yaml + import-path: cloud.google.com/go/serviceusage/apiv1 + - input-directory: google/cloud/shell/v1 + service-config: cloudshell_v1.yaml + import-path: cloud.google.com/go/shell/apiv1 + - input-directory: google/shopping/css/v1 + service-config: css_v1.yaml + import-path: cloud.google.com/go/shopping/css/apiv1 + - input-directory: google/shopping/merchant/accounts/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/accounts/apiv1 + - input-directory: google/shopping/merchant/accounts/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/accounts/apiv1beta + - input-directory: google/shopping/merchant/conversions/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/conversions/apiv1 + - input-directory: google/shopping/merchant/conversions/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/conversions/apiv1beta + - input-directory: google/shopping/merchant/datasources/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/datasources/apiv1 + - input-directory: google/shopping/merchant/datasources/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/datasources/apiv1beta + - input-directory: google/shopping/merchant/notifications/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/notifications/apiv1 + - input-directory: google/shopping/merchant/notifications/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/notifications/apiv1beta + - input-directory: google/shopping/merchant/ordertracking/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/ordertracking/apiv1 + - input-directory: google/shopping/merchant/ordertracking/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta + - input-directory: google/shopping/merchant/products/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/products/apiv1 + - input-directory: google/shopping/merchant/products/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/products/apiv1beta + - input-directory: google/shopping/merchant/productstudio/v1alpha + service-config: merchantapi_v1alpha.yaml + import-path: cloud.google.com/go/shopping/merchant/productstudio/apiv1alpha + - input-directory: google/shopping/merchant/promotions/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/promotions/apiv1 + - input-directory: google/shopping/merchant/promotions/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/promotions/apiv1beta + - input-directory: google/shopping/merchant/quota/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/quota/apiv1 + - input-directory: google/shopping/merchant/quota/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/quota/apiv1beta + - input-directory: google/shopping/merchant/inventories/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/inventories/apiv1 + - input-directory: google/shopping/merchant/inventories/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/inventories/apiv1beta + - input-directory: google/shopping/merchant/issueresolution/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/issueresolution/apiv1 + - input-directory: google/shopping/merchant/issueresolution/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta + - input-directory: google/shopping/merchant/lfp/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/lfp/apiv1 + - input-directory: google/shopping/merchant/lfp/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/lfp/apiv1beta + - input-directory: google/shopping/merchant/reports/v1 + service-config: merchantapi_v1.yaml + import-path: cloud.google.com/go/shopping/merchant/reports/apiv1 + - input-directory: google/shopping/merchant/reports/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/reports/apiv1beta + - input-directory: google/shopping/merchant/reviews/v1beta + service-config: merchantapi_v1beta.yaml + import-path: cloud.google.com/go/shopping/merchant/reviews/apiv1beta + - input-directory: google/shopping/type + service-config: + import-path: cloud.google.com/go/shopping/type + - input-directory: google/cloud/speech/v1 + service-config: speech_v1.yaml + import-path: cloud.google.com/go/speech/apiv1 + - input-directory: google/cloud/speech/v1p1beta1 + service-config: speech_v1p1beta1.yaml + import-path: cloud.google.com/go/speech/apiv1p1beta1 + - input-directory: google/cloud/speech/v2 + service-config: speech_v2.yaml + import-path: cloud.google.com/go/speech/apiv2 + - input-directory: google/cloud/storagebatchoperations/v1 + service-config: storagebatchoperations_v1.yaml + import-path: cloud.google.com/go/storagebatchoperations/apiv1 + - input-directory: google/cloud/storageinsights/v1 + service-config: storageinsights_v1.yaml + import-path: cloud.google.com/go/storageinsights/apiv1 + - input-directory: google/cloud/support/v2 + service-config: cloudsupport_v2.yaml + import-path: cloud.google.com/go/support/apiv2 + - input-directory: google/cloud/support/v2beta + service-config: cloudsupport_v2beta.yaml + import-path: cloud.google.com/go/support/apiv2beta + - input-directory: google/cloud/talent/v4 + service-config: jobs_v4.yaml + import-path: cloud.google.com/go/talent/apiv4 + - input-directory: google/cloud/talent/v4beta1 + service-config: jobs_v4beta1.yaml + import-path: cloud.google.com/go/talent/apiv4beta1 + - input-directory: google/cloud/tasks/v2 + service-config: cloudtasks_v2.yaml + import-path: cloud.google.com/go/cloudtasks/apiv2 + - input-directory: google/cloud/tasks/v2beta2 + service-config: cloudtasks_v2beta2.yaml + import-path: cloud.google.com/go/cloudtasks/apiv2beta2 + - input-directory: google/cloud/tasks/v2beta3 + service-config: cloudtasks_v2beta3.yaml + import-path: cloud.google.com/go/cloudtasks/apiv2beta3 + - input-directory: google/cloud/telcoautomation/v1 + service-config: telcoautomation_v1.yaml + import-path: cloud.google.com/go/telcoautomation/apiv1 + - input-directory: google/cloud/texttospeech/v1 + service-config: texttospeech_v1.yaml + import-path: cloud.google.com/go/texttospeech/apiv1 + - input-directory: google/cloud/tpu/v1 + service-config: tpu_v1.yaml + import-path: cloud.google.com/go/tpu/apiv1 + - input-directory: google/cloud/translate/v3 + service-config: translate_v3.yaml + import-path: cloud.google.com/go/translate/apiv3 + - input-directory: google/devtools/clouderrorreporting/v1beta1 + service-config: clouderrorreporting_v1beta1.yaml + import-path: cloud.google.com/go/errorreporting/apiv1beta1 + - input-directory: google/devtools/cloudtrace/v1 + service-config: cloudtrace_v1.yaml + import-path: cloud.google.com/go/trace/apiv1 + - input-directory: google/devtools/cloudtrace/v2 + service-config: cloudtrace_v2.yaml + import-path: cloud.google.com/go/trace/apiv2 + - input-directory: google/cloud/video/livestream/v1 + service-config: livestream_v1.yaml + import-path: cloud.google.com/go/video/livestream/apiv1 + - input-directory: google/cloud/video/transcoder/v1 + service-config: transcoder_v1.yaml + import-path: cloud.google.com/go/video/transcoder/apiv1 + - input-directory: google/cloud/videointelligence/v1 + service-config: videointelligence_v1.yaml + import-path: cloud.google.com/go/videointelligence/apiv1 + - input-directory: google/cloud/videointelligence/v1beta2 + service-config: videointelligence_v1beta2.yaml + import-path: cloud.google.com/go/videointelligence/apiv1beta2 + - input-directory: google/cloud/videointelligence/v1p3beta1 + service-config: videointelligence_v1p3beta1.yaml + import-path: cloud.google.com/go/videointelligence/apiv1p3beta1 + - input-directory: google/cloud/vision/v1 + service-config: vision_v1.yaml + import-path: cloud.google.com/go/vision/v2/apiv1 + rel-path: /vision/apiv1 + - input-directory: google/cloud/vision/v1p1beta1 + service-config: vision_v1p1beta1.yaml + import-path: cloud.google.com/go/vision/v2/apiv1p1beta1 + rel-path: /vision/apiv1p1beta1 + - input-directory: google/cloud/visionai/v1 + service-config: visionai_v1.yaml + import-path: cloud.google.com/go/visionai/apiv1 + - input-directory: google/cloud/vmmigration/v1 + service-config: vmmigration_v1.yaml + import-path: cloud.google.com/go/vmmigration/apiv1 + - input-directory: google/cloud/vmwareengine/v1 + service-config: vmwareengine_v1.yaml + import-path: cloud.google.com/go/vmwareengine/apiv1 + - input-directory: google/cloud/vpcaccess/v1 + service-config: vpcaccess_v1.yaml + import-path: cloud.google.com/go/vpcaccess/apiv1 + - input-directory: google/cloud/webrisk/v1 + service-config: webrisk_v1.yaml + import-path: cloud.google.com/go/webrisk/apiv1 + - input-directory: google/cloud/webrisk/v1beta1 + service-config: webrisk_v1beta1.yaml + import-path: cloud.google.com/go/webrisk/apiv1beta1 + - input-directory: google/cloud/websecurityscanner/v1 + service-config: websecurityscanner_v1.yaml + import-path: cloud.google.com/go/websecurityscanner/apiv1 + - input-directory: google/cloud/workflows/executions/v1 + service-config: workflowexecutions_v1.yaml + import-path: cloud.google.com/go/workflows/executions/apiv1 + - input-directory: google/cloud/workflows/executions/v1beta + service-config: workflowexecutions_v1beta.yaml + import-path: cloud.google.com/go/workflows/executions/apiv1beta + - input-directory: google/cloud/workflows/v1 + service-config: workflows_v1.yaml + import-path: cloud.google.com/go/workflows/apiv1 + - input-directory: google/cloud/workflows/v1beta + service-config: workflows_v1beta.yaml + import-path: cloud.google.com/go/workflows/apiv1beta + - input-directory: google/cloud/workstations/v1beta + service-config: workstations_v1beta.yaml + import-path: cloud.google.com/go/workstations/apiv1beta + - input-directory: google/cloud/workstations/v1 + service-config: workstations_v1.yaml + import-path: cloud.google.com/go/workstations/apiv1 + - input-directory: google/container/v1 + service-config: container_v1.yaml + import-path: cloud.google.com/go/container/apiv1 + - input-directory: google/dataflow/v1beta3 + service-config: dataflow_v1beta3.yaml + import-path: cloud.google.com/go/dataflow/apiv1beta3 + - input-directory: google/datastore/admin/v1 + service-config: datastore_v1.yaml + import-path: cloud.google.com/go/datastore/admin/apiv1 + - input-directory: google/datastore/v1 + service-config: datastore_v1.yaml + import-path: cloud.google.com/go/datastore/apiv1 + release-level-override: stable + - input-directory: google/devtools/artifactregistry/v1 + service-config: artifactregistry_v1.yaml + import-path: cloud.google.com/go/artifactregistry/apiv1 + - input-directory: google/devtools/artifactregistry/v1beta2 + service-config: artifactregistry_v1beta2.yaml + import-path: cloud.google.com/go/artifactregistry/apiv1beta2 + - input-directory: google/devtools/cloudbuild/v1 + service-config: cloudbuild_v1.yaml + import-path: cloud.google.com/go/cloudbuild/apiv1/v2 + - input-directory: google/devtools/cloudbuild/v2 + service-config: cloudbuild_v2.yaml + import-path: cloud.google.com/go/cloudbuild/apiv2 + - input-directory: google/cloud/confidentialcomputing/v1 + service-config: confidentialcomputing_v1.yaml + import-path: cloud.google.com/go/confidentialcomputing/apiv1 + - input-directory: google/cloud/confidentialcomputing/v1alpha1 + service-config: confidentialcomputing_v1alpha1.yaml + import-path: cloud.google.com/go/confidentialcomputing/apiv1alpha1 + - input-directory: google/devtools/containeranalysis/v1beta1 + service-config: containeranalysis_v1beta1.yaml + import-path: cloud.google.com/go/containeranalysis/apiv1beta1 + - input-directory: google/firestore/admin/v1 + service-config: firestore_v1.yaml + import-path: cloud.google.com/go/firestore/apiv1/admin + - input-directory: google/firestore/v1 + service-config: firestore_v1.yaml + import-path: cloud.google.com/go/firestore/apiv1 + - input-directory: google/iam/credentials/v1 + service-config: iamcredentials_v1.yaml + import-path: cloud.google.com/go/iam/credentials/apiv1 + - input-directory: google/iam/v1 + service-config: iam_meta_api.yaml + import-path: cloud.google.com/go/iam/apiv1 + - input-directory: google/iam/v2 + service-config: iam_v2.yaml + import-path: cloud.google.com/go/iam/apiv2 + - input-directory: google/iam/v3 + service-config: iam_v3.yaml + import-path: cloud.google.com/go/iam/apiv3 + - input-directory: google/iam/v3beta + service-config: iam_v3beta.yaml + import-path: cloud.google.com/go/iam/apiv3beta + - input-directory: google/identity/accesscontextmanager/v1 + service-config: accesscontextmanager_v1.yaml + import-path: cloud.google.com/go/accesscontextmanager/apiv1 + - input-directory: google/logging/v2 + service-config: logging_v2.yaml + import-path: cloud.google.com/go/logging/apiv2 + - input-directory: google/longrunning + service-config: longrunning.yaml + import-path: cloud.google.com/go/longrunning/autogen + - input-directory: google/maps/addressvalidation/v1 + service-config: addressvalidation_v1.yaml + import-path: cloud.google.com/go/maps/addressvalidation/apiv1 + - input-directory: google/maps/areainsights/v1 + service-config: areainsights_v1.yaml + import-path: cloud.google.com/go/maps/areainsights/apiv1 + - input-directory: google/maps/fleetengine/v1 + service-config: fleetengine_v1.yaml + import-path: cloud.google.com/go/maps/fleetengine/apiv1 + - input-directory: google/maps/fleetengine/delivery/v1 + service-config: fleetengine_v1.yaml + import-path: cloud.google.com/go/maps/fleetengine/delivery/apiv1 + - input-directory: google/maps/places/v1 + service-config: places_v1.yaml + import-path: cloud.google.com/go/maps/places/apiv1 + - input-directory: google/maps/routeoptimization/v1 + service-config: routeoptimization_v1.yaml + import-path: cloud.google.com/go/maps/routeoptimization/apiv1 + - input-directory: google/maps/routing/v2 + service-config: routes_v2.yaml + import-path: cloud.google.com/go/maps/routing/apiv2 + - input-directory: google/maps/solar/v1 + service-config: solar_v1.yaml + import-path: cloud.google.com/go/maps/solar/apiv1 + - input-directory: google/cloud/modelarmor/v1 + service-config: modelarmor_v1.yaml + import-path: cloud.google.com/go/modelarmor/apiv1 + - input-directory: google/cloud/modelarmor/v1beta + service-config: modelarmor_v1beta.yaml + import-path: cloud.google.com/go/modelarmor/apiv1beta + - input-directory: google/monitoring/dashboard/v1 + service-config: monitoring.yaml + import-path: cloud.google.com/go/monitoring/dashboard/apiv1 + - input-directory: google/monitoring/metricsscope/v1 + service-config: monitoring.yaml + import-path: cloud.google.com/go/monitoring/metricsscope/apiv1 + - input-directory: google/monitoring/v3 + service-config: monitoring.yaml + import-path: cloud.google.com/go/monitoring/apiv3/v2 + - input-directory: google/pubsub/v1 + service-config: pubsub_v1.yaml + import-path: cloud.google.com/go/pubsub/v2/apiv1 + - input-directory: google/spanner/adapter/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/adapter/apiv1 + - input-directory: google/spanner/admin/database/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/admin/database/apiv1 + - input-directory: google/spanner/admin/instance/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/admin/instance/apiv1 + - input-directory: google/spanner/v1 + service-config: spanner.yaml + import-path: cloud.google.com/go/spanner/apiv1 + - input-directory: google/spanner/executor/v1 + service-config: spanner_cloud_executor.yaml + import-path: cloud.google.com/go/spanner/executor/apiv1 + - input-directory: google/storage/control/v2 + service-config: storage_v2.yaml + import-path: cloud.google.com/go/storage/control/apiv2 + - input-directory: google/storage/v2 + service-config: storage_v2.yaml + import-path: cloud.google.com/go/storage/internal/apiv2 + - input-directory: google/storagetransfer/v1 + service-config: storagetransfer_v1.yaml + import-path: cloud.google.com/go/storagetransfer/apiv1 + - input-directory: google/streetview/publish/v1 + service-config: streetviewpublish.yaml + import-path: cloud.google.com/go/streetview/publish/apiv1 + # All entries below are clients that are not currently copied by owlbot. They + # explicitly express their import path for some code gen. + - input-directory: google/devtools/containeranalysis/v1beta1/grafeas + service-config: ../containeranalysis_v1beta1.yaml + import-path: cloud.google.com/go/containeranalysis/apiv1beta1 + rel-path: /containeranalysis/apiv1beta1 + - input-directory: google/cloud/video/stitcher/v1 + service-config: videostitcher_v1.yaml + import-path: cloud.google.com/go/video/stitcher/apiv1 + +skip-module-scan-paths: + # ignore the root module + - . + # Librarian released modules + - dataproc + - dlp + # individually released modules + - auth + - auth/oauth2adapt + - bigquery + - bigquery/v2 + - bigtable + - datastore + - errorreporting + - firestore + - logging + - profiler + - pubsub/v2 + - pubsub + - pubsublite + - spanner + - storage + - vertexai + # unreleased modules + - spanner/test/opentelemetry/test diff --git a/internal/stategen/testdata/source/release-please-config-individual.json b/internal/stategen/testdata/source/release-please-config-individual.json new file mode 100644 index 000000000000..32ea9f8208b0 --- /dev/null +++ b/internal/stategen/testdata/source/release-please-config-individual.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "go-yoshi", + "include-component-in-tag": true, + "separate-pull-requests": true, + "tag-separator": "/", + "packages": { + "auth": { + "component": "auth" + }, + "auth/oauth2adapt": { + "component": "auth/oauth2adapt" + }, + "bigquery": { + "component": "bigquery", + "exclude-paths": ["bigquery/v2"] + }, + "bigtable": { + "component": "bigtable" + }, + "datastore": { + "component": "datastore" + }, + "errorreporting": { + "component": "errorreporting" + }, + "firestore": { + "component": "firestore" + }, + "logging": { + "component": "logging" + }, + "profiler": { + "component": "profiler" + }, + "pubsub": { + "component": "pubsub", + "exclude-paths": ["pubsub/v2"] + }, + "pubsub/v2": { + "component": "pubsub/v2" + }, + "pubsublite": { + "component": "pubsublite" + }, + "spanner": { + "component": "spanner" + }, + "storage": { + "component": "storage" + }, + "vertexai": { + "component": "vertexai" + } + }, + "plugins": [ + "sentence-case" + ] +} diff --git a/internal/stategen/testdata/source/release-please-config-yoshi-submodules.json b/internal/stategen/testdata/source/release-please-config-yoshi-submodules.json new file mode 100644 index 000000000000..a0b13db0253b --- /dev/null +++ b/internal/stategen/testdata/source/release-please-config-yoshi-submodules.json @@ -0,0 +1,502 @@ +{ + "release-type": "go-yoshi", + "include-component-in-tag": true, + "tag-separator": "/", + "packages": { + "accessapproval": { + "component": "accessapproval" + }, + "accesscontextmanager": { + "component": "accesscontextmanager" + }, + "advisorynotifications": { + "component": "advisorynotifications" + }, + "ai": { + "component": "ai" + }, + "aiplatform": { + "component": "aiplatform" + }, + "alloydb": { + "component": "alloydb" + }, + "analytics": { + "component": "analytics" + }, + "apigateway": { + "component": "apigateway" + }, + "apigeeconnect": { + "component": "apigeeconnect" + }, + "apigeeregistry": { + "component": "apigeeregistry" + }, + "apihub": { + "component": "apihub" + }, + "apikeys": { + "component": "apikeys" + }, + "appengine": { + "component": "appengine" + }, + "apphub": { + "component": "apphub" + }, + "apps": { + "component": "apps" + }, + "area120": { + "component": "area120" + }, + "artifactregistry": { + "component": "artifactregistry" + }, + "asset": { + "component": "asset" + }, + "assuredworkloads": { + "component": "assuredworkloads" + }, + "automl": { + "component": "automl" + }, + "backupdr": { + "component": "backupdr" + }, + "baremetalsolution": { + "component": "baremetalsolution" + }, + "batch": { + "component": "batch" + }, + "beyondcorp": { + "component": "beyondcorp" + }, + "billing": { + "component": "billing" + }, + "binaryauthorization": { + "component": "binaryauthorization" + }, + "capacityplanner": { + "component": "capacityplanner" + }, + "certificatemanager": { + "component": "certificatemanager" + }, + "channel": { + "component": "channel" + }, + "chat": { + "component": "chat" + }, + "chronicle": { + "component": "chronicle" + }, + "cloudbuild": { + "component": "cloudbuild" + }, + "cloudcontrolspartner": { + "component": "cloudcontrolspartner" + }, + "clouddms": { + "component": "clouddms" + }, + "cloudprofiler": { + "component": "cloudprofiler" + }, + "cloudquotas": { + "component": "cloudquotas" + }, + "cloudtasks": { + "component": "cloudtasks" + }, + "commerce": { + "component": "commerce" + }, + "compute": { + "component": "compute" + }, + "compute/metadata": { + "component": "compute/metadata" + }, + "confidentialcomputing": { + "component": "confidentialcomputing" + }, + "config": { + "component": "config" + }, + "configdelivery": { + "component": "configdelivery" + }, + "contactcenterinsights": { + "component": "contactcenterinsights" + }, + "container": { + "component": "container" + }, + "containeranalysis": { + "component": "containeranalysis" + }, + "datacatalog": { + "component": "datacatalog" + }, + "dataflow": { + "component": "dataflow" + }, + "dataform": { + "component": "dataform" + }, + "datafusion": { + "component": "datafusion" + }, + "datalabeling": { + "component": "datalabeling" + }, + "dataplex": { + "component": "dataplex" + }, + "dataproc": { + "component": "dataproc" + }, + "dataqna": { + "component": "dataqna" + }, + "datastream": { + "component": "datastream" + }, + "deploy": { + "component": "deploy" + }, + "developerconnect": { + "component": "developerconnect" + }, + "devicestreaming": { + "component": "devicestreaming" + }, + "dialogflow": { + "component": "dialogflow" + }, + "discoveryengine": { + "component": "discoveryengine" + }, + "documentai": { + "component": "documentai" + }, + "domains": { + "component": "domains" + }, + "edgecontainer": { + "component": "edgecontainer" + }, + "edgenetwork": { + "component": "edgenetwork" + }, + "essentialcontacts": { + "component": "essentialcontacts" + }, + "eventarc": { + "component": "eventarc" + }, + "filestore": { + "component": "filestore" + }, + "financialservices": { + "component": "financialservices" + }, + "functions": { + "component": "functions" + }, + "geminidataanalytics": { + "component": "geminidataanalytics" + }, + "gkebackup": { + "component": "gkebackup" + }, + "gkeconnect": { + "component": "gkeconnect" + }, + "gkehub": { + "component": "gkehub" + }, + "gkemulticloud": { + "component": "gkemulticloud" + }, + "grafeas": { + "component": "grafeas" + }, + "gsuiteaddons": { + "component": "gsuiteaddons" + }, + "iam": { + "component": "iam" + }, + "iap": { + "component": "iap" + }, + "identitytoolkit": { + "component": "identitytoolkit" + }, + "ids": { + "component": "ids" + }, + "iot": { + "component": "iot" + }, + "kms": { + "component": "kms" + }, + "language": { + "component": "language" + }, + "licensemanager": { + "component": "licensemanager" + }, + "lifesciences": { + "component": "lifesciences" + }, + "locationfinder": { + "component": "locationfinder" + }, + "longrunning": { + "component": "longrunning" + }, + "lustre": { + "component": "lustre" + }, + "maintenance": { + "component": "maintenance" + }, + "managedidentities": { + "component": "managedidentities" + }, + "managedkafka": { + "component": "managedkafka" + }, + "maps": { + "component": "maps" + }, + "mediatranslation": { + "component": "mediatranslation" + }, + "memcache": { + "component": "memcache" + }, + "memorystore": { + "component": "memorystore" + }, + "metastore": { + "component": "metastore" + }, + "migrationcenter": { + "component": "migrationcenter" + }, + "modelarmor": { + "component": "modelarmor" + }, + "monitoring": { + "component": "monitoring" + }, + "netapp": { + "component": "netapp" + }, + "networkconnectivity": { + "component": "networkconnectivity" + }, + "networkmanagement": { + "component": "networkmanagement" + }, + "networksecurity": { + "component": "networksecurity" + }, + "networkservices": { + "component": "networkservices" + }, + "notebooks": { + "component": "notebooks" + }, + "optimization": { + "component": "optimization" + }, + "oracledatabase": { + "component": "oracledatabase" + }, + "orchestration": { + "component": "orchestration" + }, + "orgpolicy": { + "component": "orgpolicy" + }, + "osconfig": { + "component": "osconfig" + }, + "oslogin": { + "component": "oslogin" + }, + "parallelstore": { + "component": "parallelstore" + }, + "parametermanager": { + "component": "parametermanager" + }, + "phishingprotection": { + "component": "phishingprotection" + }, + "policysimulator": { + "component": "policysimulator" + }, + "policytroubleshooter": { + "component": "policytroubleshooter" + }, + "privatecatalog": { + "component": "privatecatalog" + }, + "privilegedaccessmanager": { + "component": "privilegedaccessmanager" + }, + "rapidmigrationassessment": { + "component": "rapidmigrationassessment" + }, + "recaptchaenterprise": { + "component": "recaptchaenterprise" + }, + "recommendationengine": { + "component": "recommendationengine" + }, + "recommender": { + "component": "recommender" + }, + "redis": { + "component": "redis" + }, + "resourcemanager": { + "component": "resourcemanager" + }, + "retail": { + "component": "retail" + }, + "run": { + "component": "run" + }, + "scheduler": { + "component": "scheduler" + }, + "secretmanager": { + "component": "secretmanager" + }, + "securesourcemanager": { + "component": "securesourcemanager" + }, + "security": { + "component": "security" + }, + "securitycenter": { + "component": "securitycenter" + }, + "securitycentermanagement": { + "component": "securitycentermanagement" + }, + "securityposture": { + "component": "securityposture" + }, + "servicecontrol": { + "component": "servicecontrol" + }, + "servicedirectory": { + "component": "servicedirectory" + }, + "servicehealth": { + "component": "servicehealth" + }, + "servicemanagement": { + "component": "servicemanagement" + }, + "serviceusage": { + "component": "serviceusage" + }, + "shell": { + "component": "shell" + }, + "shopping": { + "component": "shopping" + }, + "spanner/benchmarks": { + "component": "spanner/benchmarks" + }, + "speech": { + "component": "speech" + }, + "storagebatchoperations": { + "component": "storagebatchoperations" + }, + "storageinsights": { + "component": "storageinsights" + }, + "storagetransfer": { + "component": "storagetransfer" + }, + "streetview": { + "component": "streetview" + }, + "support": { + "component": "support" + }, + "talent": { + "component": "talent" + }, + "telcoautomation": { + "component": "telcoautomation" + }, + "texttospeech": { + "component": "texttospeech" + }, + "tpu": { + "component": "tpu" + }, + "trace": { + "component": "trace" + }, + "translate": { + "component": "translate" + }, + "video": { + "component": "video" + }, + "videointelligence": { + "component": "videointelligence" + }, + "vision": { + "component": "vision" + }, + "visionai": { + "component": "visionai" + }, + "vmmigration": { + "component": "vmmigration" + }, + "vmwareengine": { + "component": "vmwareengine" + }, + "vpcaccess": { + "component": "vpcaccess" + }, + "webrisk": { + "component": "webrisk" + }, + "websecurityscanner": { + "component": "websecurityscanner" + }, + "workflows": { + "component": "workflows" + }, + "workstations": { + "component": "workstations" + } + }, + "plugins": [ + "sentence-case" + ] +} From 7346b5dab41d086d37a4baccac68add15a73a3d6 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Fri, 26 Sep 2025 11:42:54 -0600 Subject: [PATCH 17/23] chore(.librarian): fix last_generated_commit for dataproc in state.yaml (#12957) --- .librarian/state.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.librarian/state.yaml b/.librarian/state.yaml index 870bc12be37f..8627a1f889b3 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -24,7 +24,7 @@ libraries: tag_format: '{id}/v{version}' - id: dataproc version: 2.14.1 - last_generated_commit: 329ace5e3712a2e37d6159d4dcd998d8c73f261e + last_generated_commit: 888ae95dd6125f754650d55410b8c117b618a268 apis: - path: google/cloud/dataproc/v1 service_config: "" From fa2e11d9a86d28aafe986239cc9b755aa062e29d Mon Sep 17 00:00:00 2001 From: Alvaro Viebrantz Date: Fri, 26 Sep 2025 15:49:52 -0400 Subject: [PATCH 18/23] feat(bigquery/v2): query client and basic query execution flow (#12878) This PR introduces the new query client with basic query execution flow (no retries yet) covering the 3 use cases: * Running a query using `jobs.query` and obtaining a `Query` handler * Running a query using `jobs.insert` and obtaining a `Query` handler * Reattaching to a `Query` handler from a `JobReference` Implements long pooling of job status in the background to mark query as complete. Towards #12877 --- bigquery/v2/query/doc.go | 55 ++++ bigquery/v2/query/helper.go | 108 +++++++ bigquery/v2/query/iterator.go | 28 ++ bigquery/v2/query/main_test.go | 95 +++++++ bigquery/v2/query/options.go | 29 ++ bigquery/v2/query/query.go | 295 ++++++++++++++++++++ bigquery/v2/query/query_integration_test.go | 165 +++++++++++ bigquery/v2/query/row.go | 19 ++ 8 files changed, 794 insertions(+) create mode 100644 bigquery/v2/query/doc.go create mode 100644 bigquery/v2/query/helper.go create mode 100644 bigquery/v2/query/iterator.go create mode 100644 bigquery/v2/query/main_test.go create mode 100644 bigquery/v2/query/options.go create mode 100644 bigquery/v2/query/query.go create mode 100644 bigquery/v2/query/query_integration_test.go create mode 100644 bigquery/v2/query/row.go diff --git a/bigquery/v2/query/doc.go b/bigquery/v2/query/doc.go new file mode 100644 index 000000000000..6dbd5a753865 --- /dev/null +++ b/bigquery/v2/query/doc.go @@ -0,0 +1,55 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package query provides a simplified API for running queries in BigQuery. +// +// This package is EXPERIMENTAL and subject to change without notice. +// +// The query client provides a simplified interface for running queries and +// retrieving results. It handles the complexities of job management and result +// pagination. +// +// Example usage: +// +// ctx := context.Background() +// client, err := apiv2_client.NewClient(ctx) +// if err != nil { +// // TODO: Handle error. +// } +// defer client.Close() +// +// helper, err := query.NewHelper(client, "my-project") +// if err != nil { +// // TODO: Handle error. +// } +// +// q, err := helper.StartQuery(ctx, &bigquerypb.PostQueryRequest{ +// QueryRequest: &bigquerypb.QueryRequest{ +// Query: "SELECT 123 as foo", +// }, +// }) +// if err != nil { +// // TODO: Handle error. +// } +// +// if err := q.Wait(ctx); err != nil { +// // TODO: Handle error. +// } +// +// it, err := q.Read(ctx) +// if err != nil { +// // TODO: Handle error. +// } +// // TODO: iterate results. +package query diff --git a/bigquery/v2/query/helper.go b/bigquery/v2/query/helper.go new file mode 100644 index 000000000000..1601cec90fb6 --- /dev/null +++ b/bigquery/v2/query/helper.go @@ -0,0 +1,108 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package query + +import ( + "context" + "errors" + "fmt" + + "cloud.google.com/go/bigquery/v2/apiv2/bigquerypb" + "cloud.google.com/go/bigquery/v2/apiv2_client" + "cloud.google.com/go/internal/uid" + "github.com/googleapis/gax-go/v2" + "google.golang.org/api/option" + "google.golang.org/protobuf/proto" +) + +// Helper for running queries in BigQuery. It is a lightweight wrapper +// around the auto-generated BigQuery v2 client, focused on query operations. +type Helper struct { + c *apiv2_client.Client + projectID string +} + +// NewHelper creates a new query helper. This helper should be reused instead of +// created per-request. +func NewHelper(c *apiv2_client.Client, projectID string, opts ...option.ClientOption) (*Helper, error) { + qc := &Helper{ + c: c, + projectID: projectID, + } + if qc.c == nil { + return nil, errors.New("missing bigquery client") + } + return qc, nil +} + +// StartQuery executes a query using the stateless jobs.query RPC. It returns a +// handle to the running query. The returned Query object can be used to wait for +// completion and retrieve results. +func (h *Helper) StartQuery(ctx context.Context, req *bigquerypb.PostQueryRequest, opts ...gax.CallOption) (*Query, error) { + req = proto.Clone(req).(*bigquerypb.PostQueryRequest) + qr := req.GetQueryRequest() + if qr == nil { + return nil, fmt.Errorf("bigquery: request is missing QueryRequest") + } + if qr.GetRequestId() == "" { + qr.RequestId = uid.NewSpace("request", nil).New() + } + + return newQueryJobFromQueryRequest(ctx, h, req, opts...), nil +} + +// StartQueryJob from a bigquerypb.Job definition. Should have job.Configuration.Query filled out. +func (h *Helper) StartQueryJob(ctx context.Context, job *bigquerypb.Job, opts ...gax.CallOption) (*Query, error) { + job = proto.Clone(job).(*bigquerypb.Job) + config := job.GetConfiguration() + if config == nil { + return nil, fmt.Errorf("bigquery: job is missing configuration") + } + qconfig := config.Query + if qconfig == nil { + return nil, fmt.Errorf("bigquery: job is not a query") + } + + jobRef := job.GetJobReference() + if jobRef == nil { + jobRef = &bigquerypb.JobReference{} + job.JobReference = jobRef + } + if jobRef.GetJobId() == "" { + jobRef.JobId = uid.NewSpace("job", nil).New() + } + if jobRef.GetProjectId() == "" { + jobRef.ProjectId = h.projectID + } + + return newQueryJobFromJob(ctx, h, h.projectID, job, opts...), nil +} + +// AttachJob attaches to an existing query job. The returned Query object can be +// used to monitor the job's status, wait for its completion, and retrieve its +// results. +func (h *Helper) AttachJob(ctx context.Context, jobRef *bigquerypb.JobReference, opts ...gax.CallOption) (*Query, error) { + jobRef = proto.Clone(jobRef).(*bigquerypb.JobReference) + if jobRef == nil { + return nil, fmt.Errorf("bigquery: AttachJob requires a non-nil JobReference") + } + if jobRef.GetJobId() == "" { + return nil, fmt.Errorf("bigquery: AttachJob requires a non-empty JobReference.JobId") + } + if jobRef.GetProjectId() == "" { + jobRef.ProjectId = h.projectID + } + return newQueryJobFromJobReference(ctx, h, jobRef, opts...), nil +} diff --git a/bigquery/v2/query/iterator.go b/bigquery/v2/query/iterator.go new file mode 100644 index 000000000000..fcb3f8fdddf2 --- /dev/null +++ b/bigquery/v2/query/iterator.go @@ -0,0 +1,28 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law_assets/v2_query_iterator.go +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package query + +import ( + "errors" +) + +// RowIterator is an iterator over the results of a query. +type RowIterator struct { +} + +// Next returns the next row from the results. +func (it *RowIterator) Next() (*Row, error) { + return nil, errors.New("not implemented") +} diff --git a/bigquery/v2/query/main_test.go b/bigquery/v2/query/main_test.go new file mode 100644 index 000000000000..5cc9a777a6f0 --- /dev/null +++ b/bigquery/v2/query/main_test.go @@ -0,0 +1,95 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package query + +import ( + "context" + "log" + "os" + "testing" + "time" + + bigquery "cloud.google.com/go/bigquery/v2/apiv2" + "cloud.google.com/go/bigquery/v2/apiv2_client" + + "cloud.google.com/go/internal/testutil" + "google.golang.org/api/option" +) + +var testQueryHelpers map[string]*Helper +var testProjectID string +var defaultTestTimeout = 30 * time.Second + +func TestMain(m *testing.M) { + cleanup := setup(context.Background()) + code := m.Run() + if cleanup != nil { + cleanup() + } + os.Exit(code) +} + +// setup establishes integration test env, and returns a cleanup func responsible +// closing closing clients +func setup(ctx context.Context) func() { + projID := testutil.ProjID() + if projID == "" { + log.Printf("project ID undetected") + return nil + } + testProjectID = projID + ts := testutil.TokenSource(ctx, bigquery.DefaultAuthScopes()...) + if ts == nil { + log.Printf("invalid token source") + return nil + } + var opts []option.ClientOption + opts = append(opts, option.WithTokenSource(ts)) + testQueryHelpers = make(map[string]*Helper) + var err error + + grpcClient, err := apiv2_client.NewClient(ctx, opts...) + if err != nil { + log.Printf("failed to create grpc client: %v", err) + return nil + } + + testQueryHelpers["GRPC"], err = NewHelper(grpcClient, testProjectID) + if err != nil { + testQueryHelpers = nil + return nil + } + + restClient, err := apiv2_client.NewRESTClient(ctx, opts...) + if err != nil { + log.Printf("failed to create rest client: %v", err) + return nil + } + + testQueryHelpers["REST"], err = NewHelper(restClient, testProjectID) + if err != nil { + testQueryHelpers = nil + return nil + } + return closeClients +} + +func closeClients() { + for k, v := range testQueryHelpers { + if err := v.c.Close(); err != nil { + log.Printf("closing client %q had error: %v", k, err) + } + } +} diff --git a/bigquery/v2/query/options.go b/bigquery/v2/query/options.go new file mode 100644 index 000000000000..c7feda71aa9a --- /dev/null +++ b/bigquery/v2/query/options.go @@ -0,0 +1,29 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package query + +// ReadOption is an option for reading query results. +type ReadOption func(*readState) + +type readState struct { + pageToken string +} + +// WithPageToken sets the page token for reading query results. +func WithPageToken(t string) ReadOption { + return func(s *readState) { + s.pageToken = t + } +} diff --git a/bigquery/v2/query/query.go b/bigquery/v2/query/query.go new file mode 100644 index 000000000000..c52fb1a80120 --- /dev/null +++ b/bigquery/v2/query/query.go @@ -0,0 +1,295 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package query + +import ( + "context" + "sync" + "time" + + "cloud.google.com/go/bigquery/v2/apiv2/bigquerypb" + "github.com/googleapis/gax-go/v2" + "google.golang.org/protobuf/types/known/wrapperspb" +) + +// Query represents a handle to a query job. Its methods can be used to wait for +// the job to complete and to iterate over the results. +type Query struct { + h *Helper + + projectID string + jobID string + location string + queryID string + + // context for background pooling + ctx context.Context + mu sync.RWMutex + complete bool + ready chan struct{} + err error + + cachedTotalRows uint64 +} + +// Create Query handler using jobs.query request and start background pooling job +func newQueryJobFromQueryRequest(ctx context.Context, h *Helper, req *bigquerypb.PostQueryRequest, opts ...gax.CallOption) *Query { + q := &Query{ + h: h, + ctx: ctx, + ready: make(chan struct{}), + } + go q.runQuery(req, opts) + + return q +} + +// Create Query handler using jobs.insert request and start background pooling job +func newQueryJobFromJob(ctx context.Context, h *Helper, projectID string, job *bigquerypb.Job, opts ...gax.CallOption) *Query { + q := &Query{ + h: h, + ctx: ctx, + ready: make(chan struct{}), + projectID: projectID, + } + go q.insertQuery(job, opts) + + return q +} + +// Create Query handler from JobReference response and start background pooling job +func newQueryJobFromJobReference(ctx context.Context, h *Helper, jobRef *bigquerypb.JobReference, opts ...gax.CallOption) *Query { + q := &Query{ + h: h, + ctx: ctx, + ready: make(chan struct{}), + } + q.consumeQueryResponse(&bigquerypb.GetQueryResultsResponse{ + JobReference: jobRef, + }) + + go q.waitForQueryBackground(opts) + + return q +} + +// Read returns a RowIterator for the query results. +func (q *Query) Read(ctx context.Context, opts ...ReadOption) (*RowIterator, error) { + // TODO: proper setup iterator + return &RowIterator{}, nil +} + +// Wait blocks until the query has completed. The provided context can be used to +// cancel the wait. If the query completes successfully, Wait returns nil. +// Otherwise, it returns the error that caused the query to fail. +// +// Wait is a convenience wrapper around Done and Err. +func (q *Query) Wait(ctx context.Context) error { + select { + case <-q.Done(): + return q.Err() + case <-ctx.Done(): + return ctx.Err() + } +} + +// Done returns a channel that is closed when the query has completed. +// It can be used in a select statement to perform non-blocking waits. +// +// Example: +// +// select { +// case <-q.Done(): +// if err := q.Err(); err != nil { +// // Handle error. +// } +// // Query is complete. +// case <-time.After(30*time.Second): +// // Timeout logic +// default: +// // Query is still running. +// } +func (q *Query) Done(opts ...gax.CallOption) <-chan struct{} { + return q.ready +} + +// Err returns the final error state of the query. It is only valid to call Err +// after the channel returned by Done has been closed. If the query completed +// successfully, Err returns nil. +func (q *Query) Err() error { + q.mu.RLock() + defer q.mu.RUnlock() + err := q.ctx.Err() + if err != nil { + return err + } + return q.err +} + +func (q *Query) insertQuery(job *bigquerypb.Job, opts []gax.CallOption) { + res, err := q.h.c.InsertJob(q.ctx, &bigquerypb.InsertJobRequest{ + ProjectId: q.projectID, + Job: job, + }, opts...) + + if err != nil { + q.markDone(err) + return + } + + q.consumeQueryResponse(&bigquerypb.GetQueryResultsResponse{ + JobReference: res.GetJobReference(), + }) + + go q.waitForQueryBackground(opts) +} + +func (q *Query) runQuery(req *bigquerypb.PostQueryRequest, opts []gax.CallOption) { + res, err := q.h.c.Query(q.ctx, req, opts...) + if err != nil { + q.markDone(err) + return + } + q.queryID = res.GetQueryId() + + q.consumeQueryResponse(res) + + go q.waitForQueryBackground(opts) +} + +func (q *Query) waitForQueryBackground(opts []gax.CallOption) { + backoff := gax.Backoff{ + Initial: 50 * time.Millisecond, + Multiplier: 1.3, + Max: 60 * time.Second, + } + for !q.complete { + err := q.waitForQuery(q.ctx, opts) + if err != nil { + q.markDone(err) + return + } + select { + case <-time.After(backoff.Pause()): + case <-q.ctx.Done(): + q.markDone(q.ctx.Err()) + return + } + } + q.markDone(nil) +} + +func (q *Query) markDone(err error) { + q.mu.Lock() + defer q.mu.Unlock() + + // Check if already done to prevent panic on closing closed channel. + select { + case <-q.ready: + // Already closed + return + default: + // Not closed yet + q.err = err + close(q.ready) + } +} + +func (q *Query) waitForQuery(ctx context.Context, opts []gax.CallOption) error { + res, err := q.h.c.GetQueryResults(ctx, &bigquerypb.GetQueryResultsRequest{ + ProjectId: q.projectID, + JobId: q.jobID, + Location: q.location, + MaxResults: wrapperspb.UInt32(0), + FormatOptions: &bigquerypb.DataFormatOptions{ + UseInt64Timestamp: true, + }, + }, opts...) + if err != nil { + return err + } + + q.consumeQueryResponse(res) + return nil +} + +// Common fields from jobs.query and jobs.getQueryResults +// Needs to be updated as new fields are consumed +type queryResponse interface { + GetJobComplete() *wrapperspb.BoolValue + GetJobReference() *bigquerypb.JobReference + GetTotalRows() *wrapperspb.UInt64Value +} + +func (q *Query) consumeQueryResponse(res queryResponse) { + q.mu.Lock() + defer q.mu.Unlock() + + if res.GetJobComplete() != nil { + q.complete = res.GetJobComplete().GetValue() + } + + jobRef := res.GetJobReference() + if jobRef != nil { + q.projectID = jobRef.GetProjectId() + q.jobID = jobRef.GetJobId() + if jobRef.GetLocation() != nil { + q.location = jobRef.GetLocation().GetValue() + } + } + + if res.GetTotalRows() != nil { + q.cachedTotalRows = res.GetTotalRows().GetValue() + } + + // TODO: save schema, page token, total rows and parse rows +} + +// QueryID returns the auto-generated ID for the query. +// This is only populated for stateless queries (i.e. those started via jobs.query) +// after the query has been submitted. +func (q *Query) QueryID() string { + q.mu.RLock() + defer q.mu.RUnlock() + return q.queryID +} + +// JobReference returns a reference to the query job. +// This will be nil until the query job has been successfully submitted. +func (q *Query) JobReference() *bigquerypb.JobReference { + q.mu.RLock() + defer q.mu.RUnlock() + if q.jobID == "" { + return nil + } + return &bigquerypb.JobReference{ + ProjectId: q.projectID, + JobId: q.jobID, + Location: wrapperspb.String(q.location), + } +} + +// Schema returns the schema of the query results. +// This will be nil until the query has completed and the schema is available. +func (q *Query) Schema() *bigquerypb.TableSchema { + return nil // TODO: fill schema +} + +// Complete returns true if the query job has finished execution. +func (q *Query) Complete() bool { + q.mu.RLock() + defer q.mu.RUnlock() + return q.complete +} diff --git a/bigquery/v2/query/query_integration_test.go b/bigquery/v2/query/query_integration_test.go new file mode 100644 index 000000000000..574a41cb4206 --- /dev/null +++ b/bigquery/v2/query/query_integration_test.go @@ -0,0 +1,165 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package query + +import ( + "context" + "fmt" + "testing" + "time" + + "cloud.google.com/go/bigquery/v2/apiv2/bigquerypb" + "google.golang.org/protobuf/types/known/wrapperspb" +) + +func TestIntegration_RunQuery(t *testing.T) { + if len(testQueryHelpers) == 0 { + t.Skip("integration tests skipped") + } + for k, helper := range testQueryHelpers { + t.Run(k, func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) + defer cancel() + + req := &bigquerypb.PostQueryRequest{ + QueryRequest: &bigquerypb.QueryRequest{ + Query: "SELECT CURRENT_TIMESTAMP() as foo, SESSION_USER() as bar", + UseLegacySql: wrapperspb.Bool(false), + FormatOptions: &bigquerypb.DataFormatOptions{ + UseInt64Timestamp: true, + }, + JobCreationMode: bigquerypb.QueryRequest_JOB_CREATION_OPTIONAL, + }, + ProjectId: helper.projectID, + } + q, err := helper.StartQuery(ctx, req) + if err != nil { + t.Fatalf("StartQuery() error: %v", err) + } + + err = q.Wait(ctx) + if err != nil { + t.Fatalf("Wait() error: %v", err) + } + + if !q.Complete() { + t.Fatalf("expected job to be complete") + } + + // TODO: read data and assert row count + }) + } +} + +func TestIntegration_QueryCancelWait(t *testing.T) { + if len(testQueryHelpers) == 0 { + t.Skip("integration tests skipped") + } + for k, helper := range testQueryHelpers { + t.Run(k, func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) + defer cancel() + + numGenRows := uint64(1000000) + req := &bigquerypb.PostQueryRequest{ + QueryRequest: &bigquerypb.QueryRequest{ + Query: fmt.Sprintf("SELECT num FROM UNNEST(GENERATE_ARRAY(1,%d)) as num", numGenRows), + UseLegacySql: wrapperspb.Bool(false), + FormatOptions: &bigquerypb.DataFormatOptions{ + UseInt64Timestamp: true, + }, + TimeoutMs: wrapperspb.UInt32(500), + UseQueryCache: wrapperspb.Bool(false), + JobCreationMode: bigquerypb.QueryRequest_JOB_CREATION_OPTIONAL, + }, + ProjectId: helper.projectID, + } + + wctx, wcancel := context.WithCancel(ctx) + q, err := helper.StartQuery(wctx, req) + if err != nil { + t.Fatalf("StartQuery() error: %v", err) + } + + go func(t *testing.T) { + err = q.Wait(ctx) + if err == nil { + t.Errorf("Wait() should throw an error: %v", err) + } + }(t) + + for q.JobReference() == nil && q.Err() == nil { + time.Sleep(100 * time.Millisecond) + } + wcancel() + + if q.Complete() { + t.Fatalf("Complete() should be false") + } + + // Re-attach and wait again + nq, err := helper.AttachJob(ctx, q.JobReference()) + if err != nil { + t.Fatalf("AttachJob() error: %v", err) + } + + err = nq.Wait(ctx) + if err != nil { + t.Fatalf("Wait() error: %v", err) + } + + if !nq.Complete() { + t.Fatalf("Complete() should be true after Wait()") + } + + // TODO: read data and assert row count + }) + } +} + +func TestIntegration_InsertQueryJob(t *testing.T) { + if len(testQueryHelpers) == 0 { + t.Skip("integration tests skipped") + } + for k, helper := range testQueryHelpers { + t.Run(k, func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) + defer cancel() + + q, err := helper.StartQueryJob(ctx, &bigquerypb.Job{ + Configuration: &bigquerypb.JobConfiguration{ + Query: &bigquerypb.JobConfigurationQuery{ + Query: "SELECT CURRENT_TIMESTAMP() as foo, SESSION_USER() as bar", + UseLegacySql: wrapperspb.Bool(false), + }, + }, + }) + if err != nil { + t.Fatalf("StartQueryJob() error: %v", err) + } + + err = q.Wait(ctx) + if err != nil { + t.Fatalf("Wait() error: %v", err) + } + + if !q.Complete() { + t.Fatalf("expected job to be complete") + } + + // TODO: read data and assert row count + }) + } +} diff --git a/bigquery/v2/query/row.go b/bigquery/v2/query/row.go new file mode 100644 index 000000000000..cf711448464c --- /dev/null +++ b/bigquery/v2/query/row.go @@ -0,0 +1,19 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package query + +// Row represents a single row in the query results. +type Row struct { +} From 33e1474de4d6ea19c4341b833f926b828b32abdd Mon Sep 17 00:00:00 2001 From: Sushan Bhattarai Date: Fri, 26 Sep 2025 16:11:36 -0400 Subject: [PATCH 19/23] fix(bigtable): release bigtable as 1.40.1 (#12961) Release-As: 1.40.1 From a3c0aca6edb873132360b46c7bb1a2aaab6d3fce Mon Sep 17 00:00:00 2001 From: shollyman Date: Fri, 26 Sep 2025 13:16:31 -0700 Subject: [PATCH 20/23] feat(bigquery): add support for MaxSlots (#12958) --- bigquery/copy.go | 11 ++ bigquery/copy_test.go | 2 + bigquery/extract.go | 11 ++ bigquery/extract_test.go | 2 + bigquery/go.mod | 44 ++--- bigquery/go.sum | 92 +++++------ bigquery/load.go | 11 ++ bigquery/load_test.go | 2 + bigquery/query.go | 12 ++ bigquery/query_test.go | 4 + go.work.sum | 340 ++++++++++++++++++++++++++++++++++++++- 11 files changed, 461 insertions(+), 70 deletions(-) diff --git a/bigquery/copy.go b/bigquery/copy.go index c8e7e1234f28..098f280fd92c 100644 --- a/bigquery/copy.go +++ b/bigquery/copy.go @@ -80,6 +80,15 @@ type CopyConfig struct { // format is // `projects/{project}/locations/{location}/reservations/{reservation}`. Reservation string + + // A target limit on the rate of slot consumption by this query. If set to a + // value > 0, BigQuery will attempt to limit the rate of slot consumption by + // this query to keep it below the configured limit, even if the query is + // eligible for more slots based on fair scheduling. The unused slots will be + // available for other jobs and queries to use. + // + // Note: This feature is not yet generally available. + MaxSlots int32 } func (c *CopyConfig) toBQ() *bq.JobConfiguration { @@ -99,6 +108,7 @@ func (c *CopyConfig) toBQ() *bq.JobConfiguration { }, JobTimeoutMs: c.JobTimeout.Milliseconds(), Reservation: c.Reservation, + MaxSlots: int64(c.MaxSlots), } } @@ -112,6 +122,7 @@ func bqToCopyConfig(q *bq.JobConfiguration, c *Client) *CopyConfig { OperationType: TableCopyOperationType(q.Copy.OperationType), JobTimeout: time.Duration(q.JobTimeoutMs) * time.Millisecond, Reservation: q.Reservation, + MaxSlots: int32(q.MaxSlots), } for _, t := range q.Copy.SourceTables { cc.Srcs = append(cc.Srcs, bqToTable(t, c)) diff --git a/bigquery/copy_test.go b/bigquery/copy_test.go index 34f876dfbcf7..5c9caae781bf 100644 --- a/bigquery/copy_test.go +++ b/bigquery/copy_test.go @@ -89,6 +89,7 @@ func TestCopy(t *testing.T) { DestinationEncryptionConfig: &EncryptionConfig{KMSKeyName: "keyName"}, Labels: map[string]string{"a": "b"}, Reservation: "reservation/1", + MaxSlots: 123, }, want: func() *bq.Job { j := defaultCopyJob() @@ -97,6 +98,7 @@ func TestCopy(t *testing.T) { j.Configuration.Copy.WriteDisposition = "WRITE_TRUNCATE" j.Configuration.Copy.DestinationEncryptionConfiguration = &bq.EncryptionConfiguration{KmsKeyName: "keyName"} j.Configuration.Reservation = "reservation/1" + j.Configuration.MaxSlots = 123 return j }(), }, diff --git a/bigquery/extract.go b/bigquery/extract.go index 1687f7b09ee3..20a26ea54ebe 100644 --- a/bigquery/extract.go +++ b/bigquery/extract.go @@ -64,6 +64,15 @@ type ExtractConfig struct { // format is // `projects/{project}/locations/{location}/reservations/{reservation}`. Reservation string + + // A target limit on the rate of slot consumption by this query. If set to a + // value > 0, BigQuery will attempt to limit the rate of slot consumption by + // this query to keep it below the configured limit, even if the query is + // eligible for more slots based on fair scheduling. The unused slots will be + // available for other jobs and queries to use. + // + // Note: This feature is not yet generally available. + MaxSlots int32 } func (e *ExtractConfig) toBQ() *bq.JobConfiguration { @@ -85,6 +94,7 @@ func (e *ExtractConfig) toBQ() *bq.JobConfiguration { }, JobTimeoutMs: e.JobTimeout.Milliseconds(), Reservation: e.Reservation, + MaxSlots: int64(e.MaxSlots), } if e.Src != nil { cfg.Extract.SourceTable = e.Src.toBQ() @@ -115,6 +125,7 @@ func bqToExtractConfig(q *bq.JobConfiguration, c *Client) *ExtractConfig { UseAvroLogicalTypes: qe.UseAvroLogicalTypes, JobTimeout: time.Duration(q.JobTimeoutMs) * time.Millisecond, Reservation: q.Reservation, + MaxSlots: int32(q.MaxSlots), } } diff --git a/bigquery/extract_test.go b/bigquery/extract_test.go index 3508b3cc72d7..82d166c6cfe3 100644 --- a/bigquery/extract_test.go +++ b/bigquery/extract_test.go @@ -86,6 +86,7 @@ func TestExtract(t *testing.T) { Labels: map[string]string{"a": "b"}, JobTimeout: 8 * time.Second, Reservation: "reservation/1", + MaxSlots: 234, }, want: func() *bq.Job { j := defaultExtractJob() @@ -94,6 +95,7 @@ func TestExtract(t *testing.T) { f := false j.Configuration.Extract.PrintHeader = &f j.Configuration.Reservation = "reservation/1" + j.Configuration.MaxSlots = 234 return j }(), }, diff --git a/bigquery/go.mod b/bigquery/go.mod index 7296032cdd66..4680a3dadf50 100644 --- a/bigquery/go.mod +++ b/bigquery/go.mod @@ -13,25 +13,25 @@ require ( github.com/google/uuid v1.6.0 github.com/googleapis/gax-go/v2 v2.15.0 go.opencensus.io v0.24.0 - go.opentelemetry.io/otel v1.36.0 - go.opentelemetry.io/otel/sdk v1.36.0 - golang.org/x/sync v0.16.0 + go.opentelemetry.io/otel v1.37.0 + go.opentelemetry.io/otel/sdk v1.37.0 + golang.org/x/sync v0.17.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da - google.golang.org/api v0.247.0 + google.golang.org/api v0.250.0 google.golang.org/genproto v0.0.0-20250603155806-513f23925822 google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c - google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c - google.golang.org/grpc v1.74.2 - google.golang.org/protobuf v1.36.7 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 + google.golang.org/grpc v1.75.1 + google.golang.org/protobuf v1.36.9 ) require ( cel.dev/expr v0.24.0 // indirect - cloud.google.com/go/auth v0.16.4 // indirect + cloud.google.com/go/auth v0.16.5 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.8.0 // indirect + cloud.google.com/go/compute/metadata v0.8.4 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -39,7 +39,7 @@ require ( github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-json v0.10.2 // indirect @@ -58,16 +58,16 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect - go.opentelemetry.io/otel/metric v1.36.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect - go.opentelemetry.io/otel/trace v1.36.0 // indirect - golang.org/x/crypto v0.41.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + golang.org/x/crypto v0.42.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/time v0.12.0 // indirect - golang.org/x/tools v0.35.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.44.0 // indirect + golang.org/x/oauth2 v0.31.0 // indirect + golang.org/x/sys v0.36.0 // indirect + golang.org/x/text v0.29.0 // indirect + golang.org/x/time v0.13.0 // indirect + golang.org/x/tools v0.36.0 // indirect ) diff --git a/bigquery/go.sum b/bigquery/go.sum index 732a7878fa8b..0124ac997fce 100644 --- a/bigquery/go.sum +++ b/bigquery/go.sum @@ -3,12 +3,12 @@ cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI= -cloud.google.com/go/auth v0.16.4 h1:fXOAIQmkApVvcIn7Pc2+5J8QTMVbUGLscnSVNl11su8= -cloud.google.com/go/auth v0.16.4/go.mod h1:j10ncYwjX/g3cdX7GpEzsdM+d+ZNsXAbb6qXA7p1Y5M= +cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI= +cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= -cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= +cloud.google.com/go/compute/metadata v0.8.4 h1:oXMa1VMQBVCyewMIOm3WQsnVd9FbKBtm8reqWRaXnHQ= +cloud.google.com/go/compute/metadata v0.8.4/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datacatalog v1.26.0 h1:eFgygb3DTufTWWUB8ARk+dSuXz+aefNJXTlkWlQcWwE= cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14= cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= @@ -24,8 +24,8 @@ cloud.google.com/go/storage v1.56.0/go.mod h1:Tpuj6t4NweCLzlNbw9Z9iwxEkrSem20Aet cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg= @@ -59,8 +59,8 @@ github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfU github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -145,75 +145,75 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= -go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= -go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= -go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= -go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= -go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= -go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= -go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= -go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= -go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= +golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= +golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc= -google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.250.0 h1:qvkwrf/raASj82UegU2RSDGWi/89WkLckn4LuO4lVXM= +google.golang.org/api v0.250.0/go.mod h1:Y9Uup8bDLJJtMzJyQnu+rLRJLA0wn+wTtc6vTlOvfXo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -223,15 +223,15 @@ google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuO google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ= google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 h1:/OQuEa4YWtDt7uQWHd3q3sUMb+QOLQUg1xa8CEsRv5w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= -google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= +google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= +google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -241,8 +241,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= -google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/bigquery/load.go b/bigquery/load.go index b0dced034dd7..c2faf631652b 100644 --- a/bigquery/load.go +++ b/bigquery/load.go @@ -117,6 +117,15 @@ type LoadConfig struct { // format is // `projects/{project}/locations/{location}/reservations/{reservation}`. Reservation string + + // A target limit on the rate of slot consumption by this query. If set to a + // value > 0, BigQuery will attempt to limit the rate of slot consumption by + // this query to keep it below the configured limit, even if the query is + // eligible for more slots based on fair scheduling. The unused slots will be + // available for other jobs and queries to use. + // + // Note: This feature is not yet generally available. + MaxSlots int32 } func (l *LoadConfig) toBQ() (*bq.JobConfiguration, io.Reader) { @@ -148,6 +157,7 @@ func (l *LoadConfig) toBQ() (*bq.JobConfiguration, io.Reader) { } media := l.Src.populateLoadConfig(config.Load) config.Reservation = l.Reservation + config.MaxSlots = int64(l.MaxSlots) return config, media } @@ -169,6 +179,7 @@ func bqToLoadConfig(q *bq.JobConfiguration, c *Client) *LoadConfig { CreateSession: q.Load.CreateSession, ColumnNameCharacterMap: ColumnNameCharacterMap(q.Load.ColumnNameCharacterMap), Reservation: q.Reservation, + MaxSlots: int32(q.MaxSlots), } if q.JobTimeoutMs > 0 { lc.JobTimeout = time.Duration(q.JobTimeoutMs) * time.Millisecond diff --git a/bigquery/load_test.go b/bigquery/load_test.go index 741fc8c4514b..742888173578 100644 --- a/bigquery/load_test.go +++ b/bigquery/load_test.go @@ -142,6 +142,7 @@ func TestLoad(t *testing.T) { config: LoadConfig{ JobTimeout: 4 * time.Second, Reservation: "reservation/1", + MaxSlots: 345, }, want: func() *bq.Job { j := defaultLoadJob() @@ -151,6 +152,7 @@ func TestLoad(t *testing.T) { j.Configuration.Load.IgnoreUnknownValues = true j.Configuration.JobTimeoutMs = 4000 j.Configuration.Reservation = "reservation/1" + j.Configuration.MaxSlots = 345 return j }(), }, diff --git a/bigquery/query.go b/bigquery/query.go index 91fe4416f6a9..c3c567dbb206 100644 --- a/bigquery/query.go +++ b/bigquery/query.go @@ -159,6 +159,15 @@ type QueryConfig struct { // format is // `projects/{project}/locations/{location}/reservations/{reservation}`. Reservation string + + // A target limit on the rate of slot consumption by this query. If set to a + // value > 0, BigQuery will attempt to limit the rate of slot consumption by + // this query to keep it below the configured limit, even if the query is + // eligible for more slots based on fair scheduling. The unused slots will be + // available for other jobs and queries to use. + // + // Note: This feature is not yet generally available. + MaxSlots int32 } func (qc *QueryConfig) toBQ() (*bq.JobConfiguration, error) { @@ -234,6 +243,7 @@ func (qc *QueryConfig) toBQ() (*bq.JobConfiguration, error) { Labels: qc.Labels, DryRun: qc.DryRun, Reservation: qc.Reservation, + MaxSlots: int64(qc.MaxSlots), Query: qconf, } if qc.JobTimeout > 0 { @@ -264,6 +274,7 @@ func bqToQueryConfig(q *bq.JobConfiguration, c *Client) (*QueryConfig, error) { } qc.UseStandardSQL = !qc.UseLegacySQL qc.Reservation = q.Reservation + qc.MaxSlots = int32(q.MaxSlots) if len(qq.TableDefinitions) > 0 { qc.TableDefinitions = make(map[string]ExternalData) @@ -480,6 +491,7 @@ func (q *Query) probeFastPath() (*bq.QueryRequest, error) { MaximumBytesBilled: q.QueryConfig.MaxBytesBilled, RequestId: uid.NewSpace("request", nil).New(), Reservation: q.Reservation, + MaxSlots: int64(q.MaxSlots), Labels: q.Labels, FormatOptions: &bq.DataFormatOptions{ UseInt64Timestamp: true, diff --git a/bigquery/query_test.go b/bigquery/query_test.go index 50648cc62878..51561178049d 100644 --- a/bigquery/query_test.go +++ b/bigquery/query_test.go @@ -362,12 +362,14 @@ func TestQuery(t *testing.T) { src: &QueryConfig{ Q: "query string", Reservation: "reservation/1", + MaxSlots: 111, DefaultProjectID: "def-project-id", DefaultDatasetID: "def-dataset-id", }, want: func() *bq.Job { j := defaultQueryJob() j.Configuration.Reservation = "reservation/1" + j.Configuration.MaxSlots = 111 return j }(), }, @@ -474,6 +476,7 @@ func TestProbeFastPath(t *testing.T) { "key": "val", }, Reservation: "reservation/1", + MaxSlots: 222, }, wantReq: &bq.QueryRequest{ Query: "foo", @@ -495,6 +498,7 @@ func TestProbeFastPath(t *testing.T) { UseInt64Timestamp: true, }, Reservation: "reservation/1", + MaxSlots: 222, }, }, { diff --git a/go.work.sum b/go.work.sum index 0fff97d259ad..e6ead8daeb6b 100644 --- a/go.work.sum +++ b/go.work.sum @@ -4,20 +4,40 @@ cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3Y cloud.google.com/go/gaming v1.9.0 h1:7vEhFnZmd931Mo7sZ6pJy7uQPDxF7m7v8xtBheG08tc= cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= cloud.google.com/go/resourcesettings v1.8.3 h1:13HOFU7v4cEvIHXSAQbinF4wp2Baybbq7q9FMctg1Ek= +codeberg.org/go-fonts/dejavu v0.4.0/go.mod h1:abni088lmhQJvso2Lsb7azCKzwkfcnttl6tL1UTWKzg= +codeberg.org/go-fonts/latin-modern v0.4.0/go.mod h1:BF68mZznJ9QHn+hic9ks2DaFl4sR5YhfM6xTYaP9vNw= +codeberg.org/go-fonts/liberation v0.4.1/go.mod h1:Gu6FTZHMMpGxPBfc8WFL8RfwMYFTvG7TIFOMx8oM4B8= codeberg.org/go-fonts/liberation v0.5.0/go.mod h1:zS/2e1354/mJ4pGzIIaEtm/59VFCFnYC7YV6YdGl5GU= +codeberg.org/go-fonts/stix v0.3.0/go.mod h1:1OSJSnA/PoHqbW2tjkkqTmNPp5xTtJQN2GRXJjO/+WA= +codeberg.org/go-latex/latex v0.0.1/go.mod h1:AiC91vVG2uURZRd4ZN1j3mAac0XBrLsxK6+ZNa7O9ok= codeberg.org/go-latex/latex v0.1.0/go.mod h1:LA0q/AyWIYrqVd+A9Upkgsb+IqPcmSTKc9Dny04MHMw= codeberg.org/go-pdf/fpdf v0.10.0/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoPOc4LjU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20221208032759-85de2813cf6b/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +eliasnaur.com/font v0.0.0-20230308162249-dd43949cb42d/go.mod h1:OYVuxibdk9OSLX8vAqydtRPP87PyTFcT9uH3MlEGBQA= gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= +gioui.org v0.0.0-20210822154628-43a7030f6e0b/go.mod h1:jmZ349gZNGWyc5FIv/VWLBQ32Ki/FOvTgEz64kh9lnk= +gioui.org v0.2.0/go.mod h1:1H72sKEk/fNFV+l0JNeM2Dt3co3Y4uaQcD+I+/GQ0e4= +gioui.org/cpu v0.0.0-20210808092351-bfe733dd3334/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= +gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= +gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= +gioui.org/shader v1.0.0/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM= +gioui.org/shader v1.0.6/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM= +gioui.org/x v0.2.0/go.mod h1:rCGN2nZ8ZHqrtseJoQxCMZpt2xrZUrdZ2WuMRLBJmYs= +git.sr.ht/~jackmordaunt/go-toast v1.0.0/go.mod h1:aIuRX/HdBOz7yRS8rOVYQCwJQlFS7DbYBTpUV0SHeeg= +git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE= git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= +git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94= +git.wow.st/gmp/jni v0.0.0-20210610011705-34026c7e22d0/go.mod h1:+axXBRUTIDlCeE73IKeD/os7LoEnTKdkp8/gQOFjqyo= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.18.0 h1:ugYJK/neZQtQeh2jc5xNoDFiMQojlAkoqJMRb7vTu1U= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.18.0/go.mod h1:Xx0VKh7GJ4si3rmElbh19Mejxz68ibWg/J30ZOMrqzU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= @@ -25,16 +45,34 @@ github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYr github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19 h1:iXUgAaqDcIUGbRoy2TdeofRG/j1zpGRSEmNK05T+bi8= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0/go.mod h1:ccdDYaY5+gO+cbnQdFxEXqfy0RkoV25H3jLXUDNM3wg= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.17.0 h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.16.10 h1:+yDD0tcuHRQZgqONkpDwzepqmElQaSlFPymHRHR9mrc= github.com/aws/aws-sdk-go-v2 v1.16.10/go.mod h1:WTACcleLz6VZTp7fak4EO5b9Q4foxbn+8PIz3PmyKlo= github.com/aws/aws-sdk-go-v2/config v1.15.9 h1:TK5yNEnFDQ9iaO04gJS/3Y+eW8BioQiCUafW75/Wc3Q= @@ -60,12 +98,18 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.16.12/go.mod h1:b53qpmhHk7mTL2J/tfG6 github.com/aws/smithy-go v1.12.1 h1:yQRC55aXN/y1W10HgwHle01DRuV9Dpf31iGkotjt3Ag= github.com/aws/smithy-go v1.12.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/bazelbuild/rules_go v0.49.0 h1:5vCbuvy8Q11g41lseGJDc5vxhDjJtfxr6nM/IC4VmqM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= @@ -77,54 +121,136 @@ github.com/chzyer/logex v1.2.0 h1:+eqR0HfOetur4tgnC8ftU5imRnhi4te+BadWS95c5AM= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20210722231415-061457976a23 h1:dZ0/VyGgQdVGAss6Ju0dt5P0QltE0SFY5Woh6hbIfiQ= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/esiqveland/notify v0.11.0/go.mod h1:63UbVSaeJwF0LVJARHFuPgUAoM7o1BEvCZyknsuonBc= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fullstorydev/grpcurl v1.8.7 h1:xJWosq3BQovQ4QrdPO72OrPiWuGgEsxY8ldYsJbPrqI= github.com/fullstorydev/grpcurl v1.8.7/go.mod h1:pVtM4qe3CMoLaIzYS8uvTuDj2jVYmXqMUkZeijnXp/E= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/dejavu v0.3.2/go.mod h1:m+TzKY7ZEl09/a17t1593E4VYW8L1VaBXHzFZOIjGEY= github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/latin-modern v0.3.0/go.mod h1:ysEQXnuT/sCDOAONxC7ImeEDVINbltClhasMAqEtRK0= +github.com/go-fonts/latin-modern v0.3.1/go.mod h1:ysEQXnuT/sCDOAONxC7ImeEDVINbltClhasMAqEtRK0= +github.com/go-fonts/latin-modern v0.3.2/go.mod h1:9odJt4NbRrbdj4UAMuLVd4zEukf6aAEKnDaQga0whqQ= github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= +github.com/go-fonts/liberation v0.3.0/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= +github.com/go-fonts/liberation v0.3.1/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= +github.com/go-fonts/liberation v0.3.2/go.mod h1:N0QsDLVUQPy3UYg9XAc3Uh3UDMp2Z7M1o4+X98dXkmI= github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= +github.com/go-fonts/stix v0.2.2/go.mod h1:SUxggC9dxd/Q+rb5PkJuvfvTbOPtNc2Qaua00fIp9iU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= +github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9/go.mod h1:gWuR/CrFDDeVRFQwHPvsv9soJVB/iqymhuZQuJ3a9OM= +github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea/go.mod h1:Y7Vld91/HRbTBm7JwoI7HejdDB0u+e9AUBO9MB7yuZk= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= +github.com/go-pdf/fpdf v0.8.0/go.mod h1:gfqhcNwXrsd3XYKte9a7vM3smvU/jB4ZRDrmWSxpfdc= +github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-text/typesetting v0.0.0-20230803102845-24e03d8b5372/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k= +github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198/go.mod h1:DTh/Y2+NbnOVVoypCCQrovMPDKUGp4yZpSbWg5D0XIM= github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-jsonnet v0.20.0 h1:WG4TTSARuV7bSm4PMB4ohjxe33IHT5WVTrJSU33uT4g= github.com/google/go-jsonnet v0.20.0/go.mod h1:VbgWF9JX7ztlv770x/TolZNGGFfiHEVx9G6ca2eUmeA= github.com/google/go-pkcs11 v0.3.0 h1:PVRnTgtArZ3QQqTGtbtjtnIkzl2iY2kt24yqbrf7td8= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/hamba/avro/v2 v2.17.2 h1:6PKpEWzJfNnvBgn7m2/8WYaDOUASxfDU+Jyb4ojDgFY= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hoisie/redis v0.0.0-20160730154456-b5c6e81454e0 h1:mjZV3MTu2A5gwfT5G9IIiLGdwZNciyVq5qqnmJJZ2JI= github.com/hoisie/redis v0.0.0-20160730154456-b5c6e81454e0/go.mod h1:pMYMxVaKJqCDC1JUg/XbPJ4/fSazB25zORpFzqsIGIc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVWCNtNq/ewIX7HIKnELmEx2nDP42yskD/pi7QE= github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= @@ -132,68 +258,170 @@ github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b h1:ogbOPx8 github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/itchyny/gojq v0.12.9 h1:biKpbKwMxVYhCU1d6mR7qMr3f0Hn9F5k5YykCVb3gmM= github.com/itchyny/gojq v0.12.9/go.mod h1:T4Ip7AETUXeGpD+436m+UEl3m3tokRgajd5pRfsR5oE= github.com/itchyny/timefmt-go v0.1.4 h1:hFEfWVdwsEi+CY8xY2FtgWHGQaBaC3JeHd+cve0ynVM= github.com/itchyny/timefmt-go v0.1.4/go.mod h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8= +github.com/jezek/xgb v1.0.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= +github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.33 h1:8KUVEKrUw2dmu1Ys0aWnkEJgoRaLAzNysfCh2KSMWiI= github.com/miekg/dns v1.1.33/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.5.0 h1:nAco9/aI9Lg2kiuROBY6BhCI/z0t5jEvJfjWbL8qXLU= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZukQ= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/substrait-io/substrait-go v0.4.2 h1:buDnjsb3qAqTaNbOR7VKmNgXf4lYQxWEcnSGUWBtmN8= @@ -201,8 +429,17 @@ github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opentelemetry.io/contrib/detectors/gcp v1.27.0/go.mod h1:amd+4uZxqJAUx7zI1JvygUtAc2EVWtQeyz8D+3161SQ= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= go.opentelemetry.io/otel/bridge/opencensus v0.40.0 h1:pqDiayRhBgoqy1vwnscik+TizcImJ58l053NScJyZso= go.opentelemetry.io/otel/bridge/opencensus v0.40.0/go.mod h1:1NvVHb6tLTe5A9qCYz+eErW0t8iPn4ZfR6tDKcqlGTM= @@ -211,32 +448,114 @@ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20210722180016-6781d3edade3/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20221012211006-4de253d81b95/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= +golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp/shiny v0.0.0-20220827204233-334a2380cb91/go.mod h1:VjAR7z0ngyATZTELrBSkxOOHhhlnVUxDye4mcjx5h/8= +golang.org/x/exp/shiny v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= +golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= +golang.org/x/exp/shiny v0.0.0-20240707233637-46b078467d37/go.mod h1:3F+MieQB7dRYLTmnncoFbb1crS5lfQoTfDgQy6K4N0o= +golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:3F+MieQB7dRYLTmnncoFbb1crS5lfQoTfDgQy6K4N0o= golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= +golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A= +golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= +golang.org/x/image v0.6.0/go.mod h1:MXLdDR43H7cDJq5GEGXEVeeNhPgi+YYEQ2pC1byI1x0= +golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= +golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= +golang.org/x/image v0.12.0/go.mod h1:Lu90jvHG7GfemOIcldsh9A2hS01ocl6oNO7ype5mEnk= +golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk= +golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= +golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= +golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a/go.mod h1:Ede7gF0KGoHlj822RtphAHK1jLdrcuRBZg0sF1Q+SPc= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488/go.mod h1:fGb/2+tgXXjhjHsTNdVEEMZNWA0quBnfrO+AfoDSAKw= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= +gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= gonum.org/v1/plot v0.15.2/go.mod h1:DX+x+DWso3LTha+AdkJEv5Txvi+Tql3KAGkehP0/Ubg= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.174.0/go.mod h1:aC7tB6j0HR1Nl0ni5ghpx6iLasmAX78Zkh/wgxAAjLg= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20230725213213-b022f6e96895/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= google.golang.org/genproto/googleapis/api v0.0.0-20230725213213-b022f6e96895/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= @@ -251,13 +570,28 @@ google.golang.org/genproto/googleapis/bytestream v0.0.0-20250115164207-1a7da9e50 google.golang.org/genproto/googleapis/bytestream v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:35wIojE/F1ptq1nfNDNjtowabHoMSA2qQs7+smpCO5s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250603155806-513f23925822 h1:zWFRixYR5QlotL+Uv3YfsPRENIrQFXiGs+iwqel6fOQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c/go.mod h1:1kGGe25NDrNJYgta9Rp2QLLXWS1FLVMMXNvihbhK0iE= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250908214217-97024824d090/go.mod h1:Zm0W1CckZuSE8rNxJRJ0+pbZP3UOe8WQpyr0KGPtjAQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230725213213-b022f6e96895/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20 h1:MLBCGN1O7GzIx+cBiwfYPwtmZ41U3Mn/cotLJciaArI= google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= @@ -274,5 +608,7 @@ modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From be5cca626fb309472218ec71b774c636186a08cc Mon Sep 17 00:00:00 2001 From: Alvaro Viebrantz Date: Fri, 26 Sep 2025 16:50:30 -0400 Subject: [PATCH 21/23] ci(bigquery/v2): fix race condition on query cancel test (#12963) Fixes #12962 --- bigquery/v2/query/query_integration_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigquery/v2/query/query_integration_test.go b/bigquery/v2/query/query_integration_test.go index 574a41cb4206..bfa4ee6613bf 100644 --- a/bigquery/v2/query/query_integration_test.go +++ b/bigquery/v2/query/query_integration_test.go @@ -94,7 +94,7 @@ func TestIntegration_QueryCancelWait(t *testing.T) { } go func(t *testing.T) { - err = q.Wait(ctx) + err := q.Wait(ctx) if err == nil { t.Errorf("Wait() should throw an error: %v", err) } From 0dabb7656a43098d0395f42133b1214484d8acbf Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Fri, 26 Sep 2025 15:10:09 -0600 Subject: [PATCH 22/23] chore(.github): bump owlbot post processor (#12960) refs: #12950 --- .github/.OwlBot.lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index af8d973c5242..328af6dc50ca 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-go:infrastructure-public-image-latest - digest: sha256:c85470532348a8e8c64dfe7d554b008368c1f780e7874a5f064b693721063517 + digest: sha256:20d778aedac88e819d011ae562a070be1f2033c6b76418e1dddb6a9676241e81 From 6c3e7bf7ed606f94eba219b310ba74388ec2debb Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 16:25:25 -0700 Subject: [PATCH 23/23] chore(main): release bigtable 1.40.1 (#12948) :robot: I have created a release *beep* *boop* --- ## [1.40.1](https://github.com/googleapis/google-cloud-go/compare/bigtable/v1.40.0...bigtable/v1.40.1) (2025-09-26) ### Features * **bigtable:** Add an e2e flow for direct access with instructions ([#12939](https://github.com/googleapis/google-cloud-go/issues/12939)) ([fdcdde8](https://github.com/googleapis/google-cloud-go/commit/fdcdde809db710633e3102440d11b3365bdd1fd4)) ### Bug Fixes * **bigtable:** Release bigtable as 1.40.1 ([#12961](https://github.com/googleapis/google-cloud-go/issues/12961)) ([33e1474](https://github.com/googleapis/google-cloud-go/commit/33e1474de4d6ea19c4341b833f926b828b32abdd)) * **bigtable:** Use stable stats.NewMetricSet ([#12941](https://github.com/googleapis/google-cloud-go/issues/12941)) ([2c713d7](https://github.com/googleapis/google-cloud-go/commit/2c713d7b9291627b1e55757024a542180188ce3f)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- .release-please-manifest-individual.json | 2 +- bigtable/CHANGES.md | 13 +++++++++++++ bigtable/internal/version.go | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest-individual.json b/.release-please-manifest-individual.json index 3ac765ad71cd..46d053ba1604 100644 --- a/.release-please-manifest-individual.json +++ b/.release-please-manifest-individual.json @@ -2,7 +2,7 @@ "auth": "0.16.5", "auth/oauth2adapt": "0.2.8", "bigquery": "1.70.0", - "bigtable": "1.40.0", + "bigtable": "1.40.1", "datastore": "1.20.0", "errorreporting": "0.3.2", "firestore": "1.18.0", diff --git a/bigtable/CHANGES.md b/bigtable/CHANGES.md index aa290e946ddd..8b8fb9f9f04e 100644 --- a/bigtable/CHANGES.md +++ b/bigtable/CHANGES.md @@ -1,5 +1,18 @@ # Changes +## [1.40.1](https://github.com/googleapis/google-cloud-go/compare/bigtable/v1.40.0...bigtable/v1.40.1) (2025-09-26) + + +### Features + +* **bigtable:** Add an e2e flow for direct access with instructions ([#12939](https://github.com/googleapis/google-cloud-go/issues/12939)) ([fdcdde8](https://github.com/googleapis/google-cloud-go/commit/fdcdde809db710633e3102440d11b3365bdd1fd4)) + + +### Bug Fixes + +* **bigtable:** Release bigtable as 1.40.1 ([#12961](https://github.com/googleapis/google-cloud-go/issues/12961)) ([33e1474](https://github.com/googleapis/google-cloud-go/commit/33e1474de4d6ea19c4341b833f926b828b32abdd)) +* **bigtable:** Use stable stats.NewMetricSet ([#12941](https://github.com/googleapis/google-cloud-go/issues/12941)) ([2c713d7](https://github.com/googleapis/google-cloud-go/commit/2c713d7b9291627b1e55757024a542180188ce3f)) + ## [1.40.0](https://github.com/googleapis/google-cloud-go/compare/bigtable/v1.39.0...bigtable/v1.40.0) (2025-09-22) diff --git a/bigtable/internal/version.go b/bigtable/internal/version.go index 1c52a3504b2c..7bff02b29c4f 100644 --- a/bigtable/internal/version.go +++ b/bigtable/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.40.0" +const Version = "1.40.1"