From a407c783a40b7dc7a87630d05790da0dd927662a Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:14:30 -0400 Subject: [PATCH 01/13] chore(main): release 2.53.2-SNAPSHOT (#3155) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- gapic-google-cloud-storage-v2/pom.xml | 4 ++-- google-cloud-storage-bom/pom.xml | 16 ++++++++-------- google-cloud-storage-control/pom.xml | 4 ++-- google-cloud-storage/pom.xml | 4 ++-- grpc-google-cloud-storage-control-v2/pom.xml | 4 ++-- grpc-google-cloud-storage-v2/pom.xml | 4 ++-- pom.xml | 16 ++++++++-------- proto-google-cloud-storage-control-v2/pom.xml | 4 ++-- proto-google-cloud-storage-v2/pom.xml | 4 ++-- samples/snapshot/pom.xml | 6 +++--- storage-shared-benchmarking/pom.xml | 4 ++-- versions.txt | 14 +++++++------- 12 files changed, 42 insertions(+), 42 deletions(-) diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml index ac05c78f7..56eca8ee8 100644 --- a/gapic-google-cloud-storage-v2/pom.xml +++ b/gapic-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT gapic-google-cloud-storage-v2 GRPC library for gapic-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index b84ef899b..5b5ae2a64 100644 --- a/google-cloud-storage-bom/pom.xml +++ b/google-cloud-storage-bom/pom.xml @@ -19,7 +19,7 @@ 4.0.0 com.google.cloud google-cloud-storage-bom - 2.53.1 + 2.53.2-SNAPSHOT pom com.google.cloud @@ -69,37 +69,37 @@ com.google.cloud google-cloud-storage - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc gapic-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc proto-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.cloud google-cloud-storage-control - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.53.1 + 2.53.2-SNAPSHOT diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index 64db8b5b6..ee1ee7768 100644 --- a/google-cloud-storage-control/pom.xml +++ b/google-cloud-storage-control/pom.xml @@ -5,13 +5,13 @@ 4.0.0 com.google.cloud google-cloud-storage-control - 2.53.1 + 2.53.2-SNAPSHOT google-cloud-storage-control GRPC library for google-cloud-storage-control com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 47b459f92..62b9eb6c9 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 2.53.1 + 2.53.2-SNAPSHOT jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,7 +12,7 @@ com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT google-cloud-storage diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml index 3688c4425..088cf1b6f 100644 --- a/grpc-google-cloud-storage-control-v2/pom.xml +++ b/grpc-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.53.1 + 2.53.2-SNAPSHOT grpc-google-cloud-storage-control-v2 GRPC library for google-cloud-storage com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml index 224f5754b..ba47c0740 100644 --- a/grpc-google-cloud-storage-v2/pom.xml +++ b/grpc-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT grpc-google-cloud-storage-v2 GRPC library for grpc-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index fa4435d48..54bbf857f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 2.53.1 + 2.53.2-SNAPSHOT Storage Parent https://github.com/googleapis/java-storage @@ -82,7 +82,7 @@ com.google.cloud google-cloud-storage - 2.53.1 + 2.53.2-SNAPSHOT com.google.apis @@ -104,32 +104,32 @@ com.google.api.grpc proto-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc gapic-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.53.1 + 2.53.2-SNAPSHOT com.google.cloud google-cloud-storage-control - 2.53.1 + 2.53.2-SNAPSHOT com.google.cloud diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml index ca297f10a..f6ad8308f 100644 --- a/proto-google-cloud-storage-control-v2/pom.xml +++ b/proto-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.53.1 + 2.53.2-SNAPSHOT proto-google-cloud-storage-control-v2 Proto library for proto-google-cloud-storage-control-v2 com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml index f7fb32aef..62bb3bf5b 100644 --- a/proto-google-cloud-storage-v2/pom.xml +++ b/proto-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-v2 - 2.53.1 + 2.53.2-SNAPSHOT proto-google-cloud-storage-v2 PROTO library for proto-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index ae7c61a6c..640631b45 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,12 +28,12 @@ com.google.cloud google-cloud-storage - 2.53.1 + 2.53.2-SNAPSHOT com.google.cloud google-cloud-storage-control - 2.53.1 + 2.53.2-SNAPSHOT compile @@ -70,7 +70,7 @@ com.google.cloud google-cloud-storage - 2.53.1 + 2.53.2-SNAPSHOT tests test diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml index 59caffd05..46956cfd2 100644 --- a/storage-shared-benchmarking/pom.xml +++ b/storage-shared-benchmarking/pom.xml @@ -10,7 +10,7 @@ com.google.cloud google-cloud-storage-parent - 2.53.1 + 2.53.2-SNAPSHOT @@ -31,7 +31,7 @@ com.google.cloud google-cloud-storage - 2.53.1 + 2.53.2-SNAPSHOT tests diff --git a/versions.txt b/versions.txt index 71478f9e9..c492d1007 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-storage:2.53.1:2.53.1 -gapic-google-cloud-storage-v2:2.53.1:2.53.1 -grpc-google-cloud-storage-v2:2.53.1:2.53.1 -proto-google-cloud-storage-v2:2.53.1:2.53.1 -google-cloud-storage-control:2.53.1:2.53.1 -proto-google-cloud-storage-control-v2:2.53.1:2.53.1 -grpc-google-cloud-storage-control-v2:2.53.1:2.53.1 +google-cloud-storage:2.53.1:2.53.2-SNAPSHOT +gapic-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT +grpc-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT +proto-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT +google-cloud-storage-control:2.53.1:2.53.2-SNAPSHOT +proto-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT +grpc-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT From 0c10a6dcf4abcf39317c0999c975035adb111d55 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Wed, 18 Jun 2025 14:15:56 -0400 Subject: [PATCH 02/13] samples(storagecontrol): add AnywhereCache samples (#3123) * storage_control_create_anywhere_cache * storage_control_disable_anywhere_cache * storage_control_get_anywhere_cache * storage_control_list_anywhere_cache * storage_control_pause_anywhere_cache * storage_control_resume_anywhere_cache * storage_control_update_anywhere_cache --- .../control/v2/AnywhereCacheCreate.java | 55 ++++++++++++ .../control/v2/AnywhereCacheDisable.java | 42 ++++++++++ .../storage/control/v2/AnywhereCacheGet.java | 42 ++++++++++ .../storage/control/v2/AnywhereCacheList.java | 45 ++++++++++ .../control/v2/AnywhereCachePause.java | 42 ++++++++++ .../control/v2/AnywhereCacheResume.java | 42 ++++++++++ .../control/v2/AnywhereCacheUpdate.java | 61 ++++++++++++++ .../control/v2/ITAnywhereCacheTest.java | 84 +++++++++++++++++++ 8 files changed, 413 insertions(+) create mode 100644 samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java create mode 100644 samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java create mode 100644 samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java create mode 100644 samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java create mode 100644 samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java create mode 100644 samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java create mode 100644 samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java create mode 100644 samples/snippets/src/test/java/com/example/storage/control/v2/ITAnywhereCacheTest.java diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java new file mode 100644 index 000000000..d9736906c --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java @@ -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 + * + * 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 com.example.storage.control.v2; + +// [START storage_control_create_anywhere_cache] +import com.google.api.gax.longrunning.OperationFuture; +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.BucketName; +import com.google.storage.control.v2.CreateAnywhereCacheMetadata; +import com.google.storage.control.v2.CreateAnywhereCacheRequest; +import com.google.storage.control.v2.StorageControlClient; +import java.io.IOException; +import java.util.concurrent.ExecutionException; + +public final class AnywhereCacheCreate { + + public static void anywhereCacheCreate(String bucketName, String cacheName, String zoneName) + throws InterruptedException, ExecutionException, IOException { + try (StorageControlClient storageControl = StorageControlClient.create()) { + + CreateAnywhereCacheRequest request = CreateAnywhereCacheRequest.newBuilder() + // Set project to "_" to signify globally scoped bucket + .setParent(BucketName.format("_", bucketName)) + .setAnywhereCache(AnywhereCache.newBuilder() + .setName(cacheName) + .setZone(zoneName) + .build()) + .build(); + + // Start a long-running operation (LRO). + OperationFuture operation = + storageControl.createAnywhereCacheAsync(request); + + // Await the LROs completion. + AnywhereCache anywhereCache = operation.get(); + System.out.printf("Created anywhere cache: %s%n", anywhereCache.getName()); + } + } + +} +// [END storage_control_create_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java new file mode 100644 index 000000000..c334268aa --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java @@ -0,0 +1,42 @@ +/* + * 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 com.example.storage.control.v2; + +// [START storage_control_disable_anywhere_cache] + +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.DisableAnywhereCacheRequest; +import com.google.storage.control.v2.StorageControlClient; +import java.io.IOException; + +public final class AnywhereCacheDisable { + + public static void anywhereCacheDisable(String cacheName) throws IOException { + try (StorageControlClient storageControl = StorageControlClient.create()) { + + DisableAnywhereCacheRequest request = DisableAnywhereCacheRequest.newBuilder() + .setName(cacheName) + .build(); + + AnywhereCache anywhereCache = storageControl.disableAnywhereCache(request); + + System.out.printf("Disabled anywhere cache: %s%n", anywhereCache.getName()); + } + } + +} +// [END storage_control_disable_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java new file mode 100644 index 000000000..978d56679 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java @@ -0,0 +1,42 @@ +/* + * 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 com.example.storage.control.v2; + +// [START storage_control_get_anywhere_cache] + +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.GetAnywhereCacheRequest; +import com.google.storage.control.v2.StorageControlClient; +import java.io.IOException; + +public final class AnywhereCacheGet { + + public static void anywhereCacheGet(String cacheName) throws IOException { + try (StorageControlClient storageControl = StorageControlClient.create()) { + + GetAnywhereCacheRequest request = GetAnywhereCacheRequest.newBuilder() + .setName(cacheName) + .build(); + + AnywhereCache anywhereCache = storageControl.getAnywhereCache(request); + + System.out.printf("Got anywhere cache: %s%n", anywhereCache.getName()); + } + } + +} +// [END storage_control_get_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java new file mode 100644 index 000000000..0b8a0ec04 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java @@ -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 com.example.storage.control.v2; + +// [START storage_control_list_anywhere_cache] + +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.BucketName; +import com.google.storage.control.v2.ListAnywhereCachesRequest; +import com.google.storage.control.v2.StorageControlClient; +import com.google.storage.control.v2.StorageControlClient.ListAnywhereCachesPagedResponse; +import java.io.IOException; + +public final class AnywhereCacheList { + + public static void anywhereCacheList(String bucketName) throws IOException { + try (StorageControlClient storageControl = StorageControlClient.create()) { + + ListAnywhereCachesRequest request = ListAnywhereCachesRequest.newBuilder() + .setParent(BucketName.format("_", bucketName)) + .build(); + + ListAnywhereCachesPagedResponse page = storageControl.listAnywhereCaches(request); + for (AnywhereCache anywhereCache : page.iterateAll()) { + System.out.println(anywhereCache.getName()); + } + } + } + +} +// [END storage_control_list_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java new file mode 100644 index 000000000..6cea55759 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java @@ -0,0 +1,42 @@ +/* + * 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 com.example.storage.control.v2; + +// [START storage_control_pause_anywhere_cache] + +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.PauseAnywhereCacheRequest; +import com.google.storage.control.v2.StorageControlClient; +import java.io.IOException; + +public final class AnywhereCachePause { + + public static void anywhereCachePause(String cacheName) throws IOException { + try (StorageControlClient storageControl = StorageControlClient.create()) { + + PauseAnywhereCacheRequest request = PauseAnywhereCacheRequest.newBuilder() + .setName(cacheName) + .build(); + + AnywhereCache anywhereCache = storageControl.pauseAnywhereCache(request); + + System.out.printf("Paused anywhere cache: %s%n", anywhereCache.getName()); + } + } + +} +// [END storage_control_pause_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java new file mode 100644 index 000000000..3a2467466 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java @@ -0,0 +1,42 @@ +/* + * 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 com.example.storage.control.v2; + +// [START storage_control_resume_anywhere_cache] + +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.ResumeAnywhereCacheRequest; +import com.google.storage.control.v2.StorageControlClient; +import java.io.IOException; + +public final class AnywhereCacheResume { + + public static void anywhereCacheResume(String cacheName) throws IOException { + try (StorageControlClient storageControl = StorageControlClient.create()) { + + ResumeAnywhereCacheRequest request = ResumeAnywhereCacheRequest.newBuilder() + .setName(cacheName) + .build(); + + AnywhereCache anywhereCache = storageControl.resumeAnywhereCache(request); + + System.out.printf("Resumed anywhere cache: %s%n", anywhereCache.getName()); + } + } + +} +// [END storage_control_resume_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java new file mode 100644 index 000000000..5cb666f29 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java @@ -0,0 +1,61 @@ +/* + * 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 com.example.storage.control.v2; + +// [START storage_control_update_anywhere_cache] + +import com.google.api.gax.longrunning.OperationFuture; +import com.google.protobuf.FieldMask; +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.StorageControlClient; +import com.google.storage.control.v2.UpdateAnywhereCacheMetadata; +import com.google.storage.control.v2.UpdateAnywhereCacheRequest; +import java.io.IOException; +import java.util.concurrent.ExecutionException; + +public final class AnywhereCacheUpdate { + + public static void anywhereCacheUpdate(String cacheName, String admissionPolicy) + throws InterruptedException, ExecutionException, IOException { + try (StorageControlClient storageControl = StorageControlClient.create()) { + + AnywhereCache pendingUpdate = AnywhereCache.newBuilder() + .setName(cacheName) + .setAdmissionPolicy(admissionPolicy) + .build(); + + UpdateAnywhereCacheRequest request = UpdateAnywhereCacheRequest.newBuilder() + .setAnywhereCache(pendingUpdate) + .setUpdateMask( + FieldMask.newBuilder() + .addPaths("admission_policy") + .build() + ) + .build(); + + // Start a long-running operation (LRO). + OperationFuture operation = + storageControl.updateAnywhereCacheAsync(request); + + // Await the LROs completion. + AnywhereCache updatedAnywhereCache = operation.get(); + System.out.printf("Updated anywhere cache: %s%n", updatedAnywhereCache.getName()); + } + } + +} +// [END storage_control_update_anywhere_cache] diff --git a/samples/snippets/src/test/java/com/example/storage/control/v2/ITAnywhereCacheTest.java b/samples/snippets/src/test/java/com/example/storage/control/v2/ITAnywhereCacheTest.java new file mode 100644 index 000000000..8bd7b0ba4 --- /dev/null +++ b/samples/snippets/src/test/java/com/example/storage/control/v2/ITAnywhereCacheTest.java @@ -0,0 +1,84 @@ +/* + * 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 com.example.storage.control.v2; + +import static org.junit.Assume.assumeTrue; + +import com.example.storage.TestBase; +import com.google.cloud.storage.it.runner.annotations.Inject; +import com.google.cloud.storage.it.runner.registry.Generator; +import com.google.cloud.storage.it.runner.registry.Zone; +import com.google.common.base.Strings; +import com.google.storage.control.v2.AnywhereCacheName; +import java.io.IOException; +import java.util.concurrent.ExecutionException; +import org.junit.Before; +import org.junit.Test; + +public final class ITAnywhereCacheTest extends TestBase { + + @Inject public Zone zone; + @Inject public Generator generator; + + private String cacheName; + + @Before + public void setUp() { + assumeTrue( + "AnywhereCache sample tests skipped in CI due to very long operation times.", + Strings.isNullOrEmpty(System.getenv("JOB_TYPE"))); + cacheName = generator.randomObjectName(); + } + + @Test + public void create() throws IOException, ExecutionException, InterruptedException { + AnywhereCacheCreate.anywhereCacheCreate(bucket.getName(), cacheName, zone.getZone()); + } + + @Test + public void get() throws IOException { + AnywhereCacheGet.anywhereCacheGet(AnywhereCacheName.format("_", bucket.getName(), cacheName)); + } + + @Test + public void list() throws IOException { + AnywhereCacheList.anywhereCacheList(bucket.getName()); + } + + @Test + public void update() throws IOException, ExecutionException, InterruptedException { + AnywhereCacheUpdate.anywhereCacheUpdate(cacheName, "admit-on-second-miss"); + } + + @Test + public void pause() throws IOException { + AnywhereCachePause.anywhereCachePause( + AnywhereCacheName.format("_", bucket.getName(), cacheName)); + } + + @Test + public void resume() throws IOException { + AnywhereCacheResume.anywhereCacheResume( + AnywhereCacheName.format("_", bucket.getName(), cacheName)); + } + + @Test + public void disable() throws IOException { + AnywhereCacheDisable.anywhereCacheDisable( + AnywhereCacheName.format("_", bucket.getName(), cacheName)); + } +} From b3a9501247f31e3af52e51fe362f3241db9a9f39 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 19 Jun 2025 02:31:52 +0200 Subject: [PATCH 03/13] chore(deps): update storage release dependencies to v2.53.1 (#3156) --- samples/install-without-bom/pom.xml | 6 +++--- samples/snippets/pom.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 60fb4ba29..39d9f1ee7 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,12 +30,12 @@ com.google.cloud google-cloud-storage - 2.53.0 + 2.53.1 com.google.cloud google-cloud-storage-control - 2.53.0 + 2.53.1 @@ -78,7 +78,7 @@ com.google.cloud google-cloud-storage - 2.53.0 + 2.53.1 tests test diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 46409d12f..2f2eb26c5 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -99,7 +99,7 @@ com.google.cloud google-cloud-storage - 2.53.0 + 2.53.1 tests test From d5b4baa595edebe533106918862d2ad29cd1bcd1 Mon Sep 17 00:00:00 2001 From: Denis DelGrosso <85250797+ddelgrosso1@users.noreply.github.com> Date: Mon, 23 Jun 2025 15:35:18 -0400 Subject: [PATCH 04/13] samples: fix region tag for listing anywhere caches (#3159) --- .../com/example/storage/control/v2/AnywhereCacheList.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java index 0b8a0ec04..95285f265 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java @@ -16,7 +16,7 @@ package com.example.storage.control.v2; -// [START storage_control_list_anywhere_cache] +// [START storage_control_list_anywhere_caches] import com.google.storage.control.v2.AnywhereCache; import com.google.storage.control.v2.BucketName; @@ -42,4 +42,4 @@ public static void anywhereCacheList(String bucketName) throws IOException { } } -// [END storage_control_list_anywhere_cache] +// [END storage_control_list_anywhere_caches] From 41a1030a2e77036cf961a16d472068b07e624192 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 24 Jun 2025 20:05:13 +0200 Subject: [PATCH 05/13] deps: update dependency com.google.cloud.opentelemetry:exporter-trace to v0.36.0 (#3162) --- google-cloud-storage/pom.xml | 2 +- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- samples/snippets/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 62b9eb6c9..211a19937 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -167,7 +167,7 @@ com.google.cloud.opentelemetry exporter-trace - 0.35.0 + 0.36.0 test diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 39d9f1ee7..e503e1557 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -98,7 +98,7 @@ com.google.cloud.opentelemetry exporter-trace - 0.35.0 + 0.36.0 com.google.cloud.opentelemetry diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 640631b45..3c06dad21 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -90,7 +90,7 @@ com.google.cloud.opentelemetry exporter-trace - 0.35.0 + 0.36.0 com.google.cloud.opentelemetry diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 2f2eb26c5..8053937d2 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -88,7 +88,7 @@ com.google.cloud.opentelemetry exporter-trace - 0.35.0 + 0.36.0 com.google.cloud.opentelemetry From 9a4aa0d4548af45ca4516b3e5185af431217cf5e Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 24 Jun 2025 20:05:36 +0200 Subject: [PATCH 06/13] test(deps): update dependency org.junit:junit-bom to v5.13.2 (#3161) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 54bbf857f..8549918e7 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ org.junit junit-bom - 5.13.1 + 5.13.2 pom import From c22a1319d8e2d92beeb03abac6bf2af8d09d49ee Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 24 Jun 2025 21:33:37 +0200 Subject: [PATCH 07/13] deps: update sdk-platform-java dependencies (#3164) --- .github/workflows/hermetic_library_generation.yaml | 2 +- .github/workflows/unmanaged_dependency_check.yaml | 2 +- google-cloud-storage-bom/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index b635365d8..9f0cb1184 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -43,7 +43,7 @@ jobs: with: fetch-depth: 0 token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} - - uses: googleapis/sdk-platform-java/.github/scripts@v2.59.2 + - uses: googleapis/sdk-platform-java/.github/scripts@v2.60.0 if: env.SHOULD_RUN == 'true' with: base_ref: ${{ github.base_ref }} diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 0cf8ad502..2eeb8f588 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -17,6 +17,6 @@ jobs: # repository .kokoro/build.sh - name: Unmanaged dependency check - uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.49.2 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.50.0 with: bom-path: google-cloud-storage-bom/pom.xml diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index 5b5ae2a64..45d24d207 100644 --- a/google-cloud-storage-bom/pom.xml +++ b/google-cloud-storage-bom/pom.xml @@ -24,7 +24,7 @@ com.google.cloud sdk-platform-java-config - 3.49.2 + 3.50.0 diff --git a/pom.xml b/pom.xml index 8549918e7..a0a176c59 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.49.2 + 3.50.0 From b956eb9b03831405f05691d50ae2de6bf422f73e Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Tue, 24 Jun 2025 15:35:36 -0400 Subject: [PATCH 08/13] chore: add fast crc32c concat implementation (#3148) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This new implementation provides a constant time computation regardless of the length of B, rather than the previous implementation which took linear time relative to the length of B. #### Benchmark summary CPU: AMD Ryzen Threadripper PRO 3945WX 12-Cores OS: Debian Testing ``` # JMH version: 1.37 # VM version: JDK 11.0.17, OpenJDK 64-Bit Server VM, 11.0.17+8 # VM invoker: /home/benwhitehead/opt/java/jdk-11.0.17+8/bin/java # VM options: -Xms1g -Xmx1g -XX:+AlwaysPreTouch # Blackhole mode: full + dont-inline hint (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 4 iterations, 30 s each # Measurement: 8 iterations, 30 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Sampling time ``` ``` Benchmark (objectSize) Mode Cnt Score Error Units Crc32cBenchmark.concatCrc32c 131072 sample 9243752 0.074 ± 0.001 us/op Crc32cBenchmark.concatCrc32c 262144 sample 9015106 0.078 ± 0.001 us/op Crc32cBenchmark.concatCrc32c 524288 sample 9010257 0.074 ± 0.001 us/op Crc32cBenchmark.concatCrc32c 1048576 sample 9165519 0.074 ± 0.001 us/op Crc32cBenchmark.concatCrc32c 2097152 sample 8993038 0.075 ± 0.001 us/op Crc32cBenchmark.crc32cCombineGoogle 131072 sample 2070639 115.806 ± 0.018 us/op Crc32cBenchmark.crc32cCombineGoogle 262144 sample 1029209 233.019 ± 0.045 us/op Crc32cBenchmark.crc32cCombineGoogle 524288 sample 516517 464.360 ± 0.106 us/op Crc32cBenchmark.crc32cCombineGoogle 1048576 sample 262118 915.067 ± 0.354 us/op Crc32cBenchmark.crc32cCombineGoogle 2097152 sample 131385 1825.685 ± 0.834 us/op ``` --- .../google/cloud/storage/Crc32cUtility.java | 340 ++++-------------- .../com/google/cloud/storage/Crc32cValue.java | 4 +- .../storage/Crc32cUtilityPropertyTest.java | 3 +- .../cloud/storage/Crc32cUtilityTest.java | 4 +- 4 files changed, 66 insertions(+), 285 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java index 1a3882daa..9f91d3b84 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java @@ -19,288 +19,70 @@ class Crc32cUtility { private Crc32cUtility() {} + // Castagnoli polynomial and its degree. + private static final long CASTAGNOLI_POLY = 4812730177L; + private static final int DEGREE = 32; + + // Table storing values of x^(2^k) mod CASTANOLI_POLY for all k < 31. This is sufficient since + // x^(2^31) = x. + private static final long[] X_POW_2K_TABLE = { + 2L, 4L, 16L, 256L, 65536L, 517762881L, 984302966L, + 408362264L, 1503875210L, 2862076957L, 3884826397L, 1324787473L, 621200174L, 1758783527L, + 1416537776L, 1180494764L, 648569364L, 2521473789L, 994858823L, 1728245375L, 3498467999L, + 4059169852L, 3345064394L, 2828422810L, 2429203150L, 3336788029L, 860151998L, 2102628683L, + 1033187991L, 4243778976L, 1123580069L + }; + + // Multiplies two polynomials together modulo CASTAGNOLI_POLY. + private static int multiply(int p, int q) { + long q64 = q; + int result = 0; + long topBit = (1L << DEGREE); + for (int i = 0; i < DEGREE; i++) { + if ((p & 1) != 0) { + result ^= (int) q64; + } + q64 <<= 1; // Multiply by x. + + // If multiplying by x gave q64 a non-zero 32nd coefficient, it no longer encodes the desired + // representative of that polynomial modulo CASTAGNOLI_POLY, so we subtract the generator. + if ((q64 & topBit) != 0) { + q64 ^= CASTAGNOLI_POLY; + } + p >>= 1; + } + return result; + } + + // Given crc representing polynomial P(x), compute P(x)*x^numBits. + private static int extendByZeros(int crc, long numBits) { + // Begin by reversing the bits to most-significant coefficient first for comprehensibility. + crc = Integer.reverse(crc); + int i = 0; + // Iterate over the binary representation of numBits, multiplying by x^(2^k) for numBits_k = 1. + while (numBits != 0) { + if ((numBits & 1) != 0) { + crc = multiply(crc, (int) X_POW_2K_TABLE[i % X_POW_2K_TABLE.length]); + } + i += 1; + numBits >>= 1; + } + crc = Integer.reverse(crc); // Return to the standard bit-order. + return crc; + } + /** - * Straight forward implementation to combine two crc32c values + * Efficiently computes CRC32C for concat(A, B) given crc(A), crc(B) and len(B). * - *

There is a more efficient implementation in https://github.com/google/crc32c, however for - * brevity we are following the byte by byte computation, implemented in: - * https://github.com/google/crc32c/blob/main/src/crc32c_portable.cc#L252-L257 - * - * @param crc1 crc32c int of an object to combine crc2 with - * @param crc2 crc32c int of the second object - * @param crc2ObjectSize byte length of object which generated crc2 - * @return - * @see https://github.com/google/crc32c/blob/21fc8ef30415a635e7351ffa0e5d5367943d4a94/src/crc32c_portable.cc#L252-L257 + * @param crcA A 32-bit integer representing crc(A) with least-significant coefficient first. + * @param crcB Same as crcA for B. + * @param numBytesInB Length of B in bytes. + * @return CRC32C for concat(A, B) PiperOrigin-RevId: 158626905 */ - public static int crc32cCombineGoogle(int crc1, int crc2, long crc2ObjectSize) { - int l = crc1; - // run number of 0's based on size - for (long i = 0; i < crc2ObjectSize; i++) { - l = (l >>> 8) ^ kByteExtensionTable[l & 0xff]; + public static int concatCrc32c(int crcA, int crcB, long numBytesInB) { + if (numBytesInB == 0) { + return crcA; } - return l ^ crc2; + return extendByZeros(crcA, 8 * numBytesInB) ^ crcB; } - - // Ported from: - // https://github.com/google/crc32c/blob/21fc8ef30415a635e7351ffa0e5d5367943d4a94/src/crc32c_portable.cc#L16-L59 - private static final int[] kByteExtensionTable = - new int[] { - 0x00000000, - 0xf26b8303, - 0xe13b70f7, - 0x1350f3f4, - 0xc79a971f, - 0x35f1141c, - 0x26a1e7e8, - 0xd4ca64eb, - 0x8ad958cf, - 0x78b2dbcc, - 0x6be22838, - 0x9989ab3b, - 0x4d43cfd0, - 0xbf284cd3, - 0xac78bf27, - 0x5e133c24, - 0x105ec76f, - 0xe235446c, - 0xf165b798, - 0x030e349b, - 0xd7c45070, - 0x25afd373, - 0x36ff2087, - 0xc494a384, - 0x9a879fa0, - 0x68ec1ca3, - 0x7bbcef57, - 0x89d76c54, - 0x5d1d08bf, - 0xaf768bbc, - 0xbc267848, - 0x4e4dfb4b, - 0x20bd8ede, - 0xd2d60ddd, - 0xc186fe29, - 0x33ed7d2a, - 0xe72719c1, - 0x154c9ac2, - 0x061c6936, - 0xf477ea35, - 0xaa64d611, - 0x580f5512, - 0x4b5fa6e6, - 0xb93425e5, - 0x6dfe410e, - 0x9f95c20d, - 0x8cc531f9, - 0x7eaeb2fa, - 0x30e349b1, - 0xc288cab2, - 0xd1d83946, - 0x23b3ba45, - 0xf779deae, - 0x05125dad, - 0x1642ae59, - 0xe4292d5a, - 0xba3a117e, - 0x4851927d, - 0x5b016189, - 0xa96ae28a, - 0x7da08661, - 0x8fcb0562, - 0x9c9bf696, - 0x6ef07595, - 0x417b1dbc, - 0xb3109ebf, - 0xa0406d4b, - 0x522bee48, - 0x86e18aa3, - 0x748a09a0, - 0x67dafa54, - 0x95b17957, - 0xcba24573, - 0x39c9c670, - 0x2a993584, - 0xd8f2b687, - 0x0c38d26c, - 0xfe53516f, - 0xed03a29b, - 0x1f682198, - 0x5125dad3, - 0xa34e59d0, - 0xb01eaa24, - 0x42752927, - 0x96bf4dcc, - 0x64d4cecf, - 0x77843d3b, - 0x85efbe38, - 0xdbfc821c, - 0x2997011f, - 0x3ac7f2eb, - 0xc8ac71e8, - 0x1c661503, - 0xee0d9600, - 0xfd5d65f4, - 0x0f36e6f7, - 0x61c69362, - 0x93ad1061, - 0x80fde395, - 0x72966096, - 0xa65c047d, - 0x5437877e, - 0x4767748a, - 0xb50cf789, - 0xeb1fcbad, - 0x197448ae, - 0x0a24bb5a, - 0xf84f3859, - 0x2c855cb2, - 0xdeeedfb1, - 0xcdbe2c45, - 0x3fd5af46, - 0x7198540d, - 0x83f3d70e, - 0x90a324fa, - 0x62c8a7f9, - 0xb602c312, - 0x44694011, - 0x5739b3e5, - 0xa55230e6, - 0xfb410cc2, - 0x092a8fc1, - 0x1a7a7c35, - 0xe811ff36, - 0x3cdb9bdd, - 0xceb018de, - 0xdde0eb2a, - 0x2f8b6829, - 0x82f63b78, - 0x709db87b, - 0x63cd4b8f, - 0x91a6c88c, - 0x456cac67, - 0xb7072f64, - 0xa457dc90, - 0x563c5f93, - 0x082f63b7, - 0xfa44e0b4, - 0xe9141340, - 0x1b7f9043, - 0xcfb5f4a8, - 0x3dde77ab, - 0x2e8e845f, - 0xdce5075c, - 0x92a8fc17, - 0x60c37f14, - 0x73938ce0, - 0x81f80fe3, - 0x55326b08, - 0xa759e80b, - 0xb4091bff, - 0x466298fc, - 0x1871a4d8, - 0xea1a27db, - 0xf94ad42f, - 0x0b21572c, - 0xdfeb33c7, - 0x2d80b0c4, - 0x3ed04330, - 0xccbbc033, - 0xa24bb5a6, - 0x502036a5, - 0x4370c551, - 0xb11b4652, - 0x65d122b9, - 0x97baa1ba, - 0x84ea524e, - 0x7681d14d, - 0x2892ed69, - 0xdaf96e6a, - 0xc9a99d9e, - 0x3bc21e9d, - 0xef087a76, - 0x1d63f975, - 0x0e330a81, - 0xfc588982, - 0xb21572c9, - 0x407ef1ca, - 0x532e023e, - 0xa145813d, - 0x758fe5d6, - 0x87e466d5, - 0x94b49521, - 0x66df1622, - 0x38cc2a06, - 0xcaa7a905, - 0xd9f75af1, - 0x2b9cd9f2, - 0xff56bd19, - 0x0d3d3e1a, - 0x1e6dcdee, - 0xec064eed, - 0xc38d26c4, - 0x31e6a5c7, - 0x22b65633, - 0xd0ddd530, - 0x0417b1db, - 0xf67c32d8, - 0xe52cc12c, - 0x1747422f, - 0x49547e0b, - 0xbb3ffd08, - 0xa86f0efc, - 0x5a048dff, - 0x8ecee914, - 0x7ca56a17, - 0x6ff599e3, - 0x9d9e1ae0, - 0xd3d3e1ab, - 0x21b862a8, - 0x32e8915c, - 0xc083125f, - 0x144976b4, - 0xe622f5b7, - 0xf5720643, - 0x07198540, - 0x590ab964, - 0xab613a67, - 0xb831c993, - 0x4a5a4a90, - 0x9e902e7b, - 0x6cfbad78, - 0x7fab5e8c, - 0x8dc0dd8f, - 0xe330a81a, - 0x115b2b19, - 0x020bd8ed, - 0xf0605bee, - 0x24aa3f05, - 0xd6c1bc06, - 0xc5914ff2, - 0x37faccf1, - 0x69e9f0d5, - 0x9b8273d6, - 0x88d28022, - 0x7ab90321, - 0xae7367ca, - 0x5c18e4c9, - 0x4f48173d, - 0xbd23943e, - 0xf36e6f75, - 0x0105ec76, - 0x12551f82, - 0xe03e9c81, - 0x34f4f86a, - 0xc69f7b69, - 0xd5cf889d, - 0x27a40b9e, - 0x79b737ba, - 0x8bdcb4b9, - 0x988c474d, - 0x6ae7c44e, - 0xbe2da0a5, - 0x4c4623a6, - 0x5f16d052, - 0xad7d5351 - }; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java index 8e1bea02b..245999dd7 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java @@ -81,7 +81,7 @@ public int getValue() { @Override public Crc32cLengthUnknown concat(Crc32cLengthKnown other) { - int combined = Crc32cUtility.crc32cCombineGoogle(value, other.value, other.length); + int combined = Crc32cUtility.concatCrc32c(value, other.value, other.length); return new Crc32cLengthUnknown(combined); } @@ -137,7 +137,7 @@ public long getLength() { @Override public Crc32cLengthKnown concat(Crc32cLengthKnown other) { - int combined = Crc32cUtility.crc32cCombineGoogle(value, other.value, other.length); + int combined = Crc32cUtility.concatCrc32c(value, other.value, other.length); return new Crc32cLengthKnown(combined, length + other.length); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java index c5c862306..23d303208 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java @@ -29,8 +29,7 @@ public void testCrc32cCombinePropertyTest( int secondPartHash = Hashing.crc32c().hashBytes(secondObject).asInt(); int expected = Hashing.crc32c().newHasher().putBytes(firstObject).putBytes(secondObject).hash().asInt(); - int actual = - Crc32cUtility.crc32cCombineGoogle(firstPartHash, secondPartHash, secondObject.length); + int actual = Crc32cUtility.concatCrc32c(firstPartHash, secondPartHash, secondObject.length); assertThat(actual).isEqualTo(expected); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java index eb16905bb..7906606e2 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java @@ -30,7 +30,7 @@ public void testCrc32cCombine() { int object2_hash = 0x31AA814E; // length("world") -> 5 int object2_size = 5; - int combined = Crc32cUtility.crc32cCombineGoogle(object1_hash, object2_hash, object2_size); + int combined = Crc32cUtility.concatCrc32c(object1_hash, object2_hash, object2_size); Assert.assertEquals(expected, combined); } @@ -42,7 +42,7 @@ public void testCrc32cCombineGuavaValues() { int expected = Hashing.crc32c().hashBytes(helloWorld.getBytes()).asInt(); int object1Hash = Hashing.crc32c().hashBytes(hello.getBytes()).asInt(); int object2Hash = Hashing.crc32c().hashBytes(world.getBytes()).asInt(); - int combined = Crc32cUtility.crc32cCombineGoogle(object1Hash, object2Hash, world.length()); + int combined = Crc32cUtility.concatCrc32c(object1Hash, object2Hash, world.length()); Assert.assertEquals(expected, combined); } } From 33ad28d6846440bd14df36a1cc20b4ef5b7771dc Mon Sep 17 00:00:00 2001 From: cloud-java-bot <122572305+cloud-java-bot@users.noreply.github.com> Date: Wed, 25 Jun 2025 17:32:48 -0400 Subject: [PATCH 09/13] chore: Update generation configuration at Wed Jun 25 15:48:09 UTC 2025 (#3169) * chore: Update generation configuration at Wed Jun 25 15:48:09 UTC 2025 * chore: generate libraries at Wed Jun 25 15:48:39 UTC 2025 * chore(deps(storagecontrol)): add com.google.api:gax-httpjson test(deps): add com.google.api:gax:testlib test(deps): add com.google.api:gax-httpjson:testlib * test(deps): add com.google.http-client:google-http-client * chore: revert unintended downgrade, fix in #3170 --------- Co-authored-by: BenWhitehead --- README.md | 11 +- generation_config.yaml | 2 +- google-cloud-storage-control/pom.xml | 21 + .../control/v2/StorageControlClient.java | 39 +- .../control/v2/StorageControlSettings.java | 22 +- ...HttpJsonStorageControlCallableFactory.java | 101 +++ .../v2/stub/HttpJsonStorageControlStub.java | 727 ++++++++++++++++++ .../control/v2/stub/StorageControlStub.java | 6 +- .../v2/stub/StorageControlStubSettings.java | 52 +- .../v2/StorageControlClientHttpJsonTest.java | 690 +++++++++++++++++ .../control/v2/AnywhereCacheCreate.java | 16 +- .../control/v2/AnywhereCacheDisable.java | 6 +- .../storage/control/v2/AnywhereCacheGet.java | 6 +- .../storage/control/v2/AnywhereCacheList.java | 8 +- .../control/v2/AnywhereCachePause.java | 6 +- .../control/v2/AnywhereCacheResume.java | 6 +- .../control/v2/AnywhereCacheUpdate.java | 22 +- 17 files changed, 1684 insertions(+), 57 deletions(-) create mode 100644 google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java create mode 100644 google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java create mode 100644 google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java diff --git a/README.md b/README.md index 1f853d2fe..4c618b20e 100644 --- a/README.md +++ b/README.md @@ -46,12 +46,12 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-storage - 2.53.0 + 2.53.1 com.google.cloud google-cloud-storage-control - 2.53.0 + 2.53.1 ``` @@ -347,6 +347,13 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/ | Set Public Access Prevention Inherited | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/SetPublicAccessPreventionInherited.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/SetPublicAccessPreventionInherited.java) | | Set Retention Policy | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/SetRetentionPolicy.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/SetRetentionPolicy.java) | | Set Soft Delete Policy | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/SetSoftDeletePolicy.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/SetSoftDeletePolicy.java) | +| Anywhere Cache Create | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java) | +| Anywhere Cache Disable | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java) | +| Anywhere Cache Get | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java) | +| Anywhere Cache List | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java) | +| Anywhere Cache Pause | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java) | +| Anywhere Cache Resume | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java) | +| Anywhere Cache Update | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java) | | Create Folder | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/CreateFolder.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/CreateFolder.java) | | Create Hierarchical Namespace Bucket | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/CreateHierarchicalNamespaceBucket.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/CreateHierarchicalNamespaceBucket.java) | | Delete Folder | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolder.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolder.java) | diff --git a/generation_config.yaml b/generation_config.yaml index 86fc804ae..2e0613f7c 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,5 +1,5 @@ gapic_generator_version: 2.59.0 -googleapis_commitish: 3a45aa38968f4fe537cd3837c0e95af8c189b11b +googleapis_commitish: d57057715ebe652819419146472b09c14729d054 libraries_bom_version: 26.61.0 libraries: - api_shortname: storage diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index ee1ee7768..e840b72f9 100644 --- a/google-cloud-storage-control/pom.xml +++ b/google-cloud-storage-control/pom.xml @@ -47,11 +47,27 @@ com.google.api gax + + com.google.api + gax + test + testlib + com.google.api gax-grpc + + com.google.api + gax-httpjson + + + com.google.api + gax-httpjson + test + testlib + com.google.guava guava @@ -71,6 +87,11 @@ com.google.api.grpc grpc-google-cloud-storage-control-v2 + + com.google.http-client + google-http-client + test + diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java index 46840a92d..ac92b5907 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java @@ -18,7 +18,9 @@ import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; +import com.google.api.core.BetaApi; import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.httpjson.longrunning.OperationsClient; import com.google.api.gax.longrunning.OperationFuture; import com.google.api.gax.paging.AbstractFixedSizeCollection; import com.google.api.gax.paging.AbstractPage; @@ -28,7 +30,6 @@ import com.google.api.gax.rpc.UnaryCallable; import com.google.common.util.concurrent.MoreExecutors; import com.google.longrunning.Operation; -import com.google.longrunning.OperationsClient; import com.google.protobuf.Empty; import com.google.protobuf.FieldMask; import com.google.storage.control.v2.stub.StorageControlStub; @@ -547,13 +548,28 @@ * StorageControlClient storageControlClient = StorageControlClient.create(storageControlSettings); * } * + *

To use REST (HTTP1.1/JSON) transport (instead of gRPC) for sending and receiving requests over + * the wire: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * StorageControlSettings storageControlSettings =
+ *     StorageControlSettings.newHttpJsonBuilder().build();
+ * StorageControlClient storageControlClient = StorageControlClient.create(storageControlSettings);
+ * }
+ * *

Please refer to the GitHub repository's samples for more quickstart code snippets. */ @Generated("by gapic-generator-java") public class StorageControlClient implements BackgroundResource { private final StorageControlSettings settings; private final StorageControlStub stub; - private final OperationsClient operationsClient; + private final OperationsClient httpJsonOperationsClient; + private final com.google.longrunning.OperationsClient operationsClient; /** Constructs an instance of StorageControlClient with default settings. */ public static final StorageControlClient create() throws IOException { @@ -585,13 +601,17 @@ public static final StorageControlClient create(StorageControlStub stub) { protected StorageControlClient(StorageControlSettings settings) throws IOException { this.settings = settings; this.stub = ((StorageControlStubSettings) settings.getStubSettings()).createStub(); - this.operationsClient = OperationsClient.create(this.stub.getOperationsStub()); + this.operationsClient = + com.google.longrunning.OperationsClient.create(this.stub.getOperationsStub()); + this.httpJsonOperationsClient = OperationsClient.create(this.stub.getHttpJsonOperationsStub()); } protected StorageControlClient(StorageControlStub stub) { this.settings = null; this.stub = stub; - this.operationsClient = OperationsClient.create(this.stub.getOperationsStub()); + this.operationsClient = + com.google.longrunning.OperationsClient.create(this.stub.getOperationsStub()); + this.httpJsonOperationsClient = OperationsClient.create(this.stub.getHttpJsonOperationsStub()); } public final StorageControlSettings getSettings() { @@ -606,10 +626,19 @@ public StorageControlStub getStub() { * Returns the OperationsClient that can be used to query the status of a long-running operation * returned by another API method call. */ - public final OperationsClient getOperationsClient() { + public final com.google.longrunning.OperationsClient getOperationsClient() { return operationsClient; } + /** + * Returns the OperationsClient that can be used to query the status of a long-running operation + * returned by another API method call. + */ + @BetaApi + public final OperationsClient getHttpJsonOperationsClient() { + return httpJsonOperationsClient; + } + // AUTO-GENERATED DOCUMENTATION AND METHOD. /** * Creates a new folder. This operation is only applicable to a hierarchical namespace enabled diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java index a7bee17da..286869bcc 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java @@ -21,9 +21,11 @@ import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.core.ApiFunction; +import com.google.api.core.BetaApi; import com.google.api.gax.core.GoogleCredentialsProvider; import com.google.api.gax.core.InstantiatingExecutorProvider; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; +import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider; import com.google.api.gax.rpc.ApiClientHeaderProvider; import com.google.api.gax.rpc.ClientContext; import com.google.api.gax.rpc.ClientSettings; @@ -297,11 +299,18 @@ public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilde return StorageControlStubSettings.defaultCredentialsProviderBuilder(); } - /** Returns a builder for the default ChannelProvider for this service. */ + /** Returns a builder for the default gRPC ChannelProvider for this service. */ public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { return StorageControlStubSettings.defaultGrpcTransportProviderBuilder(); } + /** Returns a builder for the default REST ChannelProvider for this service. */ + @BetaApi + public static InstantiatingHttpJsonChannelProvider.Builder + defaultHttpJsonTransportProviderBuilder() { + return StorageControlStubSettings.defaultHttpJsonTransportProviderBuilder(); + } + public static TransportChannelProvider defaultTransportChannelProvider() { return StorageControlStubSettings.defaultTransportChannelProvider(); } @@ -310,11 +319,16 @@ public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuil return StorageControlStubSettings.defaultApiClientHeaderProviderBuilder(); } - /** Returns a new builder for this class. */ + /** Returns a new gRPC builder for this class. */ public static Builder newBuilder() { return Builder.createDefault(); } + /** Returns a new REST builder for this class. */ + public static Builder newHttpJsonBuilder() { + return Builder.createHttpJsonDefault(); + } + /** Returns a new builder for this class. */ public static Builder newBuilder(ClientContext clientContext) { return new Builder(clientContext); @@ -352,6 +366,10 @@ private static Builder createDefault() { return new Builder(StorageControlStubSettings.newBuilder()); } + private static Builder createHttpJsonDefault() { + return new Builder(StorageControlStubSettings.newHttpJsonBuilder()); + } + public StorageControlStubSettings.Builder getStubSettingsBuilder() { return ((StorageControlStubSettings.Builder) getStubSettings()); } diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java new file mode 100644 index 000000000..dac9e0655 --- /dev/null +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java @@ -0,0 +1,101 @@ +/* + * 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 com.google.storage.control.v2.stub; + +import com.google.api.gax.httpjson.HttpJsonCallSettings; +import com.google.api.gax.httpjson.HttpJsonCallableFactory; +import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable; +import com.google.api.gax.httpjson.HttpJsonStubCallableFactory; +import com.google.api.gax.httpjson.longrunning.stub.OperationsStub; +import com.google.api.gax.rpc.BatchingCallSettings; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.OperationCallSettings; +import com.google.api.gax.rpc.OperationCallable; +import com.google.api.gax.rpc.PagedCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallable; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.longrunning.Operation; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * REST callable factory implementation for the StorageControl service API. + * + *

This class is for advanced usage. + */ +@Generated("by gapic-generator-java") +public class HttpJsonStorageControlCallableFactory + implements HttpJsonStubCallableFactory { + + @Override + public UnaryCallable createUnaryCallable( + HttpJsonCallSettings httpJsonCallSettings, + UnaryCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createUnaryCallable( + httpJsonCallSettings, callSettings, clientContext); + } + + @Override + public + UnaryCallable createPagedCallable( + HttpJsonCallSettings httpJsonCallSettings, + PagedCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createPagedCallable( + httpJsonCallSettings, callSettings, clientContext); + } + + @Override + public UnaryCallable createBatchingCallable( + HttpJsonCallSettings httpJsonCallSettings, + BatchingCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createBatchingCallable( + httpJsonCallSettings, callSettings, clientContext); + } + + @Override + public + OperationCallable createOperationCallable( + HttpJsonCallSettings httpJsonCallSettings, + OperationCallSettings callSettings, + ClientContext clientContext, + OperationsStub operationsStub) { + UnaryCallable innerCallable = + HttpJsonCallableFactory.createBaseUnaryCallable( + httpJsonCallSettings, callSettings.getInitialCallSettings(), clientContext); + HttpJsonOperationSnapshotCallable initialCallable = + new HttpJsonOperationSnapshotCallable( + innerCallable, + httpJsonCallSettings.getMethodDescriptor().getOperationSnapshotFactory()); + return HttpJsonCallableFactory.createOperationCallable( + callSettings, clientContext, operationsStub.longRunningClient(), initialCallable); + } + + @Override + public + ServerStreamingCallable createServerStreamingCallable( + HttpJsonCallSettings httpJsonCallSettings, + ServerStreamingCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createServerStreamingCallable( + httpJsonCallSettings, callSettings, clientContext); + } +} diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java new file mode 100644 index 000000000..9aed10cfc --- /dev/null +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java @@ -0,0 +1,727 @@ +/* + * 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 com.google.storage.control.v2.stub; + +import com.google.api.core.InternalApi; +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.core.BackgroundResourceAggregation; +import com.google.api.gax.httpjson.ApiMethodDescriptor; +import com.google.api.gax.httpjson.HttpJsonCallSettings; +import com.google.api.gax.httpjson.HttpJsonStubCallableFactory; +import com.google.api.gax.httpjson.ProtoMessageRequestFormatter; +import com.google.api.gax.httpjson.ProtoMessageResponseParser; +import com.google.api.gax.httpjson.ProtoRestSerializer; +import com.google.api.gax.httpjson.longrunning.stub.HttpJsonOperationsStub; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.RequestParamsBuilder; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.longrunning.Operation; +import com.google.protobuf.Empty; +import com.google.protobuf.TypeRegistry; +import com.google.storage.control.v2.AnywhereCache; +import com.google.storage.control.v2.CreateAnywhereCacheMetadata; +import com.google.storage.control.v2.CreateAnywhereCacheRequest; +import com.google.storage.control.v2.CreateFolderRequest; +import com.google.storage.control.v2.CreateManagedFolderRequest; +import com.google.storage.control.v2.DeleteFolderRequest; +import com.google.storage.control.v2.DeleteManagedFolderRequest; +import com.google.storage.control.v2.DisableAnywhereCacheRequest; +import com.google.storage.control.v2.Folder; +import com.google.storage.control.v2.GetAnywhereCacheRequest; +import com.google.storage.control.v2.GetFolderIntelligenceConfigRequest; +import com.google.storage.control.v2.GetFolderRequest; +import com.google.storage.control.v2.GetManagedFolderRequest; +import com.google.storage.control.v2.GetOrganizationIntelligenceConfigRequest; +import com.google.storage.control.v2.GetProjectIntelligenceConfigRequest; +import com.google.storage.control.v2.GetStorageLayoutRequest; +import com.google.storage.control.v2.IntelligenceConfig; +import com.google.storage.control.v2.ListAnywhereCachesRequest; +import com.google.storage.control.v2.ListAnywhereCachesResponse; +import com.google.storage.control.v2.ListFoldersRequest; +import com.google.storage.control.v2.ListFoldersResponse; +import com.google.storage.control.v2.ListManagedFoldersRequest; +import com.google.storage.control.v2.ListManagedFoldersResponse; +import com.google.storage.control.v2.ManagedFolder; +import com.google.storage.control.v2.PauseAnywhereCacheRequest; +import com.google.storage.control.v2.RenameFolderMetadata; +import com.google.storage.control.v2.RenameFolderRequest; +import com.google.storage.control.v2.ResumeAnywhereCacheRequest; +import com.google.storage.control.v2.StorageLayout; +import com.google.storage.control.v2.UpdateAnywhereCacheMetadata; +import com.google.storage.control.v2.UpdateAnywhereCacheRequest; +import com.google.storage.control.v2.UpdateFolderIntelligenceConfigRequest; +import com.google.storage.control.v2.UpdateOrganizationIntelligenceConfigRequest; +import com.google.storage.control.v2.UpdateProjectIntelligenceConfigRequest; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * REST stub implementation for the StorageControl service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@Generated("by gapic-generator-java") +public class HttpJsonStorageControlStub extends StorageControlStub { + private static final TypeRegistry typeRegistry = + TypeRegistry.newBuilder() + .add(RenameFolderMetadata.getDescriptor()) + .add(Folder.getDescriptor()) + .add(AnywhereCache.getDescriptor()) + .add(UpdateAnywhereCacheMetadata.getDescriptor()) + .add(CreateAnywhereCacheMetadata.getDescriptor()) + .build(); + + private static final ApiMethodDescriptor + getProjectIntelligenceConfigMethodDescriptor = + ApiMethodDescriptor.newBuilder() + .setFullMethodName( + "google.storage.control.v2.StorageControl/GetProjectIntelligenceConfig") + .setHttpMethod("GET") + .setType(ApiMethodDescriptor.MethodType.UNARY) + .setRequestFormatter( + ProtoMessageRequestFormatter.newBuilder() + .setPath( + "/v2/{name=projects/*/locations/*/intelligenceConfig}", + request -> { + Map fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putPathParam(fields, "name", request.getName()); + return fields; + }) + .setQueryParamsExtractor( + request -> { + Map> fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int"); + return fields; + }) + .setRequestBodyExtractor(request -> null) + .build()) + .setResponseParser( + ProtoMessageResponseParser.newBuilder() + .setDefaultInstance(IntelligenceConfig.getDefaultInstance()) + .setDefaultTypeRegistry(typeRegistry) + .build()) + .build(); + + private static final ApiMethodDescriptor< + UpdateProjectIntelligenceConfigRequest, IntelligenceConfig> + updateProjectIntelligenceConfigMethodDescriptor = + ApiMethodDescriptor + .newBuilder() + .setFullMethodName( + "google.storage.control.v2.StorageControl/UpdateProjectIntelligenceConfig") + .setHttpMethod("PATCH") + .setType(ApiMethodDescriptor.MethodType.UNARY) + .setRequestFormatter( + ProtoMessageRequestFormatter.newBuilder() + .setPath( + "/v2/{intelligenceConfig.name=projects/*/locations/*/intelligenceConfig}", + request -> { + Map fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putPathParam( + fields, + "intelligenceConfig.name", + request.getIntelligenceConfig().getName()); + return fields; + }) + .setQueryParamsExtractor( + request -> { + Map> fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "requestId", request.getRequestId()); + serializer.putQueryParam(fields, "updateMask", request.getUpdateMask()); + serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int"); + return fields; + }) + .setRequestBodyExtractor( + request -> + ProtoRestSerializer.create() + .toBody( + "intelligenceConfig", request.getIntelligenceConfig(), true)) + .build()) + .setResponseParser( + ProtoMessageResponseParser.newBuilder() + .setDefaultInstance(IntelligenceConfig.getDefaultInstance()) + .setDefaultTypeRegistry(typeRegistry) + .build()) + .build(); + + private static final ApiMethodDescriptor + getFolderIntelligenceConfigMethodDescriptor = + ApiMethodDescriptor.newBuilder() + .setFullMethodName( + "google.storage.control.v2.StorageControl/GetFolderIntelligenceConfig") + .setHttpMethod("GET") + .setType(ApiMethodDescriptor.MethodType.UNARY) + .setRequestFormatter( + ProtoMessageRequestFormatter.newBuilder() + .setPath( + "/v2/{name=folders/*/locations/*/intelligenceConfig}", + request -> { + Map fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putPathParam(fields, "name", request.getName()); + return fields; + }) + .setQueryParamsExtractor( + request -> { + Map> fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int"); + return fields; + }) + .setRequestBodyExtractor(request -> null) + .build()) + .setResponseParser( + ProtoMessageResponseParser.newBuilder() + .setDefaultInstance(IntelligenceConfig.getDefaultInstance()) + .setDefaultTypeRegistry(typeRegistry) + .build()) + .build(); + + private static final ApiMethodDescriptor< + UpdateFolderIntelligenceConfigRequest, IntelligenceConfig> + updateFolderIntelligenceConfigMethodDescriptor = + ApiMethodDescriptor + .newBuilder() + .setFullMethodName( + "google.storage.control.v2.StorageControl/UpdateFolderIntelligenceConfig") + .setHttpMethod("PATCH") + .setType(ApiMethodDescriptor.MethodType.UNARY) + .setRequestFormatter( + ProtoMessageRequestFormatter.newBuilder() + .setPath( + "/v2/{intelligenceConfig.name=folders/*/locations/*/intelligenceConfig}", + request -> { + Map fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putPathParam( + fields, + "intelligenceConfig.name", + request.getIntelligenceConfig().getName()); + return fields; + }) + .setQueryParamsExtractor( + request -> { + Map> fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "requestId", request.getRequestId()); + serializer.putQueryParam(fields, "updateMask", request.getUpdateMask()); + serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int"); + return fields; + }) + .setRequestBodyExtractor( + request -> + ProtoRestSerializer.create() + .toBody( + "intelligenceConfig", request.getIntelligenceConfig(), true)) + .build()) + .setResponseParser( + ProtoMessageResponseParser.newBuilder() + .setDefaultInstance(IntelligenceConfig.getDefaultInstance()) + .setDefaultTypeRegistry(typeRegistry) + .build()) + .build(); + + private static final ApiMethodDescriptor< + GetOrganizationIntelligenceConfigRequest, IntelligenceConfig> + getOrganizationIntelligenceConfigMethodDescriptor = + ApiMethodDescriptor + .newBuilder() + .setFullMethodName( + "google.storage.control.v2.StorageControl/GetOrganizationIntelligenceConfig") + .setHttpMethod("GET") + .setType(ApiMethodDescriptor.MethodType.UNARY) + .setRequestFormatter( + ProtoMessageRequestFormatter + .newBuilder() + .setPath( + "/v2/{name=organizations/*/locations/*/intelligenceConfig}", + request -> { + Map fields = new HashMap<>(); + ProtoRestSerializer + serializer = ProtoRestSerializer.create(); + serializer.putPathParam(fields, "name", request.getName()); + return fields; + }) + .setQueryParamsExtractor( + request -> { + Map> fields = new HashMap<>(); + ProtoRestSerializer + serializer = ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int"); + return fields; + }) + .setRequestBodyExtractor(request -> null) + .build()) + .setResponseParser( + ProtoMessageResponseParser.newBuilder() + .setDefaultInstance(IntelligenceConfig.getDefaultInstance()) + .setDefaultTypeRegistry(typeRegistry) + .build()) + .build(); + + private static final ApiMethodDescriptor< + UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig> + updateOrganizationIntelligenceConfigMethodDescriptor = + ApiMethodDescriptor + .newBuilder() + .setFullMethodName( + "google.storage.control.v2.StorageControl/UpdateOrganizationIntelligenceConfig") + .setHttpMethod("PATCH") + .setType(ApiMethodDescriptor.MethodType.UNARY) + .setRequestFormatter( + ProtoMessageRequestFormatter + .newBuilder() + .setPath( + "/v2/{intelligenceConfig.name=organizations/*/locations/*/intelligenceConfig}", + request -> { + Map fields = new HashMap<>(); + ProtoRestSerializer + serializer = ProtoRestSerializer.create(); + serializer.putPathParam( + fields, + "intelligenceConfig.name", + request.getIntelligenceConfig().getName()); + return fields; + }) + .setQueryParamsExtractor( + request -> { + Map> fields = new HashMap<>(); + ProtoRestSerializer + serializer = ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "requestId", request.getRequestId()); + serializer.putQueryParam(fields, "updateMask", request.getUpdateMask()); + serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int"); + return fields; + }) + .setRequestBodyExtractor( + request -> + ProtoRestSerializer.create() + .toBody( + "intelligenceConfig", request.getIntelligenceConfig(), true)) + .build()) + .setResponseParser( + ProtoMessageResponseParser.newBuilder() + .setDefaultInstance(IntelligenceConfig.getDefaultInstance()) + .setDefaultTypeRegistry(typeRegistry) + .build()) + .build(); + + private final UnaryCallable + getProjectIntelligenceConfigCallable; + private final UnaryCallable + updateProjectIntelligenceConfigCallable; + private final UnaryCallable + getFolderIntelligenceConfigCallable; + private final UnaryCallable + updateFolderIntelligenceConfigCallable; + private final UnaryCallable + getOrganizationIntelligenceConfigCallable; + private final UnaryCallable + updateOrganizationIntelligenceConfigCallable; + + private final BackgroundResource backgroundResources; + private final HttpJsonOperationsStub httpJsonOperationsStub; + private final HttpJsonStubCallableFactory callableFactory; + + public static final HttpJsonStorageControlStub create(StorageControlStubSettings settings) + throws IOException { + return new HttpJsonStorageControlStub(settings, ClientContext.create(settings)); + } + + public static final HttpJsonStorageControlStub create(ClientContext clientContext) + throws IOException { + return new HttpJsonStorageControlStub( + StorageControlStubSettings.newHttpJsonBuilder().build(), clientContext); + } + + public static final HttpJsonStorageControlStub create( + ClientContext clientContext, HttpJsonStubCallableFactory callableFactory) throws IOException { + return new HttpJsonStorageControlStub( + StorageControlStubSettings.newHttpJsonBuilder().build(), clientContext, callableFactory); + } + + /** + * Constructs an instance of HttpJsonStorageControlStub, using the given settings. This is + * protected so that it is easy to make a subclass, but otherwise, the static factory methods + * should be preferred. + */ + protected HttpJsonStorageControlStub( + StorageControlStubSettings settings, ClientContext clientContext) throws IOException { + this(settings, clientContext, new HttpJsonStorageControlCallableFactory()); + } + + /** + * Constructs an instance of HttpJsonStorageControlStub, using the given settings. This is + * protected so that it is easy to make a subclass, but otherwise, the static factory methods + * should be preferred. + */ + protected HttpJsonStorageControlStub( + StorageControlStubSettings settings, + ClientContext clientContext, + HttpJsonStubCallableFactory callableFactory) + throws IOException { + this.callableFactory = callableFactory; + this.httpJsonOperationsStub = + HttpJsonOperationsStub.create(clientContext, callableFactory, typeRegistry); + + HttpJsonCallSettings + getProjectIntelligenceConfigTransportSettings = + HttpJsonCallSettings + .newBuilder() + .setMethodDescriptor(getProjectIntelligenceConfigMethodDescriptor) + .setTypeRegistry(typeRegistry) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add("name", String.valueOf(request.getName())); + return builder.build(); + }) + .build(); + HttpJsonCallSettings + updateProjectIntelligenceConfigTransportSettings = + HttpJsonCallSettings + .newBuilder() + .setMethodDescriptor(updateProjectIntelligenceConfigMethodDescriptor) + .setTypeRegistry(typeRegistry) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add( + "intelligence_config.name", + String.valueOf(request.getIntelligenceConfig().getName())); + return builder.build(); + }) + .build(); + HttpJsonCallSettings + getFolderIntelligenceConfigTransportSettings = + HttpJsonCallSettings + .newBuilder() + .setMethodDescriptor(getFolderIntelligenceConfigMethodDescriptor) + .setTypeRegistry(typeRegistry) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add("name", String.valueOf(request.getName())); + return builder.build(); + }) + .build(); + HttpJsonCallSettings + updateFolderIntelligenceConfigTransportSettings = + HttpJsonCallSettings + .newBuilder() + .setMethodDescriptor(updateFolderIntelligenceConfigMethodDescriptor) + .setTypeRegistry(typeRegistry) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add( + "intelligence_config.name", + String.valueOf(request.getIntelligenceConfig().getName())); + return builder.build(); + }) + .build(); + HttpJsonCallSettings + getOrganizationIntelligenceConfigTransportSettings = + HttpJsonCallSettings + .newBuilder() + .setMethodDescriptor(getOrganizationIntelligenceConfigMethodDescriptor) + .setTypeRegistry(typeRegistry) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add("name", String.valueOf(request.getName())); + return builder.build(); + }) + .build(); + HttpJsonCallSettings + updateOrganizationIntelligenceConfigTransportSettings = + HttpJsonCallSettings + .newBuilder() + .setMethodDescriptor(updateOrganizationIntelligenceConfigMethodDescriptor) + .setTypeRegistry(typeRegistry) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add( + "intelligence_config.name", + String.valueOf(request.getIntelligenceConfig().getName())); + return builder.build(); + }) + .build(); + + this.getProjectIntelligenceConfigCallable = + callableFactory.createUnaryCallable( + getProjectIntelligenceConfigTransportSettings, + settings.getProjectIntelligenceConfigSettings(), + clientContext); + this.updateProjectIntelligenceConfigCallable = + callableFactory.createUnaryCallable( + updateProjectIntelligenceConfigTransportSettings, + settings.updateProjectIntelligenceConfigSettings(), + clientContext); + this.getFolderIntelligenceConfigCallable = + callableFactory.createUnaryCallable( + getFolderIntelligenceConfigTransportSettings, + settings.getFolderIntelligenceConfigSettings(), + clientContext); + this.updateFolderIntelligenceConfigCallable = + callableFactory.createUnaryCallable( + updateFolderIntelligenceConfigTransportSettings, + settings.updateFolderIntelligenceConfigSettings(), + clientContext); + this.getOrganizationIntelligenceConfigCallable = + callableFactory.createUnaryCallable( + getOrganizationIntelligenceConfigTransportSettings, + settings.getOrganizationIntelligenceConfigSettings(), + clientContext); + this.updateOrganizationIntelligenceConfigCallable = + callableFactory.createUnaryCallable( + updateOrganizationIntelligenceConfigTransportSettings, + settings.updateOrganizationIntelligenceConfigSettings(), + clientContext); + + this.backgroundResources = + new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + } + + @InternalApi + public static List getMethodDescriptors() { + List methodDescriptors = new ArrayList<>(); + methodDescriptors.add(getProjectIntelligenceConfigMethodDescriptor); + methodDescriptors.add(updateProjectIntelligenceConfigMethodDescriptor); + methodDescriptors.add(getFolderIntelligenceConfigMethodDescriptor); + methodDescriptors.add(updateFolderIntelligenceConfigMethodDescriptor); + methodDescriptors.add(getOrganizationIntelligenceConfigMethodDescriptor); + methodDescriptors.add(updateOrganizationIntelligenceConfigMethodDescriptor); + return methodDescriptors; + } + + public HttpJsonOperationsStub getHttpJsonOperationsStub() { + return httpJsonOperationsStub; + } + + @Override + public UnaryCallable + getProjectIntelligenceConfigCallable() { + return getProjectIntelligenceConfigCallable; + } + + @Override + public UnaryCallable + updateProjectIntelligenceConfigCallable() { + return updateProjectIntelligenceConfigCallable; + } + + @Override + public UnaryCallable + getFolderIntelligenceConfigCallable() { + return getFolderIntelligenceConfigCallable; + } + + @Override + public UnaryCallable + updateFolderIntelligenceConfigCallable() { + return updateFolderIntelligenceConfigCallable; + } + + @Override + public UnaryCallable + getOrganizationIntelligenceConfigCallable() { + return getOrganizationIntelligenceConfigCallable; + } + + @Override + public UnaryCallable + updateOrganizationIntelligenceConfigCallable() { + return updateOrganizationIntelligenceConfigCallable; + } + + @Override + public UnaryCallable createFolderCallable() { + throw new UnsupportedOperationException( + "Not implemented: createFolderCallable(). REST transport is not implemented for this method" + + " yet."); + } + + @Override + public UnaryCallable deleteFolderCallable() { + throw new UnsupportedOperationException( + "Not implemented: deleteFolderCallable(). REST transport is not implemented for this method" + + " yet."); + } + + @Override + public UnaryCallable getFolderCallable() { + throw new UnsupportedOperationException( + "Not implemented: getFolderCallable(). REST transport is not implemented for this method" + + " yet."); + } + + @Override + public UnaryCallable listFoldersCallable() { + throw new UnsupportedOperationException( + "Not implemented: listFoldersCallable(). REST transport is not implemented for this method" + + " yet."); + } + + @Override + public UnaryCallable renameFolderCallable() { + throw new UnsupportedOperationException( + "Not implemented: renameFolderCallable(). REST transport is not implemented for this method" + + " yet."); + } + + @Override + public UnaryCallable getStorageLayoutCallable() { + throw new UnsupportedOperationException( + "Not implemented: getStorageLayoutCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable createManagedFolderCallable() { + throw new UnsupportedOperationException( + "Not implemented: createManagedFolderCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable deleteManagedFolderCallable() { + throw new UnsupportedOperationException( + "Not implemented: deleteManagedFolderCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable getManagedFolderCallable() { + throw new UnsupportedOperationException( + "Not implemented: getManagedFolderCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable + listManagedFoldersCallable() { + throw new UnsupportedOperationException( + "Not implemented: listManagedFoldersCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable createAnywhereCacheCallable() { + throw new UnsupportedOperationException( + "Not implemented: createAnywhereCacheCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable updateAnywhereCacheCallable() { + throw new UnsupportedOperationException( + "Not implemented: updateAnywhereCacheCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable disableAnywhereCacheCallable() { + throw new UnsupportedOperationException( + "Not implemented: disableAnywhereCacheCallable(). REST transport is not implemented for" + + " this method yet."); + } + + @Override + public UnaryCallable pauseAnywhereCacheCallable() { + throw new UnsupportedOperationException( + "Not implemented: pauseAnywhereCacheCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable resumeAnywhereCacheCallable() { + throw new UnsupportedOperationException( + "Not implemented: resumeAnywhereCacheCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable getAnywhereCacheCallable() { + throw new UnsupportedOperationException( + "Not implemented: getAnywhereCacheCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public UnaryCallable + listAnywhereCachesCallable() { + throw new UnsupportedOperationException( + "Not implemented: listAnywhereCachesCallable(). REST transport is not implemented for this" + + " method yet."); + } + + @Override + public final void close() { + try { + backgroundResources.close(); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new IllegalStateException("Failed to close resource", e); + } + } + + @Override + public void shutdown() { + backgroundResources.shutdown(); + } + + @Override + public boolean isShutdown() { + return backgroundResources.isShutdown(); + } + + @Override + public boolean isTerminated() { + return backgroundResources.isTerminated(); + } + + @Override + public void shutdownNow() { + backgroundResources.shutdownNow(); + } + + @Override + public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException { + return backgroundResources.awaitTermination(duration, unit); + } +} diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java index 30efedc18..5bab8877f 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java @@ -72,7 +72,11 @@ public abstract class StorageControlStub implements BackgroundResource { public OperationsStub getOperationsStub() { - throw new UnsupportedOperationException("Not implemented: getOperationsStub()"); + return null; + } + + public com.google.api.gax.httpjson.longrunning.stub.OperationsStub getHttpJsonOperationsStub() { + return null; } public UnaryCallable createFolderCallable() { diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java index 629353b74..d0191ad46 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java @@ -22,6 +22,7 @@ import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; +import com.google.api.core.BetaApi; import com.google.api.core.ObsoleteApi; import com.google.api.gax.core.GaxProperties; import com.google.api.gax.core.GoogleCredentialsProvider; @@ -30,6 +31,9 @@ import com.google.api.gax.grpc.GrpcTransportChannel; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.grpc.ProtoOperationTransformers; +import com.google.api.gax.httpjson.GaxHttpJsonProperties; +import com.google.api.gax.httpjson.HttpJsonTransportChannel; +import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider; import com.google.api.gax.longrunning.OperationSnapshot; import com.google.api.gax.longrunning.OperationTimedPollAlgorithm; import com.google.api.gax.retrying.RetrySettings; @@ -554,6 +558,11 @@ public StorageControlStub createStub() throws IOException { .equals(GrpcTransportChannel.getGrpcTransportName())) { return GrpcStorageControlStub.create(this); } + if (getTransportChannelProvider() + .getTransportName() + .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) { + return HttpJsonStorageControlStub.create(this); + } throw new UnsupportedOperationException( String.format( "Transport not supported: %s", getTransportChannelProvider().getTransportName())); @@ -593,17 +602,24 @@ public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilde .setUseJwtAccessWithScope(true); } - /** Returns a builder for the default ChannelProvider for this service. */ + /** Returns a builder for the default gRPC ChannelProvider for this service. */ public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { return InstantiatingGrpcChannelProvider.newBuilder() .setMaxInboundMessageSize(Integer.MAX_VALUE); } + /** Returns a builder for the default REST ChannelProvider for this service. */ + @BetaApi + public static InstantiatingHttpJsonChannelProvider.Builder + defaultHttpJsonTransportProviderBuilder() { + return InstantiatingHttpJsonChannelProvider.newBuilder(); + } + public static TransportChannelProvider defaultTransportChannelProvider() { return defaultGrpcTransportProviderBuilder().build(); } - public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() { return ApiClientHeaderProvider.newBuilder() .setGeneratedLibToken( "gapic", GaxProperties.getLibraryVersion(StorageControlStubSettings.class)) @@ -611,11 +627,29 @@ public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuil GaxGrpcProperties.getGrpcTokenName(), GaxGrpcProperties.getGrpcVersion()); } - /** Returns a new builder for this class. */ + public static ApiClientHeaderProvider.Builder defaultHttpJsonApiClientHeaderProviderBuilder() { + return ApiClientHeaderProvider.newBuilder() + .setGeneratedLibToken( + "gapic", GaxProperties.getLibraryVersion(StorageControlStubSettings.class)) + .setTransportToken( + GaxHttpJsonProperties.getHttpJsonTokenName(), + GaxHttpJsonProperties.getHttpJsonVersion()); + } + + public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + return StorageControlStubSettings.defaultGrpcApiClientHeaderProviderBuilder(); + } + + /** Returns a new gRPC builder for this class. */ public static Builder newBuilder() { return Builder.createDefault(); } + /** Returns a new REST builder for this class. */ + public static Builder newHttpJsonBuilder() { + return Builder.createHttpJsonDefault(); + } + /** Returns a new builder for this class. */ public static Builder newBuilder(ClientContext clientContext) { return new Builder(clientContext); @@ -912,6 +946,18 @@ private static Builder createDefault() { return initDefaults(builder); } + private static Builder createHttpJsonDefault() { + Builder builder = new Builder(((ClientContext) null)); + + builder.setTransportChannelProvider(defaultHttpJsonTransportProviderBuilder().build()); + builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build()); + builder.setInternalHeaderProvider(defaultHttpJsonApiClientHeaderProviderBuilder().build()); + builder.setMtlsEndpoint(getDefaultMtlsEndpoint()); + builder.setSwitchToMtlsEndpointAllowed(true); + + return initDefaults(builder); + } + private static Builder initDefaults(Builder builder) { builder .createFolderSettings() diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java new file mode 100644 index 000000000..e2769bba9 --- /dev/null +++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java @@ -0,0 +1,690 @@ +/* + * 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 com.google.storage.control.v2; + +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.httpjson.GaxHttpJsonProperties; +import com.google.api.gax.httpjson.testing.MockHttpService; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.ApiException; +import com.google.api.gax.rpc.ApiExceptionFactory; +import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.api.gax.rpc.StatusCode; +import com.google.api.gax.rpc.testing.FakeStatusCode; +import com.google.protobuf.FieldMask; +import com.google.protobuf.Timestamp; +import com.google.storage.control.v2.stub.HttpJsonStorageControlStub; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +@Generated("by gapic-generator-java") +public class StorageControlClientHttpJsonTest { + private static MockHttpService mockService; + private static StorageControlClient client; + + @BeforeClass + public static void startStaticServer() throws IOException { + mockService = + new MockHttpService( + HttpJsonStorageControlStub.getMethodDescriptors(), + StorageControlSettings.getDefaultEndpoint()); + StorageControlSettings settings = + StorageControlSettings.newHttpJsonBuilder() + .setTransportChannelProvider( + StorageControlSettings.defaultHttpJsonTransportProviderBuilder() + .setHttpTransport(mockService) + .build()) + .setCredentialsProvider(NoCredentialsProvider.create()) + .build(); + client = StorageControlClient.create(settings); + } + + @AfterClass + public static void stopServer() { + client.close(); + } + + @Before + public void setUp() {} + + @After + public void tearDown() throws Exception { + mockService.reset(); + } + + @Test + public void createFolderUnsupportedMethodTest() throws Exception { + // The createFolder() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void deleteFolderUnsupportedMethodTest() throws Exception { + // The deleteFolder() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void getFolderUnsupportedMethodTest() throws Exception { + // The getFolder() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void listFoldersUnsupportedMethodTest() throws Exception { + // The listFolders() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void renameFolderUnsupportedMethodTest() throws Exception { + // The renameFolder() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void getStorageLayoutUnsupportedMethodTest() throws Exception { + // The getStorageLayout() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void createManagedFolderUnsupportedMethodTest() throws Exception { + // The createManagedFolder() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void deleteManagedFolderUnsupportedMethodTest() throws Exception { + // The deleteManagedFolder() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void getManagedFolderUnsupportedMethodTest() throws Exception { + // The getManagedFolder() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void listManagedFoldersUnsupportedMethodTest() throws Exception { + // The listManagedFolders() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void createAnywhereCacheUnsupportedMethodTest() throws Exception { + // The createAnywhereCache() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void updateAnywhereCacheUnsupportedMethodTest() throws Exception { + // The updateAnywhereCache() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void disableAnywhereCacheUnsupportedMethodTest() throws Exception { + // The disableAnywhereCache() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void pauseAnywhereCacheUnsupportedMethodTest() throws Exception { + // The pauseAnywhereCache() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void resumeAnywhereCacheUnsupportedMethodTest() throws Exception { + // The resumeAnywhereCache() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void getAnywhereCacheUnsupportedMethodTest() throws Exception { + // The getAnywhereCache() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void listAnywhereCachesUnsupportedMethodTest() throws Exception { + // The listAnywhereCaches() method is not supported in REST transport. + // This empty test is generated for technical reasons. + } + + @Test + public void getProjectIntelligenceConfigTest() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + IntelligenceConfigName name = + IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]"); + + IntelligenceConfig actualResponse = client.getProjectIntelligenceConfig(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void getProjectIntelligenceConfigExceptionTest() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + IntelligenceConfigName name = + IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]"); + client.getProjectIntelligenceConfig(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getProjectIntelligenceConfigTest2() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + String name = "projects/project-8842/locations/location-8842/intelligenceConfig"; + + IntelligenceConfig actualResponse = client.getProjectIntelligenceConfig(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void getProjectIntelligenceConfigExceptionTest2() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + String name = "projects/project-8842/locations/location-8842/intelligenceConfig"; + client.getProjectIntelligenceConfig(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void updateProjectIntelligenceConfigTest() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + IntelligenceConfig intelligenceConfig = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + + IntelligenceConfig actualResponse = + client.updateProjectIntelligenceConfig(intelligenceConfig, updateMask); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void updateProjectIntelligenceConfigExceptionTest() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + IntelligenceConfig intelligenceConfig = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]") + .toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + client.updateProjectIntelligenceConfig(intelligenceConfig, updateMask); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getFolderIntelligenceConfigTest() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + IntelligenceConfigName name = + IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]"); + + IntelligenceConfig actualResponse = client.getFolderIntelligenceConfig(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void getFolderIntelligenceConfigExceptionTest() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + IntelligenceConfigName name = + IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]"); + client.getFolderIntelligenceConfig(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getFolderIntelligenceConfigTest2() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + String name = "folders/folder-8383/locations/location-8383/intelligenceConfig"; + + IntelligenceConfig actualResponse = client.getFolderIntelligenceConfig(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void getFolderIntelligenceConfigExceptionTest2() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + String name = "folders/folder-8383/locations/location-8383/intelligenceConfig"; + client.getFolderIntelligenceConfig(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void updateFolderIntelligenceConfigTest() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + IntelligenceConfig intelligenceConfig = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + + IntelligenceConfig actualResponse = + client.updateFolderIntelligenceConfig(intelligenceConfig, updateMask); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void updateFolderIntelligenceConfigExceptionTest() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + IntelligenceConfig intelligenceConfig = + IntelligenceConfig.newBuilder() + .setName( + IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + client.updateFolderIntelligenceConfig(intelligenceConfig, updateMask); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getOrganizationIntelligenceConfigTest() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + IntelligenceConfigName name = IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]"); + + IntelligenceConfig actualResponse = client.getOrganizationIntelligenceConfig(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void getOrganizationIntelligenceConfigExceptionTest() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + IntelligenceConfigName name = IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]"); + client.getOrganizationIntelligenceConfig(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getOrganizationIntelligenceConfigTest2() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + String name = "organizations/organization-1958/locations/location-1958/intelligenceConfig"; + + IntelligenceConfig actualResponse = client.getOrganizationIntelligenceConfig(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void getOrganizationIntelligenceConfigExceptionTest2() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + String name = "organizations/organization-1958/locations/location-1958/intelligenceConfig"; + client.getOrganizationIntelligenceConfig(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void updateOrganizationIntelligenceConfigTest() throws Exception { + IntelligenceConfig expectedResponse = + IntelligenceConfig.newBuilder() + .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + mockService.addResponse(expectedResponse); + + IntelligenceConfig intelligenceConfig = + IntelligenceConfig.newBuilder() + .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + + IntelligenceConfig actualResponse = + client.updateOrganizationIntelligenceConfig(intelligenceConfig, updateMask); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void updateOrganizationIntelligenceConfigExceptionTest() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + IntelligenceConfig intelligenceConfig = + IntelligenceConfig.newBuilder() + .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString()) + .setUpdateTime(Timestamp.newBuilder().build()) + .setFilter(IntelligenceConfig.Filter.newBuilder().build()) + .setEffectiveIntelligenceConfig( + IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build()) + .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build()) + .build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + client.updateOrganizationIntelligenceConfig(intelligenceConfig, updateMask); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } +} diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java index d9736906c..496b4e38a 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java @@ -32,14 +32,13 @@ public static void anywhereCacheCreate(String bucketName, String cacheName, Stri throws InterruptedException, ExecutionException, IOException { try (StorageControlClient storageControl = StorageControlClient.create()) { - CreateAnywhereCacheRequest request = CreateAnywhereCacheRequest.newBuilder() - // Set project to "_" to signify globally scoped bucket - .setParent(BucketName.format("_", bucketName)) - .setAnywhereCache(AnywhereCache.newBuilder() - .setName(cacheName) - .setZone(zoneName) - .build()) - .build(); + CreateAnywhereCacheRequest request = + CreateAnywhereCacheRequest.newBuilder() + // Set project to "_" to signify globally scoped bucket + .setParent(BucketName.format("_", bucketName)) + .setAnywhereCache( + AnywhereCache.newBuilder().setName(cacheName).setZone(zoneName).build()) + .build(); // Start a long-running operation (LRO). OperationFuture operation = @@ -50,6 +49,5 @@ public static void anywhereCacheCreate(String bucketName, String cacheName, Stri System.out.printf("Created anywhere cache: %s%n", anywhereCache.getName()); } } - } // [END storage_control_create_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java index c334268aa..272efc91e 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java @@ -28,15 +28,13 @@ public final class AnywhereCacheDisable { public static void anywhereCacheDisable(String cacheName) throws IOException { try (StorageControlClient storageControl = StorageControlClient.create()) { - DisableAnywhereCacheRequest request = DisableAnywhereCacheRequest.newBuilder() - .setName(cacheName) - .build(); + DisableAnywhereCacheRequest request = + DisableAnywhereCacheRequest.newBuilder().setName(cacheName).build(); AnywhereCache anywhereCache = storageControl.disableAnywhereCache(request); System.out.printf("Disabled anywhere cache: %s%n", anywhereCache.getName()); } } - } // [END storage_control_disable_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java index 978d56679..917dd3f2c 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java @@ -28,15 +28,13 @@ public final class AnywhereCacheGet { public static void anywhereCacheGet(String cacheName) throws IOException { try (StorageControlClient storageControl = StorageControlClient.create()) { - GetAnywhereCacheRequest request = GetAnywhereCacheRequest.newBuilder() - .setName(cacheName) - .build(); + GetAnywhereCacheRequest request = + GetAnywhereCacheRequest.newBuilder().setName(cacheName).build(); AnywhereCache anywhereCache = storageControl.getAnywhereCache(request); System.out.printf("Got anywhere cache: %s%n", anywhereCache.getName()); } } - } // [END storage_control_get_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java index 95285f265..70c0f1271 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java @@ -30,9 +30,10 @@ public final class AnywhereCacheList { public static void anywhereCacheList(String bucketName) throws IOException { try (StorageControlClient storageControl = StorageControlClient.create()) { - ListAnywhereCachesRequest request = ListAnywhereCachesRequest.newBuilder() - .setParent(BucketName.format("_", bucketName)) - .build(); + ListAnywhereCachesRequest request = + ListAnywhereCachesRequest.newBuilder() + .setParent(BucketName.format("_", bucketName)) + .build(); ListAnywhereCachesPagedResponse page = storageControl.listAnywhereCaches(request); for (AnywhereCache anywhereCache : page.iterateAll()) { @@ -40,6 +41,5 @@ public static void anywhereCacheList(String bucketName) throws IOException { } } } - } // [END storage_control_list_anywhere_caches] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java index 6cea55759..bf4a20d75 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java @@ -28,15 +28,13 @@ public final class AnywhereCachePause { public static void anywhereCachePause(String cacheName) throws IOException { try (StorageControlClient storageControl = StorageControlClient.create()) { - PauseAnywhereCacheRequest request = PauseAnywhereCacheRequest.newBuilder() - .setName(cacheName) - .build(); + PauseAnywhereCacheRequest request = + PauseAnywhereCacheRequest.newBuilder().setName(cacheName).build(); AnywhereCache anywhereCache = storageControl.pauseAnywhereCache(request); System.out.printf("Paused anywhere cache: %s%n", anywhereCache.getName()); } } - } // [END storage_control_pause_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java index 3a2467466..db02a6f3d 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java @@ -28,15 +28,13 @@ public final class AnywhereCacheResume { public static void anywhereCacheResume(String cacheName) throws IOException { try (StorageControlClient storageControl = StorageControlClient.create()) { - ResumeAnywhereCacheRequest request = ResumeAnywhereCacheRequest.newBuilder() - .setName(cacheName) - .build(); + ResumeAnywhereCacheRequest request = + ResumeAnywhereCacheRequest.newBuilder().setName(cacheName).build(); AnywhereCache anywhereCache = storageControl.resumeAnywhereCache(request); System.out.printf("Resumed anywhere cache: %s%n", anywhereCache.getName()); } } - } // [END storage_control_resume_anywhere_cache] diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java index 5cb666f29..558d66db6 100644 --- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java +++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java @@ -33,19 +33,14 @@ public static void anywhereCacheUpdate(String cacheName, String admissionPolicy) throws InterruptedException, ExecutionException, IOException { try (StorageControlClient storageControl = StorageControlClient.create()) { - AnywhereCache pendingUpdate = AnywhereCache.newBuilder() - .setName(cacheName) - .setAdmissionPolicy(admissionPolicy) - .build(); - - UpdateAnywhereCacheRequest request = UpdateAnywhereCacheRequest.newBuilder() - .setAnywhereCache(pendingUpdate) - .setUpdateMask( - FieldMask.newBuilder() - .addPaths("admission_policy") - .build() - ) - .build(); + AnywhereCache pendingUpdate = + AnywhereCache.newBuilder().setName(cacheName).setAdmissionPolicy(admissionPolicy).build(); + + UpdateAnywhereCacheRequest request = + UpdateAnywhereCacheRequest.newBuilder() + .setAnywhereCache(pendingUpdate) + .setUpdateMask(FieldMask.newBuilder().addPaths("admission_policy").build()) + .build(); // Start a long-running operation (LRO). OperationFuture operation = @@ -56,6 +51,5 @@ public static void anywhereCacheUpdate(String cacheName, String admissionPolicy) System.out.printf("Updated anywhere cache: %s%n", updatedAnywhereCache.getName()); } } - } // [END storage_control_update_anywhere_cache] From 626499d082224ab8e784f57c6a1a276c5cbfcbc2 Mon Sep 17 00:00:00 2001 From: Diego Marquez Date: Wed, 25 Jun 2025 17:33:11 -0400 Subject: [PATCH 10/13] chore: manage hermetic_library_generation action version via Hermetic Build only (#3170) The fix https://github.com/googleapis/sdk-platform-java/pull/3800 was meant for GraalVM image versions. The regression in #3169, however, affects the hermetic_library_generation GH action instead, which is not in the sdk-platform-java template, but java-storage does not consume the renovate.json template as per its owlbot.py. --- renovate.json | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/renovate.json b/renovate.json index 6ee6e25a9..2ae8e2330 100644 --- a/renovate.json +++ b/renovate.json @@ -20,16 +20,6 @@ "matchStrings": ["uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v(?.+?)\\n"], "depNameTemplate": "com.google.cloud:sdk-platform-java-config", "datasourceTemplate": "maven" - }, - { - "fileMatch": [ - ".github/workflows/hermetic_library_generation.yaml" - ], - "matchStrings": [ - "uses: googleapis/sdk-platform-java/.github/scripts@v(?.+?)\\n" - ], - "depNameTemplate": "com.google.api:gapic-generator-java", - "datasourceTemplate": "maven" } ], "packageRules": [ From aa6b7cbd2edc999b761237e3a86cf3f0424c5606 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 26 Jun 2025 00:13:07 +0200 Subject: [PATCH 11/13] test(deps): update dependency io.github.classgraph:classgraph to v4.8.180 (#3168) --- google-cloud-storage/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 211a19937..e8464b0ab 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -331,7 +331,7 @@ io.github.classgraph classgraph - 4.8.179 + 4.8.180 test From 895bfbda902a77d16a33fe5238349a6b3d397c10 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Wed, 25 Jun 2025 18:13:59 -0400 Subject: [PATCH 12/13] fix: fix Journaling BlobWriteSessionConfig to properly handle multiple consecutive retries (#3166) * Clear copy buffer used to load bytes from the recovery file so, we don't have dangling bytes from a previous retry * Do not add to the cumulative crc32c when retrying. The bytes have already been added in the first attempt. --- ...ndUploadUnbufferedWritableByteChannel.java | 32 ++- ...fferedWritableByteChannelPropertyTest.java | 208 ++++++++++++++++++ .../storage/it/ChecksummedTestContent.java | 4 + 3 files changed, 236 insertions(+), 8 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java index c07e51f53..7c9451f82 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java @@ -149,7 +149,7 @@ private GatheringByteChannel openSync() throws IOException { return sync; } - private WriteObjectRequest processSegment(ChunkSegment segment) { + private WriteObjectRequest processSegment(ChunkSegment segment, boolean updateCumulativeCrc32c) { WriteObjectRequest.Builder builder = writeCtx.newRequestBuilder(); if (!first) { builder.clearUploadId().clearWriteObjectSpec().clearObjectChecksums(); @@ -162,9 +162,11 @@ private WriteObjectRequest processSegment(ChunkSegment segment) { int contentSize = b.size(); // update ctx state that tracks overall progress - writeCtx - .getCumulativeCrc32c() - .accumulateAndGet(crc32c, chunkSegmenter.getHasher()::nullSafeConcat); + if (updateCumulativeCrc32c) { + writeCtx + .getCumulativeCrc32c() + .accumulateAndGet(crc32c, chunkSegmenter.getHasher()::nullSafeConcat); + } // resolve current offset and set next long offset = writeCtx.getTotalSentBytes().getAndAdd(contentSize); @@ -202,6 +204,7 @@ private WriteObjectRequest.Builder finishMessage(WriteObjectRequest.Builder b) { return b; } + @SuppressWarnings("ConstantValue") private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) { AtomicBoolean recover = new AtomicBoolean(false); retrier.run( @@ -211,9 +214,16 @@ private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) { sync.close(); } boolean shouldRecover = recover.getAndSet(true); + // each ChunkSegment will always have its checksum computed, but if a retry happens, and + // we need to rewind and build a new ChunkSegment, we don't want to add it to the + // cumulativeCrc32c value because that will make it appear as the bytes are duplicated. + // If we send "ABCD", get an error and find only "AB" to have been persisted, we don't + // want to add "CD" to the cumulative crc32c as that would be equivalent to "ABCDCD". + boolean updateCumulativeCrc32c = !shouldRecover; if (!shouldRecover) { for (ChunkSegment segment : segments) { - WriteObjectRequest writeObjectRequest = processSegment(segment); + WriteObjectRequest writeObjectRequest = + processSegment(segment, updateCumulativeCrc32c); stream.onNext(writeObjectRequest); } @@ -247,17 +257,22 @@ private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) { first = true; writeCtx.getTotalSentBytes().set(persistedSize); writeCtx.getConfirmedBytes().set(persistedSize); - writeCtx.getCumulativeCrc32c().set(null); // todo: can we rewind checksum? + // intentionally do not modify the cumulativeCrc32c value + // this will stay in the state in sync with what has been written to disk + // when we recover, checksum the individual message but not the cumulative try (SeekableByteChannel reader = rf.reader()) { reader.position(persistedSize); ByteBuffer buf = copyBuffer.get(); + // clear before read, in case an error was thrown before + buf.clear(); while (Buffers.fillFrom(buf, reader) != -1) { buf.flip(); while (buf.hasRemaining()) { ChunkSegment[] recoverySegments = chunkSegmenter.segmentBuffer(buf); for (ChunkSegment segment : recoverySegments) { - WriteObjectRequest writeObjectRequest = processSegment(segment); + WriteObjectRequest writeObjectRequest = + processSegment(segment, updateCumulativeCrc32c); stream.onNext(writeObjectRequest); } } @@ -280,7 +295,8 @@ private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) { } } long newWritten = writeCtx.getTotalSentBytes().get(); - Preconditions.checkState(newWritten == goalSize, "%s == %s", newWritten, goalSize); + Preconditions.checkState( + newWritten == goalSize, "newWritten == goalSize (%s == %s)", newWritten, goalSize); return null; }, Decoder.identity()); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java index 4ed8f25ed..fd4f0fd58 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java @@ -16,6 +16,7 @@ package com.google.cloud.storage; +import static com.google.cloud.storage.TestUtils.apiException; import static com.google.cloud.storage.TestUtils.assertAll; import static com.google.cloud.storage.TestUtils.defaultRetryingDeps; import static com.google.cloud.storage.TestUtils.xxd; @@ -31,17 +32,23 @@ import com.google.api.gax.rpc.ApiExceptions; import com.google.api.gax.rpc.UnavailableException; import com.google.cloud.storage.BufferedWritableByteChannelSession.BufferedWritableByteChannel; +import com.google.cloud.storage.Conversions.Decoder; import com.google.cloud.storage.Retrying.DefaultRetrier; import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.Alg; import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.RequestStream; import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.ResponseStream; import com.google.cloud.storage.UnbufferedWritableByteChannelSession.UnbufferedWritableByteChannel; import com.google.cloud.storage.UnifiedOpts.Opts; +import com.google.cloud.storage.it.ChecksummedTestContent; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Ints; import com.google.protobuf.ByteString; +import com.google.protobuf.Message; +import com.google.protobuf.TextFormat; import com.google.storage.v2.Object; +import com.google.storage.v2.ObjectChecksums; import com.google.storage.v2.QueryWriteStatusRequest; import com.google.storage.v2.QueryWriteStatusResponse; import com.google.storage.v2.StartResumableWriteRequest; @@ -50,10 +57,12 @@ import com.google.storage.v2.StorageGrpc.StorageImplBase; import com.google.storage.v2.WriteObjectRequest; import com.google.storage.v2.WriteObjectResponse; +import com.google.storage.v2.WriteObjectSpec; import io.grpc.Status; import io.grpc.Status.Code; import io.grpc.stub.StreamObserver; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; @@ -76,6 +85,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import net.jqwik.api.Arbitraries; @@ -372,6 +382,204 @@ void testUploads(@ForAll("scenario") Scenario s) throws Exception { } } + @Example + void multipleRetriesAgainstFakeServer() throws Exception { + ChecksummedTestContent content = + ChecksummedTestContent.of(DataGenerator.base64Characters().genBytes(17)); + + String uploadId = UUID.randomUUID().toString(); + StartResumableWriteRequest reqStart = + StartResumableWriteRequest.newBuilder() + .setWriteObjectSpec( + WriteObjectSpec.newBuilder() + .setResource( + Object.newBuilder().setBucket("projects/_/buckets/b").setName("o").build()) + .build()) + .build(); + StartResumableWriteResponse resStart = + StartResumableWriteResponse.newBuilder().setUploadId(uploadId).build(); + QueryWriteStatusRequest reqQuery = + QueryWriteStatusRequest.newBuilder().setUploadId(uploadId).build(); + QueryWriteStatusResponse resQuery = + QueryWriteStatusResponse.newBuilder().setPersistedSize(8).build(); + WriteObjectRequest reqWrite0 = + WriteObjectRequest.newBuilder() + .setUploadId(uploadId) + .setWriteOffset(0) + .setChecksummedData(content.slice(0, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite2 = + WriteObjectRequest.newBuilder() + .setWriteOffset(2) + .setChecksummedData(content.slice(2, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite4 = + WriteObjectRequest.newBuilder() + .setWriteOffset(4) + .setChecksummedData(content.slice(4, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite6 = + WriteObjectRequest.newBuilder() + .setWriteOffset(6) + .setChecksummedData(content.slice(6, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite8 = + WriteObjectRequest.newBuilder() + .setWriteOffset(8) + .setChecksummedData(content.slice(8, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite8WithUploadId = reqWrite8.toBuilder().setUploadId(uploadId).build(); + WriteObjectRequest reqWrite10 = + WriteObjectRequest.newBuilder() + .setWriteOffset(10) + .setChecksummedData(content.slice(10, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite12 = + WriteObjectRequest.newBuilder() + .setWriteOffset(12) + .setChecksummedData(content.slice(12, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite14 = + WriteObjectRequest.newBuilder() + .setWriteOffset(14) + .setChecksummedData(content.slice(14, 2).asChecksummedData()) + .build(); + WriteObjectRequest reqWrite16 = + WriteObjectRequest.newBuilder() + .setWriteOffset(16) + .setChecksummedData(content.slice(16, 1).asChecksummedData()) + .build(); + WriteObjectRequest reqFinish = + WriteObjectRequest.newBuilder() + .setFinishWrite(true) + .setObjectChecksums(ObjectChecksums.newBuilder().setCrc32C(content.getCrc32c()).build()) + .mergeFrom(reqWrite16) + .build(); + WriteObjectResponse resFinish = + WriteObjectResponse.newBuilder() + .setResource( + reqStart.getWriteObjectSpec().getResource().toBuilder() + .setGeneration(1) + .setSize(17) + .setChecksums( + ObjectChecksums.newBuilder() + .setCrc32C(content.getCrc32c()) + .setMd5Hash(content.getMd5Bytes()) + .build()) + .build()) + .build(); + ImmutableSet allReqWrite = + ImmutableSet.of( + reqWrite0, + reqWrite2, + reqWrite4, + reqWrite6, + reqWrite8, + reqWrite10, + reqWrite12, + reqWrite14, + reqWrite16); + + AtomicInteger retryCount = new AtomicInteger(0); + StorageImplBase service = + new StorageImplBase() { + @Override + public void startResumableWrite( + StartResumableWriteRequest req, StreamObserver respond) { + if (req.equals(reqStart)) { + respond.onNext(resStart); + respond.onCompleted(); + } else { + unexpected(respond, req); + } + } + + @Override + public void queryWriteStatus( + QueryWriteStatusRequest req, StreamObserver respond) { + if (req.equals(reqQuery)) { + respond.onNext(resQuery); + respond.onCompleted(); + } else { + unexpected(respond, req); + } + } + + @Override + public StreamObserver writeObject( + StreamObserver respond) { + return new StreamObserver() { + @Override + public void onNext(WriteObjectRequest value) { + if (value.equals(reqFinish)) { + respond.onNext(resFinish); + respond.onCompleted(); + } else if (value.equals(reqWrite10)) { + int i = retryCount.get(); + if (i < 2) { + respond.onError(apiException(Code.UNAVAILABLE, "{Unavailable}")); + } + } else if (value.equals(reqWrite8WithUploadId)) { + retryCount.incrementAndGet(); + } else if (allReqWrite.contains(value)) { + // do nothing + } else { + unexpected(respond, value); + } + } + + @Override + public void onError(Throwable t) {} + + @Override + public void onCompleted() {} + }; + } + + private void unexpected(StreamObserver respond, Message msg) { + respond.onError( + apiException( + Code.UNIMPLEMENTED, + "Unexpected request { " + TextFormat.printer().shortDebugString(msg) + " }")); + } + }; + try (FakeServer fakeServer = FakeServer.of(service); + GrpcStorageImpl storage = + (GrpcStorageImpl) fakeServer.getGrpcStorageOptions().getService()) { + + BlobInfo info = BlobInfo.newBuilder("b", "o").build(); + SettableApiFuture resultFuture = SettableApiFuture.create(); + BufferHandle recoverBufferHandle = BufferHandle.allocate(2); + SyncAndUploadUnbufferedWritableByteChannel syncAndUpload = + new SyncAndUploadUnbufferedWritableByteChannel( + storage.storageClient.writeObjectCallable(), + storage.storageClient.queryWriteStatusCallable(), + resultFuture, + new ChunkSegmenter(Hasher.enabled(), ByteStringStrategy.copy(), 2, 2), + new DefaultRetrier(UnaryOperator.identity(), storage.getOptions()), + StorageRetryStrategy.getDefaultStorageRetryStrategy().getIdempotentHandler(), + new WriteCtx<>( + new ResumableWrite( + reqStart, + resStart, + id -> reqWrite0.toBuilder().clearWriteObjectSpec().setUploadId(id).build())), + recoveryFileManager.newRecoveryFile(info), + recoverBufferHandle); + try (BufferedWritableByteChannel w = + StorageByteChannels.writable() + .createSynchronized( + new DefaultBufferedWritableByteChannel(recoverBufferHandle, syncAndUpload))) { + w.write(ByteBuffer.wrap(content.getBytes())); + } + + Decoder decoder = + Conversions.grpc().blobInfo().compose(WriteObjectResponse::getResource); + BlobInfo actual = decoder.decode(resultFuture.get(3, TimeUnit.SECONDS)); + assertThat(actual.getSize()).isEqualTo(content.getBytes().length); + assertThat(actual.getCrc32c()).isEqualTo(content.getCrc32cBase64()); + } + } + static List dataFrames(long length, int segmentLength) { // todo: rethink this Random rand = new Random(length); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java index 0f40cd930..aa87e6478 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java @@ -96,6 +96,10 @@ public ChecksummedData asChecksummedData() { .build(); } + public ChecksummedTestContent slice(int begin, int length) { + return of(bytes, begin, Math.min(length, bytes.length - begin)); + } + @Override public String toString() { return MoreObjects.toStringHelper(this) From f456cc0c8f1df14513a8878e20e789afcae6f85f Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 11:20:09 -0400 Subject: [PATCH 13/13] chore(main): release 2.53.2 (#3163) * chore(main): release 2.53.2 * chore: generate libraries at Wed Jun 25 22:14:47 UTC 2025 --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: cloud-java-bot --- CHANGELOG.md | 13 +++++++++++++ README.md | 6 +++--- gapic-google-cloud-storage-v2/pom.xml | 4 ++-- google-cloud-storage-bom/pom.xml | 16 ++++++++-------- google-cloud-storage-control/pom.xml | 4 ++-- google-cloud-storage/pom.xml | 4 ++-- grpc-google-cloud-storage-control-v2/pom.xml | 4 ++-- grpc-google-cloud-storage-v2/pom.xml | 4 ++-- pom.xml | 16 ++++++++-------- proto-google-cloud-storage-control-v2/pom.xml | 4 ++-- proto-google-cloud-storage-v2/pom.xml | 4 ++-- samples/snapshot/pom.xml | 6 +++--- storage-shared-benchmarking/pom.xml | 4 ++-- versions.txt | 14 +++++++------- 14 files changed, 58 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 699c71525..f9cdcf7ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [2.53.2](https://github.com/googleapis/java-storage/compare/v2.53.1...v2.53.2) (2025-06-25) + + +### Bug Fixes + +* Fix Journaling BlobWriteSessionConfig to properly handle multiple consecutive retries ([#3166](https://github.com/googleapis/java-storage/issues/3166)) ([895bfbd](https://github.com/googleapis/java-storage/commit/895bfbda902a77d16a33fe5238349a6b3d397c10)) + + +### Dependencies + +* Update dependency com.google.cloud.opentelemetry:exporter-trace to v0.36.0 ([#3162](https://github.com/googleapis/java-storage/issues/3162)) ([41a1030](https://github.com/googleapis/java-storage/commit/41a1030a2e77036cf961a16d472068b07e624192)) +* Update sdk-platform-java dependencies ([#3164](https://github.com/googleapis/java-storage/issues/3164)) ([c22a131](https://github.com/googleapis/java-storage/commit/c22a1319d8e2d92beeb03abac6bf2af8d09d49ee)) + ## [2.53.1](https://github.com/googleapis/java-storage/compare/v2.53.0...v2.53.1) (2025-06-18) diff --git a/README.md b/README.md index 4c618b20e..bb02676de 100644 --- a/README.md +++ b/README.md @@ -66,13 +66,13 @@ implementation 'com.google.cloud:google-cloud-storage' If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-storage:2.53.1' +implementation 'com.google.cloud:google-cloud-storage:2.53.2' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.53.1" +libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.53.2" ``` ## Authentication @@ -522,7 +522,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-storage/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-storage.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.53.1 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.53.2 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml index 56eca8ee8..db04de301 100644 --- a/gapic-google-cloud-storage-v2/pom.xml +++ b/gapic-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 gapic-google-cloud-storage-v2 GRPC library for gapic-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index 45d24d207..e00fa50bb 100644 --- a/google-cloud-storage-bom/pom.xml +++ b/google-cloud-storage-bom/pom.xml @@ -19,7 +19,7 @@ 4.0.0 com.google.cloud google-cloud-storage-bom - 2.53.2-SNAPSHOT + 2.53.2 pom com.google.cloud @@ -69,37 +69,37 @@ com.google.cloud google-cloud-storage - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc proto-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.cloud google-cloud-storage-control - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.53.2-SNAPSHOT + 2.53.2 diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index e840b72f9..a3125320b 100644 --- a/google-cloud-storage-control/pom.xml +++ b/google-cloud-storage-control/pom.xml @@ -5,13 +5,13 @@ 4.0.0 com.google.cloud google-cloud-storage-control - 2.53.2-SNAPSHOT + 2.53.2 google-cloud-storage-control GRPC library for google-cloud-storage-control com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index e8464b0ab..30b340094 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 2.53.2-SNAPSHOT + 2.53.2 jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,7 +12,7 @@ com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 google-cloud-storage diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml index 088cf1b6f..121d2a91a 100644 --- a/grpc-google-cloud-storage-control-v2/pom.xml +++ b/grpc-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.53.2-SNAPSHOT + 2.53.2 grpc-google-cloud-storage-control-v2 GRPC library for google-cloud-storage com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml index ba47c0740..6736c846f 100644 --- a/grpc-google-cloud-storage-v2/pom.xml +++ b/grpc-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 grpc-google-cloud-storage-v2 GRPC library for grpc-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 diff --git a/pom.xml b/pom.xml index a0a176c59..094779165 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 2.53.2-SNAPSHOT + 2.53.2 Storage Parent https://github.com/googleapis/java-storage @@ -82,7 +82,7 @@ com.google.cloud google-cloud-storage - 2.53.2-SNAPSHOT + 2.53.2 com.google.apis @@ -104,32 +104,32 @@ com.google.api.grpc proto-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.53.2-SNAPSHOT + 2.53.2 com.google.cloud google-cloud-storage-control - 2.53.2-SNAPSHOT + 2.53.2 com.google.cloud diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml index f6ad8308f..fe4b1006e 100644 --- a/proto-google-cloud-storage-control-v2/pom.xml +++ b/proto-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.53.2-SNAPSHOT + 2.53.2 proto-google-cloud-storage-control-v2 Proto library for proto-google-cloud-storage-control-v2 com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml index 62bb3bf5b..f0e0aee9b 100644 --- a/proto-google-cloud-storage-v2/pom.xml +++ b/proto-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-v2 - 2.53.2-SNAPSHOT + 2.53.2 proto-google-cloud-storage-v2 PROTO library for proto-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 3c06dad21..da0a23de5 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,12 +28,12 @@ com.google.cloud google-cloud-storage - 2.53.2-SNAPSHOT + 2.53.2 com.google.cloud google-cloud-storage-control - 2.53.2-SNAPSHOT + 2.53.2 compile @@ -70,7 +70,7 @@ com.google.cloud google-cloud-storage - 2.53.2-SNAPSHOT + 2.53.2 tests test diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml index 46956cfd2..113548e6d 100644 --- a/storage-shared-benchmarking/pom.xml +++ b/storage-shared-benchmarking/pom.xml @@ -10,7 +10,7 @@ com.google.cloud google-cloud-storage-parent - 2.53.2-SNAPSHOT + 2.53.2 @@ -31,7 +31,7 @@ com.google.cloud google-cloud-storage - 2.53.2-SNAPSHOT + 2.53.2 tests diff --git a/versions.txt b/versions.txt index c492d1007..70ae88367 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-storage:2.53.1:2.53.2-SNAPSHOT -gapic-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT -grpc-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT -proto-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT -google-cloud-storage-control:2.53.1:2.53.2-SNAPSHOT -proto-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT -grpc-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT +google-cloud-storage:2.53.2:2.53.2 +gapic-google-cloud-storage-v2:2.53.2:2.53.2 +grpc-google-cloud-storage-v2:2.53.2:2.53.2 +proto-google-cloud-storage-v2:2.53.2:2.53.2 +google-cloud-storage-control:2.53.2:2.53.2 +proto-google-cloud-storage-control-v2:2.53.2:2.53.2 +grpc-google-cloud-storage-control-v2:2.53.2:2.53.2