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