From bf5c1ee3ec7f515b6139c74700baa96338ff6cea Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Tue, 29 Jul 2025 13:33:19 -0400
Subject: [PATCH 01/11] chore(main): release 2.54.1-SNAPSHOT (#3209)
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 b531898a24..72df827ebd 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.54.0
+ 2.54.1-SNAPSHOT
gapic-google-cloud-storage-v2
GRPC library for gapic-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.0
+ 2.54.1-SNAPSHOT
diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml
index d2e9a9f95f..406a292431 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.54.0
+ 2.54.1-SNAPSHOT
pom
com.google.cloud
@@ -69,37 +69,37 @@
com.google.cloud
google-cloud-storage
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.cloud
google-cloud-storage-control
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
grpc-google-cloud-storage-control-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
proto-google-cloud-storage-control-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml
index 9a2320e072..d74d78a578 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.54.0
+ 2.54.1-SNAPSHOT
google-cloud-storage-control
GRPC library for google-cloud-storage-control
com.google.cloud
google-cloud-storage-parent
- 2.54.0
+ 2.54.1-SNAPSHOT
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 245bb6ef05..9307e0277e 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
4.0.0
google-cloud-storage
- 2.54.0
+ 2.54.1-SNAPSHOT
jar
Google Cloud Storage
https://github.com/googleapis/java-storage
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-storage-parent
- 2.54.0
+ 2.54.1-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 5a3413ed0b..5a49de686a 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.54.0
+ 2.54.1-SNAPSHOT
grpc-google-cloud-storage-control-v2
GRPC library for google-cloud-storage
com.google.cloud
google-cloud-storage-parent
- 2.54.0
+ 2.54.1-SNAPSHOT
diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml
index 49beaac993..c59706d840 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.54.0
+ 2.54.1-SNAPSHOT
grpc-google-cloud-storage-v2
GRPC library for grpc-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.0
+ 2.54.1-SNAPSHOT
diff --git a/pom.xml b/pom.xml
index 02ce7678b6..396fb7b4a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-storage-parent
pom
- 2.54.0
+ 2.54.1-SNAPSHOT
Storage Parent
https://github.com/googleapis/java-storage
@@ -82,7 +82,7 @@
com.google.cloud
google-cloud-storage
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.apis
@@ -104,32 +104,32 @@
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
grpc-google-cloud-storage-control-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.api.grpc
proto-google-cloud-storage-control-v2
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.cloud
google-cloud-storage-control
- 2.54.0
+ 2.54.1-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 164d367945..ab7708f1a8 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.54.0
+ 2.54.1-SNAPSHOT
proto-google-cloud-storage-control-v2
Proto library for proto-google-cloud-storage-control-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.0
+ 2.54.1-SNAPSHOT
diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml
index 02953fb8e8..75b0b9575e 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.54.0
+ 2.54.1-SNAPSHOT
proto-google-cloud-storage-v2
PROTO library for proto-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.0
+ 2.54.1-SNAPSHOT
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 312b986661..8f7b1eb6f6 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,12 +28,12 @@
com.google.cloud
google-cloud-storage
- 2.54.0
+ 2.54.1-SNAPSHOT
com.google.cloud
google-cloud-storage-control
- 2.54.0
+ 2.54.1-SNAPSHOT
compile
@@ -70,7 +70,7 @@
com.google.cloud
google-cloud-storage
- 2.54.0
+ 2.54.1-SNAPSHOT
tests
test
diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml
index 89e8fd00a1..c6c02bb2ff 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.54.0
+ 2.54.1-SNAPSHOT
@@ -31,7 +31,7 @@
com.google.cloud
google-cloud-storage
- 2.54.0
+ 2.54.1-SNAPSHOT
tests
diff --git a/versions.txt b/versions.txt
index edce9b20a5..67be9b9ed4 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
# Format:
# module:released-version:current-version
-google-cloud-storage:2.54.0:2.54.0
-gapic-google-cloud-storage-v2:2.54.0:2.54.0
-grpc-google-cloud-storage-v2:2.54.0:2.54.0
-proto-google-cloud-storage-v2:2.54.0:2.54.0
-google-cloud-storage-control:2.54.0:2.54.0
-proto-google-cloud-storage-control-v2:2.54.0:2.54.0
-grpc-google-cloud-storage-control-v2:2.54.0:2.54.0
+google-cloud-storage:2.54.0:2.54.1-SNAPSHOT
+gapic-google-cloud-storage-v2:2.54.0:2.54.1-SNAPSHOT
+grpc-google-cloud-storage-v2:2.54.0:2.54.1-SNAPSHOT
+proto-google-cloud-storage-v2:2.54.0:2.54.1-SNAPSHOT
+google-cloud-storage-control:2.54.0:2.54.1-SNAPSHOT
+proto-google-cloud-storage-control-v2:2.54.0:2.54.1-SNAPSHOT
+grpc-google-cloud-storage-control-v2:2.54.0:2.54.1-SNAPSHOT
From b4673313b9ff389c2c52afc6e9cf1a2f9eb0e997 Mon Sep 17 00:00:00 2001
From: BenWhitehead
Date: Tue, 29 Jul 2025 15:27:32 -0400
Subject: [PATCH 02/11] samples(feat): add storage_move_object sample (#3191)
Rename existing MoveObject class to CopyDeleteObject to make it clear there is a copy and delete happening, not a move. (sample name is left `storage_move_file`).
---
.../storage/object/AtomicMoveObject.java | 80 +++++++++++++++++++
...{MoveObject.java => CopyDeleteObject.java} | 14 ++--
.../com/example/storage/ITObjectSnippets.java | 20 ++++-
3 files changed, 104 insertions(+), 10 deletions(-)
create mode 100644 samples/snippets/src/main/java/com/example/storage/object/AtomicMoveObject.java
rename samples/snippets/src/main/java/com/example/storage/object/{MoveObject.java => CopyDeleteObject.java} (88%)
diff --git a/samples/snippets/src/main/java/com/example/storage/object/AtomicMoveObject.java b/samples/snippets/src/main/java/com/example/storage/object/AtomicMoveObject.java
new file mode 100644
index 0000000000..a4f0d9cdd4
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/storage/object/AtomicMoveObject.java
@@ -0,0 +1,80 @@
+/*
+ * 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.object;
+
+// [START storage_move_object]
+
+import com.google.cloud.storage.BlobId;
+import com.google.cloud.storage.BlobInfo;
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.Storage.MoveBlobRequest;
+import com.google.cloud.storage.StorageOptions;
+
+public final class AtomicMoveObject {
+
+ public static void moveObject(
+ String projectId, String bucketName, String sourceObjectName, String targetObjectName) {
+
+ // The ID of your GCP project
+ // String projectId = "your-project-id";
+
+ // The ID of your GCS bucket
+ // String bucketName = "your-unique-bucket-name";
+
+ // The ID of your GCS object
+ // String sourceObjectName = "your-object-name";
+
+ // The ID of your GCS object
+ // String targetObjectName = "your-new-object-name";
+
+ Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
+ BlobId source = BlobId.of(bucketName, sourceObjectName);
+ BlobId target = BlobId.of(bucketName, targetObjectName);
+
+ // Optional: set a generation-match precondition to avoid potential race
+ // conditions and data corruptions. The request returns a 412 error if the
+ // preconditions are not met.
+ Storage.BlobTargetOption precondition;
+ BlobInfo existingTarget = storage.get(target);
+ if (existingTarget == null) {
+ // For a target object that does not yet exist, set the DoesNotExist precondition.
+ // This will cause the request to fail if the object is created before the request runs.
+ precondition = Storage.BlobTargetOption.doesNotExist();
+ } else {
+ // If the destination already exists in your bucket, instead set a generation-match
+ // precondition. This will cause the request to fail if the existing object's generation
+ // changes before the request runs.
+ precondition = Storage.BlobTargetOption.generationMatch(existingTarget.getGeneration());
+ }
+
+ // Atomically move source object to target object within the bucket
+ MoveBlobRequest moveBlobRequest =
+ MoveBlobRequest.newBuilder()
+ .setSource(source)
+ .setTarget(target)
+ .setTargetOptions(precondition)
+ .build();
+ BlobInfo movedBlob = storage.moveBlob(moveBlobRequest);
+
+ System.out.println(
+ "Moved object "
+ + source.toGsUtilUri()
+ + " to "
+ + movedBlob.getBlobId().toGsUtilUriWithGeneration());
+ }
+}
+// [END storage_move_object]
diff --git a/samples/snippets/src/main/java/com/example/storage/object/MoveObject.java b/samples/snippets/src/main/java/com/example/storage/object/CopyDeleteObject.java
similarity index 88%
rename from samples/snippets/src/main/java/com/example/storage/object/MoveObject.java
rename to samples/snippets/src/main/java/com/example/storage/object/CopyDeleteObject.java
index ad59fe172b..5caa756053 100644
--- a/samples/snippets/src/main/java/com/example/storage/object/MoveObject.java
+++ b/samples/snippets/src/main/java/com/example/storage/object/CopyDeleteObject.java
@@ -20,11 +20,12 @@
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
+import com.google.cloud.storage.BlobInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
-public class MoveObject {
- public static void moveObject(
+public class CopyDeleteObject {
+ public static void copyDeleteObject(
String projectId,
String sourceBucketName,
String sourceObjectName,
@@ -34,7 +35,7 @@ public static void moveObject(
// String projectId = "your-project-id";
// The ID of your GCS bucket
- // String bucketName = "your-unique-bucket-name";
+ // String sourceBucketName = "your-unique-bucket-name";
// The ID of your GCS object
// String sourceObjectName = "your-object-name";
@@ -53,7 +54,8 @@ public static void moveObject(
// conditions and data corruptions. The request returns a 412 error if the
// preconditions are not met.
Storage.BlobTargetOption precondition;
- if (storage.get(targetBucketName, targetObjectName) == null) {
+ BlobInfo existingTarget = storage.get(targetBucketName, targetObjectName);
+ if (existingTarget == null) {
// For a target object that does not yet exist, set the DoesNotExist precondition.
// This will cause the request to fail if the object is created before the request runs.
precondition = Storage.BlobTargetOption.doesNotExist();
@@ -61,9 +63,7 @@ public static void moveObject(
// If the destination already exists in your bucket, instead set a generation-match
// precondition. This will cause the request to fail if the existing object's generation
// changes before the request runs.
- precondition =
- Storage.BlobTargetOption.generationMatch(
- storage.get(targetBucketName, targetObjectName).getGeneration());
+ precondition = Storage.BlobTargetOption.generationMatch(existingTarget.getGeneration());
}
// Copy source object to target object
diff --git a/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java b/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java
index 50ffdd5492..28ceeb3081 100644
--- a/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java
+++ b/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java
@@ -26,10 +26,12 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import com.example.storage.object.AtomicMoveObject;
import com.example.storage.object.BatchSetObjectMetadata;
import com.example.storage.object.ChangeObjectCsekToKms;
import com.example.storage.object.ChangeObjectStorageClass;
import com.example.storage.object.ComposeObject;
+import com.example.storage.object.CopyDeleteObject;
import com.example.storage.object.CopyObject;
import com.example.storage.object.CopyOldVersionOfObject;
import com.example.storage.object.DeleteObject;
@@ -48,7 +50,6 @@
import com.example.storage.object.ListSoftDeletedObjects;
import com.example.storage.object.ListSoftDeletedVersionsOfObject;
import com.example.storage.object.MakeObjectPublic;
-import com.example.storage.object.MoveObject;
import com.example.storage.object.RestoreSoftDeletedObject;
import com.example.storage.object.RotateObjectEncryptionKey;
import com.example.storage.object.SetObjectMetadata;
@@ -258,7 +259,7 @@ public void testListObjectsWithPrefix() {
}
@Test
- public void testMoveObject() throws Exception {
+ public void testCopyDeleteObject() throws Exception {
String blob = generator.randomObjectName();
String newBlob = generator.randomObjectName();
@@ -270,12 +271,25 @@ public void testMoveObject() throws Exception {
String newBucket = tmpBucket.getBucket().getName();
BlobInfo gen1 = storage.create(BlobInfo.newBuilder(BlobId.of(newBucket, blob)).build());
- MoveObject.moveObject(GOOGLE_CLOUD_PROJECT, newBucket, blob, newBucket, newBlob);
+ CopyDeleteObject.copyDeleteObject(GOOGLE_CLOUD_PROJECT, newBucket, blob, newBucket, newBlob);
assertNotNull(storage.get(newBucket, newBlob));
assertNull(storage.get(bucket.getName(), blob));
}
}
+ @Test
+ public void testAtomicMoveObject() {
+ String blob1 = generator.randomObjectName();
+ String blob2 = generator.randomObjectName();
+
+ String bucketName = bucket.getName();
+ BlobInfo gen1 = storage.create(BlobInfo.newBuilder(BlobId.of(bucketName, blob1)).build());
+ AtomicMoveObject.moveObject(GOOGLE_CLOUD_PROJECT, bucketName, blob1, blob2);
+ assertThat(storage.get(bucketName, blob1)).isNull();
+ assertThat(storage.get(bucketName, blob2)).isNotNull();
+ assertThat(stdOut.getCapturedOutputAsUtf8String()).contains("Moved object");
+ }
+
@Test
public void testSetObjectMetadata() {
String bucketName = bucket.getName();
From a5c27b7c68f16071aad349af7b709ac9f3f116cb Mon Sep 17 00:00:00 2001
From: cloud-java-bot <122572305+cloud-java-bot@users.noreply.github.com>
Date: Wed, 30 Jul 2025 16:06:49 -0400
Subject: [PATCH 03/11] chore: Update generation configuration at Wed Jul 30
02:41:23 UTC 2025 (#3208)
* chore: Update generation configuration at Sat Jul 26 02:34:39 UTC 2025
* chore: Update generation configuration at Mon Jul 28 15:13:54 UTC 2025
* chore: Update generation configuration at Tue Jul 29 02:46:08 UTC 2025
* chore: Update generation configuration at Wed Jul 30 02:41:23 UTC 2025
* chore: generate libraries at Wed Jul 30 02:42:03 UTC 2025
---
README.md | 3 ++-
generation_config.yaml | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 121e155913..5977641ef6 100644
--- a/README.md
+++ b/README.md
@@ -371,10 +371,12 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/
| Get Managed Folder | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/managedfolders/GetManagedFolder.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/managedfolders/GetManagedFolder.java) |
| List Managed Folders | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/managedfolders/ListManagedFolders.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/managedfolders/ListManagedFolders.java) |
| Add Blob Owner | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/AddBlobOwner.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/object/AddBlobOwner.java) |
+| Atomic Move Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/AtomicMoveObject.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/object/AtomicMoveObject.java) |
| Batch Set Object Metadata | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/BatchSetObjectMetadata.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/object/BatchSetObjectMetadata.java) |
| Change Object Csek To Kms | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/ChangeObjectCsekToKms.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/object/ChangeObjectCsekToKms.java) |
| Change Object Storage Class | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/ChangeObjectStorageClass.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/object/ChangeObjectStorageClass.java) |
| Compose Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/ComposeObject.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/object/ComposeObject.java) |
+| Copy Delete Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/CopyDeleteObject.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/object/CopyDeleteObject.java) |
| Copy Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/CopyObject.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/object/CopyObject.java) |
| Copy Old Version Of Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/CopyOldVersionOfObject.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/object/CopyOldVersionOfObject.java) |
| Delete Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/DeleteObject.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/object/DeleteObject.java) |
@@ -395,7 +397,6 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/
| List Soft Deleted Objects | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/ListSoftDeletedObjects.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/object/ListSoftDeletedObjects.java) |
| List Soft Deleted Versions Of Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/ListSoftDeletedVersionsOfObject.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/object/ListSoftDeletedVersionsOfObject.java) |
| Make Object Public | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/MakeObjectPublic.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/object/MakeObjectPublic.java) |
-| Move Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/MoveObject.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/object/MoveObject.java) |
| Print Blob Acl | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/PrintBlobAcl.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/object/PrintBlobAcl.java) |
| Print Blob Acl For User | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/PrintBlobAclForUser.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/object/PrintBlobAclForUser.java) |
| Release Event Based Hold | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/ReleaseEventBasedHold.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/object/ReleaseEventBasedHold.java) |
diff --git a/generation_config.yaml b/generation_config.yaml
index 295ed23409..a045bb1737 100644
--- a/generation_config.yaml
+++ b/generation_config.yaml
@@ -1,5 +1,5 @@
gapic_generator_version: 2.60.2
-googleapis_commitish: fb0d8ac09cd1c2d94e9da572f0ad4692c8781410
+googleapis_commitish: 64e82d17e410ff5e71ab3e040ea393db362f2850
libraries_bom_version: 26.64.0
libraries:
- api_shortname: storage
From 7b250dd53cfa29bbb6a0a4cb4a345aeb2dab5c86 Mon Sep 17 00:00:00 2001
From: BenWhitehead
Date: Tue, 5 Aug 2025 12:28:04 -0400
Subject: [PATCH 04/11] feat: add new preview Bucket encryption policy
configuration (#3204)
* GoogleManagedEncryptionEnforcementConfig
* CustomerManagedEncryptionEnforcementConfig
* CustomerSuppliedEncryptionEnforcementConfig
---
.../clirr-ignored-differences.xml | 16 +
.../java/com/google/cloud/storage/Bucket.java | 42 ++
.../com/google/cloud/storage/BucketInfo.java | 452 +++++++++++++++++-
.../google/cloud/storage/GrpcConversions.java | 134 +++++-
.../google/cloud/storage/JsonConversions.java | 143 +++++-
.../com/google/cloud/storage/UnifiedOpts.java | 9 +-
.../jqwik/BucketArbitraryProvider.java | 2 +-
.../storage/jqwik/StorageArbitraries.java | 100 +++-
8 files changed, 879 insertions(+), 19 deletions(-)
diff --git a/google-cloud-storage/clirr-ignored-differences.xml b/google-cloud-storage/clirr-ignored-differences.xml
index 9acc213a13..0af49c35a7 100644
--- a/google-cloud-storage/clirr-ignored-differences.xml
+++ b/google-cloud-storage/clirr-ignored-differences.xml
@@ -145,4 +145,20 @@
com.google.cloud.storage.BucketInfo$Builder setIpFilter(com.google.cloud.storage.BucketInfo$IpFilter)
+
+ 7013
+ com/google/cloud/storage/BucketInfo$Builder
+ com.google.cloud.storage.BucketInfo$Builder setCustomerManagedEncryptionEnforcementConfig(com.google.cloud.storage.BucketInfo$CustomerManagedEncryptionEnforcementConfig)
+
+
+ 7013
+ com/google/cloud/storage/BucketInfo$Builder
+ com.google.cloud.storage.BucketInfo$Builder setCustomerSuppliedEncryptionEnforcementConfig(com.google.cloud.storage.BucketInfo$CustomerSuppliedEncryptionEnforcementConfig)
+
+
+ 7013
+ com/google/cloud/storage/BucketInfo$Builder
+ com.google.cloud.storage.BucketInfo$Builder setGoogleManagedEncryptionEnforcementConfig(com.google.cloud.storage.BucketInfo$GoogleManagedEncryptionEnforcementConfig)
+
+
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java
index 04fae5d3b6..e7ab9cff6f 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java
@@ -765,6 +765,30 @@ public Builder setIpFilter(IpFilter ipFilter) {
return this;
}
+ @Override
+ public Builder setGoogleManagedEncryptionEnforcementConfig(
+ GoogleManagedEncryptionEnforcementConfig googleManagedEncryptionEnforcementConfig) {
+ infoBuilder.setGoogleManagedEncryptionEnforcementConfig(
+ googleManagedEncryptionEnforcementConfig);
+ return this;
+ }
+
+ @Override
+ public Builder setCustomerManagedEncryptionEnforcementConfig(
+ CustomerManagedEncryptionEnforcementConfig customerManagedEncryptionEnforcementConfig) {
+ infoBuilder.setCustomerManagedEncryptionEnforcementConfig(
+ customerManagedEncryptionEnforcementConfig);
+ return this;
+ }
+
+ @Override
+ public Builder setCustomerSuppliedEncryptionEnforcementConfig(
+ CustomerSuppliedEncryptionEnforcementConfig customerSuppliedEncryptionEnforcementConfig) {
+ infoBuilder.setCustomerSuppliedEncryptionEnforcementConfig(
+ customerSuppliedEncryptionEnforcementConfig);
+ return this;
+ }
+
@Override
public Bucket build() {
return new Bucket(storage, infoBuilder);
@@ -955,6 +979,24 @@ Builder clearIpFilter() {
infoBuilder.clearIpFilter();
return this;
}
+
+ @Override
+ public Builder clearGoogleManagedEncryptionEnforcementConfig() {
+ infoBuilder.clearGoogleManagedEncryptionEnforcementConfig();
+ return this;
+ }
+
+ @Override
+ public Builder clearCustomerManagedEncryptionEnforcementConfig() {
+ infoBuilder.clearCustomerManagedEncryptionEnforcementConfig();
+ return this;
+ }
+
+ @Override
+ public Builder clearCustomerSuppliedEncryptionEnforcementConfig() {
+ infoBuilder.clearCustomerSuppliedEncryptionEnforcementConfig();
+ return this;
+ }
}
Bucket(Storage storage, BucketInfo.BuilderImpl infoBuilder) {
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java
index 9762251b00..837899ca95 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java
@@ -125,6 +125,12 @@ public class BucketInfo implements Serializable {
private final SoftDeletePolicy softDeletePolicy;
private final @Nullable IpFilter ipFilter;
+ private final @Nullable GoogleManagedEncryptionEnforcementConfig
+ googleManagedEncryptionEnforcementConfig;
+ private final @Nullable CustomerManagedEncryptionEnforcementConfig
+ customerManagedEncryptionEnforcementConfig;
+ private final @Nullable CustomerSuppliedEncryptionEnforcementConfig
+ customerSuppliedEncryptionEnforcementConfig;
private final transient ImmutableSet modifiedFields;
@@ -2082,6 +2088,327 @@ public VpcNetworkSource build() {
}
}
+ /**
+ * Google Managed Encryption (GMEK) enforcement config of a bucket.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static final class GoogleManagedEncryptionEnforcementConfig {
+ @Nullable private final EncryptionEnforcementRestrictionMode restrictionMode;
+ @Nullable private final OffsetDateTime effectiveTime;
+
+ private GoogleManagedEncryptionEnforcementConfig(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode,
+ @Nullable OffsetDateTime effectiveTime) {
+ this.restrictionMode = restrictionMode;
+ this.effectiveTime = effectiveTime;
+ }
+
+ /**
+ * Restriction mode for new objects within the bucket. If {@link
+ * EncryptionEnforcementRestrictionMode#NOT_RESTRICTED NotRestricted} or {@code null}, creation
+ * of new objects with google-managed encryption is allowed. If `FullyRestricted`, new objects
+ * can not be created using google-managed encryption.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public @Nullable EncryptionEnforcementRestrictionMode getRestrictionMode() {
+ return restrictionMode;
+ }
+
+ /**
+ * Output only. Time from which the config was effective.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public @Nullable OffsetDateTime getEffectiveTime() {
+ return effectiveTime;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof GoogleManagedEncryptionEnforcementConfig)) {
+ return false;
+ }
+ GoogleManagedEncryptionEnforcementConfig that = (GoogleManagedEncryptionEnforcementConfig) o;
+ return Objects.equals(restrictionMode, that.restrictionMode)
+ && Objects.equals(effectiveTime, that.effectiveTime);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(restrictionMode, effectiveTime);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("restrictionMode", restrictionMode)
+ .add("effectiveTime", effectiveTime)
+ .toString();
+ }
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static GoogleManagedEncryptionEnforcementConfig of(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode) {
+ return new GoogleManagedEncryptionEnforcementConfig(restrictionMode, null);
+ }
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static GoogleManagedEncryptionEnforcementConfig of(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode,
+ @Nullable OffsetDateTime effectiveTime) {
+ return new GoogleManagedEncryptionEnforcementConfig(restrictionMode, effectiveTime);
+ }
+ }
+
+ /**
+ * Customer Managed Encryption (CMEK) enforcement config of a bucket.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static final class CustomerManagedEncryptionEnforcementConfig {
+ @Nullable private final EncryptionEnforcementRestrictionMode restrictionMode;
+ @Nullable private final OffsetDateTime effectiveTime;
+
+ private CustomerManagedEncryptionEnforcementConfig(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode,
+ @Nullable OffsetDateTime effectiveTime) {
+ this.restrictionMode = restrictionMode;
+ this.effectiveTime = effectiveTime;
+ }
+
+ /**
+ * Restriction mode for new objects within the bucket. If {@link
+ * EncryptionEnforcementRestrictionMode#NOT_RESTRICTED NotRestricted} or {@code null}, creation
+ * of new objects with customer-managed encryption is allowed. If `FullyRestricted`, new objects
+ * can not be created using customer-managed encryption.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public @Nullable EncryptionEnforcementRestrictionMode getRestrictionMode() {
+ return restrictionMode;
+ }
+
+ /**
+ * Output only. Time from which the config was effective.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public @Nullable OffsetDateTime getEffectiveTime() {
+ return effectiveTime;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof CustomerManagedEncryptionEnforcementConfig)) {
+ return false;
+ }
+ CustomerManagedEncryptionEnforcementConfig that =
+ (CustomerManagedEncryptionEnforcementConfig) o;
+ return Objects.equals(restrictionMode, that.restrictionMode)
+ && Objects.equals(effectiveTime, that.effectiveTime);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(restrictionMode, effectiveTime);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("restrictionMode", restrictionMode)
+ .add("effectiveTime", effectiveTime)
+ .toString();
+ }
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static CustomerManagedEncryptionEnforcementConfig of(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode) {
+ return new CustomerManagedEncryptionEnforcementConfig(restrictionMode, null);
+ }
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static CustomerManagedEncryptionEnforcementConfig of(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode,
+ @Nullable OffsetDateTime effectiveTime) {
+ return new CustomerManagedEncryptionEnforcementConfig(restrictionMode, effectiveTime);
+ }
+ }
+
+ /**
+ * Customer Supplied Encryption (CSEK) enforcement config of a bucket.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static final class CustomerSuppliedEncryptionEnforcementConfig {
+ @Nullable private final EncryptionEnforcementRestrictionMode restrictionMode;
+ @Nullable private final OffsetDateTime effectiveTime;
+
+ private CustomerSuppliedEncryptionEnforcementConfig(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode,
+ @Nullable OffsetDateTime effectiveTime) {
+ this.restrictionMode = restrictionMode;
+ this.effectiveTime = effectiveTime;
+ }
+
+ /**
+ * Restriction mode for new objects within the bucket. If {@link
+ * EncryptionEnforcementRestrictionMode#NOT_RESTRICTED NotRestricted} or {@code null}, creation
+ * of new objects with customer-supplied encryption is allowed. If `FullyRestricted`, new
+ * objects can not be created using customer-supplied encryption.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public @Nullable EncryptionEnforcementRestrictionMode getRestrictionMode() {
+ return restrictionMode;
+ }
+
+ /**
+ * Output only. Time from which the config was effective.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public @Nullable OffsetDateTime getEffectiveTime() {
+ return effectiveTime;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof CustomerSuppliedEncryptionEnforcementConfig)) {
+ return false;
+ }
+ CustomerSuppliedEncryptionEnforcementConfig that =
+ (CustomerSuppliedEncryptionEnforcementConfig) o;
+ return Objects.equals(restrictionMode, that.restrictionMode)
+ && Objects.equals(effectiveTime, that.effectiveTime);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(restrictionMode, effectiveTime);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("restrictionMode", restrictionMode)
+ .add("effectiveTime", effectiveTime)
+ .toString();
+ }
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static CustomerSuppliedEncryptionEnforcementConfig of(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode) {
+ return new CustomerSuppliedEncryptionEnforcementConfig(restrictionMode, null);
+ }
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static CustomerSuppliedEncryptionEnforcementConfig of(
+ @Nullable EncryptionEnforcementRestrictionMode restrictionMode,
+ @Nullable OffsetDateTime effectiveTime) {
+ return new CustomerSuppliedEncryptionEnforcementConfig(restrictionMode, effectiveTime);
+ }
+ }
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static final class EncryptionEnforcementRestrictionMode extends StringEnumValue {
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static final EncryptionEnforcementRestrictionMode NOT_RESTRICTED =
+ new EncryptionEnforcementRestrictionMode("NotRestricted");
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static final EncryptionEnforcementRestrictionMode FULLY_RESTRICTED =
+ new EncryptionEnforcementRestrictionMode("FullyRestricted");
+
+ private static final StringEnumType type =
+ new StringEnumType<>(
+ EncryptionEnforcementRestrictionMode.class, EncryptionEnforcementRestrictionMode::new);
+
+ private EncryptionEnforcementRestrictionMode(String constant) {
+ super(constant);
+ }
+
+ /**
+ * Get the {@link EncryptionEnforcementRestrictionMode} for the given String constant, and throw
+ * an exception if the constant is not recognized.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static EncryptionEnforcementRestrictionMode valueOfStrict(String constant) {
+ return type.valueOfStrict(constant);
+ }
+
+ /**
+ * Get the {@link EncryptionEnforcementRestrictionMode} for the given String constant, and allow
+ * unrecognized values.
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static EncryptionEnforcementRestrictionMode valueOf(String constant) {
+ return type.valueOf(constant);
+ }
+
+ /**
+ * Return the known values
+ *
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public static EncryptionEnforcementRestrictionMode[] values() {
+ return type.values();
+ }
+ }
+
/** Builder for {@code BucketInfo}. */
public abstract static class Builder {
Builder() {}
@@ -2226,6 +2553,27 @@ Builder setUpdateTimeOffsetDateTime(OffsetDateTime updateTime) {
/** Sets the default Cloud KMS key name for this bucket. */
public abstract Builder setDefaultKmsKeyName(String defaultKmsKeyName);
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public abstract Builder setGoogleManagedEncryptionEnforcementConfig(
+ GoogleManagedEncryptionEnforcementConfig config);
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public abstract Builder setCustomerManagedEncryptionEnforcementConfig(
+ CustomerManagedEncryptionEnforcementConfig config);
+
+ /**
+ * @since 2.55.0 This new api is in preview and is subject to breaking changes.
+ */
+ @BetaApi
+ public abstract Builder setCustomerSuppliedEncryptionEnforcementConfig(
+ CustomerSuppliedEncryptionEnforcementConfig config);
+
/** Sets the default event-based hold for this bucket. */
@BetaApi
public abstract Builder setDefaultEventBasedHold(Boolean defaultEventBasedHold);
@@ -2354,6 +2702,12 @@ public Builder setRetentionPeriodDuration(Duration retentionPeriod) {
abstract Builder clearCustomPlacementConfig();
abstract Builder clearIpFilter();
+
+ abstract Builder clearGoogleManagedEncryptionEnforcementConfig();
+
+ abstract Builder clearCustomerManagedEncryptionEnforcementConfig();
+
+ abstract Builder clearCustomerSuppliedEncryptionEnforcementConfig();
}
static final class BuilderImpl extends Builder {
@@ -2394,6 +2748,9 @@ static final class BuilderImpl extends Builder {
private SoftDeletePolicy softDeletePolicy;
private HierarchicalNamespace hierarchicalNamespace;
private IpFilter ipFilter;
+ private GoogleManagedEncryptionEnforcementConfig googleManagedEncryptionEnforcementConfig;
+ private CustomerManagedEncryptionEnforcementConfig customerManagedEncryptionEnforcementConfig;
+ private CustomerSuppliedEncryptionEnforcementConfig customerSuppliedEncryptionEnforcementConfig;
private final ImmutableSet.Builder modifiedFields = ImmutableSet.builder();
BuilderImpl(String name) {
@@ -2436,6 +2793,12 @@ static final class BuilderImpl extends Builder {
softDeletePolicy = bucketInfo.softDeletePolicy;
hierarchicalNamespace = bucketInfo.hierarchicalNamespace;
ipFilter = bucketInfo.ipFilter;
+ googleManagedEncryptionEnforcementConfig =
+ bucketInfo.googleManagedEncryptionEnforcementConfig;
+ customerManagedEncryptionEnforcementConfig =
+ bucketInfo.customerManagedEncryptionEnforcementConfig;
+ customerSuppliedEncryptionEnforcementConfig =
+ bucketInfo.customerSuppliedEncryptionEnforcementConfig;
}
@Override
@@ -2712,6 +3075,43 @@ public Builder setDefaultKmsKeyName(String defaultKmsKeyName) {
return this;
}
+ @Override
+ public BuilderImpl setGoogleManagedEncryptionEnforcementConfig(
+ GoogleManagedEncryptionEnforcementConfig googleManagedEncryptionEnforcementConfig) {
+ if (!Objects.equals(
+ this.googleManagedEncryptionEnforcementConfig,
+ googleManagedEncryptionEnforcementConfig)) {
+ modifiedFields.add(BucketField.ENCRYPTION);
+ }
+ this.googleManagedEncryptionEnforcementConfig = googleManagedEncryptionEnforcementConfig;
+ return this;
+ }
+
+ @Override
+ public BuilderImpl setCustomerManagedEncryptionEnforcementConfig(
+ CustomerManagedEncryptionEnforcementConfig customerManagedEncryptionEnforcementConfig) {
+ if (!Objects.equals(
+ this.customerManagedEncryptionEnforcementConfig,
+ customerManagedEncryptionEnforcementConfig)) {
+ modifiedFields.add(BucketField.ENCRYPTION);
+ }
+ this.customerManagedEncryptionEnforcementConfig = customerManagedEncryptionEnforcementConfig;
+ return this;
+ }
+
+ @Override
+ public BuilderImpl setCustomerSuppliedEncryptionEnforcementConfig(
+ CustomerSuppliedEncryptionEnforcementConfig customerSuppliedEncryptionEnforcementConfig) {
+ if (!Objects.equals(
+ this.customerSuppliedEncryptionEnforcementConfig,
+ customerSuppliedEncryptionEnforcementConfig)) {
+ modifiedFields.add(BucketField.ENCRYPTION);
+ }
+ this.customerSuppliedEncryptionEnforcementConfig =
+ customerSuppliedEncryptionEnforcementConfig;
+ return this;
+ }
+
@Override
public Builder setDefaultEventBasedHold(Boolean defaultEventBasedHold) {
Boolean tmp = firstNonNull(defaultEventBasedHold, Data.nullOf(Boolean.class));
@@ -3042,6 +3442,24 @@ BuilderImpl clearIpFilter() {
return this;
}
+ @Override
+ BuilderImpl clearGoogleManagedEncryptionEnforcementConfig() {
+ this.googleManagedEncryptionEnforcementConfig = null;
+ return this;
+ }
+
+ @Override
+ BuilderImpl clearCustomerManagedEncryptionEnforcementConfig() {
+ this.customerManagedEncryptionEnforcementConfig = null;
+ return this;
+ }
+
+ @Override
+ BuilderImpl clearCustomerSuppliedEncryptionEnforcementConfig() {
+ this.customerSuppliedEncryptionEnforcementConfig = null;
+ return this;
+ }
+
private Builder clearDeleteLifecycleRules() {
if (lifecycleRules != null && !lifecycleRules.isEmpty()) {
ImmutableList nonDeleteRules =
@@ -3091,6 +3509,10 @@ private Builder clearDeleteLifecycleRules() {
softDeletePolicy = builder.softDeletePolicy;
hierarchicalNamespace = builder.hierarchicalNamespace;
ipFilter = builder.ipFilter;
+ googleManagedEncryptionEnforcementConfig = builder.googleManagedEncryptionEnforcementConfig;
+ customerManagedEncryptionEnforcementConfig = builder.customerManagedEncryptionEnforcementConfig;
+ customerSuppliedEncryptionEnforcementConfig =
+ builder.customerSuppliedEncryptionEnforcementConfig;
modifiedFields = builder.modifiedFields.build();
}
@@ -3449,6 +3871,21 @@ public HierarchicalNamespace getHierarchicalNamespace() {
return ipFilter;
}
+ public @Nullable GoogleManagedEncryptionEnforcementConfig
+ getGoogleManagedEncryptionEnforcementConfig() {
+ return googleManagedEncryptionEnforcementConfig;
+ }
+
+ public @Nullable CustomerManagedEncryptionEnforcementConfig
+ getCustomerManagedEncryptionEnforcementConfig() {
+ return customerManagedEncryptionEnforcementConfig;
+ }
+
+ public @Nullable CustomerSuppliedEncryptionEnforcementConfig
+ getCustomerSuppliedEncryptionEnforcementConfig() {
+ return customerSuppliedEncryptionEnforcementConfig;
+ }
+
/** Returns a builder for the current bucket. */
public Builder toBuilder() {
return new BuilderImpl(this);
@@ -3491,7 +3928,10 @@ public int hashCode() {
customPlacementConfig,
hierarchicalNamespace,
logging,
- ipFilter);
+ ipFilter,
+ googleManagedEncryptionEnforcementConfig,
+ customerManagedEncryptionEnforcementConfig,
+ customerSuppliedEncryptionEnforcementConfig);
}
@Override
@@ -3537,7 +3977,15 @@ public boolean equals(Object o) {
&& Objects.equals(softDeletePolicy, that.softDeletePolicy)
&& Objects.equals(hierarchicalNamespace, that.hierarchicalNamespace)
&& Objects.equals(logging, that.logging)
- && Objects.equals(ipFilter, that.ipFilter);
+ && Objects.equals(ipFilter, that.ipFilter)
+ && Objects.equals(
+ googleManagedEncryptionEnforcementConfig, that.googleManagedEncryptionEnforcementConfig)
+ && Objects.equals(
+ customerManagedEncryptionEnforcementConfig,
+ that.customerManagedEncryptionEnforcementConfig)
+ && Objects.equals(
+ customerSuppliedEncryptionEnforcementConfig,
+ that.customerSuppliedEncryptionEnforcementConfig);
}
@Override
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java
index a530c35468..a8354e6b42 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java
@@ -31,6 +31,10 @@
import com.google.cloud.storage.Acl.Role;
import com.google.cloud.storage.BlobInfo.CustomerEncryption;
import com.google.cloud.storage.BucketInfo.CustomPlacementConfig;
+import com.google.cloud.storage.BucketInfo.CustomerManagedEncryptionEnforcementConfig;
+import com.google.cloud.storage.BucketInfo.CustomerSuppliedEncryptionEnforcementConfig;
+import com.google.cloud.storage.BucketInfo.EncryptionEnforcementRestrictionMode;
+import com.google.cloud.storage.BucketInfo.GoogleManagedEncryptionEnforcementConfig;
import com.google.cloud.storage.BucketInfo.IpFilter;
import com.google.cloud.storage.BucketInfo.LifecycleRule;
import com.google.cloud.storage.BucketInfo.LifecycleRule.AbortIncompleteMPUAction;
@@ -46,6 +50,7 @@
import com.google.protobuf.Timestamp;
import com.google.storage.v2.Bucket;
import com.google.storage.v2.Bucket.Billing;
+import com.google.storage.v2.Bucket.Encryption;
import com.google.storage.v2.Bucket.IpFilter.PublicNetworkSource;
import com.google.storage.v2.Bucket.IpFilter.VpcNetworkSource;
import com.google.storage.v2.Bucket.Website;
@@ -68,7 +73,10 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.function.Function;
+import java.util.stream.Stream;
+import org.checkerframework.checker.nullness.qual.Nullable;
final class GrpcConversions {
static final GrpcConversions INSTANCE = new GrpcConversions();
@@ -164,6 +172,93 @@ final class GrpcConversions {
.atStartOfDay()
.atOffset(ZoneOffset.UTC));
+ private final Codec
+ encryptionEnforcementRestrictionModeCodec =
+ Codec.of(
+ EncryptionEnforcementRestrictionMode::toString,
+ EncryptionEnforcementRestrictionMode::valueOf);
+ private final Codec<
+ GoogleManagedEncryptionEnforcementConfig,
+ Encryption.GoogleManagedEncryptionEnforcementConfig>
+ googleManagedEncryptionEnforcementConfigCodec =
+ Codec.of(
+ from -> {
+ Encryption.GoogleManagedEncryptionEnforcementConfig.Builder to =
+ Encryption.GoogleManagedEncryptionEnforcementConfig.newBuilder();
+ ifNonNull(
+ from.getRestrictionMode(),
+ encryptionEnforcementRestrictionModeCodec::encode,
+ to::setRestrictionMode);
+ ifNonNull(from.getEffectiveTime(), timestampCodec::encode, to::setEffectiveTime);
+ return to.build();
+ },
+ from -> {
+ @Nullable EncryptionEnforcementRestrictionMode mode = null;
+ if (from.hasRestrictionMode()) {
+ mode =
+ encryptionEnforcementRestrictionModeCodec.decode(from.getRestrictionMode());
+ }
+ if (from.hasEffectiveTime()) {
+ return GoogleManagedEncryptionEnforcementConfig.of(
+ mode, timestampCodec.decode(from.getEffectiveTime()));
+ }
+ return GoogleManagedEncryptionEnforcementConfig.of(mode);
+ });
+ private final Codec<
+ CustomerManagedEncryptionEnforcementConfig,
+ Encryption.CustomerManagedEncryptionEnforcementConfig>
+ customerManagedEncryptionEnforcementConfigCodec =
+ Codec.of(
+ from -> {
+ Encryption.CustomerManagedEncryptionEnforcementConfig.Builder to =
+ Encryption.CustomerManagedEncryptionEnforcementConfig.newBuilder();
+ ifNonNull(
+ from.getRestrictionMode(),
+ encryptionEnforcementRestrictionModeCodec::encode,
+ to::setRestrictionMode);
+ ifNonNull(from.getEffectiveTime(), timestampCodec::encode, to::setEffectiveTime);
+ return to.build();
+ },
+ from -> {
+ @Nullable EncryptionEnforcementRestrictionMode mode = null;
+ if (from.hasRestrictionMode()) {
+ mode =
+ encryptionEnforcementRestrictionModeCodec.decode(from.getRestrictionMode());
+ }
+ if (from.hasEffectiveTime()) {
+ return CustomerManagedEncryptionEnforcementConfig.of(
+ mode, timestampCodec.decode(from.getEffectiveTime()));
+ }
+ return CustomerManagedEncryptionEnforcementConfig.of(mode);
+ });
+ private final Codec<
+ CustomerSuppliedEncryptionEnforcementConfig,
+ Encryption.CustomerSuppliedEncryptionEnforcementConfig>
+ customerSuppliedEncryptionEnforcementConfigCodec =
+ Codec.of(
+ from -> {
+ Encryption.CustomerSuppliedEncryptionEnforcementConfig.Builder to =
+ Encryption.CustomerSuppliedEncryptionEnforcementConfig.newBuilder();
+ ifNonNull(
+ from.getRestrictionMode(),
+ encryptionEnforcementRestrictionModeCodec::encode,
+ to::setRestrictionMode);
+ ifNonNull(from.getEffectiveTime(), timestampCodec::encode, to::setEffectiveTime);
+ return to.build();
+ },
+ from -> {
+ @Nullable EncryptionEnforcementRestrictionMode mode = null;
+ if (from.hasRestrictionMode()) {
+ mode =
+ encryptionEnforcementRestrictionModeCodec.decode(from.getRestrictionMode());
+ }
+ if (from.hasEffectiveTime()) {
+ return CustomerSuppliedEncryptionEnforcementConfig.of(
+ mode, timestampCodec.decode(from.getEffectiveTime()));
+ }
+ return CustomerSuppliedEncryptionEnforcementConfig.of(mode);
+ });
+
private GrpcConversions() {}
Codec entity() {
@@ -235,7 +330,25 @@ private BucketInfo bucketInfoDecode(Bucket from) {
to.setUpdateTimeOffsetDateTime(timestampCodec.decode(from.getUpdateTime()));
}
if (from.hasEncryption()) {
- to.setDefaultKmsKeyName(from.getEncryption().getDefaultKmsKey());
+ Encryption e = from.getEncryption();
+ if (!e.getDefaultKmsKey().isEmpty()) {
+ to.setDefaultKmsKeyName(e.getDefaultKmsKey());
+ }
+ if (e.hasGoogleManagedEncryptionEnforcementConfig()) {
+ to.setGoogleManagedEncryptionEnforcementConfig(
+ googleManagedEncryptionEnforcementConfigCodec.decode(
+ e.getGoogleManagedEncryptionEnforcementConfig()));
+ }
+ if (e.hasCustomerManagedEncryptionEnforcementConfig()) {
+ to.setCustomerManagedEncryptionEnforcementConfig(
+ customerManagedEncryptionEnforcementConfigCodec.decode(
+ e.getCustomerManagedEncryptionEnforcementConfig()));
+ }
+ if (e.hasCustomerSuppliedEncryptionEnforcementConfig()) {
+ to.setCustomerSuppliedEncryptionEnforcementConfig(
+ customerSuppliedEncryptionEnforcementConfigCodec.decode(
+ e.getCustomerSuppliedEncryptionEnforcementConfig()));
+ }
}
if (!from.getRpo().isEmpty()) {
to.setRpo(Rpo.valueOf(from.getRpo()));
@@ -333,9 +446,26 @@ private Bucket bucketInfoEncode(BucketInfo from) {
}
ifNonNull(from.getCreateTimeOffsetDateTime(), timestampCodec::encode, to::setCreateTime);
ifNonNull(from.getUpdateTimeOffsetDateTime(), timestampCodec::encode, to::setUpdateTime);
- if (from.getDefaultKmsKeyName() != null) {
+ if (Stream.of(
+ from.getDefaultKmsKeyName(),
+ from.getGoogleManagedEncryptionEnforcementConfig(),
+ from.getCustomerManagedEncryptionEnforcementConfig(),
+ from.getCustomerSuppliedEncryptionEnforcementConfig())
+ .anyMatch(Objects::nonNull)) {
Bucket.Encryption.Builder encryptionBuilder = Bucket.Encryption.newBuilder();
ifNonNull(from.getDefaultKmsKeyName(), encryptionBuilder::setDefaultKmsKey);
+ ifNonNull(
+ from.getGoogleManagedEncryptionEnforcementConfig(),
+ googleManagedEncryptionEnforcementConfigCodec::encode,
+ encryptionBuilder::setGoogleManagedEncryptionEnforcementConfig);
+ ifNonNull(
+ from.getCustomerManagedEncryptionEnforcementConfig(),
+ customerManagedEncryptionEnforcementConfigCodec::encode,
+ encryptionBuilder::setCustomerManagedEncryptionEnforcementConfig);
+ ifNonNull(
+ from.getCustomerSuppliedEncryptionEnforcementConfig(),
+ customerSuppliedEncryptionEnforcementConfigCodec::encode,
+ encryptionBuilder::setCustomerSuppliedEncryptionEnforcementConfig);
to.setEncryption(encryptionBuilder.build());
}
if (from.getIndexPage() != null || from.getNotFoundPage() != null) {
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java
index c79fa288ef..016e793a5d 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java
@@ -58,6 +58,10 @@
import com.google.cloud.storage.BlobInfo.Retention;
import com.google.cloud.storage.BucketInfo.Autoclass;
import com.google.cloud.storage.BucketInfo.CustomPlacementConfig;
+import com.google.cloud.storage.BucketInfo.CustomerManagedEncryptionEnforcementConfig;
+import com.google.cloud.storage.BucketInfo.CustomerSuppliedEncryptionEnforcementConfig;
+import com.google.cloud.storage.BucketInfo.EncryptionEnforcementRestrictionMode;
+import com.google.cloud.storage.BucketInfo.GoogleManagedEncryptionEnforcementConfig;
import com.google.cloud.storage.BucketInfo.IamConfiguration;
import com.google.cloud.storage.BucketInfo.IpFilter;
import com.google.cloud.storage.BucketInfo.LifecycleRule;
@@ -88,6 +92,8 @@
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.checkerframework.checker.nullness.qual.Nullable;
@InternalApi
final class JsonConversions {
@@ -160,6 +166,93 @@ final class JsonConversions {
private final Codec
vpcNetworkSourceCodec = Codec.of(this::vpcNetworkSourceEncode, this::vpcNetworkSourceDecode);
+ private final Codec
+ encryptionEnforcementRestrictionModeCodec =
+ Codec.of(
+ EncryptionEnforcementRestrictionMode::toString,
+ EncryptionEnforcementRestrictionMode::valueOf);
+ private final Codec<
+ GoogleManagedEncryptionEnforcementConfig,
+ Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig>
+ googleManagedEncryptionEnforcementConfigCodec =
+ Codec.of(
+ from -> {
+ Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig to =
+ new Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig();
+ ifNonNull(
+ from.getRestrictionMode(),
+ encryptionEnforcementRestrictionModeCodec::encode,
+ to::setRestrictionMode);
+ ifNonNull(from.getEffectiveTime(), dateTimeCodec::encode, to::setEffectiveTime);
+ return to;
+ },
+ from -> {
+ @Nullable EncryptionEnforcementRestrictionMode mode = null;
+ if (from.getRestrictionMode() != null) {
+ mode =
+ encryptionEnforcementRestrictionModeCodec.decode(from.getRestrictionMode());
+ }
+ if (from.getEffectiveTime() != null) {
+ return GoogleManagedEncryptionEnforcementConfig.of(
+ mode, dateTimeCodec.decode(from.getEffectiveTime()));
+ }
+ return GoogleManagedEncryptionEnforcementConfig.of(mode);
+ });
+ private final Codec<
+ CustomerManagedEncryptionEnforcementConfig,
+ Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig>
+ customerManagedEncryptionEnforcementConfigCodec =
+ Codec.of(
+ from -> {
+ Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig to =
+ new Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig();
+ ifNonNull(
+ from.getRestrictionMode(),
+ encryptionEnforcementRestrictionModeCodec::encode,
+ to::setRestrictionMode);
+ ifNonNull(from.getEffectiveTime(), dateTimeCodec::encode, to::setEffectiveTime);
+ return to;
+ },
+ from -> {
+ @Nullable EncryptionEnforcementRestrictionMode mode = null;
+ if (from.getRestrictionMode() != null) {
+ mode =
+ encryptionEnforcementRestrictionModeCodec.decode(from.getRestrictionMode());
+ }
+ if (from.getEffectiveTime() != null) {
+ return CustomerManagedEncryptionEnforcementConfig.of(
+ mode, dateTimeCodec.decode(from.getEffectiveTime()));
+ }
+ return CustomerManagedEncryptionEnforcementConfig.of(mode);
+ });
+ private final Codec<
+ CustomerSuppliedEncryptionEnforcementConfig,
+ Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig>
+ customerSuppliedEncryptionEnforcementConfigCodec =
+ Codec.of(
+ from -> {
+ Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig to =
+ new Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig();
+ ifNonNull(
+ from.getRestrictionMode(),
+ encryptionEnforcementRestrictionModeCodec::encode,
+ to::setRestrictionMode);
+ ifNonNull(from.getEffectiveTime(), dateTimeCodec::encode, to::setEffectiveTime);
+ return to;
+ },
+ from -> {
+ @Nullable EncryptionEnforcementRestrictionMode mode = null;
+ if (from.getRestrictionMode() != null) {
+ mode =
+ encryptionEnforcementRestrictionModeCodec.decode(from.getRestrictionMode());
+ }
+ if (from.getEffectiveTime() != null) {
+ return CustomerSuppliedEncryptionEnforcementConfig.of(
+ mode, dateTimeCodec.decode(from.getEffectiveTime()));
+ }
+ return CustomerSuppliedEncryptionEnforcementConfig.of(mode);
+ });
+
private JsonConversions() {}
Codec entity() {
@@ -447,10 +540,28 @@ private Bucket bucketInfoEncode(BucketInfo from) {
}
ifNonNull(from.getDefaultEventBasedHold(), to::setDefaultEventBasedHold);
- ifNonNull(
- from.getDefaultKmsKeyName(),
- k -> new Encryption().setDefaultKmsKeyName(k),
- to::setEncryption);
+ if (Stream.of(
+ from.getDefaultKmsKeyName(),
+ from.getGoogleManagedEncryptionEnforcementConfig(),
+ from.getCustomerManagedEncryptionEnforcementConfig(),
+ from.getCustomerSuppliedEncryptionEnforcementConfig())
+ .anyMatch(Objects::nonNull)) {
+ Bucket.Encryption encryptionBuilder = new Encryption();
+ ifNonNull(from.getDefaultKmsKeyName(), encryptionBuilder::setDefaultKmsKeyName);
+ ifNonNull(
+ from.getGoogleManagedEncryptionEnforcementConfig(),
+ googleManagedEncryptionEnforcementConfigCodec::encode,
+ encryptionBuilder::setGoogleManagedEncryptionEnforcementConfig);
+ ifNonNull(
+ from.getCustomerManagedEncryptionEnforcementConfig(),
+ customerManagedEncryptionEnforcementConfigCodec::encode,
+ encryptionBuilder::setCustomerManagedEncryptionEnforcementConfig);
+ ifNonNull(
+ from.getCustomerSuppliedEncryptionEnforcementConfig(),
+ customerSuppliedEncryptionEnforcementConfigCodec::encode,
+ encryptionBuilder::setCustomerSuppliedEncryptionEnforcementConfig);
+ to.setEncryption(encryptionBuilder);
+ }
Map pbLabels = from.getLabels();
if (pbLabels != null && !Data.isNull(pbLabels)) {
pbLabels = Maps.newHashMapWithExpectedSize(from.getLabels().size());
@@ -514,10 +625,26 @@ private BucketInfo bucketInfoDecode(com.google.api.services.storage.model.Bucket
ifNonNull(from.getLabels(), JsonConversions::replaceDataNullValuesWithNull, to::setLabels);
ifNonNull(from.getBilling(), Billing::getRequesterPays, to::setRequesterPays);
Encryption encryption = from.getEncryption();
- if (encryption != null
- && encryption.getDefaultKmsKeyName() != null
- && !encryption.getDefaultKmsKeyName().isEmpty()) {
- to.setDefaultKmsKeyName(encryption.getDefaultKmsKeyName());
+ if (encryption != null) {
+ String defaultKmsKeyName = encryption.getDefaultKmsKeyName();
+ if (defaultKmsKeyName != null && !encryption.getDefaultKmsKeyName().isEmpty()) {
+ to.setDefaultKmsKeyName(defaultKmsKeyName);
+ }
+ if (encryption.getGoogleManagedEncryptionEnforcementConfig() != null) {
+ to.setGoogleManagedEncryptionEnforcementConfig(
+ googleManagedEncryptionEnforcementConfigCodec.decode(
+ encryption.getGoogleManagedEncryptionEnforcementConfig()));
+ }
+ if (encryption.getCustomerManagedEncryptionEnforcementConfig() != null) {
+ to.setCustomerManagedEncryptionEnforcementConfig(
+ customerManagedEncryptionEnforcementConfigCodec.decode(
+ encryption.getCustomerManagedEncryptionEnforcementConfig()));
+ }
+ if (encryption.getCustomerSuppliedEncryptionEnforcementConfig() != null) {
+ to.setCustomerSuppliedEncryptionEnforcementConfig(
+ customerSuppliedEncryptionEnforcementConfigCodec.decode(
+ encryption.getCustomerSuppliedEncryptionEnforcementConfig()));
+ }
}
maybeDecodeRetentionPolicy(from, to);
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java
index 3444323cfd..5092f1e62d 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java
@@ -1091,7 +1091,14 @@ private Set getPaths() {
BucketField.DEFAULT_EVENT_BASED_HOLD.getGrpcName(),
BucketInfo.Builder::clearDefaultEventBasedHold)
.put(BucketField.DEFAULT_OBJECT_ACL.getGrpcName(), BucketInfo.Builder::clearDefaultAcl)
- .put(BucketField.ENCRYPTION.getGrpcName(), BucketInfo.Builder::clearDefaultKmsKeyName)
+ .put(
+ BucketField.ENCRYPTION.getGrpcName(),
+ builder ->
+ builder
+ .clearDefaultKmsKeyName()
+ .clearGoogleManagedEncryptionEnforcementConfig()
+ .clearCustomerManagedEncryptionEnforcementConfig()
+ .clearCustomerSuppliedEncryptionEnforcementConfig())
.put(BucketField.ETAG.getGrpcName(), BucketInfo.Builder::clearEtag)
.put(
BucketField.IAMCONFIGURATION.getGrpcName(),
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/BucketArbitraryProvider.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/BucketArbitraryProvider.java
index 9b71a59ac6..6e6b9e2da3 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/BucketArbitraryProvider.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/BucketArbitraryProvider.java
@@ -61,7 +61,7 @@ public Set> provideFor(TypeUsage targetType, SubtypeProvider subtyp
StorageArbitraries.bool(),
StorageArbitraries.buckets().rpo(),
StorageArbitraries.buckets().billing().injectNull(0.01),
- StorageArbitraries.buckets().encryption().injectNull(0.9),
+ StorageArbitraries.buckets().encryption(),
StorageArbitraries.buckets().retentionPolicy().injectNull(0.5),
StorageArbitraries.buckets().lifecycle().injectNull(0.5))
.as(Tuple::of),
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java
index 0b6e21d985..b9d5bd0a54 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java
@@ -26,6 +26,9 @@
import com.google.storage.v2.Bucket;
import com.google.storage.v2.Bucket.Billing;
import com.google.storage.v2.Bucket.Encryption;
+import com.google.storage.v2.Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig;
+import com.google.storage.v2.Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig;
+import com.google.storage.v2.Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig;
import com.google.storage.v2.Bucket.IpFilter;
import com.google.storage.v2.Bucket.IpFilter.PublicNetworkSource;
import com.google.storage.v2.Bucket.IpFilter.VpcNetworkSource;
@@ -49,6 +52,7 @@
import java.time.ZoneOffset;
import java.util.Locale;
import java.util.Map;
+import java.util.stream.Stream;
import net.jqwik.api.Arbitraries;
import net.jqwik.api.Arbitrary;
import net.jqwik.api.Combinators;
@@ -404,11 +408,23 @@ public Arbitrary iamConfig() {
}
public Arbitrary encryption() {
- return Arbitraries.strings()
- .all()
- .ofMinLength(1)
- .ofMaxLength(1024)
- .map(s -> Encryption.newBuilder().setDefaultKmsKey(s).build());
+ return Combinators.combine(
+ Arbitraries.strings().all().ofMinLength(1).ofMaxLength(1024).injectNull(0.9),
+ googleManagedEncryptionEnforcementConfig(),
+ customerManagedEncryptionEnforcementConfig(),
+ customerSuppliedEncryptionEnforcementConfig())
+ .flatAs(
+ (kmsKey, gmek, cmek, csek) -> {
+ if (Stream.of(kmsKey, gmek, cmek, csek).allMatch(java.util.Objects::isNull)) {
+ return Arbitraries.just(null);
+ }
+ Encryption.Builder b = Encryption.newBuilder();
+ ifNonNull(kmsKey, b::setDefaultKmsKey);
+ ifNonNull(gmek, b::setGoogleManagedEncryptionEnforcementConfig);
+ ifNonNull(cmek, b::setCustomerManagedEncryptionEnforcementConfig);
+ ifNonNull(csek, b::setCustomerSuppliedEncryptionEnforcementConfig);
+ return Arbitraries.just(b.build());
+ });
}
public Arbitrary retentionPolicy() {
@@ -506,6 +522,80 @@ Arbitrary networkResource() {
.ofMinLength(1)
.ofMaxLength(10);
}
+
+ public Arbitrary encryptionEnforcementRestrictionMode() {
+ return Arbitraries.of("NotRestricted", "FullyRestricted", "NOT_YET_DEFINED");
+ }
+
+ public Arbitrary encryptionEnforcementRestrictionModeWithoutEdgeCases() {
+ return Arbitraries.of("NotRestricted", "FullyRestricted");
+ }
+
+ public Arbitrary
+ googleManagedEncryptionEnforcementConfig() {
+ return encryptionEnforcementRestrictionMode()
+ .injectNull(0.9)
+ .flatMap(
+ mode -> {
+ if (mode == null) {
+ return Arbitraries.just(null);
+ }
+ return StorageArbitraries.timestamp()
+ .injectNull(0.5)
+ .map(
+ time -> {
+ GoogleManagedEncryptionEnforcementConfig.Builder b =
+ GoogleManagedEncryptionEnforcementConfig.newBuilder();
+ ifNonNull(time, b::setEffectiveTime);
+ b.setRestrictionMode(mode);
+ return b.build();
+ });
+ });
+ }
+
+ public Arbitrary
+ customerManagedEncryptionEnforcementConfig() {
+ return encryptionEnforcementRestrictionMode()
+ .injectNull(0.9)
+ .flatMap(
+ mode -> {
+ if (mode == null) {
+ return Arbitraries.just(null);
+ }
+ return StorageArbitraries.timestamp()
+ .injectNull(0.5)
+ .map(
+ time -> {
+ CustomerManagedEncryptionEnforcementConfig.Builder b =
+ CustomerManagedEncryptionEnforcementConfig.newBuilder();
+ ifNonNull(time, b::setEffectiveTime);
+ b.setRestrictionMode(mode);
+ return b.build();
+ });
+ });
+ }
+
+ public Arbitrary
+ customerSuppliedEncryptionEnforcementConfig() {
+ return encryptionEnforcementRestrictionMode()
+ .injectNull(0.9)
+ .flatMap(
+ mode -> {
+ if (mode == null) {
+ return Arbitraries.just(null);
+ }
+ return StorageArbitraries.timestamp()
+ .injectNull(0.5)
+ .map(
+ time -> {
+ CustomerSuppliedEncryptionEnforcementConfig.Builder b =
+ CustomerSuppliedEncryptionEnforcementConfig.newBuilder();
+ ifNonNull(time, b::setEffectiveTime);
+ b.setRestrictionMode(mode);
+ return b.build();
+ });
+ });
+ }
}
public static final class ProjectID {
From f98b686ef940879458acb1e56339adf869400b94 Mon Sep 17 00:00:00 2001
From: cloud-java-bot <122572305+cloud-java-bot@users.noreply.github.com>
Date: Tue, 5 Aug 2025 12:31:58 -0400
Subject: [PATCH 05/11] chore: Update generation configuration at Tue Aug 5
02:42:16 UTC 2025 (#3212)
---
.github/scripts/update_generation_config.sh | 2 +-
.github/workflows/hermetic_library_generation.yaml | 2 +-
.kokoro/presubmit/graalvm-native-a.cfg | 2 +-
.kokoro/presubmit/graalvm-native-b.cfg | 2 +-
.kokoro/presubmit/graalvm-native-c.cfg | 2 +-
README.md | 2 +-
generation_config.yaml | 6 +++---
7 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/.github/scripts/update_generation_config.sh b/.github/scripts/update_generation_config.sh
index 3b890a76b2..92efcf8819 100644
--- a/.github/scripts/update_generation_config.sh
+++ b/.github/scripts/update_generation_config.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-set -e
+set -ex
# This script should be run at the root of the repository.
# This script is used to update googleapis_commitish, gapic_generator_version,
# and libraries_bom_version in generation configuration at the time of running
diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml
index 876d040f32..519c2f8bfa 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.60.2
+ - uses: googleapis/sdk-platform-java/.github/scripts@v2.61.0
if: env.SHOULD_RUN == 'true'
with:
base_ref: ${{ github.base_ref }}
diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg
index 96b4fed86f..783727ef01 100644
--- a/.kokoro/presubmit/graalvm-native-a.cfg
+++ b/.kokoro/presubmit/graalvm-native-a.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.50.2" # {x-version-update:google-cloud-shared-dependencies:current}
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.51.0" # {x-version-update:google-cloud-shared-dependencies:current}
}
env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg
index 76f0483314..83c7afee07 100644
--- a/.kokoro/presubmit/graalvm-native-b.cfg
+++ b/.kokoro/presubmit/graalvm-native-b.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.50.2" # {x-version-update:google-cloud-shared-dependencies:current}
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.51.0" # {x-version-update:google-cloud-shared-dependencies:current}
}
env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-c.cfg b/.kokoro/presubmit/graalvm-native-c.cfg
index 277aa2338d..3a9bbf8c3a 100644
--- a/.kokoro/presubmit/graalvm-native-c.cfg
+++ b/.kokoro/presubmit/graalvm-native-c.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.50.2" # {x-version-update:google-cloud-shared-dependencies:current}
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.51.0" # {x-version-update:google-cloud-shared-dependencies:current}
}
env_vars: {
diff --git a/README.md b/README.md
index 5977641ef6..dc7c69c1a0 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,7 @@ If you are using Maven without the BOM, add this to your dependencies:
If you are using Gradle 5.x or later, add this to your dependencies:
```Groovy
-implementation platform('com.google.cloud:libraries-bom:26.64.0')
+implementation platform('com.google.cloud:libraries-bom:26.65.0')
implementation 'com.google.cloud:google-cloud-storage'
```
diff --git a/generation_config.yaml b/generation_config.yaml
index a045bb1737..eb49ac610b 100644
--- a/generation_config.yaml
+++ b/generation_config.yaml
@@ -1,6 +1,6 @@
-gapic_generator_version: 2.60.2
-googleapis_commitish: 64e82d17e410ff5e71ab3e040ea393db362f2850
-libraries_bom_version: 26.64.0
+gapic_generator_version: 2.61.0
+googleapis_commitish: 8c74a4f9ad52cfd7a7d1f6427fa0a0511377a395
+libraries_bom_version: 26.65.0
libraries:
- api_shortname: storage
name_pretty: Cloud Storage
From 6899a7769f0b64103091b9c6451e4af03e749a3e Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 5 Aug 2025 18:32:20 +0200
Subject: [PATCH 06/11] chore(deps): update storage release dependencies
(#3210)
---
samples/install-without-bom/pom.xml | 6 +++---
samples/snippets/pom.xml | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 73c354cb04..3c86e09195 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.3
+ 2.54.0
com.google.cloud
google-cloud-storage-control
- 2.53.3
+ 2.54.0
@@ -78,7 +78,7 @@
com.google.cloud
google-cloud-storage
- 2.53.3
+ 2.54.0
tests
test
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index ee1c188638..577f16e6fe 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -31,7 +31,7 @@
com.google.cloud
libraries-bom
- 26.64.0
+ 26.65.0
pom
import
@@ -99,7 +99,7 @@
com.google.cloud
google-cloud-storage
- 2.53.3
+ 2.54.0
tests
test
From e7a1021d2668dca12c1f07b7db709b03d454ccd4 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 5 Aug 2025 18:32:58 +0200
Subject: [PATCH 07/11] test(deps): update cross product test dependencies
(#3211)
---
google-cloud-storage/pom.xml | 6 +++---
pom.xml | 2 +-
samples/install-without-bom/pom.xml | 4 ++--
samples/snapshot/pom.xml | 4 ++--
samples/snippets/pom.xml | 4 ++--
5 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 9307e0277e..e3801b8add 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -16,7 +16,7 @@
google-cloud-storage
- 1.123.0
+ 1.123.1
@@ -239,14 +239,14 @@
com.google.api.grpc
proto-google-cloud-kms-v1
- 0.162.0
+ 0.164.0
test
com.google.cloud
google-cloud-kms
- 2.71.0
+ 2.73.0
test
diff --git a/pom.xml b/pom.xml
index 396fb7b4a7..2ee414c3e1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,7 +92,7 @@
com.google.cloud
google-cloud-pubsub
- 1.141.0
+ 1.141.1
test
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 3c86e09195..dd2fe12587 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -66,13 +66,13 @@
com.google.cloud
google-cloud-pubsub
- 1.141.0
+ 1.141.1
test
com.google.cloud
google-cloud-kms
- 2.71.0
+ 2.73.0
test
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 8f7b1eb6f6..962b3c2536 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -58,13 +58,13 @@
com.google.cloud
google-cloud-pubsub
- 1.141.0
+ 1.141.1
test
com.google.cloud
google-cloud-kms
- 2.71.0
+ 2.73.0
test
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 577f16e6fe..712072a693 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -76,13 +76,13 @@
com.google.cloud
google-cloud-pubsub
- 1.141.0
+ 1.141.1
test
com.google.cloud
google-cloud-kms
- 2.71.0
+ 2.73.0
test
From 38d248d9511e808e88c1bac0b6bb2ba54897830d Mon Sep 17 00:00:00 2001
From: Luwei Ge
Date: Tue, 5 Aug 2025 09:56:43 -0700
Subject: [PATCH 08/11] fix: enable ALTS bound token (for DirectPath) in the
grpc channel provider (#2919)
---
.../java/com/google/cloud/storage/GrpcStorageOptions.java | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
index 0fe1737ddc..a102125e95 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
@@ -318,7 +318,10 @@ private Tuple> resolveSettingsAndOpts() throw
InstantiatingGrpcChannelProvider.newBuilder()
.setEndpoint(endpoint)
.setAllowNonDefaultServiceAccount(true)
- .setAttemptDirectPath(attemptDirectPath);
+ .setAttemptDirectPath(attemptDirectPath)
+ .setAllowHardBoundTokenTypes(
+ Collections.singletonList(
+ InstantiatingGrpcChannelProvider.HardBoundTokenTypes.ALTS));
if (!NoopGrpcInterceptorProvider.INSTANCE.equals(grpcInterceptorProvider)) {
channelProviderBuilder.setInterceptorProvider(grpcInterceptorProvider);
From 86ff69788b30d8f82b6b95d010df507093852889 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 5 Aug 2025 20:13:51 +0200
Subject: [PATCH 09/11] deps: update dependency
com.google.cloud:sdk-platform-java-config to v3.51.0 (#3213)
---
.github/workflows/unmanaged_dependency_check.yaml | 2 +-
google-cloud-storage-bom/pom.xml | 2 +-
pom.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml
index 306521d4e3..d7ae36c028 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.50.2
+ uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.51.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 406a292431..cbe6556dac 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.50.2
+ 3.51.0
diff --git a/pom.xml b/pom.xml
index 2ee414c3e1..191a2fdbc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
com.google.cloud
sdk-platform-java-config
- 3.50.2
+ 3.51.0
From 9e9b8f8518f12dac697b23f56d6fd94b32d9d194 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 5 Aug 2025 23:05:57 +0200
Subject: [PATCH 10/11] test(deps): update cross product test dependencies
(#3216)
---
google-cloud-storage/pom.xml | 2 +-
pom.xml | 2 +-
samples/install-without-bom/pom.xml | 2 +-
samples/snapshot/pom.xml | 2 +-
samples/snippets/pom.xml | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index e3801b8add..1bd61dfe1a 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -16,7 +16,7 @@
google-cloud-storage
- 1.123.1
+ 1.123.2
diff --git a/pom.xml b/pom.xml
index 191a2fdbc5..c0774ddbf9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,7 +92,7 @@
com.google.cloud
google-cloud-pubsub
- 1.141.1
+ 1.141.2
test
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index dd2fe12587..8b4dcc4463 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -66,7 +66,7 @@
com.google.cloud
google-cloud-pubsub
- 1.141.1
+ 1.141.2
test
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 962b3c2536..a14441ee01 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -58,7 +58,7 @@
com.google.cloud
google-cloud-pubsub
- 1.141.1
+ 1.141.2
test
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 712072a693..b6d37a23a4 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -76,7 +76,7 @@
com.google.cloud
google-cloud-pubsub
- 1.141.1
+ 1.141.2
test
From 1cdfd6ee36e97c062d084e9ab33e0018733c17da Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Wed, 6 Aug 2025 13:32:53 -0400
Subject: [PATCH 11/11] chore(main): release 2.55.0 (#3215)
* chore(main): release 2.55.0
* chore: generate libraries at Tue Aug 5 18:14:51 UTC 2025
---------
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: cloud-java-bot
---
CHANGELOG.md | 18 ++++++++++++++++++
README.md | 12 ++++++------
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, 66 insertions(+), 48 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 740eacae7b..b51e08214f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,23 @@
# Changelog
+## [2.55.0](https://github.com/googleapis/java-storage/compare/v2.54.0...v2.55.0) (2025-08-05)
+
+
+### Features
+
+* Add new preview Bucket encryption policy configuration ([#3204](https://github.com/googleapis/java-storage/issues/3204)) ([7b250dd](https://github.com/googleapis/java-storage/commit/7b250dd53cfa29bbb6a0a4cb4a345aeb2dab5c86))
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.61.0 ([f98b686](https://github.com/googleapis/java-storage/commit/f98b686ef940879458acb1e56339adf869400b94))
+* Enable ALTS bound token (for DirectPath) in the grpc channel provider ([#2919](https://github.com/googleapis/java-storage/issues/2919)) ([38d248d](https://github.com/googleapis/java-storage/commit/38d248d9511e808e88c1bac0b6bb2ba54897830d))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.51.0 ([#3213](https://github.com/googleapis/java-storage/issues/3213)) ([86ff697](https://github.com/googleapis/java-storage/commit/86ff69788b30d8f82b6b95d010df507093852889))
+
## [2.54.0](https://github.com/googleapis/java-storage/compare/v2.53.3...v2.54.0) (2025-07-24)
diff --git a/README.md b/README.md
index dc7c69c1a0..05340f4a40 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file:
com.google.cloud
libraries-bom
- 26.64.0
+ 26.65.0
pom
import
@@ -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.3
+ 2.54.0
com.google.cloud
google-cloud-storage-control
- 2.53.3
+ 2.54.0
```
@@ -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.54.0'
+implementation 'com.google.cloud:google-cloud-storage:2.55.0'
```
If you are using SBT, add this to your dependencies:
```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.54.0"
+libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.55.0"
```
## Authentication
@@ -523,7 +523,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.54.0
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.55.0
[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 72df827ebd..0d97691561 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.54.1-SNAPSHOT
+ 2.55.0
gapic-google-cloud-storage-v2
GRPC library for gapic-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.1-SNAPSHOT
+ 2.55.0
diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml
index cbe6556dac..87397bf767 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.54.1-SNAPSHOT
+ 2.55.0
pom
com.google.cloud
@@ -69,37 +69,37 @@
com.google.cloud
google-cloud-storage
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.cloud
google-cloud-storage-control
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
grpc-google-cloud-storage-control-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
proto-google-cloud-storage-control-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml
index d74d78a578..f004cfe0af 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.54.1-SNAPSHOT
+ 2.55.0
google-cloud-storage-control
GRPC library for google-cloud-storage-control
com.google.cloud
google-cloud-storage-parent
- 2.54.1-SNAPSHOT
+ 2.55.0
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 1bd61dfe1a..1f3decd8ab 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
4.0.0
google-cloud-storage
- 2.54.1-SNAPSHOT
+ 2.55.0
jar
Google Cloud Storage
https://github.com/googleapis/java-storage
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-storage-parent
- 2.54.1-SNAPSHOT
+ 2.55.0
google-cloud-storage
diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml
index 5a49de686a..9cd67488c5 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.54.1-SNAPSHOT
+ 2.55.0
grpc-google-cloud-storage-control-v2
GRPC library for google-cloud-storage
com.google.cloud
google-cloud-storage-parent
- 2.54.1-SNAPSHOT
+ 2.55.0
diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml
index c59706d840..e9bc40708c 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.54.1-SNAPSHOT
+ 2.55.0
grpc-google-cloud-storage-v2
GRPC library for grpc-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.1-SNAPSHOT
+ 2.55.0
diff --git a/pom.xml b/pom.xml
index c0774ddbf9..927ad55dab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-storage-parent
pom
- 2.54.1-SNAPSHOT
+ 2.55.0
Storage Parent
https://github.com/googleapis/java-storage
@@ -82,7 +82,7 @@
com.google.cloud
google-cloud-storage
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.apis
@@ -104,32 +104,32 @@
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
grpc-google-cloud-storage-control-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.api.grpc
proto-google-cloud-storage-control-v2
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.cloud
google-cloud-storage-control
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.cloud
diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml
index ab7708f1a8..cdb5d15e40 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.54.1-SNAPSHOT
+ 2.55.0
proto-google-cloud-storage-control-v2
Proto library for proto-google-cloud-storage-control-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.1-SNAPSHOT
+ 2.55.0
diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml
index 75b0b9575e..b44026cba8 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.54.1-SNAPSHOT
+ 2.55.0
proto-google-cloud-storage-v2
PROTO library for proto-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.54.1-SNAPSHOT
+ 2.55.0
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index a14441ee01..6b34767574 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,12 +28,12 @@
com.google.cloud
google-cloud-storage
- 2.54.1-SNAPSHOT
+ 2.55.0
com.google.cloud
google-cloud-storage-control
- 2.54.1-SNAPSHOT
+ 2.55.0
compile
@@ -70,7 +70,7 @@
com.google.cloud
google-cloud-storage
- 2.54.1-SNAPSHOT
+ 2.55.0
tests
test
diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml
index c6c02bb2ff..786194b1b6 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.54.1-SNAPSHOT
+ 2.55.0
@@ -31,7 +31,7 @@
com.google.cloud
google-cloud-storage
- 2.54.1-SNAPSHOT
+ 2.55.0
tests
diff --git a/versions.txt b/versions.txt
index 67be9b9ed4..f9508c10b7 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
# Format:
# module:released-version:current-version
-google-cloud-storage:2.54.0:2.54.1-SNAPSHOT
-gapic-google-cloud-storage-v2:2.54.0:2.54.1-SNAPSHOT
-grpc-google-cloud-storage-v2:2.54.0:2.54.1-SNAPSHOT
-proto-google-cloud-storage-v2:2.54.0:2.54.1-SNAPSHOT
-google-cloud-storage-control:2.54.0:2.54.1-SNAPSHOT
-proto-google-cloud-storage-control-v2:2.54.0:2.54.1-SNAPSHOT
-grpc-google-cloud-storage-control-v2:2.54.0:2.54.1-SNAPSHOT
+google-cloud-storage:2.55.0:2.55.0
+gapic-google-cloud-storage-v2:2.55.0:2.55.0
+grpc-google-cloud-storage-v2:2.55.0:2.55.0
+proto-google-cloud-storage-v2:2.55.0:2.55.0
+google-cloud-storage-control:2.55.0:2.55.0
+proto-google-cloud-storage-control-v2:2.55.0:2.55.0
+grpc-google-cloud-storage-control-v2:2.55.0:2.55.0