From c608100cfe53abe4cc6ce02fa67e4456b6bcf19c Mon Sep 17 00:00:00 2001 From: Joe Wang <106995533+JoeWang1127@users.noreply.github.com> Date: Mon, 25 Mar 2024 14:13:56 +0000 Subject: [PATCH 01/40] chore: update renovate config for unmanaged dependency check (#2465) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update renovate config for unmanaged dependency check * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .github/workflows/unmanaged_dependency_check.yaml | 2 +- README.md | 6 +++--- renovate.json | 9 +++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index e5e9b068b6..434ae77860 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@unmanaged-dependencies-check-latest + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.27.0 with: bom-path: google-cloud-storage-bom/pom.xml diff --git a/README.md b/README.md index 9e0ad82fd4..61c48088ee 100644 --- a/README.md +++ b/README.md @@ -57,13 +57,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.36.0' +implementation 'com.google.cloud:google-cloud-storage:2.36.1' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.36.0" +libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.36.1" ``` @@ -430,7 +430,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.36.0 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.36.1 [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/renovate.json b/renovate.json index 78317cace2..23d26dbaa6 100644 --- a/renovate.json +++ b/renovate.json @@ -20,6 +20,15 @@ "matchStrings": ["value: \"gcr.io/cloud-devrel-public-resources/graalvm.*:(?.*?)\""], "depNameTemplate": "com.google.cloud:sdk-platform-java-config", "datasourceTemplate": "maven" + }, + { + "customType": "regex", + "fileMatch": [ + "^.github/workflows/unmanaged_dependency_check.yaml$" + ], + "matchStrings": ["uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v(?.+?)\\n"], + "depNameTemplate": "com.google.cloud:sdk-platform-java-config", + "datasourceTemplate": "maven" } ], "packageRules": [ From 55ec75fff50c46ff496d62350737a5daa84d8aa7 Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Tue, 26 Mar 2024 10:14:20 -0700 Subject: [PATCH 02/40] chore(benchmarking): Change bidi workload to be write only and pass bidi flag (#2468) --- .../StorageSharedBenchmarkingCli.java | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java b/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java index 32d85b0792..3effab8c24 100644 --- a/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java +++ b/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java @@ -87,6 +87,9 @@ public final class StorageSharedBenchmarkingCli implements Runnable { defaultValue = "0") int warmup; + @Option(names = "-bidi", description = "If bidi should be enabled") + boolean bidiEnabled; + Path tempDir; PrintWriter printWriter; @@ -107,11 +110,8 @@ public void run() { case "w1r3": runWorkload1(); break; - case "bidi": - runWorkloadBidi(); - break; - case "default-nobidi": - runWorkloadNoBidi(); + case "write-only": + runWorkloadWriteOnly(); break; default: throw new IllegalStateException("Specify a workload to run"); @@ -158,36 +158,31 @@ private void runWorkload1DirectPath() { } } - private void runWorkloadBidi() { - StorageOptions options = - StorageOptions.grpc() - .setProjectId(project) - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) - .build(); - Storage storageClient = options.getService(); + private void runWorkloadWriteOnly() { try { - runBidi(storageClient); + if (bidiEnabled) { + StorageOptions options = + StorageOptions.grpc() + .setProjectId(project) + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) + .build(); + Storage storageClient = options.getService(); + runBidi(storageClient); + } else { + StorageOptions options = + StorageOptions.grpc() + .setProjectId(project) + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.getDefault()) + .build(); + Storage storageClient = options.getService(); + runBidi(storageClient); + } } catch (Exception e) { System.err.println("Failed to run workload bidi" + e.getMessage()); System.exit(1); } } - private void runWorkloadNoBidi() { - StorageOptions options = - StorageOptions.grpc() - .setProjectId(project) - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.getDefault()) - .build(); - Storage storageClient = options.getService(); - try { - runBidi(storageClient); - } catch (Exception e) { - System.err.println("Failed to run workload no bidi" + e.getMessage()); - System.exit(1); - } - } - private void runW1R3(Storage storageClient) throws ExecutionException, InterruptedException { ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(workers)); From e1fb8577e6b7a36981fb78937fe8c5dd606a4c2a Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Tue, 26 Mar 2024 18:25:12 -0400 Subject: [PATCH 03/40] fix: update BidiBlobWriteSessionConfig to respect a provided bufferSize (#2471) Refactor, reuse DecoratedWritableByteChannelSession and LazySession from DefaultBlobWriteSessionConfig rather than duplicating in BidiBlobWriteSessionConfig. --- .../storage/BidiBlobWriteSessionConfig.java | 75 +++++-------------- .../DefaultBlobWriteSessionConfig.java | 8 +- 2 files changed, 21 insertions(+), 62 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java index 06dd7e7a02..390c5abbc0 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java @@ -17,19 +17,31 @@ package com.google.cloud.storage; import com.google.api.core.ApiFuture; -import com.google.api.core.ApiFutures; import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; import com.google.api.gax.grpc.GrpcCallContext; +import com.google.cloud.storage.DefaultBlobWriteSessionConfig.DecoratedWritableByteChannelSession; +import com.google.cloud.storage.DefaultBlobWriteSessionConfig.LazySession; +import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.MoreExecutors; import com.google.storage.v2.BidiWriteObjectRequest; import com.google.storage.v2.BidiWriteObjectResponse; import java.io.IOException; -import java.nio.channels.WritableByteChannel; import java.time.Clock; +import javax.annotation.concurrent.Immutable; -public class BidiBlobWriteSessionConfig extends BlobWriteSessionConfig +/** + * Perform a resumable upload, uploading at most {@code bufferSize} bytes each flush. + * + *

Configuration of buffer size can be performed via {@link + * BidiBlobWriteSessionConfig#withBufferSize(int)}. + * + * @since 2.34.0 This new api is in preview and is subject to breaking changes. + */ +@Immutable +@BetaApi +@TransportCompatibility({Transport.GRPC}) +public final class BidiBlobWriteSessionConfig extends BlobWriteSessionConfig implements BlobWriteSessionConfig.GrpcCompatible { private static final long serialVersionUID = -903533790705476197L; @@ -54,7 +66,7 @@ public int getBufferSize() { @Override WriterFactory createFactory(Clock clock) throws IOException { - return new Factory(ByteSizeConstants._16MiB); + return new Factory(bufferSize); } @InternalApi @@ -124,57 +136,4 @@ public BidiBlobWriteSessionConfig withBufferSize(int bufferSize) { ByteSizeConstants._256KiB); return new BidiBlobWriteSessionConfig(bufferSize); } - - private static final class DecoratedWritableByteChannelSession - implements WritableByteChannelSession { - - private final WritableByteChannelSession delegate; - private final Conversions.Decoder decoder; - - private DecoratedWritableByteChannelSession( - WritableByteChannelSession delegate, Conversions.Decoder decoder) { - this.delegate = delegate; - this.decoder = decoder; - } - - @Override - public WBC open() { - try { - return WritableByteChannelSession.super.open(); - } catch (Exception e) { - throw StorageException.coalesce(e); - } - } - - @Override - public ApiFuture openAsync() { - return delegate.openAsync(); - } - - @Override - public ApiFuture getResult() { - return ApiFutures.transform( - delegate.getResult(), decoder::decode, MoreExecutors.directExecutor()); - } - } - - private static final class LazySession - implements WritableByteChannelSession< - BufferedWritableByteChannelSession.BufferedWritableByteChannel, R> { - private final LazyWriteChannel lazy; - - private LazySession(LazyWriteChannel lazy) { - this.lazy = lazy; - } - - @Override - public ApiFuture openAsync() { - return lazy.getSession().openAsync(); - } - - @Override - public ApiFuture getResult() { - return lazy.getSession().getResult(); - } - } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java index 090f929e7e..3a4dd2be23 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java @@ -153,13 +153,13 @@ public WritableByteChannelSession writeSession( } } - private static final class DecoratedWritableByteChannelSession + static final class DecoratedWritableByteChannelSession implements WritableByteChannelSession { private final WritableByteChannelSession delegate; private final Decoder decoder; - private DecoratedWritableByteChannelSession( + DecoratedWritableByteChannelSession( WritableByteChannelSession delegate, Decoder decoder) { this.delegate = delegate; this.decoder = decoder; @@ -186,11 +186,11 @@ public ApiFuture getResult() { } } - private static final class LazySession + static final class LazySession implements WritableByteChannelSession { private final LazyWriteChannel lazy; - private LazySession(LazyWriteChannel lazy) { + LazySession(LazyWriteChannel lazy) { this.lazy = lazy; } From 7c86ad07eefb8203e06c90ba3efa6bdc317a8722 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 27 Mar 2024 16:36:56 -0400 Subject: [PATCH 04/40] ci: sample build in Cloud Build (#2444) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ci: sample build in Cloud Build * empty commit to trigger Cloud Build * adding the service account email * ci: test CI * domain:google.com Following https://github.com/googleapis/java-pubsub/pull/1943 * service account * format * using the samples@ account * ci: test CI * empty commit to trigger Cloud Build after b/329758593 * project number as env var * Available binding identities * sample id * stop introducing a new env var for Kokoro * chore: switch kms keys to point to new project keys * lint * remove unnecessary ; * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Sydney Munro Co-authored-by: Owl Bot --- .cloudbuild/samples_build.yaml | 35 +++++++++++++++++++ .../com/example/storage/ITBucketSnippets.java | 8 ++--- .../com/example/storage/ITObjectSnippets.java | 4 +-- .../CreateBucketPubSubNotificationTest.java | 13 +++++-- .../DeleteBucketPubSubNotificationTest.java | 13 +++++-- .../bucket/ListPubSubNotificationsTest.java | 13 +++++-- .../bucket/PrintPubSubNotificationTest.java | 13 +++++-- 7 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 .cloudbuild/samples_build.yaml diff --git a/.cloudbuild/samples_build.yaml b/.cloudbuild/samples_build.yaml new file mode 100644 index 0000000000..c22f133517 --- /dev/null +++ b/.cloudbuild/samples_build.yaml @@ -0,0 +1,35 @@ +steps: +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: ls + args: [ + '-alt', + ] +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: curl + args: [ + '--header', + 'Metadata-Flavor: Google', + 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email' + ] +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: pwd +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: bash + args: [ + '.kokoro/build.sh' + ] + env: + - 'JOB_TYPE=samples' + - 'GOOGLE_CLOUD_PROJECT=cloud-java-ci-sample' + - 'GOOGLE_CLOUD_PROJECT_NUMBER=615621127317' + - 'IT_SERVICE_ACCOUNT_EMAIL=samples@cloud-java-ci-sample.iam.gserviceaccount.com' +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: echo + args: [ + 'Sample job succeeded', + ] +timeout: 3600s +options: + defaultLogsBucketBehavior: REGIONAL_USER_OWNED_BUCKET + + diff --git a/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java b/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java index 2f61fdbb7c..dc68167a68 100644 --- a/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java +++ b/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java @@ -112,8 +112,8 @@ public class ITBucketSnippets { private static final String BUCKET = RemoteStorageHelper.generateBucketName(); private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); private static final String KMS_KEY_NAME = - "projects/java-docs-samples-testing/locations/us/keyRings/" - + "jds_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; + "projects/cloud-java-ci-sample/locations/us/keyRings/" + + "gcs_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; private static final RetrySettings RETRY_SETTINGS = RetrySettings.newBuilder() .setInitialRetryDelay(Duration.ofSeconds(2)) @@ -465,8 +465,8 @@ public void deleteBucketDefaultKmsKey() throws Throwable { .get(BUCKET) .toBuilder() .setDefaultKmsKeyName( - "projects/java-docs-samples-testing/locations/us/keyRings/" - + "jds_test_kms_key_ring/cryptoKeys/gcs_kms_key_one") + "projects/cloud-java-ci-sample/locations/us/keyRings/" + + "gcs_test_kms_key_ring/cryptoKeys/gcs_kms_key_one") .build() .update(); TestUtils.retryAssert( 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 feca2ca807..0ebaa55c6d 100644 --- a/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java +++ b/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java @@ -97,8 +97,8 @@ public class ITObjectSnippets { private static final byte[] CONTENT = STRING_CONTENT.getBytes(UTF_8); private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); private static final String KMS_KEY_NAME = - "projects/java-docs-samples-testing/locations/us/keyRings/" - + "jds_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; + "projects/cloud-java-ci-sample/locations/us/keyRings/" + + "gcs_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; private static Storage storage; diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java index a3ff52a3c1..7bfd95242e 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java @@ -40,6 +40,8 @@ public class CreateBucketPubSubNotificationTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-create-%s", PROJECT, ID); @@ -57,8 +59,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java index d83960c44c..aab1073b38 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java @@ -44,6 +44,8 @@ public class DeleteBucketPubSubNotificationTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-delete-%s", PROJECT, ID); @@ -62,8 +64,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java index 643c51bfd6..88a4613e7a 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java @@ -44,6 +44,8 @@ public class ListPubSubNotificationsTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-list-%s", PROJECT, ID); @@ -57,8 +59,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java index ce3dd804bc..d342795a85 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java @@ -40,6 +40,8 @@ public class PrintPubSubNotificationTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-print-%s", PROJECT, ID); @@ -53,8 +55,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) From e5772a4f4ec5d747fcd403477a35ceeb94492280 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Wed, 27 Mar 2024 21:13:21 -0400 Subject: [PATCH 05/40] feat: port DefaultBlobWriteSessionConfig to work with HttpStorageOptions (#2472) --- .../cloud/storage/BlobWriteSessionConfig.java | 9 ++++ .../storage/BlobWriteSessionConfigs.java | 4 +- .../DefaultBlobWriteSessionConfig.java | 41 ++++++++++++++++++- .../cloud/storage/HttpStorageOptions.java | 41 ++++++++++++++++++- .../com/google/cloud/storage/StorageImpl.java | 16 +++++++- .../storage/it/ITBlobWriteSessionTest.java | 12 +++++- 6 files changed, 115 insertions(+), 8 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java index b52e9bd4f7..441f78ac77 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java @@ -53,6 +53,15 @@ WritableByteChannelSession writeSession( StorageInternal s, BlobInfo info, Opts opts); } + /** + * Internal marker interface to signify an implementation of {@link BlobWriteSessionConfig} is + * compatible with {@link com.google.cloud.storage.TransportCompatibility.Transport#HTTP} + * + *

We could evaluate the annotations, but the code for that is more complicated and probably + * not worth the effort. + */ + interface HttpCompatible {} + /** * Internal marker interface to signify an implementation of {@link BlobWriteSessionConfig} is * compatible with {@link com.google.cloud.storage.TransportCompatibility.Transport#GRPC} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java index 43b68d8a0e..781411c6d8 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java @@ -55,7 +55,7 @@ * full or close. Buffer size is configurable via * {@link DefaultBlobWriteSessionConfig#withChunkSize(int)} * - * gRPC + * gRPC, HTTP * The network will only be used for the following operations: *

    *
  1. Creating the Resumable Upload Session
  2. @@ -241,7 +241,7 @@ private BlobWriteSessionConfigs() {} * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static DefaultBlobWriteSessionConfig getDefault() { return new DefaultBlobWriteSessionConfig(ByteSizeConstants._16MiB); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java index 3a4dd2be23..1d45c9e34c 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java @@ -21,17 +21,21 @@ import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; import com.google.api.gax.grpc.GrpcCallContext; +import com.google.api.services.storage.model.StorageObject; import com.google.cloud.storage.BufferedWritableByteChannelSession.BufferedWritableByteChannel; import com.google.cloud.storage.Conversions.Decoder; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.UnifiedOpts.ObjectTargetOpt; import com.google.cloud.storage.UnifiedOpts.Opts; +import com.google.cloud.storage.spi.v1.StorageRpc; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.MoreExecutors; import com.google.storage.v2.WriteObjectRequest; import com.google.storage.v2.WriteObjectResponse; import java.nio.channels.WritableByteChannel; import java.time.Clock; +import java.util.Map; +import java.util.function.Supplier; import javax.annotation.concurrent.Immutable; /** @@ -55,9 +59,9 @@ */ @Immutable @BetaApi -@TransportCompatibility({Transport.GRPC}) +@TransportCompatibility({Transport.GRPC, Transport.HTTP}) public final class DefaultBlobWriteSessionConfig extends BlobWriteSessionConfig - implements BlobWriteSessionConfig.GrpcCompatible { + implements BlobWriteSessionConfig.HttpCompatible, BlobWriteSessionConfig.GrpcCompatible { private static final long serialVersionUID = -6873740918589930633L; private final int chunkSize; @@ -146,6 +150,39 @@ public WritableByteChannelSession writeSession( .build(); })), WRITE_OBJECT_RESPONSE_BLOB_INFO_DECODER); + } else if (s instanceof StorageImpl) { + StorageImpl json = (StorageImpl) s; + + return new DecoratedWritableByteChannelSession<>( + new LazySession<>( + new LazyWriteChannel<>( + () -> { + final Map optionsMap = opts.getRpcOptions(); + BlobInfo.Builder builder = info.toBuilder().setMd5(null).setCrc32c(null); + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + + StorageObject encode = Conversions.json().blobInfo().encode(updated); + Supplier uploadIdSupplier = + ResumableMedia.startUploadForBlobInfo( + json.getOptions(), + updated, + optionsMap, + json.retryAlgorithmManager.getForResumableUploadSessionCreate( + optionsMap)); + ApiFuture startAsync = + ApiFutures.immediateFuture( + JsonResumableWrite.of( + encode, optionsMap, uploadIdSupplier.get(), 0L)); + + return ResumableMedia.http() + .write() + .byteChannel(HttpClientContext.from(json.storageRpc)) + .resumable() + .buffered(BufferHandle.allocate(chunkSize)) + .setStartAsync(startAsync) + .build(); + })), + Conversions.json().blobInfo()); } else { throw new IllegalStateException( "Unknown Storage implementation: " + s.getClass().getName()); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java index fd2a573119..684f3f15b7 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java @@ -16,6 +16,7 @@ package com.google.cloud.storage; +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import com.google.api.core.ApiClock; @@ -30,6 +31,7 @@ import com.google.cloud.http.HttpTransportOptions; import com.google.cloud.spi.ServiceRpcFactory; import com.google.cloud.storage.Retrying.RetryingDependencies; +import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.spi.StorageRpcFactory; import com.google.cloud.storage.spi.v1.HttpStorageRpc; @@ -39,7 +41,9 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.time.Clock; import java.util.Set; +import org.checkerframework.checker.nullness.qual.NonNull; /** @since 2.14.0 This new api is in preview and is subject to breaking changes. */ @BetaApi @@ -55,6 +59,7 @@ public class HttpStorageOptions extends StorageOptions { private final HttpRetryAlgorithmManager retryAlgorithmManager; private transient RetryDependenciesAdapter retryDepsAdapter; + private final BlobWriteSessionConfig blobWriteSessionConfig; private HttpStorageOptions(Builder builder, StorageDefaults serviceDefaults) { super(builder, serviceDefaults); @@ -63,6 +68,7 @@ private HttpStorageOptions(Builder builder, StorageDefaults serviceDefaults) { MoreObjects.firstNonNull( builder.storageRetryStrategy, defaults().getStorageRetryStrategy())); retryDepsAdapter = new RetryDependenciesAdapter(); + blobWriteSessionConfig = builder.blobWriteSessionConfig; } @Override @@ -120,6 +126,8 @@ RetryingDependencies asRetryDependencies() { public static class Builder extends StorageOptions.Builder { private StorageRetryStrategy storageRetryStrategy; + private BlobWriteSessionConfig blobWriteSessionConfig = + HttpStorageDefaults.INSTANCE.getDefaultStorageWriterConfig(); Builder() {} @@ -218,6 +226,24 @@ public HttpStorageOptions.Builder setQuotaProjectId(String quotaProjectId) { return this; } + /** + * @see BlobWriteSessionConfig + * @see BlobWriteSessionConfigs + * @see Storage#blobWriteSession(BlobInfo, BlobWriteOption...) + * @see HttpStorageDefaults#getDefaultStorageWriterConfig() + * @since 2.29.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public HttpStorageOptions.Builder setBlobWriteSessionConfig( + @NonNull BlobWriteSessionConfig blobWriteSessionConfig) { + requireNonNull(blobWriteSessionConfig, "blobWriteSessionConfig must be non null"); + checkArgument( + blobWriteSessionConfig instanceof BlobWriteSessionConfig.HttpCompatible, + "The provided instance of BlobWriteSessionConfig is not compatible with this HTTP transport."); + this.blobWriteSessionConfig = blobWriteSessionConfig; + return this; + } + @Override public HttpStorageOptions build() { return new HttpStorageOptions(this, defaults()); @@ -249,6 +275,12 @@ public HttpTransportOptions getDefaultTransportOptions() { public StorageRetryStrategy getStorageRetryStrategy() { return StorageRetryStrategy.getDefaultStorageRetryStrategy(); } + + /** @since 2.29.0 This new api is in preview and is subject to breaking changes. */ + @BetaApi + public BlobWriteSessionConfig getDefaultStorageWriterConfig() { + return BlobWriteSessionConfigs.getDefault(); + } } /** @@ -287,7 +319,14 @@ public HttpStorageFactory() {} public Storage create(StorageOptions options) { if (options instanceof HttpStorageOptions) { HttpStorageOptions httpStorageOptions = (HttpStorageOptions) options; - return new StorageImpl(httpStorageOptions); + Clock clock = Clock.systemUTC(); + try { + return new StorageImpl( + httpStorageOptions, httpStorageOptions.blobWriteSessionConfig.createFactory(clock)); + } catch (IOException e) { + throw new IllegalStateException( + "Unable to instantiate HTTP com.google.cloud.storage.Storage client.", e); + } } else { throw new IllegalArgumentException("Only HttpStorageOptions supported"); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java index a5df68b832..1a9bd8d03c 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java @@ -38,6 +38,7 @@ import com.google.cloud.WriteChannel; import com.google.cloud.storage.Acl.Entity; import com.google.cloud.storage.BlobReadChannelV2.BlobReadChannelContext; +import com.google.cloud.storage.BlobWriteSessionConfig.WriterFactory; import com.google.cloud.storage.HmacKey.HmacKeyMetadata; import com.google.cloud.storage.PostPolicyV4.ConditionV4Type; import com.google.cloud.storage.PostPolicyV4.PostConditionsV4; @@ -92,7 +93,7 @@ import java.util.function.Supplier; import org.checkerframework.checker.nullness.qual.Nullable; -final class StorageImpl extends BaseService implements Storage { +final class StorageImpl extends BaseService implements Storage, StorageInternal { private static final byte[] EMPTY_BYTE_ARRAY = {}; private static final String EMPTY_BYTE_ARRAY_MD5 = "1B2M2Y8AsgTpgAmY7PhCfg=="; @@ -115,11 +116,13 @@ final class StorageImpl extends BaseService implements Storage { final HttpRetryAlgorithmManager retryAlgorithmManager; final StorageRpc storageRpc; + final WriterFactory writerFactory; - StorageImpl(HttpStorageOptions options) { + StorageImpl(HttpStorageOptions options, WriterFactory writerFactory) { super(options); this.retryAlgorithmManager = options.getRetryAlgorithmManager(); this.storageRpc = options.getStorageRpcV1(); + this.writerFactory = writerFactory; } @Override @@ -1635,4 +1638,13 @@ private Bucket internalBucketGet(String bucket, Map option () -> storageRpc.get(bucketPb, optionsMap), (b) -> Conversions.json().bucketInfo().decode(b).asBucket(this)); } + + @Override + public BlobWriteSession blobWriteSession(BlobInfo blobInfo, BlobWriteOption... options) { + Opts opts = Opts.unwrap(options).resolveFrom(blobInfo); + + WritableByteChannelSession writableByteChannelSession = + writerFactory.writeSession(this, blobInfo, opts); + return BlobWriteSessions.of(writableByteChannelSession); + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java index 763346b1f8..b8f89726e3 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java @@ -26,6 +26,7 @@ import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; import com.google.cloud.storage.GrpcStorageOptions; +import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.StorageException; @@ -49,7 +50,7 @@ @RunWith(StorageITRunner.class) @CrossRun( - transports = {Transport.GRPC}, + transports = {Transport.HTTP, Transport.GRPC}, backends = {Backend.PROD}) public final class ITBlobWriteSessionTest { @@ -68,6 +69,7 @@ public void allDefaults() throws Exception { } @Test + @CrossRun.Exclude(transports = Transport.HTTP) public void bufferToTempDirThenUpload() throws Exception { StorageOptions options = null; if (transport == Transport.GRPC) { @@ -94,6 +96,13 @@ public void overrideDefaultBufferSize() throws Exception { .setBlobWriteSessionConfig( BlobWriteSessionConfigs.getDefault().withChunkSize(256 * 1024)) .build(); + } else if (transport == Transport.HTTP) { + options = + ((HttpStorageOptions) storage.getOptions()) + .toBuilder() + .setBlobWriteSessionConfig( + BlobWriteSessionConfigs.getDefault().withChunkSize(256 * 1024)) + .build(); } assertWithMessage("unable to resolve options").that(options).isNotNull(); //noinspection DataFlowIssue @@ -103,6 +112,7 @@ public void overrideDefaultBufferSize() throws Exception { } @Test + @CrossRun.Exclude(transports = Transport.HTTP) public void bidiTest() throws Exception { StorageOptions options = null; if (transport == Transport.GRPC) { From d84e25559afecc27026c7f4fe7aeaf0d0ce705b4 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Wed, 27 Mar 2024 21:41:43 -0400 Subject: [PATCH 06/40] feat: port BufferToDiskThenUpload to work with HttpStorageOptions (#2473) --- .../storage/BlobWriteSessionConfigs.java | 8 +-- .../cloud/storage/BufferToDiskThenUpload.java | 4 +- .../com/google/cloud/storage/StorageImpl.java | 59 +++++++++++++++++-- .../storage/it/ITBlobWriteSessionTest.java | 7 ++- 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java index 781411c6d8..43da35cc6e 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java @@ -86,7 +86,7 @@ * Buffer bytes to a temporary file on disk. On {@link WritableByteChannel#close() close()} * upload the entire files contents to Cloud Storage. Delete the temporary file. * - * gRPC + * gRPC, HTTP * *
      *
    1. A Resumable Upload Session will be used to upload the file on disk.
    2. @@ -272,7 +272,7 @@ public static BidiBlobWriteSessionConfig bidiWrite() { * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static BlobWriteSessionConfig bufferToTempDirThenUpload() throws IOException { return bufferToDiskThenUpload( Paths.get(System.getProperty("java.io.tmpdir"), "google-cloud-storage")); @@ -289,7 +289,7 @@ public static BlobWriteSessionConfig bufferToTempDirThenUpload() throws IOExcept * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static BufferToDiskThenUpload bufferToDiskThenUpload(Path path) throws IOException { return bufferToDiskThenUpload(ImmutableList.of(path)); } @@ -308,7 +308,7 @@ public static BufferToDiskThenUpload bufferToDiskThenUpload(Path path) throws IO * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static BufferToDiskThenUpload bufferToDiskThenUpload(Collection paths) throws IOException { return new BufferToDiskThenUpload(ImmutableList.copyOf(paths), false); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java index 8c9cb7c107..58ce102932 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java @@ -59,9 +59,9 @@ */ @Immutable @BetaApi -@TransportCompatibility({Transport.GRPC}) +@TransportCompatibility({Transport.GRPC, Transport.HTTP}) public final class BufferToDiskThenUpload extends BlobWriteSessionConfig - implements BlobWriteSessionConfig.GrpcCompatible { + implements BlobWriteSessionConfig.HttpCompatible, BlobWriteSessionConfig.GrpcCompatible { private static final long serialVersionUID = 9059242302276891867L; /** diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java index 1a9bd8d03c..ea9e62f070 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java @@ -91,6 +91,7 @@ import java.util.concurrent.TimeoutException; import java.util.function.Function; import java.util.function.Supplier; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; final class StorageImpl extends BaseService implements Storage, StorageInternal { @@ -147,7 +148,8 @@ public Blob create(BlobInfo blobInfo, BlobTargetOption... options) { .setMd5(EMPTY_BYTE_ARRAY_MD5) .setCrc32c(EMPTY_BYTE_ARRAY_CRC32C) .build(); - return internalCreate(updatedInfo, EMPTY_BYTE_ARRAY, 0, 0, options); + final Opts objectTargetOptOpts = Opts.unwrap(options).resolveFrom(updatedInfo); + return internalCreate(updatedInfo, EMPTY_BYTE_ARRAY, 0, 0, objectTargetOptOpts); } @Override @@ -161,7 +163,8 @@ public Blob create(BlobInfo blobInfo, byte[] content, BlobTargetOption... option BaseEncoding.base64() .encode(Ints.toByteArray(Hashing.crc32c().hashBytes(content).asInt()))) .build(); - return internalCreate(updatedInfo, content, 0, content.length, options); + final Opts objectTargetOptOpts = Opts.unwrap(options).resolveFrom(updatedInfo); + return internalCreate(updatedInfo, content, 0, content.length, objectTargetOptOpts); } @Override @@ -180,7 +183,8 @@ public Blob create( Ints.toByteArray( Hashing.crc32c().hashBytes(content, offset, length).asInt()))) .build(); - return internalCreate(updatedInfo, content, offset, length, options); + final Opts objectTargetOptOpts = Opts.unwrap(options).resolveFrom(updatedInfo); + return internalCreate(updatedInfo, content, offset, length, objectTargetOptOpts); } @Override @@ -203,12 +207,11 @@ public Blob create(BlobInfo blobInfo, InputStream content, BlobWriteOption... op private Blob internalCreate( BlobInfo info, - final byte[] content, + final byte @NonNull [] content, final int offset, final int length, - BlobTargetOption... options) { + Opts opts) { Preconditions.checkNotNull(content); - Opts opts = Opts.unwrap(options).resolveFrom(info); final Map optionsMap = opts.getRpcOptions(); BlobInfo updated = opts.blobInfoMapper().apply(info.toBuilder()).build(); @@ -1647,4 +1650,48 @@ public BlobWriteSession blobWriteSession(BlobInfo blobInfo, BlobWriteOption... o writerFactory.writeSession(this, blobInfo, opts); return BlobWriteSessions.of(writableByteChannelSession); } + + @Override + public BlobInfo internalCreateFrom(Path path, BlobInfo info, Opts opts) + throws IOException { + if (Files.isDirectory(path)) { + throw new StorageException(0, path + " is a directory"); + } + long size = Files.size(path); + if (size == 0L) { + return internalCreate(info, EMPTY_BYTE_ARRAY, 0, 0, opts); + } + final Map optionsMap = opts.getRpcOptions(); + BlobInfo.Builder builder = info.toBuilder().setMd5(null).setCrc32c(null); + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + StorageObject encode = codecs.blobInfo().encode(updated); + + Supplier uploadIdSupplier = + ResumableMedia.startUploadForBlobInfo( + getOptions(), + updated, + optionsMap, + retryAlgorithmManager.getForResumableUploadSessionCreate(optionsMap)); + JsonResumableWrite jsonResumableWrite = + JsonResumableWrite.of(encode, optionsMap, uploadIdSupplier.get(), 0); + + JsonResumableSession session = + ResumableSession.json( + HttpClientContext.from(storageRpc), + getOptions().asRetryDependencies(), + retryAlgorithmManager.idempotent(), + jsonResumableWrite); + HttpContentRange contentRange = + HttpContentRange.of(ByteRangeSpec.relativeLength(0L, size), size); + ResumableOperationResult put = + session.put(RewindableContent.of(path), contentRange); + // all exception translation is taken care of down in the JsonResumableSession + StorageObject object = put.getObject(); + if (object == null) { + // if by some odd chance the put didn't get the StorageObject, query for it + ResumableOperationResult query = session.query(); + object = query.getObject(); + } + return codecs.blobInfo().decode(object); + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java index b8f89726e3..6cff689114 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java @@ -69,7 +69,6 @@ public void allDefaults() throws Exception { } @Test - @CrossRun.Exclude(transports = Transport.HTTP) public void bufferToTempDirThenUpload() throws Exception { StorageOptions options = null; if (transport == Transport.GRPC) { @@ -78,6 +77,12 @@ public void bufferToTempDirThenUpload() throws Exception { .toBuilder() .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bufferToTempDirThenUpload()) .build(); + } else if (transport == Transport.HTTP) { + options = + ((HttpStorageOptions) storage.getOptions()) + .toBuilder() + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bufferToTempDirThenUpload()) + .build(); } assertWithMessage("unable to resolve options").that(options).isNotNull(); //noinspection DataFlowIssue From 3bf60264f47aad8101bb4b4cff9cc0449cf1c4f3 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Thu, 28 Mar 2024 12:02:27 -0400 Subject: [PATCH 07/40] feat: port ParallelCompositeUploadBlobWriteSessionConfig to work with HttpStorageOptions (#2474) --- .../storage/BlobWriteSessionConfigs.java | 4 +- ...CompositeUploadBlobWriteSessionConfig.java | 4 +- ...lelCompositeUploadWritableByteChannel.java | 10 +- .../storage/RewindableContentInputStream.java | 91 ++++++++++++++++++ .../com/google/cloud/storage/StorageImpl.java | 68 +++++++++++++ .../cloud/storage/spi/v1/HttpStorageRpc.java | 17 ++-- .../RewindableContentInputStreamTest.java | 96 +++++++++++++++++++ ...ositeUploadBlobWriteSessionConfigTest.java | 9 +- 8 files changed, 286 insertions(+), 13 deletions(-) create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContentInputStream.java create mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/RewindableContentInputStreamTest.java diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java index 43da35cc6e..9e9479e144 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java @@ -142,7 +142,7 @@ * Break the stream of bytes into smaller part objects uploading each part in parallel. Then * composing the parts together to make the ultimate object. * - * gRPC + * gRPC, HTTP * *
        *
      1. @@ -342,7 +342,7 @@ public static JournalingBlobWriteSessionConfig journaling(Collection paths * @since 2.28.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static ParallelCompositeUploadBlobWriteSessionConfig parallelCompositeUpload() { return ParallelCompositeUploadBlobWriteSessionConfig.withDefaults(); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java index 07551abe4f..41f52c0958 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java @@ -118,9 +118,9 @@ */ @Immutable @BetaApi -@TransportCompatibility({Transport.GRPC}) +@TransportCompatibility({Transport.GRPC, Transport.HTTP}) public final class ParallelCompositeUploadBlobWriteSessionConfig extends BlobWriteSessionConfig - implements BlobWriteSessionConfig.GrpcCompatible { + implements BlobWriteSessionConfig.HttpCompatible, BlobWriteSessionConfig.GrpcCompatible { private static final int MAX_PARTS_PER_COMPOSE = 32; private final int maxPartsPerCompose; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java index 639802cde6..a0dce2cfe4 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java @@ -431,6 +431,10 @@ private BlobInfo definePart(BlobInfo ultimateObject, PartRange partRange, long o PART_INDEX.appendTo(partRange, builder); OBJECT_OFFSET.appendTo(offset, builder); b.setMetadata(builder.build()); + // the value of a kms key name will contain the exact version when read from gcs + // however, gcs will not accept that version resource identifier when creating a new object + // strip it out, so it can be included as a query string parameter instead + b.setKmsKeyName(null); b = partMetadataFieldDecorator.apply(b); return b.build(); } @@ -507,7 +511,11 @@ private ApiFuture deleteAsync(BlobId id) { @VisibleForTesting @NonNull static Opts getPartOpts(Opts opts) { - return opts.filter(TO_EXCLUDE_FROM_PARTS).prepend(DOES_NOT_EXIST); + return opts.filter(TO_EXCLUDE_FROM_PARTS) + .prepend(DOES_NOT_EXIST) + // disable gzip transfer encoding for HTTP, it causes a significant bottleneck uploading + // the parts + .prepend(Opts.from(UnifiedOpts.disableGzipContent())); } @VisibleForTesting diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContentInputStream.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContentInputStream.java new file mode 100644 index 0000000000..0d2ff144b9 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContentInputStream.java @@ -0,0 +1,91 @@ +/* + * Copyright 2023 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.google.cloud.storage; + +import com.google.cloud.storage.UnbufferedWritableByteChannelSession.UnbufferedWritableByteChannel; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.channels.GatheringByteChannel; + +/** + * Facade which makes an instance of {@link RewindableContent} appear as an input stream. + * + *

        It does this by calling {@link RewindableContent#writeTo(GatheringByteChannel)} on an + * anonymous channel which closes over the read destination. + */ +final class RewindableContentInputStream extends InputStream { + + private final RewindableContent content; + + RewindableContentInputStream(RewindableContent content) { + this.content = content; + } + + @Override + public int read() throws IOException { + byte[] tmp = new byte[1]; + int read = read(tmp); + if (read == -1) { + return -1; + } else { + return tmp[0] & 0xFF; + } + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + // define a byte buffer as the destination for our write + ByteBuffer dst = ByteBuffer.wrap(b, off, len); + int remaining = dst.remaining(); + if (remaining == 0) { + return 0; + } + long written = + content.writeTo( + new AnonWritableByteChannel() { + @Override + public long write(ByteBuffer[] srcs, int offset, int length) { + // srcs here is the bytes of content + long total = 0; + for (int i = offset; i < length; i++) { + ByteBuffer src = srcs[i]; + // copy what we can from our src to the dst buffer + long written = Buffers.copy(src, dst); + total += written; + } + return total; + } + }); + // if the dst has space, but we didn't write anything means we didn't have anything to write + if (written == 0) { + return -1; + } + return Math.toIntExact(written); + } + + private abstract static class AnonWritableByteChannel implements UnbufferedWritableByteChannel { + + @Override + public boolean isOpen() { + return true; + } + + @Override + public void close() {} + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java index ea9e62f070..5884a51e52 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java @@ -1694,4 +1694,72 @@ public BlobInfo internalCreateFrom(Path path, BlobInfo info, Opts opts, ByteBuffer buf) { + + BlobInfo.Builder builder = + info.toBuilder() + .setMd5( + BaseEncoding.base64().encode(Hashing.md5().hashBytes(buf.duplicate()).asBytes())) + .setCrc32c( + BaseEncoding.base64() + .encode(Ints.toByteArray(Hashing.crc32c().hashBytes(buf.duplicate()).asInt()))); + final Map optionsMap = opts.getRpcOptions(); + + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + final StorageObject encoded = codecs.blobInfo().encode(updated); + ResultRetryAlgorithm algorithm = + retryAlgorithmManager.getForObjectsCreate(encoded, optionsMap); + RewindableContent content = RewindableContent.of(buf); + return run( + algorithm, + () -> { + content.rewindTo(0); + return storageRpc.create(encoded, new RewindableContentInputStream(content), optionsMap); + }, + Conversions.json().blobInfo()::decode); + } + + /** + * Behavioral difference compared to {@link #delete(BlobId, BlobSourceOption...)} instead of + * returning false when an object does not exist, we throw an exception. + */ + @Override + public Void internalObjectDelete(BlobId id, Opts opts) { + final StorageObject storageObject = codecs.blobId().encode(id); + ImmutableMap optionsMap = opts.getRpcOptions(); + ResultRetryAlgorithm algorithm = + retryAlgorithmManager.getForObjectsDelete(storageObject, optionsMap); + return run( + algorithm, + () -> { + boolean deleted = storageRpc.delete(storageObject, optionsMap); + // HttpStorageRpc turns a 404 into false, our code needs to know 404 + if (!deleted) { + throw new StorageException(404, "NOT_FOUND", null, null); + } + return null; + }, + Function.identity()); + } + + @Override + public BlobInfo internalObjectGet(BlobId blobId, Opts opts) { + StorageObject storedObject = codecs.blobId().encode(blobId); + ImmutableMap optionsMap = opts.getRpcOptions(); + ResultRetryAlgorithm algorithm = + retryAlgorithmManager.getForObjectsGet(storedObject, optionsMap); + return run( + algorithm, + () -> { + StorageObject storageObject = storageRpc.get(storedObject, optionsMap); + // HttpStorageRpc turns a 404 into null, our code needs to know 404 + if (storageObject == null) { + throw new StorageException(404, "NOT_FOUND", null, null); + } + return storageObject; + }, + codecs.blobInfo()::decode); + } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java index 8a97342716..363d9afdde 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java @@ -43,6 +43,7 @@ import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.util.Data; import com.google.api.services.storage.Storage; +import com.google.api.services.storage.Storage.Objects.Compose; import com.google.api.services.storage.Storage.Objects.Get; import com.google.api.services.storage.Storage.Objects.Insert; import com.google.api.services.storage.model.Bucket; @@ -755,13 +756,15 @@ public StorageObject compose( Span span = startSpan(HttpStorageRpcSpans.SPAN_NAME_COMPOSE); Scope scope = tracer.withSpan(span); try { - return storage - .objects() - .compose(target.getBucket(), target.getName(), request) - .setIfMetagenerationMatch(Option.IF_METAGENERATION_MATCH.getLong(targetOptions)) - .setIfGenerationMatch(Option.IF_GENERATION_MATCH.getLong(targetOptions)) - .setUserProject(Option.USER_PROJECT.getString(targetOptions)) - .execute(); + Compose compose = + storage + .objects() + .compose(target.getBucket(), target.getName(), request) + .setIfMetagenerationMatch(Option.IF_METAGENERATION_MATCH.getLong(targetOptions)) + .setIfGenerationMatch(Option.IF_GENERATION_MATCH.getLong(targetOptions)) + .setUserProject(Option.USER_PROJECT.getString(targetOptions)); + setEncryptionHeaders(compose.getRequestHeaders(), ENCRYPTION_KEY_PREFIX, targetOptions); + return compose.execute(); } catch (IOException ex) { span.setStatus(Status.UNKNOWN.withDescription(ex.getMessage())); throw translate(ex); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/RewindableContentInputStreamTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/RewindableContentInputStreamTest.java new file mode 100644 index 0000000000..b8d7bd5c5d --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/RewindableContentInputStreamTest.java @@ -0,0 +1,96 @@ +/* + * Copyright 2023 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.google.cloud.storage; + +import static com.google.cloud.storage.ByteSizeConstants._256KiB; +import static com.google.cloud.storage.TestUtils.xxd; +import static com.google.common.truth.Truth.assertThat; + +import com.google.protobuf.ByteString; +import java.io.IOException; +import java.nio.ByteBuffer; +import org.junit.Test; + +public final class RewindableContentInputStreamTest { + + @Test + public void read_empty() throws IOException { + RewindableContent content = RewindableContent.empty(); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + int read = in.read(); + assertThat(read).isEqualTo(-1); + } + } + + @Test + public void readB_emptySrc() throws IOException { + RewindableContent content = RewindableContent.empty(); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + int read = in.read(new byte[1]); + assertThat(read).isEqualTo(-1); + } + } + + @Test + public void readB_emptyDst() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(1); + RewindableContent content = RewindableContent.of(ByteBuffer.wrap(bytes)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + byte[] tmp = new byte[0]; + int read = in.read(tmp); + assertThat(read).isEqualTo(0); + } + } + + @Test + public void readB_singleByte() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(1); + RewindableContent content = RewindableContent.of(ByteBuffer.wrap(bytes)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + byte[] tmp = new byte[_256KiB]; + int read = in.read(tmp); + assertThat(read).isEqualTo(1); + assertThat(tmp[0]).isEqualTo(bytes[0]); + } + } + + @Test + public void read_singleByte() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(1); + RewindableContent content = RewindableContent.of(ByteBuffer.wrap(bytes)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + int read = in.read(); + assertThat(read).isEqualTo(bytes[0]); + } + } + + @Test + public void readB_multiContent() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(30); + RewindableContent content = + RewindableContent.of( + ByteBuffer.wrap(bytes, 0, 10), + ByteBuffer.wrap(bytes, 10, 10), + ByteBuffer.wrap(bytes, 20, 10)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + byte[] tmp = new byte[_256KiB]; + int read = in.read(tmp); + assertThat(read).isEqualTo(30); + assertThat(xxd(ByteString.copyFrom(tmp, 0, read))).isEqualTo(xxd(bytes)); + } + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java index 304cdd69f8..3352a92adc 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java @@ -31,6 +31,7 @@ import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; import com.google.cloud.storage.GrpcStorageOptions; +import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.BufferAllocationStrategy; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.ExecutorSupplier; @@ -73,7 +74,7 @@ @RunWith(StorageITRunner.class) @CrossRun( - transports = {Transport.GRPC}, + transports = {Transport.HTTP, Transport.GRPC}, backends = {Backend.PROD}) public final class ITParallelCompositeUploadBlobWriteSessionConfigTest { @@ -125,6 +126,12 @@ public void setUp() throws Exception { .toBuilder() .setBlobWriteSessionConfig(pcu) .build(); + } else if (transport == Transport.HTTP) { + storageOptions = + ((HttpStorageOptions) injectedStorage.getOptions()) + .toBuilder() + .setBlobWriteSessionConfig(pcu) + .build(); } assertWithMessage("unable to resolve options").that(storageOptions).isNotNull(); //noinspection DataFlowIssue From 5f679db5cf69309f1491f43f4558892b60cc5aa4 Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Fri, 29 Mar 2024 13:15:07 -0700 Subject: [PATCH 08/40] chore: Transfer Manager Parallel Composite Uploads Prework (#2469) * feat: Transfer Manager Parallel Composite Uploads Prework * fix toString * add differences to clirr * clirr --- .../clirr-ignored-differences.xml | 10 +++ .../TransferManagerConfig.java | 77 +++++++++++++++---- .../transfermanager/TransferManagerImpl.java | 2 +- .../storage/it/ITTransferManagerTest.java | 6 +- ...TransferManagerConfigTestingInstances.java | 2 +- 5 files changed, 75 insertions(+), 22 deletions(-) diff --git a/google-cloud-storage/clirr-ignored-differences.xml b/google-cloud-storage/clirr-ignored-differences.xml index 7fffdb6bdf..d227206843 100644 --- a/google-cloud-storage/clirr-ignored-differences.xml +++ b/google-cloud-storage/clirr-ignored-differences.xml @@ -61,4 +61,14 @@ com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig$PartNamingStrategy java.lang.String fmtFields(*) + + 7002 + com/google/cloud/storage/transfermanager/TransferManagerConfig + boolean isAllowDivideAndConquer() + + + 7002 + com/google/cloud/storage/transfermanager/TransferManagerConfig$Builder + * setAllowDivideAndConquer(boolean) + diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java index 835d527197..b638e46f5e 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java @@ -30,7 +30,8 @@ public final class TransferManagerConfig { private final int maxWorkers; private final int perWorkerBufferSize; - private final boolean allowDivideAndConquer; + private final boolean allowDivideAndConquerDownload; + private final boolean allowParallelCompositeUpload; private final StorageOptions storageOptions; private final Qos qos; @@ -38,12 +39,14 @@ public final class TransferManagerConfig { TransferManagerConfig( int maxWorkers, int perWorkerBufferSize, - boolean allowDivideAndConquer, + boolean allowDivideAndConquerDownload, + boolean allowParallelCompositeUpload, StorageOptions storageOptions, Qos qos) { this.maxWorkers = maxWorkers; this.perWorkerBufferSize = perWorkerBufferSize; - this.allowDivideAndConquer = allowDivideAndConquer; + this.allowDivideAndConquerDownload = allowDivideAndConquerDownload; + this.allowParallelCompositeUpload = allowParallelCompositeUpload; this.storageOptions = storageOptions; this.qos = qos; } @@ -72,11 +75,21 @@ public int getPerWorkerBufferSize() { * Whether to allow Transfer Manager to perform chunked Uploads/Downloads if it determines * chunking will be beneficial * - * @see Builder#setAllowDivideAndConquer(boolean) + * @see Builder#setAllowDivideAndConquerDownload(boolean) */ @BetaApi - public boolean isAllowDivideAndConquer() { - return allowDivideAndConquer; + public boolean isAllowDivideAndConquerDownload() { + return allowDivideAndConquerDownload; + } + /** + * Whether to allow Transfer Manager to perform Parallel Composite Uploads if it determines + * chunking will be beneficial + * + * @see Builder#setAllowParallelCompositeUpload(boolean) + */ + @BetaApi + public boolean isAllowParallelCompositeUpload() { + return allowParallelCompositeUpload; } /** @@ -98,7 +111,8 @@ public TransferManager getService() { @BetaApi public Builder toBuilder() { return new Builder() - .setAllowDivideAndConquer(allowDivideAndConquer) + .setAllowDivideAndConquerDownload(allowDivideAndConquerDownload) + .setAllowParallelCompositeUpload(allowParallelCompositeUpload) .setMaxWorkers(maxWorkers) .setPerWorkerBufferSize(perWorkerBufferSize) .setQos(qos) @@ -120,13 +134,19 @@ public boolean equals(Object o) { TransferManagerConfig that = (TransferManagerConfig) o; return maxWorkers == that.maxWorkers && perWorkerBufferSize == that.perWorkerBufferSize - && allowDivideAndConquer == that.allowDivideAndConquer + && allowDivideAndConquerDownload == that.allowDivideAndConquerDownload + && allowParallelCompositeUpload == that.allowParallelCompositeUpload && Objects.equals(storageOptions, that.storageOptions); } @Override public int hashCode() { - return Objects.hash(maxWorkers, perWorkerBufferSize, allowDivideAndConquer, storageOptions); + return Objects.hash( + maxWorkers, + perWorkerBufferSize, + allowDivideAndConquerDownload, + allowParallelCompositeUpload, + storageOptions); } @Override @@ -134,7 +154,8 @@ public String toString() { return MoreObjects.toStringHelper(this) .add("maxWorkers", maxWorkers) .add("perWorkerBufferSize", perWorkerBufferSize) - .add("allowChunking", allowDivideAndConquer) + .add("allowDivideAndConquerDownload", allowDivideAndConquerDownload) + .add("allowParallelCompositeUpload", allowParallelCompositeUpload) .add("storageOptions", storageOptions) .toString(); } @@ -154,7 +175,8 @@ public static class Builder { private int maxWorkers; private int perWorkerBufferSize; - private boolean allowDivideAndConquer; + private boolean allowDivideAndConquerDownload; + private boolean allowParallelCompositeUpload; private StorageOptions storageOptions; private Qos qos; @@ -162,7 +184,8 @@ public static class Builder { private Builder() { this.perWorkerBufferSize = 16 * 1024 * 1024; this.maxWorkers = 2 * Runtime.getRuntime().availableProcessors(); - this.allowDivideAndConquer = false; + this.allowDivideAndConquerDownload = false; + this.allowParallelCompositeUpload = false; this.storageOptions = StorageOptions.getDefaultInstance(); this.qos = DefaultQos.of(); } @@ -202,12 +225,27 @@ public Builder setPerWorkerBufferSize(int perWorkerBufferSize) { * *

        Default Value: false * - * @return the instance of Builder with the value for allowDivideAndConquer modified. - * @see TransferManagerConfig#isAllowDivideAndConquer() + * @return the instance of Builder with the value for allowDivideAndConquerDownload modified. + * @see TransferManagerConfig#isAllowDivideAndConquerDownload() + */ + @BetaApi + public Builder setAllowDivideAndConquerDownload(boolean allowDivideAndConquerDownload) { + this.allowDivideAndConquerDownload = allowDivideAndConquerDownload; + return this; + } + + /** + * Whether to allow Transfer Manager to perform Parallel Composite Uploads if it determines + * chunking will be beneficial + * + *

        Default Value: false + * + * @return the instance of Builder with the value for allowDivideAndConquerDownload modified. + * @see TransferManagerConfig#isAllowDivideAndConquerDownload() */ @BetaApi - public Builder setAllowDivideAndConquer(boolean allowDivideAndConquer) { - this.allowDivideAndConquer = allowDivideAndConquer; + public Builder setAllowParallelCompositeUpload(boolean allowDivideAndConquerDownload) { + this.allowDivideAndConquerDownload = allowDivideAndConquerDownload; return this; } @@ -239,7 +277,12 @@ Builder setQos(Qos qos) { @BetaApi public TransferManagerConfig build() { return new TransferManagerConfig( - maxWorkers, perWorkerBufferSize, allowDivideAndConquer, storageOptions, qos); + maxWorkers, + perWorkerBufferSize, + allowDivideAndConquerDownload, + allowParallelCompositeUpload, + storageOptions, + qos); } } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java index 2807d7923f..b731c2c3c2 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java @@ -103,7 +103,7 @@ public void close() throws Exception { Storage.BlobSourceOption[] opts = config.getOptionsPerRequest().toArray(new Storage.BlobSourceOption[0]); List> downloadTasks = new ArrayList<>(); - if (!transferManagerConfig.isAllowDivideAndConquer()) { + if (!transferManagerConfig.isAllowDivideAndConquerDownload()) { for (BlobInfo blob : blobs) { DirectDownloadCallable callable = new DirectDownloadCallable(storage, blob, config, opts); downloadTasks.add(convert(executor.submit(callable))); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java index 7416109be2..4f345af0d9 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java @@ -303,7 +303,7 @@ public void downloadBlobsAllowChunked() throws Exception { TransferManagerConfig config = TransferManagerConfigTestingInstances.defaults(storage.getOptions()) .toBuilder() - .setAllowDivideAndConquer(true) + .setAllowDivideAndConquerDownload(true) .setPerWorkerBufferSize(128 * 1024) .build(); try (TransferManager transferManager = config.getService()) { @@ -367,7 +367,7 @@ public void downloadBlobsChunkedFail() throws Exception { TransferManagerConfig config = TransferManagerConfigTestingInstances.defaults(storage.getOptions()) .toBuilder() - .setAllowDivideAndConquer(true) + .setAllowDivideAndConquerDownload(true) .setPerWorkerBufferSize(128 * 1024) .build(); try (TransferManager transferManager = config.getService()) { @@ -393,7 +393,7 @@ public void downloadBlobsPreconditionFailure() throws Exception { TransferManagerConfig config = TransferManagerConfigTestingInstances.defaults(storage.getOptions()) .toBuilder() - .setAllowDivideAndConquer(true) + .setAllowDivideAndConquerDownload(true) .setPerWorkerBufferSize(128 * 1024) .build(); try (TransferManager transferManager = config.getService()) { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java index 1c5e67b9bf..e9ef86c313 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java @@ -27,7 +27,7 @@ public static TransferManagerConfig defaults() { public static TransferManagerConfig defaults(StorageOptions options) { return TransferManagerConfig.newBuilder() - .setAllowDivideAndConquer(false) + .setAllowDivideAndConquerDownload(false) .setMaxWorkers(1) .setPerWorkerBufferSize(512 * 1024) .setQos(DefaultQos.of(2 * 1024 * 1024)) From 3b2b259495fb4c0978e0ca01971ff5f514d817dc Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 17:35:06 -0400 Subject: [PATCH 09/40] chore(main): release 2.36.2-SNAPSHOT (#2462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(main): release 2.36.2-SNAPSHOT * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Owl Bot --- README.md | 2 +- 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 | 2 +- storage-shared-benchmarking/pom.xml | 4 ++-- versions.txt | 14 +++++++------- 13 files changed, 41 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 61c48088ee..7f4116b62b 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,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.34.0') +implementation platform('com.google.cloud:libraries-bom:26.35.0') implementation 'com.google.cloud:google-cloud-storage' ``` diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml index feb43f75a9..6c338239b4 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.36.1-alpha + 2.36.2-alpha-SNAPSHOT gapic-google-cloud-storage-v2 GRPC library for gapic-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.36.2-SNAPSHOT diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index 2c33298edc..45869aceb7 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.36.1 + 2.36.2-SNAPSHOT pom com.google.cloud @@ -69,37 +69,37 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.36.2-SNAPSHOT com.google.api.grpc gapic-google-cloud-storage-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc proto-google-cloud-storage-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index 556c235dfb..aadfc3d152 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.36.1-alpha + 2.36.2-alpha-SNAPSHOT google-cloud-storage-control GRPC library for google-cloud-storage-control com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.36.2-SNAPSHOT diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 22d2877a02..fd158285f7 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 2.36.1 + 2.36.2-SNAPSHOT jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,7 +12,7 @@ com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.36.2-SNAPSHOT google-cloud-storage diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml index 732ba90c5c..62eccdcda4 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.36.1-alpha + 2.36.2-alpha-SNAPSHOT grpc-google-cloud-storage-control-v2 GRPC library for google-cloud-storage com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.36.2-SNAPSHOT diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml index 04096f708a..04a5ad3a8a 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.36.1-alpha + 2.36.2-alpha-SNAPSHOT grpc-google-cloud-storage-v2 GRPC library for grpc-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.36.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 50c6569329..0871dbdcb0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 2.36.1 + 2.36.2-SNAPSHOT Storage Parent https://github.com/googleapis/java-storage @@ -76,7 +76,7 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.36.2-SNAPSHOT com.google.apis @@ -117,32 +117,32 @@ com.google.api.grpc proto-google-cloud-storage-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc gapic-google-cloud-storage-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.36.2-alpha-SNAPSHOT com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.36.2-alpha-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 a0c8d8e62b..a4078283e9 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.36.1-alpha + 2.36.2-alpha-SNAPSHOT proto-google-cloud-storage-control-v2 Proto library for proto-google-cloud-storage-control-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.36.2-SNAPSHOT diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml index 1088d2ae7e..a9b8514347 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.36.1-alpha + 2.36.2-alpha-SNAPSHOT proto-google-cloud-storage-v2 PROTO library for proto-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.36.2-SNAPSHOT diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 5ba9276aa2..6366f9d25e 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,7 +28,7 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.36.2-SNAPSHOT diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml index 365e0b7536..a7e3cc59bc 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.36.1 + 2.36.2-SNAPSHOT @@ -31,7 +31,7 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.36.2-SNAPSHOT tests diff --git a/versions.txt b/versions.txt index af578c61ca..2d4f51065d 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-storage:2.36.1:2.36.1 -gapic-google-cloud-storage-v2:2.36.1-alpha:2.36.1-alpha -grpc-google-cloud-storage-v2:2.36.1-alpha:2.36.1-alpha -proto-google-cloud-storage-v2:2.36.1-alpha:2.36.1-alpha -google-cloud-storage-control:2.36.1-alpha:2.36.1-alpha -proto-google-cloud-storage-control-v2:2.36.1-alpha:2.36.1-alpha -grpc-google-cloud-storage-control-v2:2.36.1-alpha:2.36.1-alpha +google-cloud-storage:2.36.1:2.36.2-SNAPSHOT +gapic-google-cloud-storage-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT +grpc-google-cloud-storage-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT +proto-google-cloud-storage-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT +google-cloud-storage-control:2.36.1-alpha:2.36.2-alpha-SNAPSHOT +proto-google-cloud-storage-control-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT +grpc-google-cloud-storage-control-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT From 955d78af0fecd4b65506df4bfd44fc683e23c2ec Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Mon, 1 Apr 2024 14:54:28 -0400 Subject: [PATCH 10/40] fix: fix BidiBlobWriteSessionConfigs to respect preconditions (#2481) --- .../com/google/cloud/storage/UnifiedOpts.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) 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 06909620d2..16c76ef926 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 @@ -598,6 +598,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getObjectChecksumsBuilder().setCrc32C(val); + return b; + }; + } + @Override public int hashCode() { return Objects.hash(val); @@ -753,6 +761,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + customerSuppliedKey(b.getCommonObjectRequestParamsBuilder(), val); + return b; + }; + } + @Override public Mapper updateObject() { return b -> { @@ -1045,6 +1061,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfGenerationMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfGenerationMatch(val); @@ -1106,6 +1130,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfGenerationNotMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfGenerationNotMatch(val); @@ -1157,6 +1189,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().getResourceBuilder().setKmsKey(val); + return b; + }; + } + @Override public Mapper composeObject() { return b -> b.setKmsKey(val); @@ -1217,6 +1257,15 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getObjectChecksumsBuilder() + .setMd5Hash(ByteString.copyFrom(BaseEncoding.base64().decode(val))); + return b; + }; + } + @Override public int hashCode() { return Objects.hash(val); @@ -1252,6 +1301,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfMetagenerationMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfMetagenerationMatch(val); @@ -1337,6 +1394,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfMetagenerationNotMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfMetagenerationNotMatch(val); @@ -1452,6 +1517,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setPredefinedAcl(val); + return b; + }; + } + @Override public Mapper updateObject() { return b -> b.setPredefinedAcl(val); @@ -1704,6 +1777,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().getResourceBuilder().setContentType(val); + return b; + }; + } + @Override public Mapper updateObject() { return b -> { From 895fd3b4cdd983bcd08097c4246effc043b281d5 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Mon, 1 Apr 2024 15:44:46 -0400 Subject: [PATCH 11/40] build: include junit-vintage-engine in test dependencies (#2455) Include junit-vintage-engine in test dependencies for google-cloud-storage to ensure junit4 and junit5 tests are both run during `mvn test`. test: remove all EasyMock tests and the dependency --- google-cloud-storage/pom.xml | 17 +- .../com/google/cloud/storage/BlobTest.java | 600 ----- .../com/google/cloud/storage/BucketTest.java | 837 ------ .../google/cloud/storage/CopyWriterTest.java | 227 -- .../cloud/storage/NotificationTest.java | 128 - .../cloud/storage/PolicyHelperTest.java | 5 - .../cloud/storage/StorageBatchResultTest.java | 107 - .../cloud/storage/StorageBatchTest.java | 251 -- .../cloud/storage/StorageExceptionTest.java | 206 -- .../google/cloud/storage/StorageImplTest.java | 2344 ----------------- .../cloud/storage/StorageOptionsTest.java | 68 - .../storage/testing/ApiPolicyMatcher.java | 102 - .../storage/testing/ApiPolicyMatcherTest.java | 108 - .../testing/RemoteStorageHelperTest.java | 273 -- pom.xml | 19 - 15 files changed, 11 insertions(+), 5281 deletions(-) delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/NotificationTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index fd158285f7..7fbba0aeeb 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -210,11 +210,6 @@ - - org.easymock - easymock - test - org.mockito mockito-core @@ -251,6 +246,12 @@ 1.8.4 test + + org.junit.vintage + junit-vintage-engine + ${junit-platform.version} + test + @@ -293,6 +294,11 @@ google-api-client to be able to bootstrap. --> com.google.http-client:google-http-client-gson + + org.junit.vintage:junit-vintage-engine @@ -316,7 +322,6 @@ sponge_log - org.apache.maven.surefire diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java deleted file mode 100644 index 4cb1ee86ae..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java +++ /dev/null @@ -1,600 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static org.easymock.EasyMock.capture; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createNiceMock; -import static org.easymock.EasyMock.createStrictMock; -import static org.easymock.EasyMock.eq; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -import com.google.api.core.ApiClock; -import com.google.api.gax.retrying.RetrySettings; -import com.google.cloud.ReadChannel; -import com.google.cloud.storage.Acl.Project; -import com.google.cloud.storage.Acl.Project.ProjectRole; -import com.google.cloud.storage.Acl.Role; -import com.google.cloud.storage.Acl.User; -import com.google.cloud.storage.Blob.BlobSourceOption; -import com.google.cloud.storage.BlobInfo.BuilderImpl; -import com.google.cloud.storage.Storage.CopyRequest; -import com.google.cloud.storage.spi.v1.HttpStorageRpc; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.io.BaseEncoding; -import java.io.File; -import java.net.URL; -import java.nio.file.Path; -import java.security.Key; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import javax.crypto.spec.SecretKeySpec; -import org.easymock.Capture; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -public class BlobTest { - - private static final Acl ACL = Acl.of(User.ofAllAuthenticatedUsers(), Role.OWNER); - private static final Acl OTHER_ACL = Acl.of(new Project(ProjectRole.OWNERS, "p"), Role.READER); - private static final List ACLS = ImmutableList.of(ACL, OTHER_ACL); - private static final Integer COMPONENT_COUNT = 2; - private static final String CONTENT_TYPE = "text/html"; - private static final String CACHE_CONTROL = "cache"; - private static final String CONTENT_DISPOSITION = "content-disposition"; - private static final String CONTENT_ENCODING = "UTF-8"; - private static final String CONTENT_LANGUAGE = "En"; - private static final String CRC32 = "FF00"; - private static final String CRC32_HEX_STRING = "145d34"; - private static final Long DELETE_TIME = System.currentTimeMillis(); - private static final String ETAG = "0xFF00"; - private static final Long GENERATION = 1L; - private static final String GENERATED_ID = "B/N:1"; - private static final String MD5 = "FF00"; - private static final String MD5_HEX_STRING = "145d34"; - private static final String MEDIA_LINK = "http://media/b/n"; - private static final Map METADATA = ImmutableMap.of("n1", "v1", "n2", "v2"); - private static final Long META_GENERATION = 10L; - private static final User OWNER = new User("user@gmail.com"); - private static final String SELF_LINK = "http://storage/b/n"; - private static final Long SIZE = 1024L; - private static final Long UPDATE_TIME = DELETE_TIME - 1L; - private static final Long CREATE_TIME = UPDATE_TIME - 1L; - private static final Long CUSTOM_TIME = CREATE_TIME - 1L; - private static final StorageClass STORAGE_CLASS = StorageClass.COLDLINE; - private static final Long TIME_STORAGE_CLASS_UPDATED = CREATE_TIME; - private static final String ENCRYPTION_ALGORITHM = "AES256"; - private static final String KEY_SHA256 = "keySha"; - private static final BlobInfo.CustomerEncryption CUSTOMER_ENCRYPTION = - new BlobInfo.CustomerEncryption(ENCRYPTION_ALGORITHM, KEY_SHA256); - private static final String KMS_KEY_NAME = - "projects/p/locations/kr-loc/keyRings/kr/cryptoKeys/key"; - private static final Boolean EVENT_BASED_HOLD = true; - private static final Boolean TEMPORARY_HOLD = true; - private static final Long RETENTION_EXPIRATION_TIME = 10L; - private static final BlobInfo FULL_BLOB_INFO = - BlobInfo.newBuilder("b", "n", GENERATION) - .setAcl(ACLS) - .setComponentCount(COMPONENT_COUNT) - .setContentType(CONTENT_TYPE) - .setCacheControl(CACHE_CONTROL) - .setContentDisposition(CONTENT_DISPOSITION) - .setContentEncoding(CONTENT_ENCODING) - .setContentLanguage(CONTENT_LANGUAGE) - .setCrc32c(CRC32) - .setDeleteTime(DELETE_TIME) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMd5(MD5) - .setMediaLink(MEDIA_LINK) - .setMetadata(METADATA) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setSize(SIZE) - .setUpdateTime(UPDATE_TIME) - .setCreateTime(CREATE_TIME) - .setCustomTime(CUSTOM_TIME) - .setStorageClass(STORAGE_CLASS) - .setTimeStorageClassUpdated(TIME_STORAGE_CLASS_UPDATED) - .setCustomerEncryption(CUSTOMER_ENCRYPTION) - .setKmsKeyName(KMS_KEY_NAME) - .setEventBasedHold(EVENT_BASED_HOLD) - .setTemporaryHold(TEMPORARY_HOLD) - .setRetentionExpirationTime(RETENTION_EXPIRATION_TIME) - .build(); - private static final BlobInfo BLOB_INFO = - BlobInfo.newBuilder("b", "n", 12345678L).setMetageneration(42L).build(); - private static final BlobInfo BLOB_INFO_NO_GENERATION = - BlobInfo.newBuilder(BLOB_INFO.getBucket(), BLOB_INFO.getName()) - .setMetageneration(42L) - .build(); - private static final BlobInfo DIRECTORY_INFO = - BlobInfo.newBuilder("b", "n/").setSize(0L).setIsDirectory(true).build(); - private static final String BASE64_KEY = "JVzfVl8NLD9FjedFuStegjRfES5ll5zc59CIXw572OA="; - private static final Key KEY = - new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); - - // This retrying setting is used by test testDownloadWithRetries. This unit test is setup - // to write one byte and then throw retryable exception, it then writes another bytes on - // second call succeeds. - private static final RetrySettings RETRY_SETTINGS = - RetrySettings.newBuilder().setMaxAttempts(2).build(); - private static final ApiClock API_CLOCK = - new ApiClock() { - @Override - public long nanoTime() { - return 42_000_000_000L; - } - - @Override - public long millisTime() { - return 42_000L; - } - }; - - private Storage storage; - private Blob blob; - private Blob expectedBlob; - private Storage serviceMockReturnsOptions = createMock(Storage.class); - private HttpStorageOptions mockOptions = createMock(HttpStorageOptions.class); - private final HttpRetryAlgorithmManager retryAlgorithmManager = - HttpStorageOptions.getDefaultInstance().getRetryAlgorithmManager(); - - @Before - public void setUp() { - storage = createStrictMock(Storage.class); - } - - @After - public void tearDown() throws Exception { - verify(storage); - } - - private void initializeExpectedBlob() { - expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).anyTimes(); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(mockOptions); - replay(serviceMockReturnsOptions); - expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(BLOB_INFO)); - } - - private void initializeBlob() { - blob = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO)); - } - - @Test - public void testExists_True() throws Exception { - initializeExpectedBlob(); - Storage.BlobGetOption[] expectedOptions = {Storage.BlobGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(expectedBlob.getBlobId(), expectedOptions)).andReturn(expectedBlob); - replay(storage); - initializeBlob(); - assertTrue(blob.exists()); - } - - @Test - public void testExists_False() throws Exception { - Storage.BlobGetOption[] expectedOptions = {Storage.BlobGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO.getBlobId(), expectedOptions)).andReturn(null); - replay(storage); - initializeBlob(); - assertFalse(blob.exists()); - } - - @Test - public void testContent() throws Exception { - initializeExpectedBlob(); - byte[] content = {1, 2}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.readAllBytes(BLOB_INFO.getBlobId())).andReturn(content); - replay(storage); - initializeBlob(); - assertArrayEquals(content, blob.getContent()); - } - - @Test - public void testContentWithDecryptionKey() throws Exception { - initializeExpectedBlob(); - byte[] content = {1, 2}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect( - storage.readAllBytes( - BLOB_INFO.getBlobId(), Storage.BlobSourceOption.decryptionKey(BASE64_KEY))) - .andReturn(content) - .times(2); - replay(storage); - initializeBlob(); - assertArrayEquals(content, blob.getContent(BlobSourceOption.decryptionKey(BASE64_KEY))); - assertArrayEquals(content, blob.getContent(BlobSourceOption.decryptionKey(KEY))); - } - - @Test - public void testReload() throws Exception { - initializeExpectedBlob(); - Blob expectedReloadedBlob = expectedBlob.toBuilder().setCacheControl("c").build(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO_NO_GENERATION.getBlobId(), new Storage.BlobGetOption[0])) - .andReturn(expectedReloadedBlob); - replay(storage); - initializeBlob(); - Blob updatedBlob = blob.reload(); - assertEquals(expectedReloadedBlob, updatedBlob); - } - - @Test - public void testReloadNull() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO_NO_GENERATION.getBlobId(), new Storage.BlobGetOption[0])) - .andReturn(null); - replay(storage); - initializeBlob(); - Blob reloadedBlob = blob.reload(); - assertNull(reloadedBlob); - } - - @Test - public void testReloadWithOptions() throws Exception { - initializeExpectedBlob(); - Blob expectedReloadedBlob = expectedBlob.toBuilder().setCacheControl("c").build(); - Storage.BlobGetOption[] options = {Storage.BlobGetOption.metagenerationMatch(42L)}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO_NO_GENERATION.getBlobId(), options)) - .andReturn(expectedReloadedBlob); - replay(storage); - initializeBlob(); - Blob updatedBlob = blob.reload(BlobSourceOption.metagenerationMatch()); - assertEquals(expectedReloadedBlob, updatedBlob); - } - - @Test - public void testUpdate() throws Exception { - initializeExpectedBlob(); - Blob expectedUpdatedBlob = expectedBlob.toBuilder().setCacheControl("c").build(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.update(eq(expectedUpdatedBlob), new Storage.BlobTargetOption[0])) - .andReturn(expectedUpdatedBlob); - replay(storage); - initializeBlob(); - Blob updatedBlob = new Blob(storage, new BlobInfo.BuilderImpl(expectedUpdatedBlob)); - Blob actualUpdatedBlob = updatedBlob.update(); - assertEquals(expectedUpdatedBlob, actualUpdatedBlob); - } - - @Test - public void testDelete() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.delete(BLOB_INFO.getBlobId(), new Storage.BlobSourceOption[0])).andReturn(true); - replay(storage); - initializeBlob(); - assertTrue(blob.delete()); - } - - @Test - public void testCopyToBucket() throws Exception { - initializeExpectedBlob(); - BlobInfo target = BlobInfo.newBuilder(BlobId.of("bt", "n")).build(); - CopyWriter copyWriter = createMock(CopyWriter.class); - Capture capturedCopyRequest = Capture.newInstance(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.copy(capture(capturedCopyRequest))).andReturn(copyWriter); - replay(storage); - initializeBlob(); - CopyWriter returnedCopyWriter = blob.copyTo("bt"); - assertEquals(copyWriter, returnedCopyWriter); - assertEquals(BLOB_INFO_NO_GENERATION.getBlobId(), capturedCopyRequest.getValue().getSource()); - assertEquals(target, capturedCopyRequest.getValue().getTarget()); - assertFalse(capturedCopyRequest.getValue().overrideInfo()); - assertTrue(capturedCopyRequest.getValue().getSourceOptions().isEmpty()); - assertTrue(capturedCopyRequest.getValue().getTargetOptions().isEmpty()); - } - - @Test - public void testCopyTo() throws Exception { - initializeExpectedBlob(); - BlobInfo target = BlobInfo.newBuilder(BlobId.of("bt", "nt")).build(); - CopyWriter copyWriter = createMock(CopyWriter.class); - Capture capturedCopyRequest = Capture.newInstance(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.copy(capture(capturedCopyRequest))).andReturn(copyWriter); - replay(storage); - initializeBlob(); - CopyWriter returnedCopyWriter = blob.copyTo("bt", "nt"); - assertEquals(copyWriter, returnedCopyWriter); - assertEquals(BLOB_INFO_NO_GENERATION.getBlobId(), capturedCopyRequest.getValue().getSource()); - assertEquals(target, capturedCopyRequest.getValue().getTarget()); - assertFalse(capturedCopyRequest.getValue().overrideInfo()); - assertTrue(capturedCopyRequest.getValue().getSourceOptions().isEmpty()); - assertTrue(capturedCopyRequest.getValue().getTargetOptions().isEmpty()); - } - - @Test - public void testCopyToBlobId() throws Exception { - initializeExpectedBlob(); - BlobInfo target = BlobInfo.newBuilder(BlobId.of("bt", "nt")).build(); - BlobId targetId = BlobId.of("bt", "nt"); - CopyWriter copyWriter = createMock(CopyWriter.class); - Capture capturedCopyRequest = Capture.newInstance(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.copy(capture(capturedCopyRequest))).andReturn(copyWriter); - replay(storage); - initializeBlob(); - CopyWriter returnedCopyWriter = blob.copyTo(targetId); - assertEquals(copyWriter, returnedCopyWriter); - assertEquals(BLOB_INFO_NO_GENERATION.getBlobId(), capturedCopyRequest.getValue().getSource()); - assertEquals(target, capturedCopyRequest.getValue().getTarget()); - assertFalse(capturedCopyRequest.getValue().overrideInfo()); - assertTrue(capturedCopyRequest.getValue().getSourceOptions().isEmpty()); - assertTrue(capturedCopyRequest.getValue().getTargetOptions().isEmpty()); - } - - @Test - public void testReader() throws Exception { - initializeExpectedBlob(); - ReadChannel channel = createMock(ReadChannel.class); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.reader(BLOB_INFO.getBlobId())).andReturn(channel); - replay(storage); - initializeBlob(); - assertSame(channel, blob.reader()); - } - - @Test - public void testReaderWithDecryptionKey() throws Exception { - initializeExpectedBlob(); - ReadChannel channel = createMock(ReadChannel.class); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect( - storage.reader( - BLOB_INFO.getBlobId(), Storage.BlobSourceOption.decryptionKey(BASE64_KEY))) - .andReturn(channel) - .times(2); - replay(storage); - initializeBlob(); - assertSame(channel, blob.reader(BlobSourceOption.decryptionKey(BASE64_KEY))); - assertSame(channel, blob.reader(BlobSourceOption.decryptionKey(KEY))); - } - - @Test - public void testSignUrl() throws Exception { - initializeExpectedBlob(); - URL url = new URL("http://localhost:123/bla"); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.signUrl(expectedBlob, 100, TimeUnit.SECONDS)).andReturn(url); - replay(storage); - initializeBlob(); - assertEquals(url, blob.signUrl(100, TimeUnit.SECONDS)); - } - - @Test - public void testGetAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.getAcl(BLOB_INFO.getBlobId(), User.ofAllAuthenticatedUsers())).andReturn(ACL); - replay(storage); - initializeBlob(); - assertEquals(ACL, blob.getAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.deleteAcl(BLOB_INFO.getBlobId(), User.ofAllAuthenticatedUsers())) - .andReturn(true); - replay(storage); - initializeBlob(); - assertTrue(blob.deleteAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.createAcl(BLOB_INFO.getBlobId(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBlob(); - assertEquals(returnedAcl, blob.createAcl(ACL)); - } - - @Test - public void testUpdateAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.updateAcl(BLOB_INFO.getBlobId(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBlob(); - assertEquals(returnedAcl, blob.updateAcl(ACL)); - } - - @Test - public void testListAcls() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.listAcls(BLOB_INFO.getBlobId())).andReturn(ACLS); - replay(storage); - initializeBlob(); - assertEquals(ACLS, blob.listAcls()); - } - - @Test - public void testToBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(storage); - replay(mockOptions); - Blob fullBlob = new Blob(storage, new BlobInfo.BuilderImpl(FULL_BLOB_INFO)); - assertEquals(fullBlob, fullBlob.toBuilder().build()); - Blob simpleBlob = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO)); - assertEquals(simpleBlob, simpleBlob.toBuilder().build()); - Blob directory = new Blob(storage, new BlobInfo.BuilderImpl(DIRECTORY_INFO)); - assertEquals(directory, directory.toBuilder().build()); - } - - @Test - public void testBuilder() { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - replay(storage); - Blob.Builder builder = new Blob.Builder(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO))); - Blob blob = - builder - .setAcl(ACLS) - .setComponentCount(COMPONENT_COUNT) - .setContentType(CONTENT_TYPE) - .setCacheControl(CACHE_CONTROL) - .setContentDisposition(CONTENT_DISPOSITION) - .setContentEncoding(CONTENT_ENCODING) - .setContentLanguage(CONTENT_LANGUAGE) - .setCrc32c(CRC32) - .setCreateTime(CREATE_TIME) - .setCustomTime(CUSTOM_TIME) - .setStorageClass(STORAGE_CLASS) - .setTimeStorageClassUpdated(TIME_STORAGE_CLASS_UPDATED) - .setCustomerEncryption(CUSTOMER_ENCRYPTION) - .setKmsKeyName(KMS_KEY_NAME) - .setEventBasedHold(EVENT_BASED_HOLD) - .setTemporaryHold(TEMPORARY_HOLD) - .setRetentionExpirationTime(RETENTION_EXPIRATION_TIME) - .setDeleteTime(DELETE_TIME) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMd5(MD5) - .setMediaLink(MEDIA_LINK) - .setMetadata(METADATA) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setSize(SIZE) - .setUpdateTime(UPDATE_TIME) - .build(); - assertEquals("b", blob.getBucket()); - assertEquals("n", blob.getName()); - assertEquals(ACLS, blob.getAcl()); - assertEquals(COMPONENT_COUNT, blob.getComponentCount()); - assertEquals(CONTENT_TYPE, blob.getContentType()); - assertEquals(CACHE_CONTROL, blob.getCacheControl()); - assertEquals(CONTENT_DISPOSITION, blob.getContentDisposition()); - assertEquals(CONTENT_ENCODING, blob.getContentEncoding()); - assertEquals(CONTENT_LANGUAGE, blob.getContentLanguage()); - assertEquals(CRC32, blob.getCrc32c()); - assertEquals(CRC32_HEX_STRING, blob.getCrc32cToHexString()); - assertEquals(CREATE_TIME, blob.getCreateTime()); - assertEquals(CUSTOM_TIME, blob.getCustomTime()); - assertEquals(STORAGE_CLASS, blob.getStorageClass()); - assertEquals(TIME_STORAGE_CLASS_UPDATED, blob.getTimeStorageClassUpdated()); - assertEquals(CUSTOMER_ENCRYPTION, blob.getCustomerEncryption()); - assertEquals(KMS_KEY_NAME, blob.getKmsKeyName()); - assertEquals(EVENT_BASED_HOLD, blob.getEventBasedHold()); - assertEquals(TEMPORARY_HOLD, blob.getTemporaryHold()); - assertEquals(RETENTION_EXPIRATION_TIME, blob.getRetentionExpirationTime()); - assertEquals(DELETE_TIME, blob.getDeleteTime()); - assertEquals(ETAG, blob.getEtag()); - assertEquals(GENERATED_ID, blob.getGeneratedId()); - assertEquals(MD5, blob.getMd5()); - assertEquals(MD5_HEX_STRING, blob.getMd5ToHexString()); - assertEquals(MEDIA_LINK, blob.getMediaLink()); - assertEquals(METADATA, blob.getMetadata()); - assertEquals(META_GENERATION, blob.getMetageneration()); - assertEquals(OWNER, blob.getOwner()); - assertEquals(SELF_LINK, blob.getSelfLink()); - assertEquals(SIZE, blob.getSize()); - assertEquals(UPDATE_TIME, blob.getUpdateTime()); - assertEquals(storage.getOptions(), blob.getStorage().getOptions()); - assertFalse(blob.isDirectory()); - builder = new Blob.Builder(new Blob(storage, new BlobInfo.BuilderImpl(DIRECTORY_INFO))); - blob = builder.setBlobId(BlobId.of("b", "n/")).setIsDirectory(true).setSize(0L).build(); - assertEquals("b", blob.getBucket()); - assertEquals("n/", blob.getName()); - assertNull(blob.getAcl()); - assertNull(blob.getComponentCount()); - assertNull(blob.getContentType()); - assertNull(blob.getCacheControl()); - assertNull(blob.getContentDisposition()); - assertNull(blob.getContentEncoding()); - assertNull(blob.getContentLanguage()); - assertNull(blob.getCrc32c()); - assertNull(blob.getCrc32cToHexString()); - assertNull(blob.getCreateTime()); - assertNull(blob.getStorageClass()); - assertNull(blob.getTimeStorageClassUpdated()); - assertNull(blob.getCustomerEncryption()); - assertNull(blob.getKmsKeyName()); - assertNull(blob.getEventBasedHold()); - assertNull(blob.getTemporaryHold()); - assertNull(blob.getRetentionExpirationTime()); - assertNull(blob.getDeleteTime()); - assertNull(blob.getEtag()); - assertNull(blob.getGeneratedId()); - assertNull(blob.getMd5()); - assertNull(blob.getMd5ToHexString()); - assertNull(blob.getMediaLink()); - assertNull(blob.getMetadata()); - assertNull(blob.getMetageneration()); - assertNull(blob.getOwner()); - assertNull(blob.getSelfLink()); - assertEquals(0L, (long) blob.getSize()); - assertNull(blob.getUpdateTime()); - assertNull(blob.getCustomTime()); - assertTrue(blob.isDirectory()); - } - - private StorageRpc prepareForDownload() { - HttpStorageRpc mockStorageRpc = createNiceMock(HttpStorageRpc.class); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - replay(storage); - expect(mockOptions.getStorageRpcV1()).andReturn(mockStorageRpc); - expect(mockOptions.getRetrySettings()).andReturn(RETRY_SETTINGS); - expect(mockOptions.getClock()).andReturn(API_CLOCK); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(mockOptions); - blob = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO)); - return mockStorageRpc; - } - - @Test - public void testDownloadTo() throws Exception { - replay(storage); - File file = File.createTempFile("blob", ".tmp"); - Path path = file.toPath(); - - Storage s = Mockito.mock(Storage.class); - Blob blob = new Blob(s, new BuilderImpl(BlobInfo.newBuilder("buck", "obj").build())); - - Mockito.doNothing().when(s).downloadTo(blob.getBlobId(), path); - blob.downloadTo(path); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java deleted file mode 100644 index 4bdb3d7f4c..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java +++ /dev/null @@ -1,837 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static com.google.cloud.storage.Acl.Role.WRITER; -import static com.google.common.truth.Truth.assertThat; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createStrictMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.gax.paging.Page; -import com.google.cloud.PageImpl; -import com.google.cloud.storage.Acl.Project; -import com.google.cloud.storage.Acl.Project.ProjectRole; -import com.google.cloud.storage.Acl.Role; -import com.google.cloud.storage.Acl.User; -import com.google.cloud.storage.BucketInfo.AgeDeleteRule; -import com.google.cloud.storage.BucketInfo.DeleteRule; -import com.google.cloud.storage.BucketInfo.LifecycleRule; -import com.google.cloud.storage.BucketInfo.LifecycleRule.LifecycleAction; -import com.google.cloud.storage.BucketInfo.LifecycleRule.LifecycleCondition; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.Storage.BlobWriteOption; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.hash.Hashing; -import com.google.common.io.BaseEncoding; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.security.Key; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import javax.crypto.spec.SecretKeySpec; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class BucketTest { - - private static final Acl ACL = Acl.of(User.ofAllAuthenticatedUsers(), Role.OWNER); - private static final Acl OTHER_ACL = Acl.of(new Project(ProjectRole.OWNERS, "p"), Role.READER); - private static final List ACLS = ImmutableList.of(ACL, OTHER_ACL); - private static final String ETAG = "0xFF00"; - private static final String GENERATED_ID = "B/N:1"; - private static final Long META_GENERATION = 10L; - private static final User OWNER = new User("user@gmail.com"); - private static final String SELF_LINK = "http://storage/b/n"; - private static final Long CREATE_TIME = System.currentTimeMillis(); - private static final Long UPDATE_TIME = CREATE_TIME - 1L; - private static final List CORS = Collections.singletonList(Cors.newBuilder().build()); - private static final List DEFAULT_ACL = - Collections.singletonList(Acl.of(User.ofAllAuthenticatedUsers(), WRITER)); - - @SuppressWarnings({"unchecked", "deprecation"}) - private static final List DELETE_RULES = - Collections.singletonList(new AgeDeleteRule(5)); - - private static final List LIFECYCLE_RULES = - Collections.singletonList( - new LifecycleRule( - LifecycleAction.newDeleteAction(), - LifecycleCondition.newBuilder().setAge(5).build())); - private static final String INDEX_PAGE = "index.html"; - private static final String NOT_FOUND_PAGE = "error.html"; - private static final String LOCATION = "ASIA"; - private static final StorageClass STORAGE_CLASS = StorageClass.STANDARD; - private static final String DEFAULT_KMS_KEY_NAME = - "projects/p/locations/kr-loc/keyRings/kr/cryptoKeys/key"; - private static final Boolean VERSIONING_ENABLED = true; - private static final Map BUCKET_LABELS = ImmutableMap.of("label1", "value1"); - private static final Boolean REQUESTER_PAYS = true; - private static final String USER_PROJECT = "test-project"; - private static final Boolean DEFAULT_EVENT_BASED_HOLD = true; - private static final Long RETENTION_EFFECTIVE_TIME = 10L; - private static final Long RETENTION_PERIOD = 10L; - private static final Boolean RETENTION_POLICY_IS_LOCKED = false; - private static final List LOCATION_TYPES = - ImmutableList.of("multi-region", "region", "dual-region"); - private static final String LOCATION_TYPE = "multi-region"; - - @SuppressWarnings({"unchecked", "deprecation"}) - private static final BucketInfo FULL_BUCKET_INFO = - BucketInfo.newBuilder("b") - .setAcl(ACLS) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setCors(CORS) - .setCreateTime(CREATE_TIME) - .setUpdateTime(UPDATE_TIME) - .setDefaultAcl(DEFAULT_ACL) - .setDeleteRules(DELETE_RULES) - .setLifecycleRules(LIFECYCLE_RULES) - .setIndexPage(INDEX_PAGE) - .setNotFoundPage(NOT_FOUND_PAGE) - .setLocation(LOCATION) - .setStorageClass(STORAGE_CLASS) - .setVersioningEnabled(VERSIONING_ENABLED) - .setLabels(BUCKET_LABELS) - .setRequesterPays(REQUESTER_PAYS) - .setDefaultKmsKeyName(DEFAULT_KMS_KEY_NAME) - .setDefaultEventBasedHold(DEFAULT_EVENT_BASED_HOLD) - .setRetentionEffectiveTime(RETENTION_EFFECTIVE_TIME) - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(RETENTION_POLICY_IS_LOCKED) - .build(); - - private static final BucketInfo BUCKET_INFO = - BucketInfo.newBuilder("b").setMetageneration(42L).build(); - private static final String CONTENT_TYPE = "text/plain"; - private static final String BASE64_KEY = "JVzfVl8NLD9FjedFuStegjRfES5ll5zc59CIXw572OA="; - private static final Key KEY = - new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); - private final HttpRetryAlgorithmManager retryAlgorithmManager = - HttpStorageOptions.getDefaultInstance().getRetryAlgorithmManager(); - - private Storage storage; - private Storage serviceMockReturnsOptions = createMock(Storage.class); - private HttpStorageOptions mockOptions = createMock(HttpStorageOptions.class); - private Bucket bucket; - private Bucket expectedBucket; - private List blobResults; - - @Before - public void setUp() { - storage = createStrictMock(Storage.class); - } - - @After - public void tearDown() throws Exception { - verify(storage); - } - - private void initializeExpectedBucket() { - expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).anyTimes(); - replay(serviceMockReturnsOptions); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(mockOptions); - expectedBucket = new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(BUCKET_INFO)); - blobResults = - ImmutableList.of( - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n1").build())), - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n2").build())), - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n3").build()))); - } - - private void initializeBucket() { - bucket = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO)); - } - - @Test - public void testExists_True() throws Exception { - initializeExpectedBucket(); - Storage.BucketGetOption[] expectedOptions = {Storage.BucketGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BUCKET_INFO.getName(), expectedOptions)).andReturn(expectedBucket); - replay(storage); - initializeBucket(); - assertTrue(bucket.exists()); - } - - @Test - public void testExists_False() throws Exception { - initializeExpectedBucket(); - Storage.BucketGetOption[] expectedOptions = {Storage.BucketGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BUCKET_INFO.getName(), expectedOptions)).andReturn(null); - replay(storage); - initializeBucket(); - assertFalse(bucket.exists()); - } - - @Test - public void testReload() throws Exception { - initializeExpectedBucket(); - BucketInfo updatedInfo = BUCKET_INFO.toBuilder().setNotFoundPage("p").build(); - Bucket expectedUpdatedBucket = - new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(updatedInfo)); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(updatedInfo.getName())).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = bucket.reload(); - assertEquals(expectedUpdatedBucket, updatedBucket); - } - - @Test - public void testReloadNull() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BUCKET_INFO.getName())).andReturn(null); - replay(storage); - initializeBucket(); - assertNull(bucket.reload()); - } - - @Test - public void testReloadWithOptions() throws Exception { - initializeExpectedBucket(); - BucketInfo updatedInfo = BUCKET_INFO.toBuilder().setNotFoundPage("p").build(); - Bucket expectedUpdatedBucket = - new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(updatedInfo)); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(updatedInfo.getName(), Storage.BucketGetOption.metagenerationMatch(42L))) - .andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = bucket.reload(Bucket.BucketSourceOption.metagenerationMatch()); - assertEquals(expectedUpdatedBucket, updatedBucket); - } - - @Test - public void testUpdate() throws Exception { - initializeExpectedBucket(); - Bucket expectedUpdatedBucket = expectedBucket.toBuilder().setNotFoundPage("p").build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertEquals(expectedUpdatedBucket, actualUpdatedBucket); - } - - @Test - public void testDelete() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.delete(BUCKET_INFO.getName())).andReturn(true); - replay(storage); - initializeBucket(); - assertTrue(bucket.delete()); - } - - @Test - public void testList() throws Exception { - initializeExpectedBucket(); - PageImpl expectedBlobPage = new PageImpl<>(null, "c", blobResults); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.list(BUCKET_INFO.getName())).andReturn(expectedBlobPage); - replay(storage); - initializeBucket(); - Page blobPage = bucket.list(); - Iterator blobInfoIterator = blobPage.getValues().iterator(); - Iterator blobIterator = blobPage.getValues().iterator(); - while (blobInfoIterator.hasNext() && blobIterator.hasNext()) { - assertEquals(blobInfoIterator.next(), blobIterator.next()); - } - assertFalse(blobInfoIterator.hasNext()); - assertFalse(blobIterator.hasNext()); - assertEquals(expectedBlobPage.getNextPageToken(), blobPage.getNextPageToken()); - } - - @Test - public void testGet() throws Exception { - initializeExpectedBucket(); - Blob expectedBlob = - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n").build())); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BlobId.of(expectedBucket.getName(), "n"), new Storage.BlobGetOption[0])) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.get("n"); - assertEquals(expectedBlob, blob); - } - - @Test - public void testGetAllArray() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - List blobIds = - Lists.transform( - blobResults, - new Function() { - @Override - public BlobId apply(Blob blob) { - return blob.getBlobId(); - } - }); - expect(storage.get(blobIds)).andReturn(blobResults); - replay(storage); - initializeBucket(); - assertEquals(blobResults, bucket.get("n1", "n2", "n3")); - } - - @Test - public void testGetAllIterable() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - List blobIds = - Lists.transform( - blobResults, - new Function() { - @Override - public BlobId apply(Blob blob) { - return blob.getBlobId(); - } - }); - expect(storage.get(blobIds)).andReturn(blobResults); - replay(storage); - initializeBucket(); - assertEquals(blobResults, bucket.get(ImmutableList.of("n1", "n2", "n3"))); - } - - @Test - public void testCreate() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", content, CONTENT_TYPE); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateNoContentType() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", content); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateWithOptions() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - Storage.PredefinedAcl acl = Storage.PredefinedAcl.ALL_AUTHENTICATED_USERS; - expect(storage.getOptions()).andReturn(mockOptions); - expect( - storage.create( - info, - content, - new BlobTargetOption(UnifiedOpts.generationMatch(42L)), - new BlobTargetOption(UnifiedOpts.metagenerationMatch(24L)), - Storage.BlobTargetOption.predefinedAcl(acl), - Storage.BlobTargetOption.encryptionKey(BASE64_KEY), - Storage.BlobTargetOption.userProject(USER_PROJECT))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create( - "n", - content, - CONTENT_TYPE, - Bucket.BlobTargetOption.generationMatch(42L), - Bucket.BlobTargetOption.metagenerationMatch(24L), - Bucket.BlobTargetOption.predefinedAcl(acl), - Bucket.BlobTargetOption.encryptionKey(BASE64_KEY), - Bucket.BlobTargetOption.userProject(USER_PROJECT)); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateWithEncryptionKey() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content, Storage.BlobTargetOption.encryptionKey(KEY))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create("n", content, CONTENT_TYPE, Bucket.BlobTargetOption.encryptionKey(KEY)); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateWithKmsKeyName() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content, Storage.BlobTargetOption.kmsKeyName(DEFAULT_KMS_KEY_NAME))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create( - "n", content, CONTENT_TYPE, Bucket.BlobTargetOption.kmsKeyName(DEFAULT_KMS_KEY_NAME)); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateNotExists() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content, new BlobTargetOption(UnifiedOpts.doesNotExist()))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", content, CONTENT_TYPE, Bucket.BlobTargetOption.doesNotExist()); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStream() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", streamContent, CONTENT_TYPE); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamNoContentType() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", streamContent); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamWithOptions() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = info.asBlob(serviceMockReturnsOptions); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - String crc32c = Utils.crc32cCodec.encode(Hashing.crc32c().hashBytes(content).asInt()); - Storage.PredefinedAcl acl = Storage.PredefinedAcl.ALL_AUTHENTICATED_USERS; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect( - storage.create( - info, - streamContent, - new BlobWriteOption(UnifiedOpts.generationMatch(42L)), - new BlobWriteOption(UnifiedOpts.metagenerationMatch(24L)), - Storage.BlobWriteOption.predefinedAcl(acl), - new BlobWriteOption(UnifiedOpts.crc32cMatch(crc32c)), - new BlobWriteOption(UnifiedOpts.md5Match("md5")), - Storage.BlobWriteOption.encryptionKey(BASE64_KEY), - Storage.BlobWriteOption.userProject(USER_PROJECT))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create( - "n", - streamContent, - CONTENT_TYPE, - Bucket.BlobWriteOption.generationMatch(42L), - Bucket.BlobWriteOption.metagenerationMatch(24L), - Bucket.BlobWriteOption.predefinedAcl(acl), - Bucket.BlobWriteOption.crc32cMatch(crc32c), - Bucket.BlobWriteOption.md5Match("md5"), - Bucket.BlobWriteOption.encryptionKey(BASE64_KEY), - Bucket.BlobWriteOption.userProject(USER_PROJECT)); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamWithEncryptionKey() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent, Storage.BlobWriteOption.encryptionKey(KEY))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create("n", streamContent, CONTENT_TYPE, Bucket.BlobWriteOption.encryptionKey(KEY)); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamNotExists() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = info.asBlob(serviceMockReturnsOptions); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent, new BlobWriteOption(UnifiedOpts.doesNotExist()))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create("n", streamContent, CONTENT_TYPE, Bucket.BlobWriteOption.doesNotExist()); - assertEquals(expectedBlob, blob); - } - - @Test - public void testGetAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.getAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())).andReturn(ACL); - replay(storage); - initializeBucket(); - assertEquals(ACL, bucket.getAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.deleteAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())) - .andReturn(true); - replay(storage); - initializeBucket(); - assertTrue(bucket.deleteAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.createAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.createAcl(ACL)); - } - - @Test - public void testUpdateAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.updateAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.updateAcl(ACL)); - } - - @Test - public void testListAcls() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.listAcls(BUCKET_INFO.getName())).andReturn(ACLS); - replay(storage); - initializeBucket(); - assertEquals(ACLS, bucket.listAcls()); - } - - @Test - public void testGetDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.getDefaultAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())) - .andReturn(ACL); - replay(storage); - initializeBucket(); - assertEquals(ACL, bucket.getDefaultAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.deleteDefaultAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())) - .andReturn(true); - replay(storage); - initializeBucket(); - assertTrue(bucket.deleteDefaultAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.createDefaultAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.createDefaultAcl(ACL)); - } - - @Test - public void testUpdateDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.updateDefaultAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.updateDefaultAcl(ACL)); - } - - @Test - public void testListDefaultAcls() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.listDefaultAcls(BUCKET_INFO.getName())).andReturn(ACLS); - replay(storage); - initializeBucket(); - assertEquals(ACLS, bucket.listDefaultAcls()); - } - - @Test - public void testLockRetention() throws Exception { - initializeExpectedBucket(); - Bucket expectedRetentionLockedBucket = - expectedBucket - .toBuilder() - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(true) - .build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect( - storage.lockRetentionPolicy( - expectedRetentionLockedBucket, - Storage.BucketTargetOption.metagenerationMatch(), - Storage.BucketTargetOption.userProject(USER_PROJECT))) - .andReturn(expectedRetentionLockedBucket); - replay(storage); - initializeBucket(); - Bucket lockedRetentionPolicyBucket = - new Bucket(storage, new BucketInfo.BuilderImpl(expectedRetentionLockedBucket)); - Bucket actualRetentionLockedBucket = - lockedRetentionPolicyBucket.lockRetentionPolicy( - Storage.BucketTargetOption.metagenerationMatch(), - Storage.BucketTargetOption.userProject(USER_PROJECT)); - assertEquals(expectedRetentionLockedBucket, actualRetentionLockedBucket); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testToBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).times(4); - replay(storage); - Bucket fullBucket = new Bucket(storage, new BucketInfo.BuilderImpl(FULL_BUCKET_INFO)); - assertEquals(fullBucket, fullBucket.toBuilder().build()); - Bucket simpleBlob = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO)); - assertEquals(simpleBlob, simpleBlob.toBuilder().build()); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testBuilder() { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions).times(4); - replay(storage); - Bucket.Builder builder = - new Bucket.Builder(new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO))); - Bucket bucket = - builder - .setAcl(ACLS) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setCors(CORS) - .setCreateTime(CREATE_TIME) - .setUpdateTime(UPDATE_TIME) - .setDefaultAcl(DEFAULT_ACL) - .setDeleteRules(DELETE_RULES) - .setLifecycleRules(LIFECYCLE_RULES) - .setIndexPage(INDEX_PAGE) - .setNotFoundPage(NOT_FOUND_PAGE) - .setLocation(LOCATION) - .setLocationType(LOCATION_TYPE) - .setStorageClass(STORAGE_CLASS) - .setVersioningEnabled(VERSIONING_ENABLED) - .setLabels(BUCKET_LABELS) - .setRequesterPays(REQUESTER_PAYS) - .setDefaultKmsKeyName(DEFAULT_KMS_KEY_NAME) - .setDefaultEventBasedHold(DEFAULT_EVENT_BASED_HOLD) - .setRetentionEffectiveTime(RETENTION_EFFECTIVE_TIME) - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(RETENTION_POLICY_IS_LOCKED) - .build(); - assertEquals("b", bucket.getName()); - assertEquals(ACLS, bucket.getAcl()); - assertEquals(ETAG, bucket.getEtag()); - assertEquals(GENERATED_ID, bucket.getGeneratedId()); - assertEquals(META_GENERATION, bucket.getMetageneration()); - assertEquals(OWNER, bucket.getOwner()); - assertEquals(SELF_LINK, bucket.getSelfLink()); - assertEquals(CREATE_TIME, bucket.getCreateTime()); - assertEquals(UPDATE_TIME, bucket.getUpdateTime()); - assertEquals(CORS, bucket.getCors()); - assertEquals(DEFAULT_ACL, bucket.getDefaultAcl()); - assertEquals(DELETE_RULES, bucket.getDeleteRules()); - assertEquals(LIFECYCLE_RULES, bucket.getLifecycleRules()); - assertEquals(INDEX_PAGE, bucket.getIndexPage()); - assertEquals(NOT_FOUND_PAGE, bucket.getNotFoundPage()); - assertEquals(LOCATION, bucket.getLocation()); - assertEquals(STORAGE_CLASS, bucket.getStorageClass()); - assertEquals(VERSIONING_ENABLED, bucket.versioningEnabled()); - assertEquals(BUCKET_LABELS, bucket.getLabels()); - assertEquals(REQUESTER_PAYS, bucket.requesterPays()); - assertEquals(DEFAULT_KMS_KEY_NAME, bucket.getDefaultKmsKeyName()); - assertEquals(DEFAULT_EVENT_BASED_HOLD, bucket.getDefaultEventBasedHold()); - assertEquals(RETENTION_EFFECTIVE_TIME, bucket.getRetentionEffectiveTime()); - assertEquals(RETENTION_PERIOD, bucket.getRetentionPeriod()); - assertEquals(RETENTION_POLICY_IS_LOCKED, bucket.retentionPolicyIsLocked()); - assertEquals(storage.getOptions(), bucket.getStorage().getOptions()); - assertTrue(LOCATION_TYPES.contains(LOCATION_TYPE)); - } - - @Test - public void testDeleteLifecycleRules() { - initializeExpectedBucket(); - Bucket bucket = - new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(FULL_BUCKET_INFO)); - assertThat(bucket.getLifecycleRules()).hasSize(1); - Bucket expectedUpdatedBucket = bucket.toBuilder().deleteLifecycleRules().build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertThat(actualUpdatedBucket.getLifecycleRules()).hasSize(0); - } - - @Test - public void testUpdateBucketLogging() { - initializeExpectedBucket(); - BucketInfo.Logging logging = - BucketInfo.Logging.newBuilder() - .setLogBucket("logs-bucket") - .setLogObjectPrefix("test-logs") - .build(); - BucketInfo bucketInfo = BucketInfo.newBuilder("b").setLogging(logging).build(); - Bucket bucket = new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(bucketInfo)); - assertThat(bucket.getLogging().getLogBucket()).isEqualTo("logs-bucket"); - assertThat(bucket.getLogging().getLogObjectPrefix()).isEqualTo("test-logs"); - Bucket expectedUpdatedBucket = bucket.toBuilder().setLogging(null).build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertThat(actualUpdatedBucket.getLogging().getLogBucket()).isNull(); - assertThat(actualUpdatedBucket.getLogging().getLogObjectPrefix()).isNull(); - } - - @Test - public void testRemoveBucketCORS() { - initializeExpectedBucket(); - List origins = ImmutableList.of(Cors.Origin.of("http://cloud.google.com")); - List httpMethods = ImmutableList.of(HttpMethod.GET); - List responseHeaders = ImmutableList.of("Content-Type"); - Cors cors = - Cors.newBuilder() - .setOrigins(origins) - .setMethods(httpMethods) - .setResponseHeaders(responseHeaders) - .setMaxAgeSeconds(100) - .build(); - BucketInfo bucketInfo = BucketInfo.newBuilder("b").setCors(ImmutableList.of(cors)).build(); - Bucket bucket = new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(bucketInfo)); - assertThat(bucket.getCors()).isNotNull(); - assertThat(bucket.getCors().get(0).getMaxAgeSeconds()).isEqualTo(100); - assertThat(bucket.getCors().get(0).getMethods()).isEqualTo(httpMethods); - assertThat(bucket.getCors().get(0).getOrigins()).isEqualTo(origins); - assertThat(bucket.getCors().get(0).getResponseHeaders()).isEqualTo(responseHeaders); - - // Remove bucket CORS configuration. - Bucket expectedUpdatedBucket = bucket.toBuilder().setCors(null).build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertThat(actualUpdatedBucket.getCors()).isEmpty(); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java deleted file mode 100644 index 72ff6691f6..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import com.google.cloud.RestorableState; -import com.google.cloud.ServiceOptions; -import com.google.cloud.storage.spi.StorageRpcFactory; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.cloud.storage.spi.v1.StorageRpc.RewriteRequest; -import com.google.cloud.storage.spi.v1.StorageRpc.RewriteResponse; -import com.google.common.collect.ImmutableMap; -import java.util.Map; -import org.easymock.EasyMock; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class CopyWriterTest { - - private static final String SOURCE_BUCKET_NAME = "b"; - private static final String SOURCE_BLOB_NAME = "n"; - private static final String DESTINATION_BUCKET_NAME = "b1"; - private static final String DESTINATION_BLOB_NAME = "n1"; - private static final BlobId BLOB_ID = BlobId.of(SOURCE_BUCKET_NAME, SOURCE_BLOB_NAME); - private static final BlobInfo BLOB_INFO = - BlobInfo.newBuilder(DESTINATION_BUCKET_NAME, DESTINATION_BLOB_NAME).build(); - private static final BlobInfo RESULT_INFO = - BlobInfo.newBuilder(DESTINATION_BUCKET_NAME, DESTINATION_BLOB_NAME) - .setContentType("type") - .build(); - private static final Map EMPTY_OPTIONS = ImmutableMap.of(); - private static final RewriteRequest REQUEST_WITH_OBJECT = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(BLOB_ID), - EMPTY_OPTIONS, - true, - Conversions.json().blobInfo().encode(BLOB_INFO), - EMPTY_OPTIONS, - null); - private static final RewriteRequest REQUEST_WITHOUT_OBJECT = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(BLOB_ID), - EMPTY_OPTIONS, - false, - Conversions.json().blobInfo().encode(BLOB_INFO), - EMPTY_OPTIONS, - null); - private static final RewriteResponse RESPONSE_WITH_OBJECT = - new RewriteResponse(REQUEST_WITH_OBJECT, null, 42L, false, "token", 21L); - private static final RewriteResponse RESPONSE_WITHOUT_OBJECT = - new RewriteResponse(REQUEST_WITHOUT_OBJECT, null, 42L, false, "token", 21L); - private static final RewriteResponse RESPONSE_WITH_OBJECT_DONE = - new RewriteResponse( - REQUEST_WITH_OBJECT, - Conversions.json().blobInfo().encode(RESULT_INFO), - 42L, - true, - "token", - 42L); - private static final RewriteResponse RESPONSE_WITHOUT_OBJECT_DONE = - new RewriteResponse( - REQUEST_WITHOUT_OBJECT, - Conversions.json().blobInfo().encode(RESULT_INFO), - 42L, - true, - "token", - 42L); - - private HttpStorageOptions options; - private StorageRpcFactory rpcFactoryMock; - private StorageRpc storageRpcMock; - private CopyWriter copyWriter; - private Blob result; - - @Before - public void setUp() { - rpcFactoryMock = createMock(StorageRpcFactory.class); - storageRpcMock = createMock(StorageRpc.class); - expect(rpcFactoryMock.create(anyObject(StorageOptions.class))).andReturn(storageRpcMock); - replay(rpcFactoryMock); - options = - HttpStorageOptions.newBuilder() - .setProjectId("projectid") - .setServiceRpcFactory(rpcFactoryMock) - .setRetrySettings(ServiceOptions.getNoRetrySettings()) - .build(); - result = new Blob(options.getService(), new BlobInfo.BuilderImpl(RESULT_INFO)); - } - - @After - public void tearDown() throws Exception { - verify(rpcFactoryMock, storageRpcMock); - } - - @Test - public void testRewriteWithObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testRewriteWithoutObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITHOUT_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testRewriteWithObjectMultipleRequests() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testRewriteWithoutObjectMultipleRequests() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITHOUT_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testSaveAndRestoreWithObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - copyWriter.copyChunk(); - assertTrue(!copyWriter.isDone()); - assertEquals(21L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - RestorableState rewriterState = copyWriter.capture(); - CopyWriter restoredRewriter = rewriterState.restore(); - assertEquals(result, restoredRewriter.getResult()); - assertTrue(restoredRewriter.isDone()); - assertEquals(42L, restoredRewriter.getTotalBytesCopied()); - assertEquals(42L, restoredRewriter.getBlobSize()); - } - - @Test - public void testSaveAndRestoreWithoutObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITHOUT_OBJECT); - copyWriter.copyChunk(); - assertTrue(!copyWriter.isDone()); - assertEquals(21L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - RestorableState rewriterState = copyWriter.capture(); - CopyWriter restoredRewriter = rewriterState.restore(); - assertEquals(result, restoredRewriter.getResult()); - assertTrue(restoredRewriter.isDone()); - assertEquals(42L, restoredRewriter.getTotalBytesCopied()); - assertEquals(42L, restoredRewriter.getBlobSize()); - } - - @Test - public void testSaveAndRestoreWithResult() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - copyWriter.copyChunk(); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - RestorableState rewriterState = copyWriter.capture(); - CopyWriter restoredRewriter = rewriterState.restore(); - assertEquals(result, restoredRewriter.getResult()); - assertTrue(restoredRewriter.isDone()); - assertEquals(42L, restoredRewriter.getTotalBytesCopied()); - assertEquals(42L, restoredRewriter.getBlobSize()); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/NotificationTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/NotificationTest.java deleted file mode 100644 index df8537d64e..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/NotificationTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2020 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.google.cloud.storage; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createStrictMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; - -import com.google.cloud.storage.NotificationInfo.EventType; -import com.google.cloud.storage.NotificationInfo.PayloadFormat; -import com.google.common.collect.ImmutableMap; -import java.util.Arrays; -import java.util.Map; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class NotificationTest { - - private static final String ETAG = "0xFF00"; - private static final String SELF_LINK = "http://storage/b/n"; - private static final String OBJECT_NAME_PREFIX = "index.html"; - private static final String TOPIC = "projects/myProject/topics/topic1"; - private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); - private static final PayloadFormat PAYLOAD_FORMAT = PayloadFormat.JSON_API_V1.JSON_API_V1; - private static final EventType[] EVENT_TYPES = { - EventType.OBJECT_FINALIZE, EventType.OBJECT_METADATA_UPDATE - }; - private static final NotificationInfo NOTIFICATION_INFO = - NotificationInfo.newBuilder(TOPIC) - .setEtag(ETAG) - .setCustomAttributes(CUSTOM_ATTRIBUTES) - .setSelfLink(SELF_LINK) - .setEventTypes(EVENT_TYPES) - .setObjectNamePrefix(OBJECT_NAME_PREFIX) - .setPayloadFormat(PAYLOAD_FORMAT) - .build(); - - private Storage storage; - private StorageOptions mockOptions = createMock(StorageOptions.class); - - @Before - public void setUp() { - storage = createStrictMock(Storage.class); - } - - @After - public void tearDown() { - verify(storage); - } - - @Test - public void testBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).times(2); - replay(storage); - Notification.Builder builder = - new Notification.Builder( - new Notification(storage, new NotificationInfo.BuilderImpl(NOTIFICATION_INFO))); - Notification notification = - builder - .setEtag(ETAG) - .setCustomAttributes(CUSTOM_ATTRIBUTES) - .setSelfLink(SELF_LINK) - .setEventTypes(EVENT_TYPES) - .setObjectNamePrefix(OBJECT_NAME_PREFIX) - .setPayloadFormat(PAYLOAD_FORMAT) - .build(); - assertEquals(ETAG, notification.getEtag()); - assertEquals(SELF_LINK, notification.getSelfLink()); - assertEquals(OBJECT_NAME_PREFIX, notification.getObjectNamePrefix()); - assertEquals(PAYLOAD_FORMAT, notification.getPayloadFormat()); - assertEquals(TOPIC, notification.getTopic()); - assertEquals(CUSTOM_ATTRIBUTES, notification.getCustomAttributes()); - assertEquals(Arrays.asList(EVENT_TYPES), notification.getEventTypes()); - } - - @Test - public void testToBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).times(2); - replay(storage); - Notification notification = - new Notification(storage, new NotificationInfo.BuilderImpl(NOTIFICATION_INFO)); - compareBucketNotification(notification, notification.toBuilder().build()); - } - - @Test - public void testFromPb() { - expect(storage.getOptions()).andReturn(mockOptions).times(1); - replay(storage); - compareBucketNotification( - NOTIFICATION_INFO, - Conversions.json() - .notificationInfo() - .decode(Conversions.json().notificationInfo().encode(NOTIFICATION_INFO)) - .asNotification(storage)); - } - - private void compareBucketNotification(NotificationInfo expected, NotificationInfo actual) { - assertEquals(expected.getNotificationId(), actual.getNotificationId()); - assertEquals(expected.getCustomAttributes(), actual.getCustomAttributes()); - assertEquals(expected.getEtag(), actual.getEtag()); - assertEquals(expected.getSelfLink(), actual.getSelfLink()); - assertEquals(expected.getEventTypes(), actual.getEventTypes()); - assertEquals(expected.getObjectNamePrefix(), actual.getObjectNamePrefix()); - assertEquals(expected.getPayloadFormat(), actual.getPayloadFormat()); - assertEquals(expected.getTopic().trim(), actual.getTopic().trim()); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java index 649de1037e..5532364d74 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java @@ -17,12 +17,10 @@ package com.google.cloud.storage; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import com.google.api.services.storage.model.Policy.Bindings; import com.google.cloud.Identity; import com.google.cloud.Policy; -import com.google.cloud.storage.testing.ApiPolicyMatcher; import com.google.common.collect.ImmutableList; import java.util.List; import org.junit.Test; @@ -58,11 +56,8 @@ public void testEquivalence() { .setVersion(1); Policy actualLibPolicy = Conversions.json().policyCodec().decode(apiPolicy); - com.google.api.services.storage.model.Policy actualApiPolicy = - Conversions.json().policyCodec().encode(libPolicy); assertEquals(libPolicy, actualLibPolicy); - assertTrue(new ApiPolicyMatcher(apiPolicy).matches(actualApiPolicy)); } @Test diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java deleted file mode 100644 index 8f3ca3fd31..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2016 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.google.cloud.storage; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.cloud.BatchResult; -import java.io.IOException; -import org.easymock.EasyMock; -import org.junit.Before; -import org.junit.Test; - -public class StorageBatchResultTest { - - private StorageBatchResult result; - - @Before - public void setUp() { - result = new StorageBatchResult<>(); - } - - @Test - public void testSuccess() { - assertFalse(result.completed()); - try { - result.get(); - fail("This was not completed yet."); - } catch (IllegalStateException ex) { - // expected - } - result.success(true); - assertTrue(result.get()); - } - - @Test - public void testError() { - assertFalse(result.completed()); - try { - result.get(); - fail("This was not completed yet."); - } catch (IllegalStateException ex) { - // expected - } - StorageException ex = new StorageException(new IOException("some error")); - result.error(ex); - try { - result.get(); - fail("This is a failed operation and should have thrown a StorageException."); - } catch (StorageException real) { - assertSame(ex, real); - } - } - - @Test - public void testNotifyError() { - StorageException ex = new StorageException(new IOException("some error")); - assertFalse(result.completed()); - BatchResult.Callback callback = - EasyMock.createStrictMock(BatchResult.Callback.class); - callback.error(ex); - EasyMock.replay(callback); - result.notify(callback); - result.error(ex); - try { - result.notify(callback); - fail("The batch has been completed."); - } catch (IllegalStateException exception) { - // expected - } - EasyMock.verify(callback); - } - - @Test - public void testNotifySuccess() { - assertFalse(result.completed()); - BatchResult.Callback callback = - EasyMock.createStrictMock(BatchResult.Callback.class); - callback.success(true); - EasyMock.replay(callback); - result.notify(callback); - result.success(true); - try { - result.notify(callback); - fail("The batch has been completed."); - } catch (IllegalStateException exception) { - // expected - } - EasyMock.verify(callback); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java deleted file mode 100644 index 46f2461f99..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2016 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.google.cloud.storage; - -import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.services.storage.model.StorageObject; -import com.google.cloud.storage.Storage.BlobGetOption; -import com.google.cloud.storage.Storage.BlobSourceOption; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.spi.v1.HttpStorageRpc; -import com.google.cloud.storage.spi.v1.RpcBatch; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.common.collect.ImmutableMap; -import java.util.Map; -import org.easymock.Capture; -import org.easymock.EasyMock; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class StorageBatchTest { - - private static final BlobId BLOB_ID = BlobId.of("b1", "n1"); - private static final BlobId BLOB_ID_COMPLETE = BlobId.of("b1", "n1", 42L); - private static final BlobInfo BLOB_INFO = BlobInfo.newBuilder(BLOB_ID).build(); - private static final BlobInfo BLOB_INFO_COMPLETE = - BlobInfo.newBuilder(BLOB_ID_COMPLETE).setMetageneration(42L).build(); - private static final BlobGetOption[] BLOB_GET_OPTIONS = { - BlobGetOption.generationMatch(42L), BlobGetOption.metagenerationMatch(42L) - }; - private static final BlobSourceOption[] BLOB_SOURCE_OPTIONS = { - BlobSourceOption.generationMatch(42L), BlobSourceOption.metagenerationMatch(42L) - }; - private static final GoogleJsonError GOOGLE_JSON_ERROR = new GoogleJsonError(); - private final HttpRetryAlgorithmManager retryAlgorithmManager = - HttpStorageOptions.getDefaultInstance().getRetryAlgorithmManager(); - - private HttpStorageOptions optionsMock; - private HttpStorageRpc storageRpcMock; - private RpcBatch batchMock; - private StorageBatch storageBatch; - private final Storage storage = EasyMock.createStrictMock(Storage.class); - - @Before - public void setUp() { - optionsMock = EasyMock.createMock(HttpStorageOptions.class); - storageRpcMock = EasyMock.createMock(HttpStorageRpc.class); - batchMock = EasyMock.createMock(RpcBatch.class); - EasyMock.expect(optionsMock.getStorageRpcV1()).andReturn(storageRpcMock); - EasyMock.expect(optionsMock.getRetryAlgorithmManager()) - .andReturn(retryAlgorithmManager) - .anyTimes(); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - EasyMock.replay(optionsMock, storageRpcMock, batchMock, storage); - storageBatch = new StorageBatch(optionsMock); - } - - @After - public void tearDown() { - EasyMock.verify(batchMock, storageRpcMock, optionsMock, storage); - } - - @Test - public void testConstructor() { - assertSame(batchMock, storageBatch.getBatch()); - assertSame(optionsMock, storageBatch.getOptions()); - assertSame(storageRpcMock, storageBatch.getStorageRpc()); - } - - @Test - public void testDelete() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.eq(ImmutableMap.of())); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = - storageBatch.delete(BLOB_ID.getBucket(), BLOB_ID.getName()); - assertNotNull(callback.getValue()); - try { - batchResult.get(); - fail("No result available yet."); - } catch (IllegalStateException ex) { - // expected - } - // testing error here, success is tested with options - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onFailure(GOOGLE_JSON_ERROR); - try { - batchResult.get(); - fail("Should throw a StorageExcetion on error."); - } catch (StorageException ex) { - // expected - } - } - - @Test - public void testDeleteWithOptions() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - Capture> capturedOptions = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.capture(capturedOptions)); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = storageBatch.delete(BLOB_ID, BLOB_SOURCE_OPTIONS); - assertNotNull(callback.getValue()); - Map options = capturedOptions.getValue(); - assertEquals(2, options.size()); - assertThat(options).containsEntry(StorageRpc.Option.IF_GENERATION_MATCH, 42L); - assertThat(options).containsEntry(StorageRpc.Option.IF_METAGENERATION_MATCH, 42L); - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onSuccess(null); - assertTrue(batchResult.get()); - } - - @Test - public void testUpdate() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.eq(ImmutableMap.of())); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = storageBatch.update(BLOB_INFO); - assertNotNull(callback.getValue()); - try { - batchResult.get(); - fail("No result available yet."); - } catch (IllegalStateException ex) { - // expected - } - // testing error here, success is tested with options - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onFailure(GOOGLE_JSON_ERROR); - try { - batchResult.get(); - fail("Should throw a StorageExcetion on error."); - } catch (StorageException ex) { - // expected - } - } - - @Test - public void testUpdateWithOptions() { - EasyMock.reset(storage, batchMock, optionsMock); - EasyMock.expect(storage.getOptions()).andReturn(optionsMock).anyTimes(); - EasyMock.expect(optionsMock.getService()).andReturn(storage).anyTimes(); - EasyMock.expect(optionsMock.getRetryAlgorithmManager()) - .andReturn(retryAlgorithmManager) - .anyTimes(); - Capture> callback = Capture.newInstance(); - Capture> capturedOptions = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO_COMPLETE)), - EasyMock.capture(callback), - EasyMock.capture(capturedOptions)); - EasyMock.replay(batchMock, storage, optionsMock); - StorageBatchResult batchResult = - storageBatch.update( - BLOB_INFO_COMPLETE, - BlobTargetOption.generationMatch(), - BlobTargetOption.metagenerationMatch()); - assertNotNull(callback.getValue()); - assertEquals(2, capturedOptions.getValue().size()); - assertEquals(42L, capturedOptions.getValue().get(StorageRpc.Option.IF_GENERATION_MATCH)); - assertEquals(42L, capturedOptions.getValue().get(StorageRpc.Option.IF_METAGENERATION_MATCH)); - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO)); - assertEquals(new Blob(storage, new Blob.BuilderImpl(BLOB_INFO)), batchResult.get()); - } - - @Test - public void testGet() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.eq(ImmutableMap.of())); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = storageBatch.get(BLOB_ID.getBucket(), BLOB_ID.getName()); - assertNotNull(callback.getValue()); - try { - batchResult.get(); - fail("No result available yet."); - } catch (IllegalStateException ex) { - // expected - } - // testing error here, success is tested with options - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onFailure(GOOGLE_JSON_ERROR); - try { - batchResult.get(); - fail("Should throw a StorageExcetion on error."); - } catch (StorageException ex) { - // expected - } - } - - @Test - public void testGetWithOptions() { - EasyMock.reset(storage, batchMock, optionsMock); - EasyMock.expect(storage.getOptions()).andReturn(optionsMock).anyTimes(); - EasyMock.expect(optionsMock.getService()).andReturn(storage).anyTimes(); - EasyMock.expect(optionsMock.getRetryAlgorithmManager()) - .andReturn(retryAlgorithmManager) - .anyTimes(); - Capture> callback = Capture.newInstance(); - Capture> capturedOptions = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.capture(capturedOptions)); - EasyMock.replay(storage, batchMock, optionsMock); - StorageBatchResult batchResult = storageBatch.get(BLOB_ID, BLOB_GET_OPTIONS); - assertNotNull(callback.getValue()); - Map options = capturedOptions.getValue(); - assertEquals(2, options.size()); - assertThat(options).containsEntry(StorageRpc.Option.IF_GENERATION_MATCH, 42L); - assertThat(options).containsEntry(StorageRpc.Option.IF_METAGENERATION_MATCH, 42L); - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO)); - assertEquals(new Blob(storage, new Blob.BuilderImpl(BLOB_INFO)), batchResult.get()); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java deleted file mode 100644 index 0051cac498..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.http.HttpResponseException; -import com.google.cloud.BaseServiceException; -import com.google.cloud.RetryHelper.RetryHelperException; -import java.io.IOException; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import javax.net.ssl.SSLException; -import org.junit.Test; - -public class StorageExceptionTest { - - @Test - public void testStorageException() { - StorageException exception = new StorageException(500, "message"); - assertEquals(500, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(502, "message"); - assertEquals(502, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(503, "message"); - assertEquals(503, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(504, "message"); - assertEquals(504, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(429, "message"); - assertEquals(429, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(408, "message"); - assertEquals(408, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(400, "message"); - assertEquals(400, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertFalse(exception.isRetryable()); - - IOException cause = new SocketTimeoutException(); - exception = new StorageException(cause); - assertNull(exception.getReason()); - assertNull(exception.getMessage()); - assertTrue(exception.isRetryable()); - assertSame(cause, exception.getCause()); - - GoogleJsonError error = new GoogleJsonError(); - error.setCode(503); - error.setMessage("message"); - exception = new StorageException(error); - assertEquals(503, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(400, "message", cause); - assertEquals(400, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertFalse(exception.isRetryable()); - assertSame(cause, exception.getCause()); - - HttpResponseException httpResponseException = - new HttpResponseException.Builder(404, "Service Unavailable", new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(404, exception.getCode()); - assertFalse(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(503, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(503, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(502, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(502, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(500, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(500, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(429, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(429, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(408, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(408, exception.getCode()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateConnectionReset() { - StorageException exception = - StorageException.translate( - new SSLException( - "Connection has been shutdown: " - + new SSLException(new SocketException("Connection reset")))); - assertEquals(0, exception.getCode()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateConnectionShutdown() { - StorageException exception = - StorageException.translate( - new SSLException( - "Connection has been shutdown: " - + new SSLException(new SocketException("Socket closed")))); - String test = exception.getMessage(); - - assertEquals(0, exception.getCode()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateConnectionClosedPrematurely() { - StorageException exception = - StorageException.translate( - new IOException( - "Connection closed prematurely: bytesRead = 1114112, Content-Length = 10485760")); - assertEquals(0, exception.getCode()); - assertEquals("connectionClosedPrematurely", exception.getReason()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateAndThrow() throws Exception { - Exception cause = new StorageException(503, "message"); - RetryHelperException exceptionMock = createMock(RetryHelperException.class); - expect(exceptionMock.getCause()).andReturn(cause).times(2); - replay(exceptionMock); - try { - StorageException.translateAndThrow(exceptionMock); - } catch (BaseServiceException ex) { - assertEquals(503, ex.getCode()); - assertEquals("message", ex.getMessage()); - assertTrue(ex.isRetryable()); - } finally { - verify(exceptionMock); - } - cause = new IllegalArgumentException("message"); - exceptionMock = createMock(RetryHelperException.class); - expect(exceptionMock.getMessage()).andReturn("message").times(1); - expect(exceptionMock.getCause()).andReturn(cause).times(2); - replay(exceptionMock); - try { - StorageException.translateAndThrow(exceptionMock); - } catch (BaseServiceException ex) { - assertEquals(StorageException.UNKNOWN_CODE, ex.getCode()); - assertEquals("message", ex.getMessage()); - assertFalse(ex.isRetryable()); - assertSame(cause, ex.getCause()); - } finally { - verify(exceptionMock); - } - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java deleted file mode 100644 index bda9d6a8bd..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java +++ /dev/null @@ -1,2344 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static com.google.cloud.storage.SignedUrlEncodingHelper.Rfc3986UriEncode; -import static com.google.cloud.storage.testing.ApiPolicyMatcher.eqApiPolicy; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.eq; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.getCurrentArguments; -import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.util.DateTime; -import com.google.api.core.ApiClock; -import com.google.api.gax.retrying.RetrySettings; -import com.google.api.services.storage.model.Policy.Bindings; -import com.google.api.services.storage.model.StorageObject; -import com.google.api.services.storage.model.TestIamPermissionsResponse; -import com.google.auth.oauth2.ServiceAccountCredentials; -import com.google.cloud.Identity; -import com.google.cloud.Policy; -import com.google.cloud.ServiceOptions; -import com.google.cloud.storage.Acl.Project; -import com.google.cloud.storage.Acl.Project.ProjectRole; -import com.google.cloud.storage.Acl.Role; -import com.google.cloud.storage.Acl.User; -import com.google.cloud.storage.Storage.BlobSourceOption; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.Storage.BucketSourceOption; -import com.google.cloud.storage.Storage.CopyRequest; -import com.google.cloud.storage.spi.StorageRpcFactory; -import com.google.cloud.storage.spi.v1.RpcBatch; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.io.BaseEncoding; -import java.io.File; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.net.URLDecoder; -import java.nio.file.Files; -import java.security.InvalidKeyException; -import java.security.Key; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.Signature; -import java.security.SignatureException; -import java.security.spec.EncodedKeySpec; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.crypto.spec.SecretKeySpec; -import org.easymock.Capture; -import org.easymock.EasyMock; -import org.easymock.IAnswer; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class StorageImplTest { - - private static final String BUCKET_NAME1 = "b1"; - private static final String BUCKET_NAME2 = "b2"; - private static final String BUCKET_NAME3 = "b3"; - private static final String BLOB_NAME1 = "n1"; - private static final String BLOB_NAME2 = "n2"; - private static final String BLOB_NAME3 = "n3"; - private static final byte[] BLOB_CONTENT = {0xD, 0xE, 0xA, 0xD}; - private static final String BASE64_KEY = "JVzfVl8NLD9FjedFuStegjRfES5ll5zc59CIXw572OA="; - private static final Key KEY = - new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); - private static final String KMS_KEY_NAME = - "projects/gcloud-devel/locations/us/keyRings/gcs_kms_key_ring_us/cryptoKeys/key"; - private static final Long RETENTION_PERIOD = 10L; - private static final String USER_PROJECT = "test-project"; - // BucketInfo objects - private static final BucketInfo BUCKET_INFO1 = - BucketInfo.newBuilder(BUCKET_NAME1).setMetageneration(42L).build(); - private static final BucketInfo BUCKET_INFO2 = BucketInfo.newBuilder(BUCKET_NAME2).build(); - private static final BucketInfo BUCKET_INFO3 = - BucketInfo.newBuilder(BUCKET_NAME3) - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(true) - .setMetageneration(42L) - .build(); - - // BlobInfo objects - private static final BlobInfo BLOB_INFO1 = - BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME1, 24L) - .setMetageneration(42L) - .setContentType("application/json") - .setMd5("md5string") - .build(); - private static final BlobInfo BLOB_INFO2 = BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME2).build(); - private static final BlobInfo BLOB_INFO3 = BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME3).build(); - - // Empty StorageRpc options - private static final Map EMPTY_RPC_OPTIONS = ImmutableMap.of(); - - // Bucket target options - private static final Storage.BucketTargetOption BUCKET_TARGET_METAGENERATION = - Storage.BucketTargetOption.metagenerationMatch(); - private static final Storage.BucketTargetOption BUCKET_TARGET_PREDEFINED_ACL = - Storage.BucketTargetOption.predefinedAcl(Storage.PredefinedAcl.PRIVATE); - private static final Storage.BucketTargetOption BUCKET_TARGET_USER_PROJECT = - Storage.BucketTargetOption.userProject(USER_PROJECT); - private static final Map BUCKET_TARGET_OPTIONS = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, BUCKET_INFO1.getMetageneration(), - StorageRpc.Option.PREDEFINED_ACL, Storage.PredefinedAcl.PRIVATE.getEntry()); - private static final Map BUCKET_TARGET_OPTIONS_LOCK_RETENTION_POLICY = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, - BUCKET_INFO3.getMetageneration(), - StorageRpc.Option.USER_PROJECT, - USER_PROJECT); - - // Blob target options (create, update, compose) - private static final BlobTargetOption BLOB_TARGET_GENERATION = BlobTargetOption.generationMatch(); - private static final BlobTargetOption BLOB_TARGET_METAGENERATION = - BlobTargetOption.metagenerationMatch(); - private static final BlobTargetOption BLOB_TARGET_PREDEFINED_ACL = - BlobTargetOption.predefinedAcl(Storage.PredefinedAcl.PRIVATE); - private static final Map BLOB_TARGET_OPTIONS_UPDATE = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration(), - StorageRpc.Option.PREDEFINED_ACL, Storage.PredefinedAcl.PRIVATE.getEntry()); - private static final Map BLOB_TARGET_OPTIONS_COMPOSE = - ImmutableMap.of( - StorageRpc.Option.IF_GENERATION_MATCH, BLOB_INFO1.getGeneration(), - StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration()); - - // Bucket get/source options - private static final BucketSourceOption BUCKET_SOURCE_METAGENERATION = - BucketSourceOption.metagenerationMatch(BUCKET_INFO1.getMetageneration()); - private static final Map BUCKET_SOURCE_OPTIONS = - ImmutableMap.of(StorageRpc.Option.IF_METAGENERATION_MATCH, BUCKET_INFO1.getMetageneration()); - - private static final BlobSourceOption BLOB_SOURCE_METAGENERATION = - BlobSourceOption.metagenerationMatch(BLOB_INFO1.getMetageneration()); - private static final BlobSourceOption BLOB_SOURCE_GENERATION = - BlobSourceOption.generationMatch(BLOB_INFO1.getGeneration()); - private static final BlobSourceOption BLOB_SOURCE_GENERATION_FROM_BLOB_ID = - BlobSourceOption.generationMatch(); - private static final Map BLOB_SOURCE_OPTIONS = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration(), - StorageRpc.Option.IF_GENERATION_MATCH, BLOB_INFO1.getGeneration()); - private static final Map BLOB_SOURCE_OPTIONS_COPY = - ImmutableMap.of( - StorageRpc.Option.IF_SOURCE_METAGENERATION_MATCH, BUCKET_INFO1.getMetageneration(), - StorageRpc.Option.IF_SOURCE_GENERATION_MATCH, BLOB_INFO1.getGeneration()); - - // ACLs - private static final Acl ACL = Acl.of(User.ofAllAuthenticatedUsers(), Role.OWNER); - private static final Acl OTHER_ACL = Acl.of(new Project(ProjectRole.OWNERS, "p"), Role.READER); - - // Customer supplied encryption key options - private static final Map ENCRYPTION_KEY_OPTIONS = - ImmutableMap.of(StorageRpc.Option.CUSTOMER_SUPPLIED_KEY, BASE64_KEY); - - // Customer managed encryption key options - private static final Map KMS_KEY_NAME_OPTIONS = - ImmutableMap.of(StorageRpc.Option.KMS_KEY_NAME, KMS_KEY_NAME); - // IAM policies - private static final String POLICY_ETAG1 = "CAE="; - private static final String POLICY_ETAG2 = "CAI="; - private static final Policy LIB_POLICY1 = - Policy.newBuilder() - .addIdentity(StorageRoles.objectViewer(), Identity.allUsers()) - .addIdentity( - StorageRoles.objectAdmin(), - Identity.user("test1@gmail.com"), - Identity.user("test2@gmail.com")) - .setEtag(POLICY_ETAG1) - .setVersion(1) - .build(); - - private static final ServiceAccount SERVICE_ACCOUNT = ServiceAccount.of("test@google.com"); - - private static final com.google.api.services.storage.model.Policy API_POLICY1 = - new com.google.api.services.storage.model.Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"))) - .setEtag(POLICY_ETAG1) - .setVersion(1); - - private static final String PRIVATE_KEY_STRING = - "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoG" - + "BAL2xolH1zrISQ8+GzOV29BNjjzq4/HIP8Psd1+cZb81vDklSF+95wB250MSE0BDc81pvIMwj5OmIfLg1NY6uB" - + "1xavOPpVdx1z664AGc/BEJ1zInXGXaQ6s+SxGenVq40Yws57gikQGMZjttpf1Qbz4DjkxsbRoeaRHn06n9pH1e" - + "jAgMBAAECgYEAkWcm0AJF5LMhbWKbjkxm/LG06UNApkHX6vTOOOODkonM/qDBnhvKCj8Tan+PaU2j7679Cd19q" - + "xCm4SBQJET7eBhqLD9L2j9y0h2YUQnLbISaqUS1/EXcr2C1Lf9VCEn1y/GYuDYqs85rGoQ4ZYfM9ClROSq86fH" - + "+cbIIssqJqukCQQD18LjfJz/ichFeli5/l1jaFid2XoCH3T6TVuuysszVx68fh60gSIxEF/0X2xB+wuPxTP4IQ" - + "+t8tD/ktd232oWXAkEAxXPych2QBHePk9/lek4tOkKBgfnDzex7S/pI0G1vpB3VmzBbCsokn9lpOv7JV8071GD" - + "lW/7R6jlLfpQy3hN31QJAE10osSk99m5Uv8XDU3hvHnywDrnSFOBulNs7I47AYfSe7TSZhPkxUgsxejddTR27J" - + "LyTI8N1PxRSE4feNSOXcQJAMMKJRJT4U6IS2rmXubREhvaVdLtxFxEnAYQ1JwNfZm/XqBMw6GEy2iaeTetNXVl" - + "ZRQEIoscyn1y2v/No/F5iYQJBAKBOGASoQcBjGTOg/H/SfcE8QVNsKEpthRrs6CkpT80aZ/AV+ksfoIf2zw2M3" - + "mAHfrO+TBLdz4sicuFQvlN9SEc="; - - private static final String PUBLIC_KEY_STRING = - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9saJR9c6y" - + "EkPPhszldvQTY486uPxyD/D7HdfnGW/Nbw5JUhfvecAdudDEhNAQ3PNabyDMI+TpiHy4NTWOrgdcWrzj6VXcdc" - + "+uuABnPwRCdcyJ1xl2kOrPksRnp1auNGMLOe4IpEBjGY7baX9UG8+A45MbG0aHmkR59Op/aR9XowIDAQAB"; - - private static final ApiClock TIME_SOURCE = - new ApiClock() { - @Override - public long nanoTime() { - return 42_000_000_000L; - } - - @Override - public long millisTime() { - return 42_000L; - } - }; - - // List of chars under test were taken from - // https://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters - private static final Map RFC3986_URI_ENCODING_MAP = - ImmutableMap.builder() - .put('!', "%21") - .put('#', "%23") - .put('$', "%24") - .put('&', "%26") - .put('\'', "%27") - .put('(', "%28") - .put(')', "%29") - .put('*', "%2A") - .put('+', "%2B") - .put(',', "%2C") - // NOTE: Whether the forward slash character should be encoded depends on the URI segment - // being encoded. The path segment should not encode forward slashes, but others (e.g. - // query parameter keys and values) should encode them. Tests verifying encoding behavior - // in path segments should make a copy of this map and replace the mapping for '/' to "/". - .put('/', "%2F") - .put(':', "%3A") - .put(';', "%3B") - .put('=', "%3D") - .put('?', "%3F") - .put('@', "%40") - .put('[', "%5B") - .put(']', "%5D") - // In addition to [a-zA-Z0-9], these chars should not be URI-encoded: - .put('-', "-") - .put('_', "_") - .put('.', ".") - .put('~', "~") - .build(); - - private static final String ACCOUNT = "account"; - private static PrivateKey privateKey; - private static PublicKey publicKey; - - private StorageOptions options; - private StorageRpcFactory rpcFactoryMock; - private StorageRpc storageRpcMock; - private Storage storage; - - private Blob expectedBlob1, expectedBlob2, expectedBlob3; - private Bucket expectedBucket1, expectedBucket2, expectedBucket3; - - @BeforeClass - public static void beforeClass() throws NoSuchAlgorithmException, InvalidKeySpecException { - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - EncodedKeySpec privateKeySpec = - new PKCS8EncodedKeySpec(BaseEncoding.base64().decode(PRIVATE_KEY_STRING)); - privateKey = keyFactory.generatePrivate(privateKeySpec); - EncodedKeySpec publicKeySpec = - new X509EncodedKeySpec(BaseEncoding.base64().decode(PUBLIC_KEY_STRING)); - publicKey = keyFactory.generatePublic(publicKeySpec); - } - - @Before - public void setUp() { - rpcFactoryMock = EasyMock.createMock(StorageRpcFactory.class); - storageRpcMock = EasyMock.createMock(StorageRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(StorageOptions.class))) - .andReturn(storageRpcMock); - EasyMock.replay(rpcFactoryMock); - options = - StorageOptions.http() - .setProjectId("projectId") - .setClock(TIME_SOURCE) - .setServiceRpcFactory(rpcFactoryMock) - .setRetrySettings(ServiceOptions.getNoRetrySettings()) - .build(); - } - - @After - public void tearDown() throws Exception { - EasyMock.verify(rpcFactoryMock, storageRpcMock); - } - - private void initializeService() { - storage = options.getService(); - initializeServiceDependentObjects(); - } - - private void initializeServiceDependentObjects() { - expectedBlob1 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)); - expectedBlob2 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO2)); - expectedBlob3 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO3)); - expectedBucket1 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO1)); - expectedBucket2 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO2)); - expectedBucket3 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO3)); - } - - @Test - public void testUpdateBucket() { - BucketInfo updatedBucketInfo = BUCKET_INFO1.toBuilder().setIndexPage("some-page").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().bucketInfo().encode(updatedBucketInfo), EMPTY_RPC_OPTIONS)) - .andReturn(Conversions.json().bucketInfo().encode(updatedBucketInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = storage.update(updatedBucketInfo); - assertEquals(new Bucket(storage, new BucketInfo.BuilderImpl(updatedBucketInfo)), bucket); - } - - @Test - public void testUpdateBucketWithOptions() { - BucketInfo updatedBucketInfo = BUCKET_INFO1.toBuilder().setIndexPage("some-page").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().bucketInfo().encode(updatedBucketInfo), BUCKET_TARGET_OPTIONS)) - .andReturn(Conversions.json().bucketInfo().encode(updatedBucketInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = - storage.update( - updatedBucketInfo, BUCKET_TARGET_METAGENERATION, BUCKET_TARGET_PREDEFINED_ACL); - assertEquals(new Bucket(storage, new BucketInfo.BuilderImpl(updatedBucketInfo)), bucket); - } - - @Test - public void testUpdateBlob() { - BlobInfo updatedBlobInfo = BLOB_INFO1.toBuilder().setContentType("some-content-type").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().blobInfo().encode(updatedBlobInfo), EMPTY_RPC_OPTIONS)) - .andReturn(Conversions.json().blobInfo().encode(updatedBlobInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = storage.update(updatedBlobInfo); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(updatedBlobInfo)), blob); - } - - @Test - public void testUpdateBlobWithOptions() { - BlobInfo updatedBlobInfo = BLOB_INFO1.toBuilder().setContentType("some-content-type").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().blobInfo().encode(updatedBlobInfo), BLOB_TARGET_OPTIONS_UPDATE)) - .andReturn(Conversions.json().blobInfo().encode(updatedBlobInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = - storage.update(updatedBlobInfo, BLOB_TARGET_METAGENERATION, BLOB_TARGET_PREDEFINED_ACL); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(updatedBlobInfo)), blob); - } - - @Test - public void testDeleteBucket() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().bucketInfo().encode(BucketInfo.of(BUCKET_NAME1)), - EMPTY_RPC_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.delete(BUCKET_NAME1)); - } - - @Test - public void testDeleteBucketWithOptions() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().bucketInfo().encode(BucketInfo.of(BUCKET_NAME1)), - BUCKET_SOURCE_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.delete(BUCKET_NAME1, BUCKET_SOURCE_METAGENERATION)); - } - - @Test - public void testDeleteBlob() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - EMPTY_RPC_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.delete(BUCKET_NAME1, BLOB_NAME1)); - } - - @Test - public void testDeleteBlobWithOptions() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - BLOB_SOURCE_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue( - storage.delete( - BUCKET_NAME1, BLOB_NAME1, BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION)); - } - - @Test - public void testDeleteBlobWithOptionsFromBlobId() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().blobId().encode(BLOB_INFO1.getBlobId()), BLOB_SOURCE_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue( - storage.delete( - BLOB_INFO1.getBlobId(), - BLOB_SOURCE_GENERATION_FROM_BLOB_ID, - BLOB_SOURCE_METAGENERATION)); - } - - @Test - public void testCompose() { - Storage.ComposeRequest req = - Storage.ComposeRequest.newBuilder() - .addSource(BLOB_NAME2, BLOB_NAME3) - .setTarget(BLOB_INFO1) - .build(); - EasyMock.expect( - storageRpcMock.compose( - ImmutableList.of( - Conversions.json().blobInfo().encode(BLOB_INFO2), - Conversions.json().blobInfo().encode(BLOB_INFO3)), - Conversions.json().blobInfo().encode(BLOB_INFO1), - EMPTY_RPC_OPTIONS)) - .andReturn(Conversions.json().blobInfo().encode(BLOB_INFO1)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = storage.compose(req); - assertEquals(expectedBlob1, blob); - } - - @Test - public void testComposeWithOptions() { - Storage.ComposeRequest req = - Storage.ComposeRequest.newBuilder() - .addSource(BLOB_NAME2, BLOB_NAME3) - .setTarget(BLOB_INFO1) - .setTargetOptions(BLOB_TARGET_GENERATION, BLOB_TARGET_METAGENERATION) - .build(); - EasyMock.expect( - storageRpcMock.compose( - ImmutableList.of( - Conversions.json().blobInfo().encode(BLOB_INFO2), - Conversions.json().blobInfo().encode(BLOB_INFO3)), - Conversions.json().blobInfo().encode(BLOB_INFO1), - BLOB_TARGET_OPTIONS_COMPOSE)) - .andReturn(Conversions.json().blobInfo().encode(BLOB_INFO1)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = storage.compose(req); - assertEquals(expectedBlob1, blob); - } - - @Test - public void testCopy() { - CopyRequest request = Storage.CopyRequest.of(BLOB_INFO1.getBlobId(), BLOB_INFO2.getBlobId()); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - EMPTY_RPC_OPTIONS, - false, - Conversions.json().blobInfo().encode(BLOB_INFO2), - EMPTY_RPC_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyWithOptions() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION) - .setTarget(BLOB_INFO1, BLOB_TARGET_GENERATION, BLOB_TARGET_METAGENERATION) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - BLOB_SOURCE_OPTIONS_COPY, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - BLOB_TARGET_OPTIONS_COMPOSE, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyWithEncryptionKey() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.encryptionKey(BASE64_KEY)) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - ENCRYPTION_KEY_OPTIONS, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - ENCRYPTION_KEY_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse).times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(BASE64_KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.encryptionKey(KEY)) - .build(); - writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyFromEncryptionKeyToKmsKeyName() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.kmsKeyName(KMS_KEY_NAME)) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - ENCRYPTION_KEY_OPTIONS, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - KMS_KEY_NAME_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse).times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(BASE64_KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.kmsKeyName(KMS_KEY_NAME)) - .build(); - writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyWithOptionsFromBlobId() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO1.getBlobId()) - .setSourceOptions(BLOB_SOURCE_GENERATION_FROM_BLOB_ID, BLOB_SOURCE_METAGENERATION) - .setTarget(BLOB_INFO1, BLOB_TARGET_GENERATION, BLOB_TARGET_METAGENERATION) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - BLOB_SOURCE_OPTIONS_COPY, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - BLOB_TARGET_OPTIONS_COMPOSE, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyMultipleRequests() { - CopyRequest request = Storage.CopyRequest.of(BLOB_INFO1.getBlobId(), BLOB_INFO2.getBlobId()); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - EMPTY_RPC_OPTIONS, - false, - Conversions.json().blobInfo().encode(BLOB_INFO2), - EMPTY_RPC_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse1 = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - StorageRpc.RewriteResponse rpcResponse2 = - new StorageRpc.RewriteResponse( - rpcRequest, Conversions.json().blobInfo().encode(BLOB_INFO1), 42L, true, "token", 42L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse1); - EasyMock.expect(storageRpcMock.continueRewrite(rpcResponse1)).andReturn(rpcResponse2); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - assertEquals(expectedBlob1, writer.getResult()); - assertTrue(writer.isDone()); - assertEquals(42L, writer.getTotalBytesCopied()); - assertEquals(42L, writer.getBlobSize()); - } - - @Test - public void testReadAllBytes() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - EMPTY_RPC_OPTIONS)) - .andReturn(BLOB_CONTENT); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesWithOptions() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - BLOB_SOURCE_OPTIONS)) - .andReturn(BLOB_CONTENT); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes( - BUCKET_NAME1, BLOB_NAME1, BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesWithDecriptionKey() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - ENCRYPTION_KEY_OPTIONS)) - .andReturn(BLOB_CONTENT) - .times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1, BlobSourceOption.decryptionKey(KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - readBytes = - storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1, BlobSourceOption.decryptionKey(BASE64_KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesFromBlobIdWithOptions() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BLOB_INFO1.getBlobId()), BLOB_SOURCE_OPTIONS)) - .andReturn(BLOB_CONTENT); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes( - BLOB_INFO1.getBlobId(), - BLOB_SOURCE_GENERATION_FROM_BLOB_ID, - BLOB_SOURCE_METAGENERATION); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesFromBlobIdWithDecriptionKey() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BLOB_INFO1.getBlobId()), ENCRYPTION_KEY_OPTIONS)) - .andReturn(BLOB_CONTENT) - .times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes(BLOB_INFO1.getBlobId(), BlobSourceOption.decryptionKey(KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - readBytes = - storage.readAllBytes(BLOB_INFO1.getBlobId(), BlobSourceOption.decryptionKey(BASE64_KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testBatch() { - RpcBatch batchMock = EasyMock.mock(RpcBatch.class); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - EasyMock.replay(batchMock, storageRpcMock); - initializeService(); - StorageBatch batch = storage.batch(); - assertSame(options, batch.getOptions()); - assertSame(storageRpcMock, batch.getStorageRpc()); - assertSame(batchMock, batch.getBatch()); - EasyMock.verify(batchMock); - } - - @Test - public void testSignUrl() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = storage.signUrl(BLOB_INFO1, 14, TimeUnit.DAYS); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlLeadingSlash() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - String blobName = "/b1"; - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl(BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), 14, TimeUnit.DAYS); - String expectedResourcePath = "/b1"; - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedResourcePath) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedResourcePath); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlLeadingSlashWithHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - String blobName = "/b1"; - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String escapedBlobName = Rfc3986UriEncode(blobName, false); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithOptions() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.POST), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withMd5()); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.POST) - .append('\n') - .append(BLOB_INFO1.getMd5()) - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithOptionsAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.POST), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withMd5(), - Storage.SignUrlOption.withHostName("https://example.com")); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.POST) - .append('\n') - .append(BLOB_INFO1.getMd5()) - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlForBlobWithSpecialChars() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - Map encodingCharsToTest = - new HashMap(RFC3986_URI_ENCODING_MAP); - // Signed URL specs say that '/' is not encoded in the resource name (path segment of the URI). - encodingCharsToTest.put('/', "/"); - for (Map.Entry entry : encodingCharsToTest.entrySet()) { - String blobName = "/a" + entry.getKey() + "b"; - URL url = - storage.signUrl(BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), 14, TimeUnit.DAYS); - String expectedBlobName = "/a" + entry.getValue() + "b"; - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - } - - @Test - public void testSignUrlForBlobWithSpecialCharsAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - Map encodingCharsToTest = - new HashMap(RFC3986_URI_ENCODING_MAP); - // Signed URL specs say that '/' is not encoded in the resource name (path segment of the URI). - encodingCharsToTest.put('/', "/"); - for (Map.Entry entry : encodingCharsToTest.entrySet()) { - String blobName = "/a" + entry.getKey() + "b"; - URL url = - storage.signUrl( - BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String expectedBlobName = "/a" + entry.getValue() + "b"; - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - } - - @Test - public void testSignUrlWithExtHeaders() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - Map extHeaders = new HashMap(); - extHeaders.put("x-goog-acl", "public-read"); - extHeaders.put("x-goog-meta-owner", "myself"); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.PUT), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withExtHeaders(extHeaders)); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.PUT) - .append('\n') - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append('\n') - .append("x-goog-acl:public-read\n") - .append("x-goog-meta-owner:myself\n") - .append('/') - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithExtHeadersAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - Map extHeaders = new HashMap(); - extHeaders.put("x-goog-acl", "public-read"); - extHeaders.put("x-goog-meta-owner", "myself"); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.PUT), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withExtHeaders(extHeaders), - Storage.SignUrlOption.withHostName("https://example.com")); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.PUT) - .append('\n') - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append('\n') - .append("x-goog-acl:public-read\n") - .append("x-goog-meta-owner:myself\n") - .append('/') - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlForBlobWithSlashes() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String blobName = "/foo/bar/baz #%20other cool stuff.txt"; - URL url = - storage.signUrl(BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), 14, TimeUnit.DAYS); - String escapedBlobName = Rfc3986UriEncode(blobName, false); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlForBlobWithSlashesAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String blobName = "/foo/bar/baz #%20other cool stuff.txt"; - URL url = - storage.signUrl( - BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String escapedBlobName = Rfc3986UriEncode(blobName, false); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testV2SignUrlWithQueryParams() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String dispositionNotEncoded = "attachment; filename=\"" + BLOB_NAME1 + "\""; - String dispositionEncoded = "attachment%3B%20filename%3D%22" + BLOB_NAME1 + "%22"; - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withPathStyle(), - Storage.SignUrlOption.withV2Signature(), - Storage.SignUrlOption.withQueryParams( - ImmutableMap.of( - "response-content-disposition", dispositionNotEncoded))); - - String stringUrl = url.toString(); - - String expectedPrefix = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - // Query params aren't sorted for V2 signatures; user-supplied params are inserted at - // the start of the query string, before the required auth params. - .append("?response-content-disposition=") - .append(dispositionEncoded) - .append("&GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedPrefix)); - String signature = stringUrl.substring(expectedPrefix.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append('\n') - // No value for Content-MD5, blank - .append('\n') - // No value for Content-Type, blank - .append('\n') - // Expiration line: - .append(42L + 1209600) - .append('\n') - // Resource line: - .append('/') - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - // TODO(b/144304815): Remove this test once all conformance tests contain query param test cases. - @Test - public void testV4SignUrlWithQueryParams() { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String dispositionNotEncoded = "attachment; filename=\"" + BLOB_NAME1 + "\""; - String dispositionEncoded = "attachment%3B%20filename%3D%22" + BLOB_NAME1 + "%22"; - URL url = - storage.signUrl( - BLOB_INFO1, - 6, - TimeUnit.DAYS, - Storage.SignUrlOption.withPathStyle(), - Storage.SignUrlOption.withV4Signature(), - Storage.SignUrlOption.withQueryParams( - ImmutableMap.of( - "response-content-disposition", dispositionNotEncoded))); - String stringUrl = url.toString(); - String expectedPrefix = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append('?') - .toString(); - assertTrue(stringUrl.startsWith(expectedPrefix)); - String restOfUrl = stringUrl.substring(expectedPrefix.length()); - - Pattern pattern = - Pattern.compile( - // We use the same code to construct the canonical request query string as we do to - // construct the query string used in the final URL, so this query string should also be - // sorted correctly, except for the trailing x-goog-signature param. - new StringBuilder("X-Goog-Algorithm=GOOG4-RSA-SHA256") - .append("&X-Goog-Credential=[^&]+") - .append("&X-Goog-Date=[^&]+") - .append("&X-Goog-Expires=[^&]+") - .append("&X-Goog-SignedHeaders=[^&]+") - .append("&response-content-disposition=[^&]+") - // Signature is always tacked onto the end of the final URL; it's not sorted w/ the - // other params above, since the signature is not known when you're constructing the - // query string line of the canonical request string. - .append("&X-Goog-Signature=.*") - .toString()); - Matcher matcher = pattern.matcher(restOfUrl); - assertTrue(restOfUrl, matcher.matches()); - - // Make sure query param was encoded properly. - assertNotEquals(-1, restOfUrl.indexOf("&response-content-disposition=" + dispositionEncoded)); - } - - @Test - public void testGetAllArray() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.get(blobId1, blobId2); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testGetAllArrayIterable() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.get(ImmutableList.of(blobId1, blobId2)); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testDeleteAllArray() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List result = storage.delete(blobId1, blobId2); - callback1.getValue().onSuccess(null); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, result.size()); - assertTrue(result.get(0)); - assertFalse(result.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testDeleteAllIterable() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List result = storage.delete(blobId1, blobId2); - callback1.getValue().onSuccess(null); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, result.size()); - assertTrue(result.get(0)); - assertFalse(result.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testUpdateAllArray() { - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.update(BLOB_INFO1, BLOB_INFO2); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testUpdateAllIterable() { - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.update(ImmutableList.of(BLOB_INFO1, BLOB_INFO2)); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testGetBucketAcl() { - EasyMock.expect( - storageRpcMock.getAcl( - BUCKET_NAME1, "allAuthenticatedUsers", new HashMap())) - .andReturn(Conversions.json().bucketAcl().encode(ACL)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.getAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers()); - assertEquals(ACL, acl); - } - - @Test - public void testGetBucketAclNull() { - EasyMock.expect( - storageRpcMock.getAcl( - BUCKET_NAME1, "allAuthenticatedUsers", new HashMap())) - .andReturn(null); - EasyMock.replay(storageRpcMock); - initializeService(); - assertNull(storage.getAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteBucketAcl() { - EasyMock.expect( - storageRpcMock.deleteAcl( - BUCKET_NAME1, "allAuthenticatedUsers", new HashMap())) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.deleteAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.createAcl( - Conversions.json().bucketAcl().encode(ACL).setBucket(BUCKET_NAME1), - new HashMap())) - .andReturn(Conversions.json().bucketAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.createAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testUpdateBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.patchAcl( - Conversions.json().bucketAcl().encode(ACL).setBucket(BUCKET_NAME1), - new HashMap())) - .andReturn(Conversions.json().bucketAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.updateAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testListBucketAcl() { - EasyMock.expect(storageRpcMock.listAcls(BUCKET_NAME1, new HashMap())) - .andReturn( - ImmutableList.of( - Conversions.json().bucketAcl().encode(ACL), - Conversions.json().bucketAcl().encode(OTHER_ACL))); - EasyMock.replay(storageRpcMock); - initializeService(); - List acls = storage.listAcls(BUCKET_NAME1); - assertEquals(ImmutableList.of(ACL, OTHER_ACL), acls); - } - - @Test - public void testGetDefaultBucketAcl() { - EasyMock.expect(storageRpcMock.getDefaultAcl(BUCKET_NAME1, "allAuthenticatedUsers")) - .andReturn(Conversions.json().objectAcl().encode(ACL)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.getDefaultAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers()); - assertEquals(ACL, acl); - } - - @Test - public void testGetDefaultBucketAclNull() { - EasyMock.expect(storageRpcMock.getDefaultAcl(BUCKET_NAME1, "allAuthenticatedUsers")) - .andReturn(null); - EasyMock.replay(storageRpcMock); - initializeService(); - assertNull(storage.getDefaultAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteDefaultBucketAcl() { - EasyMock.expect(storageRpcMock.deleteDefaultAcl(BUCKET_NAME1, "allAuthenticatedUsers")) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.deleteDefaultAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateDefaultBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.createDefaultAcl( - Conversions.json().objectAcl().encode(ACL).setBucket(BUCKET_NAME1))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.createDefaultAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testUpdateDefaultBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.patchDefaultAcl( - Conversions.json().objectAcl().encode(ACL).setBucket(BUCKET_NAME1))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.updateDefaultAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testListDefaultBucketAcl() { - EasyMock.expect(storageRpcMock.listDefaultAcls(BUCKET_NAME1)) - .andReturn( - ImmutableList.of( - Conversions.json().objectAcl().encode(ACL), - Conversions.json().objectAcl().encode(OTHER_ACL))); - EasyMock.replay(storageRpcMock); - initializeService(); - List acls = storage.listDefaultAcls(BUCKET_NAME1); - assertEquals(ImmutableList.of(ACL, OTHER_ACL), acls); - } - - @Test - public void testGetBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect(storageRpcMock.getAcl(BUCKET_NAME1, BLOB_NAME1, 42L, "allAuthenticatedUsers")) - .andReturn(Conversions.json().objectAcl().encode(ACL)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.getAcl(blobId, User.ofAllAuthenticatedUsers()); - assertEquals(ACL, acl); - } - - @Test - public void testGetBlobAclNull() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect(storageRpcMock.getAcl(BUCKET_NAME1, BLOB_NAME1, 42L, "allAuthenticatedUsers")) - .andReturn(null); - EasyMock.replay(storageRpcMock); - initializeService(); - assertNull(storage.getAcl(blobId, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect( - storageRpcMock.deleteAcl(BUCKET_NAME1, BLOB_NAME1, 42L, "allAuthenticatedUsers")) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.deleteAcl(blobId, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.createAcl( - Conversions.json() - .objectAcl() - .encode(ACL) - .setBucket(BUCKET_NAME1) - .setObject(BLOB_NAME1) - .setGeneration(42L))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.createAcl(blobId, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testUpdateBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.patchAcl( - Conversions.json() - .objectAcl() - .encode(ACL) - .setBucket(BUCKET_NAME1) - .setObject(BLOB_NAME1) - .setGeneration(42L))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.updateAcl(blobId, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testListBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect(storageRpcMock.listAcls(BUCKET_NAME1, BLOB_NAME1, 42L)) - .andReturn( - ImmutableList.of( - Conversions.json().objectAcl().encode(ACL), - Conversions.json().objectAcl().encode(OTHER_ACL))); - EasyMock.replay(storageRpcMock); - initializeService(); - List acls = storage.listAcls(blobId); - assertEquals(ImmutableList.of(ACL, OTHER_ACL), acls); - } - - @Test - public void testGetIamPolicy() { - EasyMock.expect(storageRpcMock.getIamPolicy(BUCKET_NAME1, EMPTY_RPC_OPTIONS)) - .andReturn(API_POLICY1); - EasyMock.replay(storageRpcMock); - initializeService(); - assertEquals(LIB_POLICY1, storage.getIamPolicy(BUCKET_NAME1)); - } - - @Test - public void testSetIamPolicy() { - com.google.api.services.storage.model.Policy preCommitApiPolicy = - new com.google.api.services.storage.model.Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers( - ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"), - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"))) - .setEtag(POLICY_ETAG1) - .setVersion(1); - // postCommitApiPolicy is identical but for the etag, which has been updated. - com.google.api.services.storage.model.Policy postCommitApiPolicy = - new com.google.api.services.storage.model.Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers( - ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"), - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"))) - .setEtag(POLICY_ETAG2) - .setVersion(1); - Policy postCommitLibPolicy = - Policy.newBuilder() - .addIdentity(StorageRoles.objectViewer(), Identity.allUsers()) - .addIdentity( - StorageRoles.objectAdmin(), - Identity.user("test1@gmail.com"), - Identity.user("test2@gmail.com")) - .addIdentity(StorageRoles.admin(), Identity.group("test-group@gmail.com")) - .setEtag(POLICY_ETAG2) - .setVersion(1) - .build(); - - EasyMock.expect(storageRpcMock.getIamPolicy(BUCKET_NAME1, EMPTY_RPC_OPTIONS)) - .andReturn(API_POLICY1); - EasyMock.expect( - storageRpcMock.setIamPolicy( - EasyMock.eq(BUCKET_NAME1), - eqApiPolicy(preCommitApiPolicy), - EasyMock.eq(EMPTY_RPC_OPTIONS))) - .andReturn(postCommitApiPolicy); - EasyMock.replay(storageRpcMock); - initializeService(); - - Policy currentPolicy = storage.getIamPolicy(BUCKET_NAME1); - Policy updatedPolicy = - storage.setIamPolicy( - BUCKET_NAME1, - currentPolicy - .toBuilder() - .addIdentity(StorageRoles.admin(), Identity.group("test-group@gmail.com")) - .build()); - assertEquals(updatedPolicy, postCommitLibPolicy); - } - - @Test - public void testTestIamPermissionsNull() { - ImmutableList expectedPermissions = ImmutableList.of(false, false, false); - ImmutableList checkedPermissions = - ImmutableList.of( - "storage.buckets.get", "storage.buckets.getIamPolicy", "storage.objects.list"); - - EasyMock.expect( - storageRpcMock.testIamPermissions(BUCKET_NAME1, checkedPermissions, EMPTY_RPC_OPTIONS)) - .andReturn(new TestIamPermissionsResponse()); - EasyMock.replay(storageRpcMock); - initializeService(); - assertEquals(expectedPermissions, storage.testIamPermissions(BUCKET_NAME1, checkedPermissions)); - } - - @Test - public void testTestIamPermissionsNonNull() { - ImmutableList expectedPermissions = ImmutableList.of(true, false, true); - ImmutableList checkedPermissions = - ImmutableList.of( - "storage.buckets.get", "storage.buckets.getIamPolicy", "storage.objects.list"); - - EasyMock.expect( - storageRpcMock.testIamPermissions(BUCKET_NAME1, checkedPermissions, EMPTY_RPC_OPTIONS)) - .andReturn( - new TestIamPermissionsResponse() - .setPermissions(ImmutableList.of("storage.objects.list", "storage.buckets.get"))); - EasyMock.replay(storageRpcMock); - initializeService(); - assertEquals(expectedPermissions, storage.testIamPermissions(BUCKET_NAME1, checkedPermissions)); - } - - @Test - public void testLockRetentionPolicy() { - EasyMock.expect( - storageRpcMock.lockRetentionPolicy( - Conversions.json().bucketInfo().encode(BUCKET_INFO3), - BUCKET_TARGET_OPTIONS_LOCK_RETENTION_POLICY)) - .andReturn(Conversions.json().bucketInfo().encode(BUCKET_INFO3)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = - storage.lockRetentionPolicy( - BUCKET_INFO3, BUCKET_TARGET_METAGENERATION, BUCKET_TARGET_USER_PROJECT); - assertEquals(expectedBucket3, bucket); - } - - @Test - public void testGetServiceAccount() { - EasyMock.expect(storageRpcMock.getServiceAccount("projectId")) - .andReturn(Conversions.json().serviceAccount().encode(SERVICE_ACCOUNT)); - EasyMock.replay(storageRpcMock); - initializeService(); - ServiceAccount serviceAccount = storage.getServiceAccount("projectId"); - assertEquals(SERVICE_ACCOUNT, serviceAccount); - } - - @Test - public void testRetryableException() { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - EasyMock.expect(storageRpcMock.get(Conversions.json().blobId().encode(blob), EMPTY_RPC_OPTIONS)) - .andThrow(new StorageException(500, "internalError")) - .andReturn(Conversions.json().blobInfo().encode(BLOB_INFO1)); - EasyMock.replay(storageRpcMock); - storage = - options - .toBuilder() - .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) - .build() - .getService(); - initializeServiceDependentObjects(); - Blob readBlob = storage.get(blob); - assertEquals(expectedBlob1, readBlob); - } - - @Test - public void testNonRetryableException() { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - String exceptionMessage = "Not Implemented"; - EasyMock.expect(storageRpcMock.get(Conversions.json().blobId().encode(blob), EMPTY_RPC_OPTIONS)) - .andThrow(new StorageException(501, exceptionMessage)); - EasyMock.replay(storageRpcMock); - storage = - options - .toBuilder() - .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) - .build() - .getService(); - initializeServiceDependentObjects(); - try { - storage.get(blob); - Assert.fail(); - } catch (StorageException ex) { - Assert.assertNotNull(ex.getMessage()); - } - } - - @Test - public void testRuntimeException() { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - String exceptionMessage = "Artificial runtime exception"; - EasyMock.expect(storageRpcMock.get(Conversions.json().blobId().encode(blob), EMPTY_RPC_OPTIONS)) - .andThrow(new RuntimeException(exceptionMessage)); - EasyMock.replay(storageRpcMock); - storage = - options - .toBuilder() - .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) - .build() - .getService(); - try { - storage.get(blob); - Assert.fail(); - } catch (StorageException ex) { - Assert.assertNotNull(ex.getMessage()); - } - } - - @Test - public void testV4PostPolicy() { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - PostPolicyV4.PostFieldsV4 fields = - PostPolicyV4.PostFieldsV4.newBuilder().setAcl("public-read").build(); - PostPolicyV4.PostConditionsV4 conditions = - PostPolicyV4.PostConditionsV4.newBuilder() - .addContentTypeCondition(PostPolicyV4.ConditionV4Type.MATCHES, "image/jpeg") - .build(); - - // test fields and conditions - PostPolicyV4 policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), - 7, - TimeUnit.DAYS, - fields, - conditions); - - Map outputFields = policy.getFields(); - - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("content-type"), "image/jpeg"); - assertEquals(outputFields.get("acl"), "public-read"); - assertEquals(outputFields.get("key"), "my-object"); - assertEquals("https://storage.googleapis.com/my-bucket/", policy.getUrl()); - - // test fields, no conditions - policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), 7, TimeUnit.DAYS, conditions); - outputFields = policy.getFields(); - - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("content-type"), "image/jpeg"); - assertEquals(outputFields.get("key"), "my-object"); - assertEquals("https://storage.googleapis.com/my-bucket/", policy.getUrl()); - - // test conditions, no fields - policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), 7, TimeUnit.DAYS, fields); - outputFields = policy.getFields(); - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("acl"), "public-read"); - assertEquals(outputFields.get("key"), "my-object"); - - // test no conditions no fields - policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), 7, TimeUnit.DAYS); - outputFields = policy.getFields(); - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("key"), "my-object"); - assertEquals("https://storage.googleapis.com/my-bucket/", policy.getUrl()); - } - - @Test - public void testBucketLifecycleRules() { - BucketInfo bucketInfo = - BucketInfo.newBuilder("b") - .setLocation("us") - .setLifecycleRules( - ImmutableList.of( - new BucketInfo.LifecycleRule( - BucketInfo.LifecycleRule.LifecycleAction.newSetStorageClassAction( - StorageClass.COLDLINE), - BucketInfo.LifecycleRule.LifecycleCondition.newBuilder() - .setAge(1) - .setNumberOfNewerVersions(3) - .setIsLive(false) - .setCreatedBefore(new DateTime(System.currentTimeMillis())) - .setMatchesStorageClass(ImmutableList.of(StorageClass.COLDLINE)) - .setDaysSinceNoncurrentTime(30) - .setNoncurrentTimeBefore(new DateTime(System.currentTimeMillis())) - .setCustomTimeBefore(new DateTime(System.currentTimeMillis())) - .setDaysSinceCustomTime(30) - .build()))) - .build(); - EasyMock.expect( - storageRpcMock.create( - Conversions.json().bucketInfo().encode(bucketInfo), - new HashMap())) - .andReturn(Conversions.json().bucketInfo().encode(bucketInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = storage.create(bucketInfo); - BucketInfo.LifecycleRule lifecycleRule = bucket.getLifecycleRules().get(0); - assertEquals(3, lifecycleRule.getCondition().getNumberOfNewerVersions().intValue()); - assertNotNull(lifecycleRule.getCondition().getCreatedBefore()); - assertFalse(lifecycleRule.getCondition().getIsLive()); - assertEquals(1, lifecycleRule.getCondition().getAge().intValue()); - assertEquals(1, lifecycleRule.getCondition().getMatchesStorageClass().size()); - assertEquals(30, lifecycleRule.getCondition().getDaysSinceNoncurrentTime().intValue()); - assertNotNull(lifecycleRule.getCondition().getNoncurrentTimeBefore()); - assertEquals(30, lifecycleRule.getCondition().getDaysSinceCustomTime().intValue()); - assertNotNull(lifecycleRule.getCondition().getCustomTimeBefore()); - } - - @Test - public void testDownloadTo() throws Exception { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - storage = options.toBuilder().build().getService(); - final byte[] expected = {1, 2}; - EasyMock.expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(0l), - anyObject(OutputStream.class))) - .andAnswer( - new IAnswer() { - @Override - public Long answer() throws Throwable { - ((OutputStream) getCurrentArguments()[3]).write(expected); - return 2l; - } - }); - EasyMock.replay(storageRpcMock); - File file = File.createTempFile("blob", ".tmp"); - storage.downloadTo(blob, file.toPath()); - byte actual[] = Files.readAllBytes(file.toPath()); - assertArrayEquals(expected, actual); - } - - @Test - public void testDownloadToWithRetries() throws Exception { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - storage = - options - .toBuilder() - .setRetrySettings(RetrySettings.newBuilder().setMaxAttempts(2).build()) - .build() - .getService(); - final byte[] expected = {1, 2}; - expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(0l), - anyObject(OutputStream.class))) - .andAnswer( - new IAnswer() { - @Override - public Long answer() throws Throwable { - ((OutputStream) getCurrentArguments()[3]).write(expected[0]); - throw new StorageException(504, "error"); - } - }); - expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(1l), - anyObject(OutputStream.class))) - .andAnswer( - new IAnswer() { - @Override - public Long answer() throws Throwable { - ((OutputStream) getCurrentArguments()[3]).write(expected[1]); - return 1l; - } - }); - replay(storageRpcMock); - File file = File.createTempFile("blob", ".tmp"); - storage.downloadTo(blob, file.toPath()); - byte actual[] = Files.readAllBytes(file.toPath()); - assertArrayEquals(expected, actual); - } - - @Test - public void testDownloadToWithException() throws Exception { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - storage = options.toBuilder().build().getService(); - Exception exception = new IllegalStateException("test"); - expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(0l), - anyObject(OutputStream.class))) - .andThrow(exception); - replay(storageRpcMock); - File file = File.createTempFile("blob", ".tmp"); - try { - storage.downloadTo(blob, file.toPath()); - fail(); - } catch (StorageException e) { - assertSame(exception, e.getCause()); - } - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java deleted file mode 100644 index d120441eda..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2017 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.google.cloud.storage; - -import static com.google.common.truth.Truth.assertThat; - -import com.google.cloud.TransportOptions; -import org.easymock.EasyMock; -import org.junit.Assert; -import org.junit.Test; - -public class StorageOptionsTest { - - @Test - public void testInvalidTransport() { - try { - StorageOptions.http() - .setTransportOptions(EasyMock.createMock(TransportOptions.class)); - Assert.fail(); - } catch (IllegalArgumentException ex) { - Assert.assertNotNull(ex.getMessage()); - } - } - - @Test - public void testConfigureHostShouldBeKeptOnToBuilder() { - StorageOptions opts1 = StorageOptions.http().setHost("custom-host").build(); - StorageOptions opts2 = opts1.toBuilder().build(); - - assertThat(opts2.getHost()).isEqualTo("custom-host"); - } - - @Test - public void testToBuilderShouldSpecifyDefaultIfNotOtherwiseSet() { - StorageOptions opts1 = StorageOptions.http().build(); - StorageOptions opts2 = opts1.toBuilder().build(); - - assertThat(opts2.getHost()).isEqualTo("https://storage.googleapis.com"); - } - - @Test - public void testNewBuilderSpecifiesCorrectHost() { - StorageOptions opts1 = StorageOptions.http().build(); - - assertThat(opts1.getHost()).isEqualTo("https://storage.googleapis.com"); - } - - @Test - public void testDefaultInstanceSpecifiesCorrectHost() { - StorageOptions opts1 = StorageOptions.getDefaultInstance(); - - assertThat(opts1.getHost()).isEqualTo("https://storage.googleapis.com"); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java deleted file mode 100644 index 6f09649aeb..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2017 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.google.cloud.storage.testing; - -import com.google.api.services.storage.model.Policy; -import com.google.api.services.storage.model.Policy.Bindings; -import com.google.common.collect.ImmutableSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.easymock.EasyMock; -import org.easymock.IArgumentMatcher; - -/** - * Matches two {@link Policy} instances, which may have lists of {@link Bindings} that are not in - * the same order but which are still logically equivalent. - */ -public class ApiPolicyMatcher implements IArgumentMatcher { - - private final Map> expectedBindings; - private final String expectedEtag; - - public ApiPolicyMatcher(Policy expected) { - expectedBindings = toMap(expected.getBindings()); - expectedEtag = expected.getEtag(); - } - - @Override - public boolean matches(Object object) { - if (!(object instanceof Policy)) { - return false; - } - Policy actual = (Policy) object; - Map> actualBindings = toMap(actual.getBindings()); - String actualEtag = actual.getEtag(); - - if (expectedEtag == null) { - if (actualEtag != null) { - return false; - } - } else { - if (!expectedEtag.equals(actual.getEtag())) { - return false; - } - } - - if (expectedBindings.size() != actualBindings.size()) { - return false; - } - - for (Map.Entry> entry : expectedBindings.entrySet()) { - String role = entry.getKey(); - Set expectedMembers = entry.getValue(); - Set actualMembers = actualBindings.get(role); - if (!expectedMembers.equals(actualMembers)) { - return false; - } - } - - return true; - } - - @Override - public void appendTo(StringBuffer buffer) { - buffer.append("eqApiPolicy("); - buffer.append("etag="); - buffer.append(expectedEtag); - buffer.append(",bindings="); - buffer.append(expectedBindings); - buffer.append(")"); - } - - public static Policy eqApiPolicy(Policy in) { - EasyMock.reportMatcher(new ApiPolicyMatcher(in)); - return null; - } - - private Map> toMap(List bindings) { - Map> mapBindings = new HashMap<>(); - if (bindings != null) { - for (Bindings binding : bindings) { - mapBindings.put(binding.getRole(), ImmutableSet.copyOf(binding.getMembers())); - } - } - return mapBindings; - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java deleted file mode 100644 index 1514c68d7c..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2017 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.google.cloud.storage.testing; - -import static com.google.cloud.storage.testing.ApiPolicyMatcher.eqApiPolicy; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import com.google.api.services.storage.model.Policy; -import com.google.api.services.storage.model.Policy.Bindings; -import com.google.common.collect.ImmutableList; -import org.easymock.EasyMock; -import org.junit.Test; - -public class ApiPolicyMatcherTest { - - private static interface PolicyAcceptor { - - int accept(Policy policy); - } - - private static final String ETAG = "CAE="; - private static final Policy API_POLICY_1 = - new Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"), - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"))) - .setEtag(ETAG); - private static final Policy API_POLICY_2 = - new Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"), - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test2@gmail.com", "user:test1@gmail.com")) - .setRole("roles/storage.objectAdmin"))) - .setEtag(ETAG); - private static final Policy API_POLICY_MISSING_BINDINGS = new Policy().setEtag(ETAG); - private static final Policy API_POLICY_MISSING_ETAG = - new Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"), - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test2@gmail.com", "user:test1@gmail.com")) - .setRole("roles/storage.objectAdmin"))); - - @Test - public void testEquivalence() { - assertMatch(API_POLICY_1, API_POLICY_2); - assertMatch(API_POLICY_2, API_POLICY_1); - assertNoMatch(API_POLICY_1, API_POLICY_MISSING_BINDINGS); - assertNoMatch(API_POLICY_MISSING_BINDINGS, API_POLICY_1); - assertNoMatch(API_POLICY_1, API_POLICY_MISSING_ETAG); - assertNoMatch(API_POLICY_MISSING_ETAG, API_POLICY_1); - assertNoMatch(API_POLICY_MISSING_BINDINGS, API_POLICY_MISSING_ETAG); - assertNoMatch(API_POLICY_MISSING_ETAG, API_POLICY_MISSING_BINDINGS); - } - - private static void assertMatch(Policy expected, Policy actual) { - assertTrue(new ApiPolicyMatcher(expected).matches(actual)); - } - - private static void assertNoMatch(Policy expected, Policy actual) { - assertFalse(new ApiPolicyMatcher(expected).matches(actual)); - } - - @Test - public void testStaticMocker() { - PolicyAcceptor mock = EasyMock.createMock(PolicyAcceptor.class); - EasyMock.expect(mock.accept(eqApiPolicy(API_POLICY_1))).andReturn(0); - EasyMock.replay(mock); - mock.accept(API_POLICY_2); - EasyMock.verify(mock); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java deleted file mode 100644 index 44cb82c080..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage.testing; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.gax.paging.Page; -import com.google.cloud.http.HttpTransportOptions; -import com.google.cloud.storage.Blob; -import com.google.cloud.storage.BlobId; -import com.google.cloud.storage.Storage; -import com.google.cloud.storage.Storage.BlobListOption; -import com.google.cloud.storage.StorageException; -import com.google.cloud.storage.StorageOptions; -import com.google.common.collect.ImmutableList; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import org.easymock.EasyMock; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.threeten.bp.Duration; - -public class RemoteStorageHelperTest { - - private static final String BUCKET_NAME = "bucket-name"; - private static final String PROJECT_ID = "project-id"; - private static final String JSON_KEY = - "{\n" - + " \"private_key_id\": \"somekeyid\",\n" - + " \"private_key\": \"-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggS" - + "kAgEAAoIBAQC+K2hSuFpAdrJI\\nnCgcDz2M7t7bjdlsadsasad+fvRSW6TjNQZ3p5LLQY1kSZRqBqylRkzteMOyHg" - + "aR\\n0Pmxh3ILCND5men43j3h4eDbrhQBuxfEMalkG92sL+PNQSETY2tnvXryOvmBRwa/\\nQP/9dJfIkIDJ9Fw9N4" - + "Bhhhp6mCcRpdQjV38H7JsyJ7lih/oNjECgYAt\\nknddadwkwewcVxHFhcZJO+XWf6ofLUXpRwiTZakGMn8EE1uVa2" - + "LgczOjwWHGi99MFjxSer5m9\\n1tCa3/KEGKiS/YL71JvjwX3mb+cewlkcmweBKZHM2JPTk0ZednFSpVZMtycjkbLa" - + "\\ndYOS8V85AgMBewECggEBAKksaldajfDZDV6nGqbFjMiizAKJolr/M3OQw16K6o3/\\n0S31xIe3sSlgW0+UbYlF" - + "4U8KifhManD1apVSC3csafaspP4RZUHFhtBywLO9pR5c\\nr6S5aLp+gPWFyIp1pfXbWGvc5VY/v9x7ya1VEa6rXvL" - + "sKupSeWAW4tMj3eo/64ge\\nsdaceaLYw52KeBYiT6+vpsnYrEkAHO1fF/LavbLLOFJmFTMxmsNaG0tuiJHgjshB\\" - + "n82DpMCbXG9YcCgI/DbzuIjsdj2JC1cascSP//3PmefWysucBQe7Jryb6NQtASmnv\\nCdDw/0jmZTEjpe4S1lxfHp" - + "lAhHFtdgYTvyYtaLZiVVkCgYEA8eVpof2rceecw/I6\\n5ng1q3Hl2usdWV/4mZMvR0fOemacLLfocX6IYxT1zA1FF" - + "JlbXSRsJMf/Qq39mOR2\\nSpW+hr4jCoHeRVYLgsbggtrevGmILAlNoqCMpGZ6vDmJpq6ECV9olliDvpPgWOP+\\nm" - + "YPDreFBGxWvQrADNbRt2dmGsrsCgYEAyUHqB2wvJHFqdmeBsaacewzV8x9WgmeX\\ngUIi9REwXlGDW0Mz50dxpxcK" - + "CAYn65+7TCnY5O/jmL0VRxU1J2mSWyWTo1C+17L0\\n3fUqjxL1pkefwecxwecvC+gFFYdJ4CQ/MHHXU81Lwl1iWdF" - + "Cd2UoGddYaOF+KNeM\\nHC7cmqra+JsCgYEAlUNywzq8nUg7282E+uICfCB0LfwejuymR93CtsFgb7cRd6ak\\nECR" - + "8FGfCpH8ruWJINllbQfcHVCX47ndLZwqv3oVFKh6pAS/vVI4dpOepP8++7y1u\\ncoOvtreXCX6XqfrWDtKIvv0vjl" - + "HBhhhp6mCcRpdQjV38H7JsyJ7lih/oNjECgYAt\\nkndj5uNl5SiuVxHFhcZJO+XWf6ofLUregtevZakGMn8EE1uVa" - + "2AY7eafmoU/nZPT\\n00YB0TBATdCbn/nBSuKDESkhSg9s2GEKQZG5hBmL5uCMfo09z3SfxZIhJdlerreP\\nJ7gSi" - + "dI12N+EZxYd4xIJh/HFDgp7RRO87f+WJkofMQKBgGTnClK1VMaCRbJZPriw\\nEfeFCoOX75MxKwXs6xgrw4W//AYG" - + "GUjDt83lD6AZP6tws7gJ2IwY/qP7+lyhjEqN\\nHtfPZRGFkGZsdaksdlaksd323423d+15/UvrlRSFPNj1tWQmNKk" - + "XyRDW4IG1Oa2p\\nrALStNBx5Y9t0/LQnFI4w3aG\\n-----END PRIVATE KEY-----\\n\",\n" - + " \"client_email\": \"someclientid@developer.gserviceaccount.com\",\n" - + " \"client_id\": \"someclientid.apps.googleusercontent.com\",\n" - + " \"type\": \"service_account\"\n" - + "}"; - private static final InputStream JSON_KEY_STREAM = new ByteArrayInputStream(JSON_KEY.getBytes()); - private static final StorageException RETRYABLE_EXCEPTION = new StorageException(409, ""); - private static final StorageException FATAL_EXCEPTION = new StorageException(500, ""); - private static final String BLOB_NAME2 = "n2"; - private static final BlobId BLOB_ID1 = BlobId.of(BUCKET_NAME, "n1"); - private static final BlobId BLOB_ID2 = BlobId.of(BUCKET_NAME, BLOB_NAME2); - - private Blob blob1; - private Blob blob2; - private List blobList; - private Page blobPage; - - @Before - public void setUp() { - blob1 = EasyMock.createMock(Blob.class); - blob2 = EasyMock.createMock(Blob.class); - blobList = ImmutableList.of(blob1, blob2); - blobPage = - new Page() { - - @Override - public boolean hasNextPage() { - return true; - } - - @Override - public String getNextPageToken() { - return "nextPageCursor"; - } - - @Override - public Page getNextPage() { - return null; - } - - @Override - public Iterable getValues() { - return blobList; - } - - @Override - public Iterable iterateAll() { - return blobList; - } - }; - } - - @Test - public void testForceDelete() throws InterruptedException, ExecutionException { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andReturn(true); - EasyMock.replay(storageMock, blob1, blob2); - assertTrue(RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 5, TimeUnit.SECONDS)); - EasyMock.verify(storageMock, blob1, blob2); - } - - @Test - public void testForceDeleteTimeout() throws InterruptedException, ExecutionException { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1).anyTimes(); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2).anyTimes(); - - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage) - .anyTimes(); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andThrow(RETRYABLE_EXCEPTION).anyTimes(); - EasyMock.replay(storageMock, blob1, blob2); - assertFalse( - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 50, TimeUnit.MICROSECONDS)); - EasyMock.verify(storageMock); - } - - @Test - public void testForceDeleteFail() throws InterruptedException, ExecutionException { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andThrow(FATAL_EXCEPTION); - EasyMock.replay(storageMock, blob1, blob2); - try { - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 5, TimeUnit.SECONDS); - Assert.fail(); - } catch (ExecutionException ex) { - assertNotNull(ex.getMessage()); - } finally { - EasyMock.verify(storageMock); - } - } - - @Test - public void testForceDeleteNoTimeout() { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andReturn(true); - EasyMock.replay(storageMock, blob1, blob2); - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME); - EasyMock.verify(storageMock); - } - - @Test - public void testForceDeleteNoTimeoutFail() { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andThrow(FATAL_EXCEPTION); - EasyMock.replay(storageMock, blob1, blob2); - try { - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME); - Assert.fail(); - } catch (StorageException ex) { - assertNotNull(ex.getMessage()); - } finally { - EasyMock.verify(storageMock); - } - } - - @Test - public void testForceDeleteRetriesWithUserProject() throws Exception { - final String USER_PROJECT = "user-project"; - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - EasyMock.expect(blob2.getName()).andReturn(BLOB_NAME2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)) - .andReturn(ImmutableList.of(Boolean.TRUE, Boolean.FALSE)) - .anyTimes(); - EasyMock.expect( - storageMock.delete( - BUCKET_NAME, BLOB_NAME2, Storage.BlobSourceOption.userProject(USER_PROJECT))) - .andReturn(true) - .anyTimes(); - EasyMock.expect( - storageMock.list( - BUCKET_NAME, - BlobListOption.versions(true), - BlobListOption.userProject(USER_PROJECT))) - .andReturn(blobPage); - EasyMock.expect( - storageMock.delete(BUCKET_NAME, Storage.BucketSourceOption.userProject(USER_PROJECT))) - .andReturn(true); - EasyMock.replay(storageMock, blob1, blob2); - try { - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 5, TimeUnit.SECONDS, USER_PROJECT); - } finally { - EasyMock.verify(storageMock); - } - } - - @Test - public void testCreateFromStream() { - RemoteStorageHelper helper = RemoteStorageHelper.create(PROJECT_ID, JSON_KEY_STREAM); - StorageOptions options = helper.getOptions(); - assertEquals(PROJECT_ID, options.getProjectId()); - assertEquals(60000, ((HttpTransportOptions) options.getTransportOptions()).getConnectTimeout()); - assertEquals(60000, ((HttpTransportOptions) options.getTransportOptions()).getReadTimeout()); - assertEquals(10, options.getRetrySettings().getMaxAttempts()); - assertEquals(Duration.ofMillis(30000), options.getRetrySettings().getMaxRetryDelay()); - assertEquals(Duration.ofMillis(120000), options.getRetrySettings().getTotalTimeout()); - assertEquals(Duration.ofMillis(250), options.getRetrySettings().getInitialRetryDelay()); - } -} diff --git a/pom.xml b/pom.xml index 0871dbdcb0..fd08055813 100644 --- a/pom.xml +++ b/pom.xml @@ -89,30 +89,11 @@ 1.127.2 test - - org.easymock - easymock - 4.3 - test - org.mockito mockito-core 4.11.0 test - - - - org.objenesis - objenesis - - - - - org.objenesis - objenesis - 3.3 - test com.google.api.grpc From be063082902552e3305645836b9437590350a26a Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Tue, 2 Apr 2024 14:29:48 -0400 Subject: [PATCH 12/40] test: fix ParallelCompositeUploadWritableByteChannelTest to apply accurately after porting json (#2483) --- .../storage/ParallelCompositeUploadWritableByteChannelTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java index 3a78adf4fe..48bb4137e3 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java @@ -320,7 +320,7 @@ public void partOpts_stripsPreconditionsAndChecksums_addingIfGenEq0() { "kms-key"); ImmutableMap rpcOptions = partOpts.getRpcOptions(); - assertThat(rpcOptions).isEqualTo(expected); + assertThat(rpcOptions).containsAtLeastEntriesIn(expected); } @Test From 17fa53b117ce88c2a8adbbb9b9aa9593a9d102c2 Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Tue, 2 Apr 2024 13:57:50 -0700 Subject: [PATCH 13/40] chore(benchmarking): fix typo, bidi changed to bidi_enabled (#2486) --- .../storage/benchmarking/StorageSharedBenchmarkingCli.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java b/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java index 3effab8c24..b1626a2848 100644 --- a/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java +++ b/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java @@ -87,7 +87,7 @@ public final class StorageSharedBenchmarkingCli implements Runnable { defaultValue = "0") int warmup; - @Option(names = "-bidi", description = "If bidi should be enabled") + @Option(names = "-bidi_enabled", description = "If bidi should be enabled") boolean bidiEnabled; Path tempDir; From 70fd088975280ed9a650ca09825ccb28297d89f7 Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Wed, 3 Apr 2024 09:13:05 -0700 Subject: [PATCH 14/40] docs: Add summary and reference docs for Storage Control API to readme (#2485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: Add summary and reference docs for Storage Control API to readme * add readme-partials change * add link without modifying template * remove newline * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .readme-partials.yaml | 6 ++++++ README.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.readme-partials.yaml b/.readme-partials.yaml index c95759f5b2..ab591da18a 100644 --- a/.readme-partials.yaml +++ b/.readme-partials.yaml @@ -1,4 +1,10 @@ custom_content: | + ## About Storage Control + + The [Storage Control API](https://cloud.google.com/storage/docs/reference/rpc/) lets you perform metadata-specific, control plane, and long-running operations. + + The Storage Control API creates one space to perform metadata-specific, control plane, and long-running operations apart from the Storage API. Separating these operations from the Storage API improves API standardization and lets you run faster releases. + #### Creating an authorized service object To make authenticated requests to Google Cloud Storage, you must create a service object with credentials. You can diff --git a/README.md b/README.md index 7f4116b62b..b6472addff 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,12 @@ See the [Cloud Storage client library docs][javadocs] to learn how to use this Cloud Storage Client Library. +## About Storage Control + +The [Storage Control API](https://cloud.google.com/storage/docs/reference/rpc/) lets you perform metadata-specific, control plane, and long-running operations. + +The Storage Control API creates one space to perform metadata-specific, control plane, and long-running operations apart from the Storage API. Separating these operations from the Storage API improves API standardization and lets you run faster releases. + #### Creating an authorized service object To make authenticated requests to Google Cloud Storage, you must create a service object with credentials. You can From 3a0b82929f2c26e2f26f30266319e25bdbe1c5a7 Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Wed, 3 Apr 2024 11:59:12 -0700 Subject: [PATCH 15/40] samples: Add StorageControl Quickstart Sample (#2479) * samples: Add StorageControl Quickstart Sample * storage control regiontag * lint * fix sample build * address pr comments * linter * create bucket in sample to keep it in line with other quickstarts * move bucket creation out of sample and into tests * linter and test fix --- samples/install-without-bom/pom.xml | 11 +++++ samples/native-image-sample/pom.xml | 6 +++ samples/snapshot/pom.xml | 6 +++ samples/snippets/pom.xml | 4 ++ .../QuickstartStorageControlSample.java | 40 +++++++++++++++++++ .../example/storage/QuickstartSampleIT.java | 13 ++++++ 6 files changed, 80 insertions(+) create mode 100644 samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index ef39f8723b..7144a5dbeb 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -32,6 +32,11 @@ google-cloud-storage 2.36.0 + + com.google.cloud + google-cloud-storage-control + 2.36.0-alpha + @@ -64,6 +69,12 @@ 1.127.2 test + + com.google.cloud + google-cloud-storage-control + 2.36.1-alpha + compile + diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index 2f4f14a4b7..fc3e6f2371 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -64,6 +64,12 @@ 1.127.2 test + + com.google.cloud + google-cloud-storage-control + 2.36.0-alpha + compile + diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 6366f9d25e..57278b0397 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -30,6 +30,12 @@ google-cloud-storage 2.36.2-SNAPSHOT + + com.google.cloud + google-cloud-storage-control + 2.36.1-alpha + compile + junit diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index b9c0b93c99..3d0dd50955 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -43,6 +43,10 @@ com.google.cloud google-cloud-storage + + com.google.cloud + google-cloud-storage-control + diff --git a/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java b/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java new file mode 100644 index 0000000000..71c824e417 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java @@ -0,0 +1,40 @@ +/* + * Copyright 2024 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; + +// [START storage_control_quickstart_sample] +import com.google.storage.control.v2.GetStorageLayoutRequest; +import com.google.storage.control.v2.StorageControlClient; +import com.google.storage.control.v2.StorageLayout; +import com.google.storage.control.v2.StorageLayoutName; + +public class QuickstartStorageControlSample { + public static void main(String... args) throws Exception { + String bucketName = args[0]; // "your-bucket-name"; + + // Instantiates a client in a try-with-resource to automatically cleanup underlying resources + try (StorageControlClient storageControlClient = StorageControlClient.create()) { + GetStorageLayoutRequest request = GetStorageLayoutRequest.newBuilder() + // Set project to "_" to signify global bucket + .setName(StorageLayoutName.format("_", bucketName)) + .build(); + StorageLayout response = storageControlClient.getStorageLayout(request); + System.out.printf("Performed getStorageLayout request for %s", response.getName()); + } + } +} +// [END storage_control_quickstart_sample] diff --git a/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java b/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java index 877ec89dae..c34b08de6d 100644 --- a/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java +++ b/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java @@ -18,9 +18,11 @@ import static com.google.common.truth.Truth.assertThat; +import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; import com.google.cloud.testing.junit4.StdOutCaptureRule; +import com.google.storage.control.v2.StorageLayoutName; import java.util.UUID; import org.junit.After; import org.junit.Before; @@ -73,4 +75,15 @@ public void testQuickstartGrpcDp() throws Exception { String got = stdOutCaptureRule.getCapturedOutputAsUtf8String(); assertThat(got).contains(String.format("Bucket %s created.", bucketName)); } + + @Test + public void testQuickstartStorageControl() throws Exception { + Storage storageClient = StorageOptions.getDefaultInstance().getService(); + storageClient.create(BucketInfo.of(bucketName)); + QuickstartStorageControlSample.main(bucketName); + String got = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(got) + .contains(String.format("Performed getStorageLayout request for %s", + StorageLayoutName.format("_", bucketName))); + } } From f5483356a3ba6327a712ef2f5534b61a649174df Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Tue, 9 Apr 2024 15:22:16 -0400 Subject: [PATCH 16/40] fix: update ApiaryUnbufferedWritableByteChannel to be graceful of non-quantum aligned write calls (#2493) Despite GCS only allowing incremental updates to a resumable session at 256KiB byte boundaries, we have observed an extremely rare case of an incremental write being non-quantum aligned. The change in this PR makes ApiaryUnbufferedWritableByteChannel graceful to this possibility, and will only set the finalization header when close is invoked. If a write is not quantum aligned, it will either: 1) not be consumed at all, at which point write can be called again with the still enqueued bytes 2) partially consumed, with the position of the provided ByteBuffers updated to reflect how much of their bytes were consumed, matching up with the number of bytes actually consumed returned from `write()` Add new integration test to intentionally perform non-quantum aligned `write()` calls to ApiaryUnbufferedWritableByteChannel. Separate change to gRPC affected code path to come in a later PR. b/330550326 --- .../ApiaryUnbufferedWritableByteChannel.java | 16 +-- .../JsonResumableSessionFailureScenario.java | 3 +- .../storage/JsonResumableSessionPutTask.java | 7 +- .../ITJsonResumableSessionPutTaskTest.java | 45 ------- .../storage/ITJsonResumableSessionTest.java | 2 +- .../ITUnbufferedResumableUploadTest.java | 117 ++++++++++++++++++ 6 files changed, 131 insertions(+), 59 deletions(-) create mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/ITUnbufferedResumableUploadTest.java diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java index da13857291..27800e4bbc 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java @@ -96,30 +96,32 @@ private long internalWrite(ByteBuffer[] srcs, int offset, int length, boolean fi } RewindableContent content = RewindableContent.of(Utils.subArray(srcs, offset, length)); long available = content.getLength(); + // as long as request has at least 256KiB GCS will accept bytes in 256KiB increments, + // however if a request is smaller than 256KiB it MUST be the finalization request. + if (!finalize && available < ByteSizeConstants._256KiB) { + return 0; + } long newFinalByteOffset = cumulativeByteCount + available; final HttpContentRange header; ByteRangeSpec rangeSpec = ByteRangeSpec.explicit(cumulativeByteCount, newFinalByteOffset); - boolean quantumAligned = available % ByteSizeConstants._256KiB == 0; - if (quantumAligned && finalize) { + if (finalize) { header = HttpContentRange.of(rangeSpec, newFinalByteOffset); finished = true; - } else if (quantumAligned) { + } else { header = HttpContentRange.of(rangeSpec); - } else { // not quantum aligned, have to finalize - header = HttpContentRange.of(rangeSpec, newFinalByteOffset); - finished = true; } try { ResumableOperationResult<@Nullable StorageObject> operationResult = session.put(content, header); long persistedSize = operationResult.getPersistedSize(); committedBytesCallback.accept(persistedSize); + long written = persistedSize - cumulativeByteCount; this.cumulativeByteCount = persistedSize; if (finished) { StorageObject storageObject = operationResult.getObject(); result.set(storageObject); } - return available; + return written; } catch (Exception e) { result.setException(e); throw StorageException.coalesce(e); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java index 0b6249ca8c..2e87117800 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java @@ -64,8 +64,7 @@ enum JsonResumableSessionFailureScenario { SCENARIO_7( BaseServiceException.UNKNOWN_CODE, "dataLoss", - "Client side data loss detected. Bytes acked is more than client sent."), - SCENARIO_9(503, "backendNotConnected", "Ack less than bytes sent"); + "Client side data loss detected. Bytes acked is more than client sent."); private static final String PREFIX_I = "\t|< "; private static final String PREFIX_O = "\t|> "; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java index 3f5e6ccb63..192cfec6dd 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java @@ -109,10 +109,9 @@ public void rewindTo(long offset) { success = true; return ResumableOperationResult.incremental(ackRange.endOffset()); } else if (ackRange.endOffset() < effectiveEnd) { - StorageException se = - JsonResumableSessionFailureScenario.SCENARIO_9.toStorageException(uploadId, response); - span.setStatus(Status.UNKNOWN.withDescription(se.getMessage())); - throw se; + rewindTo(ackRange.endOffset()); + success = true; + return ResumableOperationResult.incremental(ackRange.endOffset()); } else { StorageException se = JsonResumableSessionFailureScenario.SCENARIO_7.toStorageException(uploadId, response); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java index f3e3750e2e..d4c25edbde 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java @@ -110,51 +110,6 @@ public void emptyObjectHappyPath() throws Exception { } } - /** - * - * - *

        S.9

        - * - * Partial successful append to session - * - *

        The client has sent N bytes, the server confirmed N bytes as committed. The client sends K - * bytes starting at offset N. The server responds with only N + L with 0 <= L < K bytes as - * committed. - */ - @Test - public void scenario9() throws Exception { - - HttpRequestHandler handler = - req -> { - String contentRangeString = req.headers().get(CONTENT_RANGE); - HttpContentRange parse = HttpContentRange.parse(contentRangeString); - long endInclusive = ((HttpContentRange.HasRange) parse).range().endOffsetInclusive(); - FullHttpResponse resp = - new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); - ByteRangeSpec range = ByteRangeSpec.explicitClosed(0L, endInclusive - 1); - resp.headers().set(HttpHeaderNames.RANGE, range.getHttpRangeHeader()); - return resp; - }; - - try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { - URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); - - AtomicLong confirmedBytes = new AtomicLong(-1L); - - JsonResumableSessionPutTask task = - new JsonResumableSessionPutTask( - httpClientContext, - uploadUrl, - RewindableContent.empty(), - HttpContentRange.of(ByteRangeSpec.explicitClosed(0L, 10L))); - - StorageException se = assertThrows(StorageException.class, task::call); - assertThat(se.getCode()).isEqualTo(503); - assertThat(confirmedBytes.get()).isEqualTo(-1L); - } - } - /** * * diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java index 7336749dbb..2d96828b10 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java @@ -98,7 +98,7 @@ public void rewindWillQueryStatusOnlyWhenDirty() throws Exception { DefaultFullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); if (range1.getHeaderValue().equals(contentRange)) { - resp.headers().set(RANGE, ByteRangeSpec.explicit(0L, _256KiBL).getHttpRangeHeader()); + return new DefaultFullHttpResponse(req.protocolVersion(), SERVICE_UNAVAILABLE); } else if (range2.getHeaderValue().equals(contentRange)) { resp.headers().set(RANGE, ByteRangeSpec.explicit(0L, _256KiBL).getHttpRangeHeader()); } else { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITUnbufferedResumableUploadTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITUnbufferedResumableUploadTest.java new file mode 100644 index 0000000000..cf1b0d67d5 --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITUnbufferedResumableUploadTest.java @@ -0,0 +1,117 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.api.core.ApiFutures; +import com.google.api.services.storage.model.StorageObject; +import com.google.cloud.storage.ITUnbufferedResumableUploadTest.ObjectSizes; +import com.google.cloud.storage.TransportCompatibility.Transport; +import com.google.cloud.storage.UnbufferedWritableByteChannelSession.UnbufferedWritableByteChannel; +import com.google.cloud.storage.UnifiedOpts.ObjectTargetOpt; +import com.google.cloud.storage.UnifiedOpts.Opts; +import com.google.cloud.storage.it.runner.StorageITRunner; +import com.google.cloud.storage.it.runner.annotations.Backend; +import com.google.cloud.storage.it.runner.annotations.CrossRun; +import com.google.cloud.storage.it.runner.annotations.CrossRun.Exclude; +import com.google.cloud.storage.it.runner.annotations.Inject; +import com.google.cloud.storage.it.runner.annotations.Parameterized; +import com.google.cloud.storage.it.runner.annotations.Parameterized.Parameter; +import com.google.cloud.storage.it.runner.annotations.Parameterized.ParametersProvider; +import com.google.cloud.storage.it.runner.registry.Generator; +import com.google.cloud.storage.spi.v1.StorageRpc; +import com.google.common.collect.ImmutableList; +import java.io.IOException; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.Supplier; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(StorageITRunner.class) +@CrossRun( + backends = {Backend.PROD}, + transports = {Transport.HTTP, Transport.GRPC}) +@Parameterized(ObjectSizes.class) +public final class ITUnbufferedResumableUploadTest { + + @Inject public Storage storage; + @Inject public BucketInfo bucket; + @Inject public Generator generator; + + @Parameter public int objectSize; + + public static final class ObjectSizes implements ParametersProvider { + + @Override + public ImmutableList parameters() { + return ImmutableList.of(256 * 1024, 2 * 1024 * 1024); + } + } + + @Test + @Exclude(transports = Transport.GRPC) + public void json() + throws IOException, ExecutionException, InterruptedException, TimeoutException { + BlobInfo blobInfo = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + Opts opts = Opts.empty(); + final Map optionsMap = opts.getRpcOptions(); + BlobInfo.Builder builder = blobInfo.toBuilder().setMd5(null).setCrc32c(null); + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + + StorageObject encode = Conversions.json().blobInfo().encode(updated); + HttpStorageOptions options = (HttpStorageOptions) storage.getOptions(); + Supplier uploadIdSupplier = + ResumableMedia.startUploadForBlobInfo( + options, + updated, + optionsMap, + StorageRetryStrategy.getUniformStorageRetryStrategy().getIdempotentHandler()); + JsonResumableWrite jsonResumableWrite = + JsonResumableWrite.of(encode, optionsMap, uploadIdSupplier.get(), 0); + + UnbufferedWritableByteChannelSession session = + ResumableMedia.http() + .write() + .byteChannel(HttpClientContext.from(options.getStorageRpcV1())) + .resumable() + .unbuffered() + .setStartAsync(ApiFutures.immediateFuture(jsonResumableWrite)) + .build(); + + int additional = 13; + long size = objectSize + additional; + ByteBuffer b = DataGenerator.base64Characters().genByteBuffer(size); + + UnbufferedWritableByteChannel open = session.open(); + int written = open.write(b); + assertThat(written).isEqualTo(objectSize); + assertThat(b.remaining()).isEqualTo(additional); + + int writtenAndClose = open.writeAndClose(b); + assertThat(writtenAndClose).isEqualTo(additional); + open.close(); + + StorageObject storageObject = session.getResult().get(2, TimeUnit.SECONDS); + assertThat(storageObject.getSize()).isEqualTo(BigInteger.valueOf(size)); + } +} From 0dc9b9ebcd98b73031ac185f476e6e34a8d824c0 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Thu, 11 Apr 2024 11:17:45 -0400 Subject: [PATCH 17/40] chore(samples): update UploadObjectFromMemory to use the most appropriate method (#2495) --- .../object/UploadObjectFromMemory.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java b/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java index e0190ee85a..98d0020200 100644 --- a/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java +++ b/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java @@ -22,7 +22,6 @@ import com.google.cloud.storage.BlobInfo; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -45,7 +44,25 @@ public static void uploadObjectFromMemory( BlobId blobId = BlobId.of(bucketName, objectName); BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build(); byte[] content = contents.getBytes(StandardCharsets.UTF_8); - storage.createFrom(blobInfo, new ByteArrayInputStream(content)); + + // Optional: set a generation-match precondition to enable automatic retries, avoid potential + // race + // conditions and data corruptions. The request returns a 412 error if the + // preconditions are not met. + Storage.BlobTargetOption precondition; + if (storage.get(bucketName, objectName) == 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( + storage.get(bucketName, objectName).getGeneration()); + } + storage.create(blobInfo, content, precondition); System.out.println( "Object " From 5007e8f49f526fb3e5fbd939919851aa6a939d65 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Thu, 11 Apr 2024 15:49:44 -0400 Subject: [PATCH 18/40] test: add test to ensure journaling BWS errors early for http (#2475) --- .../storage/it/ITBlobWriteSessionTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java index 6cff689114..4abe949498 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java @@ -27,6 +27,7 @@ import com.google.cloud.storage.DataGenerator; import com.google.cloud.storage.GrpcStorageOptions; import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.JournalingBlobWriteSessionConfig; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.StorageException; @@ -37,9 +38,11 @@ import com.google.cloud.storage.it.runner.annotations.CrossRun; import com.google.cloud.storage.it.runner.annotations.Inject; import com.google.cloud.storage.it.runner.registry.Generator; +import com.google.common.collect.ImmutableList; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; +import java.nio.file.Path; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -91,6 +94,22 @@ public void bufferToTempDirThenUpload() throws Exception { } } + @Test + @CrossRun.Exclude(transports = Transport.GRPC) + public void journalingNotSupportedByHttp() { + HttpStorageOptions.Builder builder = ((HttpStorageOptions) storage.getOptions()).toBuilder(); + + Path rootPath = temporaryFolder.getRoot().toPath(); + JournalingBlobWriteSessionConfig journaling = + BlobWriteSessionConfigs.journaling(ImmutableList.of(rootPath)); + + IllegalArgumentException iae = + assertThrows( + IllegalArgumentException.class, () -> builder.setBlobWriteSessionConfig(journaling)); + + assertThat(iae).hasMessageThat().contains("HTTP transport"); + } + @Test public void overrideDefaultBufferSize() throws Exception { StorageOptions options = null; From d47afcfe2bcb2e7e266a5197456b6f9661e91004 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Thu, 11 Apr 2024 16:46:53 -0400 Subject: [PATCH 19/40] fix: ensure all BlobWriteSession types conform to the semantics specified in BlobWriteSession (#2482) * Improve error handling to cover more cases where errors should be converted to StorageException * Enforce BlobWriteSession#open only being able to be called once, subsequent calls will error * Make JsonResumableSessionPutTask more graceful when attempting to determine object size (testbench can omit `.size` from its response when the value is 0, possibly due to protobuf to json conversion where protobuf won't explicitly include a 0 value.) * Update com.google.cloud.storage.StorageException#coalesce to look for ApiException in causes the same way it does for BaseServiceException * Add com.google.cloud.storage.StorageOptions.Builder#setBlobWriteSessionConfig now that both Http and Grpc support these, having it on the base class is convenient * Add new integration test ITBlobWriteSessionCommonSemanticsTest which forces certain failure modes and ensures expected handling in accordance with the semantics outlined in BlobWriteSession --- .../clirr-ignored-differences.xml | 7 + .../cloud/storage/BlobWriteSession.java | 9 + .../cloud/storage/BlobWriteSessions.java | 9 +- .../DefaultBlobWriteSessionConfig.java | 77 +++++- .../GapicUnbufferedWritableByteChannel.java | 7 +- .../storage/GapicUploadSessionBuilder.java | 15 +- .../storage/JsonResumableSessionPutTask.java | 10 +- .../cloud/storage/StorageException.java | 3 + .../google/cloud/storage/StorageOptions.java | 15 ++ ...ITBlobWriteSessionCommonSemanticsTest.java | 223 ++++++++++++++++++ .../storage/it/ITBlobWriteSessionTest.java | 96 ++------ ...TJournalingBlobWriteSessionConfigTest.java | 5 +- ...ositeUploadBlobWriteSessionConfigTest.java | 21 +- 13 files changed, 377 insertions(+), 120 deletions(-) create mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionCommonSemanticsTest.java diff --git a/google-cloud-storage/clirr-ignored-differences.xml b/google-cloud-storage/clirr-ignored-differences.xml index d227206843..cc9d69330f 100644 --- a/google-cloud-storage/clirr-ignored-differences.xml +++ b/google-cloud-storage/clirr-ignored-differences.xml @@ -71,4 +71,11 @@ com/google/cloud/storage/transfermanager/TransferManagerConfig$Builder * setAllowDivideAndConquer(boolean) + + + 7013 + com/google/cloud/storage/StorageOptions$Builder + com.google.cloud.storage.StorageOptions$Builder setBlobWriteSessionConfig(com.google.cloud.storage.BlobWriteSessionConfig) + + diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java index 02ea23a6a7..81cecdc892 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java @@ -20,6 +20,7 @@ import com.google.api.core.BetaApi; import java.io.IOException; import java.nio.channels.WritableByteChannel; +import java.util.concurrent.TimeUnit; /** * A session to write an object to Google Cloud Storage. @@ -50,6 +51,10 @@ public interface BlobWriteSession { *

        Upon calling {@link WritableByteChannel#close()} the object creation will be finalized, and * {@link #getResult()}s future should resolve. * + *

        The returned {@code WritableByteChannel} can throw IOExceptions from any of its usual + * methods. Any {@link IOException} thrown can have a cause of a {@link StorageException}. + * However, not all {@code IOExceptions} will have {@code StorageException}s. + * * @throws IOException When creating the {@link WritableByteChannel} if an unrecoverable * underlying IOException occurs it can be rethrown * @throws IllegalStateException if open is called more than once @@ -66,6 +71,10 @@ public interface BlobWriteSession { * Google Cloud Storage 2. A terminal failure occurs, the terminal failure will become the * exception result * + *

        If a terminal failure is encountered, calling either {@link ApiFuture#get()} or {@link + * ApiFuture#get(long, TimeUnit)} will result in an {@link + * java.util.concurrent.ExecutionException} with a cause that is the {@link StorageException}. + * * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java index 878552a125..c9da9ee05c 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java @@ -17,6 +17,7 @@ package com.google.cloud.storage; import com.google.api.core.ApiFuture; +import com.google.common.base.Preconditions; import java.io.IOException; import java.nio.channels.WritableByteChannel; @@ -30,14 +31,20 @@ static BlobWriteSession of(WritableByteChannelSession s) { static final class WritableByteChannelSessionAdapter implements BlobWriteSession { private final WritableByteChannelSession delegate; + private boolean open; private WritableByteChannelSessionAdapter(WritableByteChannelSession delegate) { this.delegate = delegate; + open = false; } @Override public WritableByteChannel open() throws IOException { - return delegate.open(); + synchronized (this) { + Preconditions.checkState(!open, "already open"); + open = true; + return delegate.open(); + } } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java index 1d45c9e34c..ffcbcfa8ee 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java @@ -32,6 +32,8 @@ import com.google.common.util.concurrent.MoreExecutors; import com.google.storage.v2.WriteObjectRequest; import com.google.storage.v2.WriteObjectResponse; +import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; import java.time.Clock; import java.util.Map; @@ -202,24 +204,25 @@ static final class DecoratedWritableByteChannelSession openAsync() { - return delegate.openAsync(); + return ApiFutures.catchingAsync( + delegate.openAsync(), + Throwable.class, + throwable -> ApiFutures.immediateFailedFuture(StorageException.coalesce(throwable)), + MoreExecutors.directExecutor()); } @Override public ApiFuture getResult() { - return ApiFutures.transform( - delegate.getResult(), decoder::decode, MoreExecutors.directExecutor()); + ApiFuture decodeResult = + ApiFutures.transform( + delegate.getResult(), decoder::decode, MoreExecutors.directExecutor()); + return ApiFutures.catchingAsync( + decodeResult, + Throwable.class, + throwable -> ApiFutures.immediateFailedFuture(StorageException.coalesce(throwable)), + MoreExecutors.directExecutor()); } } @@ -233,7 +236,55 @@ static final class LazySession @Override public ApiFuture openAsync() { - return lazy.getSession().openAsync(); + // make sure the errors coming out of the BufferedWritableByteChannel are either IOException + // or StorageException + return ApiFutures.transform( + lazy.getSession().openAsync(), + delegate -> + new BufferedWritableByteChannel() { + @Override + public int write(ByteBuffer src) throws IOException { + try { + return delegate.write(src); + } catch (IOException e) { + throw e; + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + + @Override + public void flush() throws IOException { + try { + delegate.flush(); + } catch (IOException e) { + throw e; + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + + @Override + public boolean isOpen() { + try { + return delegate.isOpen(); + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + + @Override + public void close() throws IOException { + try { + delegate.close(); + } catch (IOException e) { + throw e; + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + }, + MoreExecutors.directExecutor()); } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java index b4a26ed4d3..32d5eb9dc8 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java @@ -92,7 +92,12 @@ public void close() throws IOException { throw e; } } else { - flusher.close(null); + try { + flusher.close(null); + } catch (RuntimeException e) { + resultFuture.setException(e); + throw e; + } } open = false; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java index ac52021308..2d1daa5444 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java @@ -49,7 +49,7 @@ GapicBidiWritableByteChannelSessionBuilder bidiByteChannel( } ApiFuture resumableWrite( - UnaryCallable x, + UnaryCallable callable, WriteObjectRequest writeObjectRequest) { StartResumableWriteRequest.Builder b = StartResumableWriteRequest.newBuilder(); if (writeObjectRequest.hasWriteObjectSpec()) { @@ -65,9 +65,16 @@ ApiFuture resumableWrite( Function f = uploadId -> writeObjectRequest.toBuilder().clearWriteObjectSpec().setUploadId(uploadId).build(); - return ApiFutures.transform( - x.futureCall(req), - (resp) -> new ResumableWrite(req, resp, f), + ApiFuture futureResumableWrite = + ApiFutures.transform( + callable.futureCall(req), + (resp) -> new ResumableWrite(req, resp, f), + MoreExecutors.directExecutor()); + // make sure we wrap any failure as a storage exception + return ApiFutures.catchingAsync( + futureResumableWrite, + Throwable.class, + throwable -> ApiFutures.immediateFailedFuture(StorageException.coalesce(throwable)), MoreExecutors.directExecutor()); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java index 192cfec6dd..622988d4cb 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java @@ -120,7 +120,7 @@ public void rewindTo(long offset) { } } else if (finalizing && JsonResumableSessionFailureScenario.isOk(code)) { @Nullable StorageObject storageObject; - @Nullable BigInteger actualSize; + BigInteger actualSize = BigInteger.ZERO; Long contentLength = response.getHeaders().getContentLength(); String contentType = response.getHeaders().getContentType(); @@ -130,7 +130,12 @@ public void rewindTo(long offset) { boolean isJson = contentType != null && contentType.startsWith("application/json"); if (isJson) { storageObject = response.parseAs(StorageObject.class); - actualSize = storageObject != null ? storageObject.getSize() : null; + if (storageObject != null) { + BigInteger size = storageObject.getSize(); + if (size != null) { + actualSize = size; + } + } } else if ((contentLength == null || contentLength == 0) && storedContentLength != null) { // when a signed url is used, the finalize response is empty response.ignore(); @@ -150,7 +155,6 @@ public void rewindTo(long offset) { int compare = expectedSize.compareTo(actualSize); if (compare == 0) { success = true; - //noinspection DataFlowIssue compareTo result will filter out actualSize == null return ResumableOperationResult.complete(storageObject, actualSize.longValue()); } else if (compare > 0) { StorageException se = diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java index f8b4f94a8d..eeb24a44b8 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java @@ -118,6 +118,9 @@ static BaseServiceException coalesce(Throwable t) { if (t instanceof ApiException) { return asStorageException((ApiException) t); } + if (t.getCause() instanceof ApiException) { + return asStorageException((ApiException) t.getCause()); + } return getStorageException(t); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java index 53ad6142e9..ab32532ae1 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java @@ -22,14 +22,17 @@ import com.google.cloud.ServiceDefaults; import com.google.cloud.ServiceOptions; import com.google.cloud.http.HttpTransportOptions; +import com.google.cloud.storage.GrpcStorageOptions.GrpcStorageDefaults; import com.google.cloud.storage.HttpStorageOptions.HttpStorageDefaults; import com.google.cloud.storage.HttpStorageOptions.HttpStorageFactory; import com.google.cloud.storage.HttpStorageOptions.HttpStorageRpcFactory; +import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.spi.StorageRpcFactory; import java.io.IOException; import java.io.InputStream; import java.util.Properties; +import org.checkerframework.checker.nullness.qual.NonNull; public abstract class StorageOptions extends ServiceOptions { @@ -95,6 +98,18 @@ public abstract static class Builder public abstract Builder setStorageRetryStrategy(StorageRetryStrategy storageRetryStrategy); + /** + * @see BlobWriteSessionConfig + * @see BlobWriteSessionConfigs + * @see Storage#blobWriteSession(BlobInfo, BlobWriteOption...) + * @see HttpStorageDefaults#getDefaultStorageWriterConfig() + * @see GrpcStorageDefaults#getDefaultStorageWriterConfig() + * @since 2.37.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public abstract StorageOptions.Builder setBlobWriteSessionConfig( + @NonNull BlobWriteSessionConfig blobWriteSessionConfig); + @Override public abstract StorageOptions build(); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionCommonSemanticsTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionCommonSemanticsTest.java new file mode 100644 index 0000000000..dc02c3fb9b --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionCommonSemanticsTest.java @@ -0,0 +1,223 @@ +/* + * Copyright 2024 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.google.cloud.storage.it; + +import static com.google.cloud.storage.TestUtils.assertAll; +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; +import static org.junit.Assume.assumeTrue; + +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BlobWriteSession; +import com.google.cloud.storage.BlobWriteSessionConfig; +import com.google.cloud.storage.BlobWriteSessionConfigs; +import com.google.cloud.storage.BucketInfo; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.BufferAllocationStrategy; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.ExecutorSupplier; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.PartCleanupStrategy; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.PartMetadataFieldDecorator; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.PartNamingStrategy; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.Storage.BlobTargetOption; +import com.google.cloud.storage.Storage.BlobWriteOption; +import com.google.cloud.storage.StorageException; +import com.google.cloud.storage.StorageOptions; +import com.google.cloud.storage.TransportCompatibility.Transport; +import com.google.cloud.storage.it.ITBlobWriteSessionCommonSemanticsTest.ParamsProvider; +import com.google.cloud.storage.it.runner.StorageITRunner; +import com.google.cloud.storage.it.runner.annotations.Backend; +import com.google.cloud.storage.it.runner.annotations.CrossRun; +import com.google.cloud.storage.it.runner.annotations.Inject; +import com.google.cloud.storage.it.runner.annotations.Parameterized; +import com.google.cloud.storage.it.runner.annotations.Parameterized.Parameter; +import com.google.cloud.storage.it.runner.annotations.Parameterized.ParametersProvider; +import com.google.cloud.storage.it.runner.registry.Generator; +import com.google.common.collect.ImmutableList; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.WritableByteChannel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; + +@RunWith(StorageITRunner.class) +@CrossRun( + backends = {Backend.PROD}, + transports = {Transport.HTTP, Transport.GRPC}) +@Parameterized(ParamsProvider.class) +public final class ITBlobWriteSessionCommonSemanticsTest { + + @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Inject public Storage injectedStorage; + @Inject public BucketInfo bucket; + @Inject public Generator generator; + + @Parameter public Params params; + + private Storage storage; + + @Before + public void setUp() throws Exception { + Path tmpDir = temporaryFolder.newFolder().toPath(); + BlobWriteSessionConfig config = params.ctor.apply(tmpDir); + + StorageOptions originalOptions = injectedStorage.getOptions(); + StorageOptions newOptions = null; + try { + newOptions = originalOptions.toBuilder().setBlobWriteSessionConfig(config).build(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessageThat().contains("not compatible with this"); + assumeTrue(false); + } + storage = newOptions.getService(); + } + + @After + public void tearDown() throws Exception { + if (storage != null) { + storage.close(); + } + } + + @Test + public void closingAnOpenedSessionWithoutCallingWriteShouldMakeAnEmptyObject() + throws IOException, ExecutionException, InterruptedException, TimeoutException { + BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); + + WritableByteChannel open = session.open(); + open.close(); + BlobInfo gen1 = session.getResult().get(1, TimeUnit.SECONDS); + + // sometimes testbench will not define `.size = 0`, default it here if we get null + Long size = gen1.getSize(); + if (size == null) { + size = 0L; + } + assertThat(size).isEqualTo(0); + } + + @Test + public void attemptingToUseASessionWhichResultsInFailureShouldThrowAStorageException() { + // attempt to write to a bucket which we have not created + String badBucketName = bucket.getName() + "x"; + BlobInfo info = BlobInfo.newBuilder(badBucketName, generator.randomObjectName()).build(); + + BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); + StorageException se = + assertThrows( + StorageException.class, + () -> { + WritableByteChannel open = session.open(); + open.close(); + }); + + assertThat(se.getCode()).isEqualTo(404); + } + + @Test + public void callingOpenIsOnlyAllowedOnce() throws Exception { + BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); + + WritableByteChannel open = session.open(); + IllegalStateException se = assertThrows(IllegalStateException.class, session::open); + + assertAll(() -> assertThat(se.getMessage()).contains("already open")); + } + + @Test + public void getResultErrorsWhenTheSessionErrors() throws Exception { + BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + byte[] helloWorld = "Hello World".getBytes(StandardCharsets.UTF_8); + storage.create(info, helloWorld, BlobTargetOption.doesNotExist()); + + BlobWriteSession session = + storage.blobWriteSession( + info, + // this precondition will result in failure + BlobWriteOption.doesNotExist()); + + try (WritableByteChannel open = session.open()) { + open.write(ByteBuffer.wrap(helloWorld)); + } catch (StorageException se) { + assertThat(se.getCode()).isEqualTo(412); + } catch (IOException ioe) { + assertThat(ioe).hasCauseThat().isInstanceOf(StorageException.class); + StorageException se = (StorageException) ioe.getCause(); + assertThat(se.getCode()).isEqualTo(412); + } + + ExecutionException resultSe = + assertThrows(ExecutionException.class, () -> session.getResult().get(10, TimeUnit.SECONDS)); + + assertAll( + () -> assertThat(resultSe).hasCauseThat().isInstanceOf(StorageException.class), + () -> assertThat(((StorageException) resultSe.getCause()).getCode()).isEqualTo(412)); + } + + public static final class ParamsProvider implements ParametersProvider { + @Override + public ImmutableList parameters() { + final int _2MiB = 2 * 1024 * 1024; + final int _4MiB = 4 * 1024 * 1024; + return ImmutableList.of( + new Params("default", p -> BlobWriteSessionConfigs.getDefault()), + new Params("c!c.2MiB", p -> BlobWriteSessionConfigs.getDefault().withChunkSize(_2MiB)), + new Params("b!p.1", BlobWriteSessionConfigs::bufferToDiskThenUpload), + new Params("j!p.1", p -> BlobWriteSessionConfigs.journaling(ImmutableList.of(p))), + new Params( + "p!t.c&b.s*&p.4MiB&c.n&m.n", + p -> + BlobWriteSessionConfigs.parallelCompositeUpload() + .withExecutorSupplier(ExecutorSupplier.cachedPool()) + .withPartNamingStrategy(PartNamingStrategy.noPrefix()) + .withBufferAllocationStrategy(BufferAllocationStrategy.simple(_4MiB)) + .withPartCleanupStrategy(PartCleanupStrategy.never()) + .withPartMetadataFieldDecorator(PartMetadataFieldDecorator.noOp())), + new Params("d!c.2MiB", p -> BlobWriteSessionConfigs.bidiWrite().withBufferSize(_2MiB))); + } + } + + public interface ParamsCtor { + BlobWriteSessionConfig apply(Path p) throws IOException; + } + + public static final class Params { + private final String desc; + private final ParamsCtor ctor; + + public Params(String desc, ParamsCtor ctor) { + this.desc = desc; + this.ctor = ctor; + } + + @Override + public String toString() { + return desc; + } + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java index 4abe949498..10ae174a35 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java @@ -17,7 +17,6 @@ package com.google.cloud.storage.it; import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; import com.google.cloud.storage.BlobInfo; @@ -25,12 +24,10 @@ import com.google.cloud.storage.BlobWriteSessionConfigs; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; -import com.google.cloud.storage.GrpcStorageOptions; import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.JournalingBlobWriteSessionConfig; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; -import com.google.cloud.storage.StorageException; import com.google.cloud.storage.StorageOptions; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.it.runner.StorageITRunner; @@ -39,13 +36,10 @@ import com.google.cloud.storage.it.runner.annotations.Inject; import com.google.cloud.storage.it.runner.registry.Generator; import com.google.common.collect.ImmutableList; -import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; import java.nio.file.Path; -import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -60,7 +54,6 @@ public final class ITBlobWriteSessionTest { @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); @Inject public Storage storage; - @Inject public Transport transport; @Inject public BucketInfo bucket; @@ -73,22 +66,13 @@ public void allDefaults() throws Exception { @Test public void bufferToTempDirThenUpload() throws Exception { - StorageOptions options = null; - if (transport == Transport.GRPC) { - options = - ((GrpcStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bufferToTempDirThenUpload()) - .build(); - } else if (transport == Transport.HTTP) { - options = - ((HttpStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bufferToTempDirThenUpload()) - .build(); - } - assertWithMessage("unable to resolve options").that(options).isNotNull(); - //noinspection DataFlowIssue + Path path = temporaryFolder.newFolder().toPath(); + StorageOptions options = + storage + .getOptions() + .toBuilder() + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bufferToDiskThenUpload(path)) + .build(); try (Storage s = options.getService()) { doTest(s); } @@ -112,24 +96,13 @@ public void journalingNotSupportedByHttp() { @Test public void overrideDefaultBufferSize() throws Exception { - StorageOptions options = null; - if (transport == Transport.GRPC) { - options = - ((GrpcStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig( - BlobWriteSessionConfigs.getDefault().withChunkSize(256 * 1024)) - .build(); - } else if (transport == Transport.HTTP) { - options = - ((HttpStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig( - BlobWriteSessionConfigs.getDefault().withChunkSize(256 * 1024)) - .build(); - } - assertWithMessage("unable to resolve options").that(options).isNotNull(); - //noinspection DataFlowIssue + StorageOptions options = + (storage.getOptions()) + .toBuilder() + .setBlobWriteSessionConfig( + BlobWriteSessionConfigs.getDefault().withChunkSize(256 * 1024)) + .build(); + try (Storage s = options.getService()) { doTest(s); } @@ -138,47 +111,16 @@ public void overrideDefaultBufferSize() throws Exception { @Test @CrossRun.Exclude(transports = Transport.HTTP) public void bidiTest() throws Exception { - StorageOptions options = null; - if (transport == Transport.GRPC) { - options = - ((GrpcStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) - .build(); - } - assertWithMessage("unable to resolve options").that(options).isNotNull(); - + StorageOptions options = + (storage.getOptions()) + .toBuilder() + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) + .build(); try (Storage s = options.getService()) { doTest(s); } } - @Test - public void closingAnOpenedSessionWithoutCallingWriteShouldMakeAnEmptyObject() - throws IOException, ExecutionException, InterruptedException, TimeoutException { - BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); - BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); - - WritableByteChannel open = session.open(); - open.close(); - BlobInfo gen1 = session.getResult().get(1, TimeUnit.SECONDS); - - assertThat(gen1.getSize()).isEqualTo(0); - } - - @Test - public void attemptingToOpenASessionWhichResultsInFailureShouldThrowAStorageException() { - // attempt to write to a bucket which we have not created - String badBucketName = bucket.getName() + "x"; - BlobInfo info = BlobInfo.newBuilder(badBucketName, generator.randomObjectName()).build(); - - BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); - StorageException se = assertThrows(StorageException.class, () -> session.open().close()); - - assertThat(se.getCode()).isEqualTo(404); - assertThat(se).hasMessageThat().contains(badBucketName); - } - private void doTest(Storage underTest) throws Exception { BlobWriteSession sess = underTest.blobWriteSession( diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java index 4526a09f69..70e369f307 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java @@ -24,7 +24,6 @@ import com.google.cloud.storage.BlobWriteSessionConfigs; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; -import com.google.cloud.storage.GrpcStorageOptions; import com.google.cloud.storage.JournalingBlobWriteSessionConfig; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; @@ -75,7 +74,9 @@ public void setUp() throws Exception { JournalingBlobWriteSessionConfig journaling = BlobWriteSessionConfigs.journaling(ImmutableList.of(tempDir)); journalingStorage = - ((GrpcStorageOptions.Builder) this.storage.getOptions().toBuilder()) + this.storage + .getOptions() + .toBuilder() .setBlobWriteSessionConfig(journaling) .build() .getService(); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java index 3352a92adc..9b7d630f6b 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java @@ -18,7 +18,6 @@ import static com.google.cloud.storage.TestUtils.xxd; import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; import com.google.api.gax.paging.Page; @@ -30,8 +29,6 @@ import com.google.cloud.storage.BlobWriteSessionConfigs; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; -import com.google.cloud.storage.GrpcStorageOptions; -import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.BufferAllocationStrategy; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.ExecutorSupplier; @@ -119,22 +116,8 @@ public void setUp() throws Exception { // let our fixtures take care of cleaning things .withPartCleanupStrategy(PartCleanupStrategy.never()); - StorageOptions storageOptions = null; - if (transport == Transport.GRPC) { - storageOptions = - ((GrpcStorageOptions) injectedStorage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(pcu) - .build(); - } else if (transport == Transport.HTTP) { - storageOptions = - ((HttpStorageOptions) injectedStorage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(pcu) - .build(); - } - assertWithMessage("unable to resolve options").that(storageOptions).isNotNull(); - //noinspection DataFlowIssue + StorageOptions storageOptions = + injectedStorage.getOptions().toBuilder().setBlobWriteSessionConfig(pcu).build(); storage = storageOptions.getService(); rand = new Random(); } From 8b5454910c74563c9598f9d5cc23fa509ec749d9 Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:43:14 -0700 Subject: [PATCH 20/40] feat: Transfer Manager ParallelCompositeUploads (#2494) --- .../storage/transfermanager/DefaultQos.java | 19 +++- .../ParallelCompositeUploadCallable.java | 94 ++++++++++++++++ .../cloud/storage/transfermanager/Qos.java | 2 + .../transfermanager/TransferManager.java | 3 +- .../TransferManagerConfig.java | 36 +++---- .../transfermanager/TransferManagerImpl.java | 102 ++++++++++++++++-- .../storage/it/ITTransferManagerTest.java | 56 +++++++++- ...TransferManagerConfigTestingInstances.java | 3 +- 8 files changed, 277 insertions(+), 38 deletions(-) create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/ParallelCompositeUploadCallable.java diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java index fa1ed0c98a..e466a824eb 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java @@ -19,9 +19,16 @@ final class DefaultQos implements Qos { private final long divideAndConquerThreshold; + private final long parallelCompositeUploadThreshold; + private boolean threadThresholdMet; - private DefaultQos(long divideAndConquerThreshold) { + private DefaultQos( + long divideAndConquerThreshold, + long parallelCompositeUploadThreshold, + boolean threadThresholdMet) { this.divideAndConquerThreshold = divideAndConquerThreshold; + this.parallelCompositeUploadThreshold = parallelCompositeUploadThreshold; + this.threadThresholdMet = threadThresholdMet; } @Override @@ -29,11 +36,13 @@ public boolean divideAndConquer(long objectSize) { return objectSize > divideAndConquerThreshold; } - static DefaultQos of() { - return of(128L * 1024 * 1024); + @Override + public boolean parallelCompositeUpload(long objectSize) { + return threadThresholdMet && objectSize > parallelCompositeUploadThreshold; } - static DefaultQos of(long divideAndConquerThreshold) { - return new DefaultQos(divideAndConquerThreshold); + static DefaultQos of(TransferManagerConfig config) { + return new DefaultQos( + 128L * 1024 * 1024, 4L * config.getPerWorkerBufferSize(), config.getMaxWorkers() > 2); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/ParallelCompositeUploadCallable.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/ParallelCompositeUploadCallable.java new file mode 100644 index 0000000000..d306c4a6cf --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/ParallelCompositeUploadCallable.java @@ -0,0 +1,94 @@ +/* + * Copyright 2024 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.google.cloud.storage.transfermanager; + +import com.google.api.core.ApiFuture; +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BlobWriteSession; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.Storage.BlobWriteOption; +import com.google.cloud.storage.StorageException; +import com.google.common.io.ByteStreams; +import java.nio.channels.FileChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +final class ParallelCompositeUploadCallable implements Callable { + private final Storage storage; + + private final BlobInfo originalBlob; + + private final Path sourceFile; + + private final ParallelUploadConfig parallelUploadConfig; + + private final Storage.BlobWriteOption[] opts; + + public ParallelCompositeUploadCallable( + Storage storage, + BlobInfo originalBlob, + Path sourceFile, + ParallelUploadConfig parallelUploadConfig, + BlobWriteOption[] opts) { + this.storage = storage; + this.originalBlob = originalBlob; + this.sourceFile = sourceFile; + this.parallelUploadConfig = parallelUploadConfig; + this.opts = opts; + } + + public UploadResult call() { + return uploadPCU(); + } + + private UploadResult uploadPCU() { + BlobWriteSession session = storage.blobWriteSession(originalBlob, opts); + try (WritableByteChannel writableByteChannel = session.open(); + FileChannel fc = FileChannel.open(sourceFile, StandardOpenOption.READ)) { + ByteStreams.copy(fc, writableByteChannel); + } catch (StorageException e) { + if (parallelUploadConfig.isSkipIfExists() && e.getCode() == 412) { + return UploadResult.newBuilder(originalBlob, TransferStatus.SKIPPED) + .setException(e) + .build(); + } else { + return UploadResult.newBuilder(originalBlob, TransferStatus.FAILED_TO_FINISH) + .setException(e) + .build(); + } + } catch (Exception e) { + return UploadResult.newBuilder(originalBlob, TransferStatus.FAILED_TO_FINISH) + .setException(e) + .build(); + } + try { + ApiFuture result = session.getResult(); + BlobInfo newBlob = result.get(10, TimeUnit.SECONDS); + return UploadResult.newBuilder(originalBlob, TransferStatus.SUCCESS) + .setUploadedBlob(newBlob) + .build(); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + return UploadResult.newBuilder(originalBlob, TransferStatus.FAILED_TO_FINISH) + .setException(e) + .build(); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java index 100591648d..492cf3d1f2 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java @@ -19,4 +19,6 @@ interface Qos { boolean divideAndConquer(long objectSize); + + boolean parallelCompositeUpload(long objectSize); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java index f333deca69..9aae23454a 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java @@ -18,6 +18,7 @@ import com.google.api.core.BetaApi; import com.google.cloud.storage.BlobInfo; +import java.io.IOException; import java.nio.file.Path; import java.util.List; import org.checkerframework.checker.nullness.qual.NonNull; @@ -58,7 +59,7 @@ public interface TransferManager extends AutoCloseable { */ @BetaApi @NonNull - UploadJob uploadFiles(List files, ParallelUploadConfig config); + UploadJob uploadFiles(List files, ParallelUploadConfig config) throws IOException; /** * Downloads a list of blobs in parallel. This operation will not block the invoking thread, diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java index b638e46f5e..f06839dd9b 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java @@ -34,21 +34,18 @@ public final class TransferManagerConfig { private final boolean allowParallelCompositeUpload; private final StorageOptions storageOptions; - private final Qos qos; TransferManagerConfig( int maxWorkers, int perWorkerBufferSize, boolean allowDivideAndConquerDownload, boolean allowParallelCompositeUpload, - StorageOptions storageOptions, - Qos qos) { + StorageOptions storageOptions) { this.maxWorkers = maxWorkers; this.perWorkerBufferSize = perWorkerBufferSize; this.allowDivideAndConquerDownload = allowDivideAndConquerDownload; this.allowParallelCompositeUpload = allowParallelCompositeUpload; this.storageOptions = storageOptions; - this.qos = qos; } /** @@ -86,6 +83,15 @@ public boolean isAllowDivideAndConquerDownload() { * chunking will be beneficial * * @see Builder#setAllowParallelCompositeUpload(boolean) + *

        Note: Performing parallel composite uploads costs more money. Class A operations + * are performed to create each part and to perform each compose. If a storage tier other than + * STANDARD + * is used, early deletion fees apply to deletion of the parts. + *

        Please see the Parallel composite + * uploads documentation for a more in depth explanation of the limitations of Parallel + * composite uploads. */ @BetaApi public boolean isAllowParallelCompositeUpload() { @@ -105,7 +111,7 @@ public StorageOptions getStorageOptions() { /** The service object for {@link TransferManager} */ @BetaApi public TransferManager getService() { - return new TransferManagerImpl(this); + return new TransferManagerImpl(this, DefaultQos.of(this)); } @BetaApi @@ -115,14 +121,9 @@ public Builder toBuilder() { .setAllowParallelCompositeUpload(allowParallelCompositeUpload) .setMaxWorkers(maxWorkers) .setPerWorkerBufferSize(perWorkerBufferSize) - .setQos(qos) .setStorageOptions(storageOptions); } - Qos getQos() { - return qos; - } - @Override public boolean equals(Object o) { if (this == o) { @@ -179,7 +180,6 @@ public static class Builder { private boolean allowParallelCompositeUpload; private StorageOptions storageOptions; - private Qos qos; private Builder() { this.perWorkerBufferSize = 16 * 1024 * 1024; @@ -187,7 +187,6 @@ private Builder() { this.allowDivideAndConquerDownload = false; this.allowParallelCompositeUpload = false; this.storageOptions = StorageOptions.getDefaultInstance(); - this.qos = DefaultQos.of(); } /** @@ -244,8 +243,8 @@ public Builder setAllowDivideAndConquerDownload(boolean allowDivideAndConquerDow * @see TransferManagerConfig#isAllowDivideAndConquerDownload() */ @BetaApi - public Builder setAllowParallelCompositeUpload(boolean allowDivideAndConquerDownload) { - this.allowDivideAndConquerDownload = allowDivideAndConquerDownload; + public Builder setAllowParallelCompositeUpload(boolean allowParallelCompositeUpload) { + this.allowParallelCompositeUpload = allowParallelCompositeUpload; return this; } @@ -263,12 +262,6 @@ public Builder setStorageOptions(StorageOptions storageOptions) { return this; } - @BetaApi - Builder setQos(Qos qos) { - this.qos = qos; - return this; - } - /** * Creates a TransferManagerConfig object. * @@ -281,8 +274,7 @@ public TransferManagerConfig build() { perWorkerBufferSize, allowDivideAndConquerDownload, allowParallelCompositeUpload, - storageOptions, - qos); + storageOptions); } } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java index b731c2c3c2..4bbbeb9393 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java @@ -20,9 +20,13 @@ import com.google.api.core.ApiFutures; import com.google.api.core.BetaApi; import com.google.api.core.ListenableFutureToApiFuture; +import com.google.api.core.SettableApiFuture; import com.google.api.gax.rpc.FixedHeaderProvider; import com.google.cloud.storage.BlobId; import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BlobWriteSessionConfigs; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.ExecutorSupplier; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.StorageOptions; @@ -31,10 +35,13 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Deque; import java.util.List; +import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.function.BinaryOperator; @@ -50,12 +57,17 @@ final class TransferManagerImpl implements TransferManager { private final Qos qos; private final Storage storage; - TransferManagerImpl(TransferManagerConfig transferManagerConfig) { + private final Deque pcuQueue; + // define a unique object which we can use to synchronize modification of pcuPoller + private final Object pcuPollerSync = new Object(); + private volatile ApiFuture pcuPoller; + + TransferManagerImpl(TransferManagerConfig transferManagerConfig, Qos qos) { this.transferManagerConfig = transferManagerConfig; this.executor = MoreExecutors.listeningDecorator( Executors.newFixedThreadPool(transferManagerConfig.getMaxWorkers())); - this.qos = transferManagerConfig.getQos(); + this.qos = qos; StorageOptions storageOptions = transferManagerConfig.getStorageOptions(); String userAgent = storageOptions.getUserAgent(); if (userAgent == null || !userAgent.contains(USER_AGENT_ENTRY)) { @@ -67,6 +79,14 @@ final class TransferManagerImpl implements TransferManager { ImmutableMap.of("User-Agent", USER_AGENT_ENTRY + LIBRARY_VERSION))) .build(); } + // Create the blobWriteSessionConfig for ParallelCompositeUpload + if (transferManagerConfig.isAllowParallelCompositeUpload()) { + ParallelCompositeUploadBlobWriteSessionConfig pcuConfig = + BlobWriteSessionConfigs.parallelCompositeUpload() + .withExecutorSupplier(ExecutorSupplier.useExecutor(executor)); + storageOptions = storageOptions.toBuilder().setBlobWriteSessionConfig(pcuConfig).build(); + } + this.pcuQueue = new ConcurrentLinkedDeque<>(); this.storage = storageOptions.getService(); } @@ -79,7 +99,8 @@ public void close() throws Exception { @Override @BetaApi - public @NonNull UploadJob uploadFiles(List files, ParallelUploadConfig config) { + public @NonNull UploadJob uploadFiles(List files, ParallelUploadConfig config) + throws IOException { Storage.BlobWriteOption[] opts = config.getWriteOptsPerRequest().toArray(new BlobWriteOption[0]); List> uploadTasks = new ArrayList<>(); @@ -87,9 +108,19 @@ public void close() throws Exception { if (Files.isDirectory(file)) throw new IllegalStateException("Directories are not supported"); String blobName = TransferManagerUtils.createBlobName(config, file); BlobInfo blobInfo = BlobInfo.newBuilder(config.getBucketName(), blobName).build(); - UploadCallable callable = - new UploadCallable(transferManagerConfig, storage, blobInfo, file, config, opts); - uploadTasks.add(convert(executor.submit(callable))); + if (transferManagerConfig.isAllowParallelCompositeUpload() + && qos.parallelCompositeUpload(Files.size(file))) { + ParallelCompositeUploadCallable callable = + new ParallelCompositeUploadCallable(storage, blobInfo, file, config, opts); + SettableApiFuture resultFuture = SettableApiFuture.create(); + pcuQueue.add(new PendingPcuTask(callable, resultFuture)); + uploadTasks.add(resultFuture); + schedulePcuPoller(); + } else { + UploadCallable callable = + new UploadCallable(transferManagerConfig, storage, blobInfo, file, config, opts); + uploadTasks.add(convert(executor.submit(callable))); + } } return UploadJob.newBuilder() .setParallelUploadConfig(config) @@ -151,6 +182,26 @@ public void close() throws Exception { .build(); } + private void schedulePcuPoller() { + if (pcuPoller == null) { + synchronized (pcuPollerSync) { + if (pcuPoller == null) { + pcuPoller = convert(executor.submit(new PcuPoller())); + } + } + } + } + + private void deschedulePcuPoller() { + if (pcuPoller != null) { + synchronized (pcuPollerSync) { + if (pcuPoller != null) { + pcuPoller = null; + } + } + } + } + private static ApiFuture convert(ListenableFuture lf) { return new ListenableFutureToApiFuture<>(lf); } @@ -191,4 +242,43 @@ public static Range of(long begin, long end) { return new Range(begin, end); } } + + /** + * When performing a Parallel composite upload, the thread pool we perform work on is shared as + * the PCU worker pool. Because of this, if we submit our work to the executor service and take + * all the threads waiting for PCU uploads to complete, the PCU work doesn't have any threads + * available to itself. + * + *

        This class represents a single worker that will be submitted to the executor service and + * will poll a queue to process a single PCU at a time, leaving any other threads free for PCU + * work. + */ + private final class PcuPoller implements Runnable { + + @Override + public void run() { + do { + PendingPcuTask poll = pcuQueue.poll(); + if (poll == null) { + deschedulePcuPoller(); + return; + } + + UploadResult result = poll.callable.call(); + poll.resultFuture.set(result); + + } while (true); + } + } + + private static final class PendingPcuTask { + private final ParallelCompositeUploadCallable callable; + private final SettableApiFuture resultFuture; + + private PendingPcuTask( + ParallelCompositeUploadCallable callable, SettableApiFuture resultFuture) { + this.callable = callable; + this.resultFuture = resultFuture; + } + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java index 4f345af0d9..5c1feed6f4 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java @@ -74,6 +74,8 @@ public class ITTransferManagerTest { private static final Comparator comp2 = Comparator.comparing(DownloadResult::getInput, comp); + private static final long CHUNK_THRESHOLD = 2L * 1024 * 1024; + @Inject public Storage storage; @Inject public BucketInfo bucket; @Inject public Generator generator; @@ -106,8 +108,8 @@ public void setUp() throws Exception { writeChannel.write(content); } } - long size = 2L * 1024 * 1024; - size = size + 100L; + // We make this size just a bit bigger than the threshold. + long size = CHUNK_THRESHOLD + 100L; ByteBuffer chunkedContent = DataGenerator.base64Characters().genByteBuffer(size); try (WriteChannel writeChannel = storage.writer(blobInfoChunking)) { writeChannel.write(chunkedContent); @@ -341,6 +343,56 @@ public void downloadBlobsAllowChunked() throws Exception { } } + @Test + public void uploadFilesAllowPCU() throws Exception { + TransferManagerConfig config = + TransferManagerConfigTestingInstances.defaults(storage.getOptions()) + .toBuilder() + .setAllowParallelCompositeUpload(true) + .setPerWorkerBufferSize(128 * 1024) + .build(); + long size = CHUNK_THRESHOLD + 100L; + try (TransferManager transferManager = config.getService(); + TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, size)) { + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucket.getName()).build(); + UploadJob job = + transferManager.uploadFiles( + Collections.singletonList(tmpFile.getPath()), parallelUploadConfig); + List uploadResults = job.getUploadResults(); + assertThat(uploadResults.get(0).getStatus()).isEqualTo(TransferStatus.SUCCESS); + } + } + + @Test + public void uploadFilesAllowMultiplePCUAndSmallerFiles() throws Exception { + TransferManagerConfig config = + TransferManagerConfigTestingInstances.defaults(storage.getOptions()) + .toBuilder() + .setAllowParallelCompositeUpload(true) + .setPerWorkerBufferSize(128 * 1024) + .build(); + long largeFileSize = CHUNK_THRESHOLD + 100L; + long smallFileSize = CHUNK_THRESHOLD - 100L; + try (TransferManager transferManager = config.getService(); + TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, largeFileSize); + TmpFile tmpfile2 = DataGenerator.base64Characters().tempFile(baseDir, largeFileSize); + TmpFile tmpFile3 = DataGenerator.base64Characters().tempFile(baseDir, smallFileSize)) { + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucket.getName()).build(); + List files = + ImmutableList.of(tmpFile.getPath(), tmpfile2.getPath(), tmpFile3.getPath()); + UploadJob job = transferManager.uploadFiles(files, parallelUploadConfig); + List uploadResults = job.getUploadResults(); + assertThat(uploadResults).hasSize(3); + assertThat( + uploadResults.stream() + .filter(result -> result.getStatus() == TransferStatus.SUCCESS) + .collect(Collectors.toList())) + .hasSize(3); + } + } + @Test public void downloadNonexistentBucket() throws Exception { TransferManagerConfig config = diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java index e9ef86c313..da89ada5ae 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java @@ -28,9 +28,8 @@ public static TransferManagerConfig defaults() { public static TransferManagerConfig defaults(StorageOptions options) { return TransferManagerConfig.newBuilder() .setAllowDivideAndConquerDownload(false) - .setMaxWorkers(1) + .setMaxWorkers(5) .setPerWorkerBufferSize(512 * 1024) - .setQos(DefaultQos.of(2 * 1024 * 1024)) .setStorageOptions(options) .build(); } From e2030b281d45b69840962e0a80c4b6b85e300b20 Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Fri, 12 Apr 2024 14:08:18 -0700 Subject: [PATCH 21/40] docs: Create Samples for transfer manager (#2492) * docs: Create Samples for transfer manager --- .../transfermanager/DownloadBucket.java | 60 +++++++++ .../storage/transfermanager/DownloadMany.java | 51 ++++++++ .../transfermanager/UploadDirectory.java | 59 +++++++++ .../storage/transfermanager/UploadMany.java | 46 +++++++ .../ITTransferManagerSamples.java | 119 ++++++++++++++++++ 5 files changed, 335 insertions(+) create mode 100644 samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java create mode 100644 samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java create mode 100644 samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java create mode 100644 samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java create mode 100644 samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java new file mode 100644 index 0000000000..5e09f5a911 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java @@ -0,0 +1,60 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_download_bucket] +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; +import com.google.cloud.storage.transfermanager.DownloadResult; +import com.google.cloud.storage.transfermanager.ParallelDownloadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; + +class DownloadBucket { + + public static void downloadBucketContents(String projectId, + String bucketName, Path destinationDirectory) { + Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService(); + List blobs = storage + .list(bucketName) + .streamAll() + .map(blob -> blob.asBlobInfo()) + .collect(Collectors.toList()); + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelDownloadConfig parallelDownloadConfig = ParallelDownloadConfig.newBuilder() + .setBucketName(bucketName) + .setDownloadDirectory(destinationDirectory) + .build(); + + List results = transferManager + .downloadBlobs(blobs, parallelDownloadConfig) + .getDownloadResults(); + + for (DownloadResult result : results) { + System.out.println("Download of " + result.getInput().getName() + + " completed with status " + + result.getStatus()); + } + + } + +} +// [END storage_transfer_manager_download_bucket] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java new file mode 100644 index 0000000000..4fd1720b38 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_download_many] +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.transfermanager.DownloadResult; +import com.google.cloud.storage.transfermanager.ParallelDownloadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import java.nio.file.Path; +import java.util.List; + +class DownloadMany { + + public static void downloadManyBlobs(String bucketName, + List blobs, Path destinationDirectory) { + + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelDownloadConfig parallelDownloadConfig = ParallelDownloadConfig.newBuilder() + .setBucketName(bucketName) + .setDownloadDirectory(destinationDirectory) + .build(); + + List results = transferManager + .downloadBlobs(blobs, parallelDownloadConfig) + .getDownloadResults(); + + for (DownloadResult result : results) { + System.out.println("Download of " + result.getInput().getName() + + " completed with status " + result.getStatus()); + } + + } + +} +// [END storage_transfer_manager_download_many] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java new file mode 100644 index 0000000000..096b2daedb --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java @@ -0,0 +1,59 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_upload_directory] +import com.google.cloud.storage.transfermanager.ParallelUploadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import com.google.cloud.storage.transfermanager.UploadResult; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +class UploadDirectory { + + public static void uploadDirectoryContents(String bucketName, Path sourceDirectory) + throws IOException { + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelUploadConfig parallelUploadConfig = ParallelUploadConfig + .newBuilder() + .setBucketName(bucketName) + .build(); + + // Create a list to store the file paths + List filePaths = new ArrayList<>(); + // Get all files in the directory + // try-with-resource to ensure pathStream is closed + try (Stream pathStream = Files.walk(sourceDirectory)) { + pathStream.filter(Files::isRegularFile) + .forEach(filePaths::add); + } + List results = transferManager + .uploadFiles(filePaths, parallelUploadConfig) + .getUploadResults(); + for (UploadResult result : results) { + System.out.println("Upload for " + result.getInput().getName() + + " completed with status " + result.getStatus()); + } + } + +} +// [END storage_transfer_manager_upload_directory] \ No newline at end of file diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java new file mode 100644 index 0000000000..245df36492 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java @@ -0,0 +1,46 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_upload_many] +import com.google.cloud.storage.transfermanager.ParallelUploadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import com.google.cloud.storage.transfermanager.UploadResult; +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +class UploadMany { + + public static void uploadManyFiles(String bucketName, List files) + throws IOException { + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelUploadConfig parallelUploadConfig = ParallelUploadConfig + .newBuilder() + .setBucketName(bucketName) + .build(); + List results = transferManager + .uploadFiles(files, parallelUploadConfig) + .getUploadResults(); + for (UploadResult result : results) { + System.out.println("Upload for " + result.getInput().getName() + + " completed with status " + result.getStatus()); + } + } +} +// [END storage_transfer_manager_upload_many] diff --git a/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java b/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java new file mode 100644 index 0000000000..e43b3a16f7 --- /dev/null +++ b/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java @@ -0,0 +1,119 @@ +/* + * Copyright 2024 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.transfermanager; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.cloud.storage.BlobId; +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BucketInfo; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.testing.RemoteStorageHelper; +import com.google.cloud.testing.junit4.StdOutCaptureRule; +import com.google.common.collect.ImmutableList; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + + +public class ITTransferManagerSamples { + private static final String BUCKET = RemoteStorageHelper.generateBucketName(); + private static Storage storage; + private static List blobs; + private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + @Rule + public final StdOutCaptureRule stdOutCaptureRule = new StdOutCaptureRule(); + @Rule public final TemporaryFolder tmp = new TemporaryFolder(); + @Rule public final TemporaryFolder tmpDirectory = new TemporaryFolder(); + + @BeforeClass + public static void beforeClass() { + RemoteStorageHelper helper = RemoteStorageHelper.create(); + storage = helper.getOptions().getService(); + storage.create(BucketInfo.of(BUCKET)); + blobs = Arrays.asList(BlobInfo.newBuilder(BUCKET, "blob1").build(), + BlobInfo.newBuilder(BUCKET, "blob2").build(), + BlobInfo.newBuilder(BUCKET, "blob3").build()); + for (BlobInfo blob : blobs) { + storage.create(blob); + } + + } + + @Test + public void uploadFiles() throws Exception { + File tmpFile = File.createTempFile("file", ".txt"); + File tmpFile2 = File.createTempFile("file2", ".txt"); + File tmpFile3 = File.createTempFile("file3", ".txt"); + List files = + ImmutableList.of(tmpFile.toPath(), tmpFile2.toPath(), tmpFile3.toPath()); + UploadMany.uploadManyFiles(BUCKET, files); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("file")).isTrue(); + assertThat(snippetOutput.contains("file2")).isTrue(); + assertThat(snippetOutput.contains("file3")).isTrue(); + } + + @Test + public void uploadDirectory() throws IOException { + File tmpFile = tmpDirectory.newFile("fileDirUpload.txt"); + File tmpFile2 = tmpDirectory.newFile("fileDirUpload2.txt"); + File tmpFile3 = tmpDirectory.newFile("fileDirUpload3.txt"); + UploadDirectory.uploadDirectoryContents(BUCKET, tmpDirectory.getRoot().toPath()); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("fileDirUpload.txt")).isTrue(); + assertThat(snippetOutput.contains("fileDirUpload2.txt")).isTrue(); + assertThat(snippetOutput.contains("fileDirUpload3.txt")).isTrue(); + } + + @Test + public void downloadBucket() { + String downloadFullBucketName = RemoteStorageHelper.generateBucketName(); + storage.create(BucketInfo.of(downloadFullBucketName)); + List bucketBlobs = Arrays.asList( + BlobInfo.newBuilder(downloadFullBucketName, "bucketb1").build(), + BlobInfo.newBuilder(downloadFullBucketName, "bucketb2").build(), + BlobInfo.newBuilder(downloadFullBucketName, "bucketb3").build()); + for (BlobInfo blob : bucketBlobs) { + storage.create(blob); + } + DownloadBucket + .downloadBucketContents(PROJECT_ID, downloadFullBucketName, tmp.getRoot().toPath()); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("bucketb1")).isTrue(); + assertThat(snippetOutput.contains("bucketb2")).isTrue(); + assertThat(snippetOutput.contains("bucketb3")).isTrue(); + } + + @Test + public void downloadFiles() { + DownloadMany.downloadManyBlobs(BUCKET, blobs, tmp.getRoot().toPath()); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("blob1")).isTrue(); + assertThat(snippetOutput.contains("blob2")).isTrue(); + assertThat(snippetOutput.contains("blob3")).isTrue(); + } + +} From 8c7404dea8ef16a7b61accad4fe614e033a5ad2c Mon Sep 17 00:00:00 2001 From: JesseLovelace <43148100+JesseLovelace@users.noreply.github.com> Date: Sun, 14 Apr 2024 16:42:35 -0700 Subject: [PATCH 22/40] feat: Adds a ZeroCopy response marshaller for grpc ReadObject handling (#2489) * feat: Adds a ZeroCopy response marshaller for grpc ReadObject handling * Update google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java Co-authored-by: BenWhitehead * add copyright header * Apply suggestions from code review Co-authored-by: BenWhitehead * Extract classes to own files, more StorageClient initialization * copyright headers on new files * formatter * one more lint issue * fix: improve GrpcStorageOptions.ReadObjectResponseZeroCopyMessageMarshaller#close() handling of multiple IOExceptions * clean up ZeroCopyMarshallerTest * add gprc core to pom --------- Co-authored-by: BenWhitehead --- google-cloud-storage/pom.xml | 8 + .../storage/GapicDownloadSessionBuilder.java | 16 +- .../GapicUnbufferedReadableByteChannel.java | 79 ++--- .../cloud/storage/GrpcBlobReadChannel.java | 5 +- .../google/cloud/storage/GrpcStorageImpl.java | 9 +- .../cloud/storage/GrpcStorageOptions.java | 299 +++++++++++++++++- .../java/com/google/cloud/storage/Hasher.java | 25 +- .../com/google/cloud/storage/ReadCursor.java | 52 +++ .../ResponseContentLifecycleHandle.java | 57 ++++ .../ResponseContentLifecycleManager.java | 31 ++ ...apicUnbufferedReadableByteChannelTest.java | 15 +- .../ITGzipReadableByteChannelTest.java | 22 +- .../storage/TransportCompatibilityTest.java | 4 +- .../cloud/storage/ZeroCopyMarshallerTest.java | 223 +++++++++++++ 14 files changed, 767 insertions(+), 78 deletions(-) create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleHandle.java create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleManager.java create mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/ZeroCopyMarshallerTest.java diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 7fbba0aeeb..c6219b776d 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -96,6 +96,14 @@ com.google.protobuf protobuf-java-util + + io.grpc + grpc-core + + + io.grpc + grpc-protobuf + com.google.api.grpc proto-google-common-protos diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java index 704794a389..82789bcd2f 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java @@ -48,19 +48,23 @@ public static GapicDownloadSessionBuilder create() { * ultimately produced channel will not do any retries of its own. */ public ReadableByteChannelSessionBuilder byteChannel( - ServerStreamingCallable read) { - return new ReadableByteChannelSessionBuilder(read); + ServerStreamingCallable read, + ResponseContentLifecycleManager responseContentLifecycleManager) { + return new ReadableByteChannelSessionBuilder(read, responseContentLifecycleManager); } public static final class ReadableByteChannelSessionBuilder { private final ServerStreamingCallable read; + private final ResponseContentLifecycleManager responseContentLifecycleManager; private boolean autoGzipDecompression; private Hasher hasher; private ReadableByteChannelSessionBuilder( - ServerStreamingCallable read) { + ServerStreamingCallable read, + ResponseContentLifecycleManager responseContentLifecycleManager) { this.read = read; + this.responseContentLifecycleManager = responseContentLifecycleManager; this.hasher = Hasher.noop(); this.autoGzipDecompression = false; } @@ -100,11 +104,13 @@ public UnbufferedReadableByteChannelSessionBuilder unbuffered() { return (object, resultFuture) -> { if (autoGzipDecompression) { return new GzipReadableByteChannel( - new GapicUnbufferedReadableByteChannel(resultFuture, read, object, hasher), + new GapicUnbufferedReadableByteChannel( + resultFuture, read, object, hasher, responseContentLifecycleManager), ApiFutures.transform( resultFuture, Object::getContentEncoding, MoreExecutors.directExecutor())); } else { - return new GapicUnbufferedReadableByteChannel(resultFuture, read, object, hasher); + return new GapicUnbufferedReadableByteChannel( + resultFuture, read, object, hasher, responseContentLifecycleManager); } }; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java index 4b19c3f998..6cecc8dded 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java @@ -16,8 +16,6 @@ package com.google.cloud.storage; -import static com.google.common.base.Preconditions.checkArgument; - import com.google.api.client.http.HttpStatusCodes; import com.google.api.core.ApiFuture; import com.google.api.core.SettableApiFuture; @@ -25,6 +23,7 @@ import com.google.api.gax.rpc.ServerStreamingCallable; import com.google.cloud.storage.Crc32cValue.Crc32cLengthKnown; import com.google.cloud.storage.UnbufferedReadableByteChannelSession.UnbufferedReadableByteChannel; +import com.google.protobuf.ByteString; import com.google.storage.v2.ChecksummedData; import com.google.storage.v2.Object; import com.google.storage.v2.ReadObjectRequest; @@ -46,6 +45,7 @@ final class GapicUnbufferedReadableByteChannel private final ReadObjectRequest req; private final Hasher hasher; private final LazyServerStreamIterator iter; + private final ResponseContentLifecycleManager rclm; private boolean open = true; private boolean complete = false; @@ -53,18 +53,20 @@ final class GapicUnbufferedReadableByteChannel private Object metadata; - private ByteBuffer leftovers; + private ResponseContentLifecycleHandle leftovers; GapicUnbufferedReadableByteChannel( SettableApiFuture result, ServerStreamingCallable read, ReadObjectRequest req, - Hasher hasher) { + Hasher hasher, + ResponseContentLifecycleManager rclm) { this.result = result; this.read = read; this.req = req; this.hasher = hasher; this.blobOffset = req.getReadOffset(); + this.rclm = rclm; this.iter = new LazyServerStreamIterator(); } @@ -82,8 +84,9 @@ public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { ReadCursor c = new ReadCursor(blobOffset, blobOffset + totalBufferCapacity); while (c.hasRemaining()) { if (leftovers != null) { - copy(c, leftovers, dsts, offset, length); + leftovers.copy(c, dsts, offset, length); if (!leftovers.hasRemaining()) { + leftovers.close(); leftovers = null; } continue; @@ -91,6 +94,7 @@ public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { if (iter.hasNext()) { ReadObjectResponse resp = iter.next(); + ResponseContentLifecycleHandle handle = rclm.get(resp); if (resp.hasMetadata()) { Object respMetadata = resp.getMetadata(); if (metadata == null) { @@ -107,22 +111,24 @@ public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { } } ChecksummedData checksummedData = resp.getChecksummedData(); - ByteBuffer content = checksummedData.getContent().asReadOnlyByteBuffer(); - // very important to know whether a crc32c value is set. Without checking, protobuf will + ByteString content = checksummedData.getContent(); + int contentSize = content.size(); + // Very important to know whether a crc32c value is set. Without checking, protobuf will // happily return 0, which is a valid crc32c value. if (checksummedData.hasCrc32C()) { - Crc32cLengthKnown expected = - Crc32cValue.of(checksummedData.getCrc32C(), checksummedData.getContent().size()); + Crc32cLengthKnown expected = Crc32cValue.of(checksummedData.getCrc32C(), contentSize); try { - hasher.validate(expected, content::duplicate); + hasher.validate(expected, content.asReadOnlyByteBufferList()); } catch (IOException e) { close(); throw e; } } - copy(c, content, dsts, offset, length); - if (content.hasRemaining()) { - leftovers = content; + handle.copy(c, dsts, offset, length); + if (handle.hasRemaining()) { + leftovers = handle; + } else { + handle.close(); } } else { complete = true; @@ -144,18 +150,19 @@ public boolean isOpen() { @Override public void close() throws IOException { open = false; - iter.close(); + try { + if (leftovers != null) { + leftovers.close(); + } + } finally { + iter.close(); + } } ApiFuture getResult() { return result; } - private void copy(ReadCursor c, ByteBuffer content, ByteBuffer[] dsts, int offset, int length) { - long copiedBytes = Buffers.copy(content, dsts, offset, length); - c.advance(copiedBytes); - } - private IOException closeWithError(String message) throws IOException { close(); StorageException cause = @@ -163,40 +170,6 @@ private IOException closeWithError(String message) throws IOException { throw new IOException(message, cause); } - /** - * Shrink wraps a beginning, offset and limit for tracking state of an individual invocation of - * {@link #read} - */ - private static final class ReadCursor { - private final long beginning; - private long offset; - private final long limit; - - private ReadCursor(long beginning, long limit) { - this.limit = limit; - this.beginning = beginning; - this.offset = beginning; - } - - public boolean hasRemaining() { - return limit - offset > 0; - } - - public void advance(long incr) { - checkArgument(incr >= 0); - offset += incr; - } - - public long read() { - return offset - beginning; - } - - @Override - public String toString() { - return String.format("ReadCursor{begin=%d, offset=%d, limit=%d}", beginning, offset, limit); - } - } - private final class LazyServerStreamIterator implements Iterator, Closeable { private ServerStream serverStream; private Iterator responseIterator; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java index 4ae3f24466..03e3cb517a 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java @@ -28,15 +28,18 @@ final class GrpcBlobReadChannel extends BaseStorageReadChannel { private final ServerStreamingCallable read; + private final ResponseContentLifecycleManager responseContentLifecycleManager; private final ReadObjectRequest request; private final boolean autoGzipDecompression; GrpcBlobReadChannel( ServerStreamingCallable read, + ResponseContentLifecycleManager responseContentLifecycleManager, ReadObjectRequest request, boolean autoGzipDecompression) { super(Conversions.grpc().blobInfo()); this.read = read; + this.responseContentLifecycleManager = responseContentLifecycleManager; this.request = request; this.autoGzipDecompression = autoGzipDecompression; } @@ -53,7 +56,7 @@ protected LazyReadChannel newLazyReadChannel() { ReadableByteChannelSessionBuilder b = ResumableMedia.gapic() .read() - .byteChannel(read) + .byteChannel(read, responseContentLifecycleManager) .setHasher(Hasher.noop()) .setAutoGzipDecompression(autoGzipDecompression); BufferHandle bufferHandle = getBufferHandle(); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java index e9857e93d5..e5e81c060e 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java @@ -180,6 +180,7 @@ final class GrpcStorageImpl extends BaseService .collect(ImmutableSet.toImmutableSet()))); final StorageClient storageClient; + final ResponseContentLifecycleManager responseContentLifecycleManager; final WriterFactory writerFactory; final GrpcConversions codecs; final GrpcRetryAlgorithmManager retryAlgorithmManager; @@ -192,10 +193,12 @@ final class GrpcStorageImpl extends BaseService GrpcStorageImpl( GrpcStorageOptions options, StorageClient storageClient, + ResponseContentLifecycleManager responseContentLifecycleManager, WriterFactory writerFactory, Opts defaultOpts) { super(options); this.storageClient = storageClient; + this.responseContentLifecycleManager = responseContentLifecycleManager; this.writerFactory = writerFactory; this.defaultOpts = defaultOpts; this.codecs = Conversions.grpc(); @@ -716,8 +719,10 @@ public GrpcBlobReadChannel reader(BlobId blob, BlobSourceOption... options) { ReadObjectRequest request = getReadObjectRequest(blob, opts); Set codes = resultRetryAlgorithmToCodes(retryAlgorithmManager.getFor(request)); GrpcCallContext grpcCallContext = Retrying.newCallContext().withRetryableCodes(codes); + return new GrpcBlobReadChannel( storageClient.readObjectCallable().withDefaultCallContext(grpcCallContext), + responseContentLifecycleManager, request, !opts.autoGzipDecompression()); } @@ -1868,7 +1873,9 @@ private UnbufferedReadableByteChannelSession unbufferedReadSession( opts.grpcMetadataMapper().apply(Retrying.newCallContext().withRetryableCodes(codes)); return ResumableMedia.gapic() .read() - .byteChannel(storageClient.readObjectCallable().withDefaultCallContext(grpcCallContext)) + .byteChannel( + storageClient.readObjectCallable().withDefaultCallContext(grpcCallContext), + responseContentLifecycleManager) .setAutoGzipDecompression(!opts.autoGzipDecompression()) .unbuffered() .setReadObjectRequest(readObjectRequest) 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 841343d311..438b5fd595 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 @@ -25,14 +25,20 @@ import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.FixedCredentialsProvider; import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.GrpcCallSettings; import com.google.api.gax.grpc.GrpcInterceptorProvider; +import com.google.api.gax.grpc.GrpcStubCallableFactory; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.retrying.RetrySettings; import com.google.api.gax.retrying.StreamResumptionStrategy; +import com.google.api.gax.rpc.ClientContext; import com.google.api.gax.rpc.HeaderProvider; import com.google.api.gax.rpc.NoHeaderProvider; +import com.google.api.gax.rpc.RequestParamsBuilder; +import com.google.api.gax.rpc.ServerStreamingCallable; import com.google.api.gax.rpc.StatusCode.Code; import com.google.api.gax.rpc.internal.QuotaProjectIdHidingCredentials; +import com.google.api.pathtemplate.PathTemplate; import com.google.auth.Credentials; import com.google.cloud.NoCredentials; import com.google.cloud.ServiceFactory; @@ -47,25 +53,50 @@ import com.google.cloud.storage.UnifiedOpts.Opts; import com.google.cloud.storage.UnifiedOpts.UserProject; import com.google.cloud.storage.spi.StorageRpcFactory; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.protobuf.ByteString; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.MessageLite; +import com.google.protobuf.Parser; +import com.google.protobuf.UnsafeByteOperations; import com.google.storage.v2.ReadObjectRequest; import com.google.storage.v2.ReadObjectResponse; import com.google.storage.v2.StorageClient; import com.google.storage.v2.StorageSettings; +import com.google.storage.v2.stub.GrpcStorageCallableFactory; +import com.google.storage.v2.stub.GrpcStorageStub; +import com.google.storage.v2.stub.StorageStub; +import com.google.storage.v2.stub.StorageStubSettings; import io.grpc.ClientInterceptor; +import io.grpc.Detachable; +import io.grpc.HasByteBuffer; +import io.grpc.KnownLength; import io.grpc.ManagedChannelBuilder; +import io.grpc.MethodDescriptor; +import io.grpc.Status; +import io.grpc.protobuf.ProtoUtils; +import java.io.Closeable; import java.io.IOException; +import java.io.InputStream; import java.io.Serializable; import java.net.URI; +import java.nio.ByteBuffer; import java.time.Clock; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.IdentityHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -658,11 +689,32 @@ public Storage create(StorageOptions options) { Tuple> t = grpcStorageOptions.resolveSettingsAndOpts(); StorageSettings storageSettings = t.x(); Opts defaultOpts = t.y(); - return new GrpcStorageImpl( - grpcStorageOptions, - StorageClient.create(storageSettings), - grpcStorageOptions.blobWriteSessionConfig.createFactory(Clock.systemUTC()), - defaultOpts); + if (ZeroCopyReadinessChecker.isReady()) { + StorageStubSettings stubSettings = + (StorageStubSettings) storageSettings.getStubSettings(); + ClientContext clientContext = ClientContext.create(stubSettings); + GrpcStorageCallableFactory grpcStorageCallableFactory = + new GrpcStorageCallableFactory(); + InternalZeroCopyGrpcStorageStub stub = + new InternalZeroCopyGrpcStorageStub( + stubSettings, clientContext, grpcStorageCallableFactory); + StorageClient client = new InternalStorageClient(stub); + return new GrpcStorageImpl( + grpcStorageOptions, + client, + stub.getObjectMediaResponseMarshaller, + grpcStorageOptions.blobWriteSessionConfig.createFactory(Clock.systemUTC()), + defaultOpts); + } else { + StorageClient client = StorageClient.create(storageSettings); + return new GrpcStorageImpl( + grpcStorageOptions, + client, + ResponseContentLifecycleManager.noop(), + grpcStorageOptions.blobWriteSessionConfig.createFactory(Clock.systemUTC()), + defaultOpts); + } + } catch (IOException e) { throw new IllegalStateException( "Unable to instantiate gRPC com.google.cloud.storage.Storage client.", e); @@ -780,4 +832,241 @@ private Object readResolve() { return INSTANCE; } } + + private static final class InternalStorageClient extends StorageClient { + + private InternalStorageClient(StorageStub stub) { + super(stub); + } + } + + private static final class InternalZeroCopyGrpcStorageStub extends GrpcStorageStub + implements AutoCloseable { + private final ReadObjectResponseZeroCopyMessageMarshaller getObjectMediaResponseMarshaller; + + private final ServerStreamingCallable + serverStreamingCallable; + + private InternalZeroCopyGrpcStorageStub( + StorageStubSettings settings, + ClientContext clientContext, + GrpcStubCallableFactory callableFactory) + throws IOException { + super(settings, clientContext, callableFactory); + + this.getObjectMediaResponseMarshaller = + new ReadObjectResponseZeroCopyMessageMarshaller(ReadObjectResponse.getDefaultInstance()); + + MethodDescriptor readObjectMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.SERVER_STREAMING) + .setFullMethodName("google.storage.v2.Storage/ReadObject") + .setRequestMarshaller(ProtoUtils.marshaller(ReadObjectRequest.getDefaultInstance())) + .setResponseMarshaller(getObjectMediaResponseMarshaller) + .build(); + + GrpcCallSettings readObjectTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(readObjectMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + // todo: this is fragile to proto annotation changes, and would require manual + // maintenance + builder.add(request.getBucket(), "bucket", PathTemplate.create("{bucket=**}")); + return builder.build(); + }) + .build(); + + this.serverStreamingCallable = + callableFactory.createServerStreamingCallable( + readObjectTransportSettings, settings.readObjectSettings(), clientContext); + } + + @Override + public ServerStreamingCallable readObjectCallable() { + return serverStreamingCallable; + } + } + + @VisibleForTesting + static class ReadObjectResponseZeroCopyMessageMarshaller + implements MethodDescriptor.PrototypeMarshaller, + ResponseContentLifecycleManager, + Closeable { + private final Map unclosedStreams; + private final Parser parser; + private final MethodDescriptor.PrototypeMarshaller baseMarshaller; + + ReadObjectResponseZeroCopyMessageMarshaller(ReadObjectResponse defaultInstance) { + parser = defaultInstance.getParserForType(); + baseMarshaller = + (MethodDescriptor.PrototypeMarshaller) + ProtoUtils.marshaller(defaultInstance); + unclosedStreams = Collections.synchronizedMap(new IdentityHashMap<>()); + } + + @Override + public Class getMessageClass() { + return baseMarshaller.getMessageClass(); + } + + @Override + public ReadObjectResponse getMessagePrototype() { + return baseMarshaller.getMessagePrototype(); + } + + @Override + public InputStream stream(ReadObjectResponse value) { + return baseMarshaller.stream(value); + } + + @Override + public ReadObjectResponse parse(InputStream stream) { + CodedInputStream cis = null; + try { + if (stream instanceof KnownLength + && stream instanceof Detachable + && stream instanceof HasByteBuffer + && ((HasByteBuffer) stream).byteBufferSupported()) { + int size = stream.available(); + // Stream is now detached here and should be closed later. + stream = ((Detachable) stream).detach(); + // This mark call is to keep buffer while traversing buffers using skip. + stream.mark(size); + List byteStrings = new ArrayList<>(); + while (stream.available() != 0) { + ByteBuffer buffer = ((HasByteBuffer) stream).getByteBuffer(); + byteStrings.add(UnsafeByteOperations.unsafeWrap(buffer)); + stream.skip(buffer.remaining()); + } + stream.reset(); + cis = ByteString.copyFrom(byteStrings).newCodedInput(); + cis.enableAliasing(true); + cis.setSizeLimit(Integer.MAX_VALUE); + } + } catch (IOException e) { + throw Status.INTERNAL + .withDescription("Error parsing input stream for ReadObject") + .withCause(e) + .asRuntimeException(); + } + if (cis != null) { + // fast path (no memory copy) + ReadObjectResponse message; + try { + message = parseFrom(cis); + } catch (InvalidProtocolBufferException ipbe) { + throw Status.INTERNAL + .withDescription("Invalid protobuf byte sequence for ReadObject") + .withCause(ipbe) + .asRuntimeException(); + } + unclosedStreams.put(message, stream); + return message; + } else { + // slow path + return baseMarshaller.parse(stream); + } + } + + private ReadObjectResponse parseFrom(CodedInputStream stream) + throws InvalidProtocolBufferException { + ReadObjectResponse message = parser.parseFrom(stream); + try { + stream.checkLastTagWas(0); + return message; + } catch (InvalidProtocolBufferException e) { + e.setUnfinishedMessage(message); + throw e; + } + } + + @Override + public ResponseContentLifecycleHandle get(ReadObjectResponse response) { + InputStream stream = unclosedStreams.remove(response); + return new ResponseContentLifecycleHandle(response, stream); + } + + @Override + public void close() throws IOException { + closeAllStreams(unclosedStreams.values()); + } + + /** + * In the event closing the streams results in multiple streams throwing IOExceptions, collect + * them all as suppressed exceptions on the first occurrence. + */ + @VisibleForTesting + static void closeAllStreams(Collection inputStreams) throws IOException { + IOException ioException = + inputStreams.stream() + .map( + stream -> { + try { + stream.close(); + return null; + } catch (IOException e) { + return e; + } + }) + .filter(Objects::nonNull) + .reduce( + null, + (l, r) -> { + if (l != null) { + l.addSuppressed(r); + return l; + } else { + return r; + } + }, + (l, r) -> l); + + if (ioException != null) { + throw ioException; + } + } + } + + static final class ZeroCopyReadinessChecker { + private static final boolean isZeroCopyReady; + + static { + // Check whether io.grpc.Detachable exists? + boolean detachableClassExists = false; + try { + // Try to load Detachable interface in the package where KnownLength is in. + // This can be done directly by looking up io.grpc.Detachable but rather + // done indirectly to handle the case where gRPC is being shaded in a + // different package. + String knownLengthClassName = KnownLength.class.getName(); + String detachableClassName = + knownLengthClassName.substring(0, knownLengthClassName.lastIndexOf('.') + 1) + + "Detachable"; + Class detachableClass = Class.forName(detachableClassName); + detachableClassExists = (detachableClass != null); + } catch (ClassNotFoundException ex) { + // leaves detachableClassExists false + } + // Check whether com.google.protobuf.UnsafeByteOperations exists? + boolean unsafeByteOperationsClassExists = false; + try { + // Same above + String messageLiteClassName = MessageLite.class.getName(); + String unsafeByteOperationsClassName = + messageLiteClassName.substring(0, messageLiteClassName.lastIndexOf('.') + 1) + + "UnsafeByteOperations"; + Class unsafeByteOperationsClass = Class.forName(unsafeByteOperationsClassName); + unsafeByteOperationsClassExists = (unsafeByteOperationsClass != null); + } catch (ClassNotFoundException ex) { + // leaves unsafeByteOperationsClassExists false + } + isZeroCopyReady = detachableClassExists && unsafeByteOperationsClassExists; + } + + public static boolean isReady() { + return isZeroCopyReady; + } + } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java index 06fca0413f..d7741b7d91 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java @@ -20,6 +20,7 @@ import com.google.common.hash.Hashing; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.List; import java.util.function.Supplier; import javax.annotation.concurrent.Immutable; import org.checkerframework.checker.nullness.qual.Nullable; @@ -36,6 +37,8 @@ default Crc32cLengthKnown hash(Supplier b) { void validate(Crc32cValue expected, Supplier b) throws IOException; + void validate(Crc32cValue expected, List buffers) throws IOException; + @Nullable Crc32cLengthKnown nullSafeConcat(Crc32cLengthKnown r1, Crc32cLengthKnown r2); @@ -61,6 +64,9 @@ public Crc32cLengthKnown hash(ByteBuffer b) { @Override public void validate(Crc32cValue expected, Supplier b) {} + @Override + public void validate(Crc32cValue expected, List b) {} + @Override public @Nullable Crc32cLengthKnown nullSafeConcat(Crc32cLengthKnown r1, Crc32cLengthKnown r2) { return null; @@ -79,7 +85,24 @@ public Crc32cLengthKnown hash(ByteBuffer b) { return Crc32cValue.of(Hashing.crc32c().hashBytes(b).asInt(), remaining); } - @SuppressWarnings("ConstantConditions") + @SuppressWarnings({"ConstantConditions", "UnstableApiUsage"}) + @Override + public void validate(Crc32cValue expected, List b) throws IOException { + long remaining = 0; + com.google.common.hash.Hasher crc32c = Hashing.crc32c().newHasher(); + for (ByteBuffer tmp : b) { + remaining += tmp.remaining(); + crc32c.putBytes(tmp); + } + Crc32cLengthKnown actual = Crc32cValue.of(crc32c.hash().asInt(), remaining); + if (!actual.eqValue(expected)) { + throw new IOException( + String.format( + "Mismatch checksum value. Expected %s actual %s", + expected.debugString(), actual.debugString())); + } + } + @Override public void validate(Crc32cValue expected, Supplier b) throws IOException { Crc32cLengthKnown actual = hash(b); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java new file mode 100644 index 0000000000..b65a6e257b --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import static com.google.common.base.Preconditions.checkArgument; + +/** + * Shrink wraps a beginning, offset and limit for tracking state of an individual invocation of + * {@link #read} + */ +final class ReadCursor { + private final long beginning; + private long offset; + private final long limit; + + ReadCursor(long beginning, long limit) { + this.limit = limit; + this.beginning = beginning; + this.offset = beginning; + } + + public boolean hasRemaining() { + return limit - offset > 0; + } + + public void advance(long incr) { + checkArgument(incr >= 0); + offset += incr; + } + + public long read() { + return offset - beginning; + } + + @Override + public String toString() { + return String.format("ReadCursor{begin=%d, offset=%d, limit=%d}", beginning, offset, limit); + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleHandle.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleHandle.java new file mode 100644 index 0000000000..20fc365832 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleHandle.java @@ -0,0 +1,57 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import com.google.storage.v2.ReadObjectResponse; +import java.io.Closeable; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class ResponseContentLifecycleHandle implements Closeable { + @Nullable private final Closeable dispose; + + private final List buffers; + + ResponseContentLifecycleHandle(ReadObjectResponse resp, @Nullable Closeable dispose) { + this.dispose = dispose; + + this.buffers = resp.getChecksummedData().getContent().asReadOnlyByteBufferList(); + } + + void copy(ReadCursor c, ByteBuffer[] dsts, int offset, int length) { + for (ByteBuffer b : buffers) { + long copiedBytes = Buffers.copy(b, dsts, offset, length); + c.advance(copiedBytes); + if (b.hasRemaining()) break; + } + } + + boolean hasRemaining() { + for (ByteBuffer b : buffers) { + if (b.hasRemaining()) return true; + } + return false; + } + + @Override + public void close() throws IOException { + if (dispose != null) { + dispose.close(); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleManager.java new file mode 100644 index 0000000000..3236513398 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleManager.java @@ -0,0 +1,31 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import com.google.storage.v2.ReadObjectResponse; + +interface ResponseContentLifecycleManager { + ResponseContentLifecycleHandle get(ReadObjectResponse response); + + static ResponseContentLifecycleManager noop() { + return response -> + new ResponseContentLifecycleHandle( + response, + () -> { + // no-op + }); + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java index ba9a972cc2..3a4fd7e924 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java @@ -127,7 +127,8 @@ public void readRetriesAreProperlyOrdered_readLargerThanMessageSize() .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.noop())); + Hasher.noop(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; try (UnbufferedReadableByteChannel c = session.open()) { c.read(ByteBuffer.wrap(actualBytes)); @@ -155,7 +156,8 @@ public void readRetriesAreProperlyOrdered_readSmallerThanMessageSize() .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.noop())); + Hasher.noop(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; ImmutableList buffers = TestUtils.subDivide(actualBytes, 2); try (UnbufferedReadableByteChannel c = session.open()) { @@ -213,7 +215,8 @@ public void readObject( .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.noop())); + Hasher.noop(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; try (UnbufferedReadableByteChannel c = session.open()) { IOException ioException = @@ -260,7 +263,8 @@ public void readObject( .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.enabled())); + Hasher.enabled(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; try (UnbufferedReadableByteChannel c = session.open()) { IOException ioException = @@ -299,7 +303,8 @@ public void readObject( .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.enabled())); + Hasher.enabled(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[41]; //noinspection resource UnbufferedReadableByteChannel c = session.open(); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java index 2e8efa0589..41f6df1de4 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java @@ -124,7 +124,9 @@ public void autoGzipDecompress_true() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(true) .unbuffered() @@ -143,7 +145,9 @@ public void autoGzipDecompress_false() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(false) .unbuffered() @@ -193,7 +197,9 @@ public void autoGzipDecompress_true() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(true) .unbuffered() @@ -212,7 +218,9 @@ public void autoGzipDecompress_false() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(false) .unbuffered() @@ -231,7 +239,9 @@ public void autoGzipDecompress_default_disabled() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .unbuffered() .setReadObjectRequest(reqCompressed) @@ -314,7 +324,7 @@ public void readObject( ReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(sc.readObjectCallable()) + .byteChannel(sc.readObjectCallable(), ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(true) .unbuffered() diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java index 76219beccd..32d308a311 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java @@ -38,7 +38,9 @@ public void verifyUnsupportedMethodsGenerateMeaningfulException() { .setCredentials(NoCredentials.getInstance()) .build(); @SuppressWarnings("resource") - Storage s = new GrpcStorageImpl(options, null, null, Opts.empty()); + Storage s = + new GrpcStorageImpl( + options, null, ResponseContentLifecycleManager.noop(), null, Opts.empty()); ImmutableList messages = Stream.>of( s::batch, diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ZeroCopyMarshallerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ZeroCopyMarshallerTest.java new file mode 100644 index 0000000000..57d96dfbca --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ZeroCopyMarshallerTest.java @@ -0,0 +1,223 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import static com.google.cloud.storage.TestUtils.getChecksummedData; +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import com.google.cloud.storage.GrpcStorageOptions.ReadObjectResponseZeroCopyMessageMarshaller; +import com.google.common.collect.ImmutableList; +import com.google.common.hash.Hashing; +import com.google.protobuf.ByteString; +import com.google.storage.v2.ContentRange; +import com.google.storage.v2.Object; +import com.google.storage.v2.ObjectChecksums; +import com.google.storage.v2.ReadObjectResponse; +import io.grpc.StatusRuntimeException; +import io.grpc.internal.ReadableBuffer; +import io.grpc.internal.ReadableBuffers; +import java.io.Closeable; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; +import org.junit.Test; + +public class ZeroCopyMarshallerTest { + private final byte[] bytes = DataGenerator.base64Characters().genBytes(40); + private final ByteString data = ByteString.copyFrom(bytes, 0, 10); + private final ReadObjectResponse response = + ReadObjectResponse.newBuilder() + .setMetadata( + Object.newBuilder() + .setName("name") + .setGeneration(3L) + .setContentType("application/octet-stream") + .build()) + .setContentRange(ContentRange.newBuilder().setStart(0).build()) + .setObjectChecksums( + ObjectChecksums.newBuilder().setCrc32C(Hashing.crc32c().hashBytes(bytes).asInt())) + .setChecksummedData(getChecksummedData(data, Hasher.enabled())) + .build(); + + private ReadObjectResponseZeroCopyMessageMarshaller createMarshaller() { + return new ReadObjectResponseZeroCopyMessageMarshaller(ReadObjectResponse.getDefaultInstance()); + } + + private byte[] dropLastOneByte(byte[] bytes) { + return Arrays.copyOfRange(bytes, 0, bytes.length - 1); + } + + private InputStream createInputStream(byte[] bytes, boolean isZeroCopyable) { + ReadableBuffer buffer = + isZeroCopyable ? ReadableBuffers.wrap(ByteBuffer.wrap(bytes)) : ReadableBuffers.wrap(bytes); + return ReadableBuffers.openStream(buffer, true); + } + + @Test + public void testParseOnFastPath() throws IOException { + InputStream stream = createInputStream(response.toByteArray(), true); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + ReadObjectResponse response = marshaller.parse(stream); + assertEquals(response, this.response); + ResponseContentLifecycleHandle stream2 = marshaller.get(response); + assertNotNull(stream2); + stream2.close(); + ResponseContentLifecycleHandle stream3 = marshaller.get(response); + assertNotNull(stream3); + stream3.close(); + } + + @Test + public void testParseOnSlowPath() throws IOException { + InputStream stream = createInputStream(response.toByteArray(), false); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + ReadObjectResponse response = marshaller.parse(stream); + assertEquals(response, this.response); + ResponseContentLifecycleHandle stream2 = marshaller.get(response); + assertNotNull(stream2); + stream2.close(); + } + + @Test + public void testParseBrokenMessageOnFastPath() { + InputStream stream = createInputStream(dropLastOneByte(response.toByteArray()), true); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + assertThrows( + StatusRuntimeException.class, + () -> { + marshaller.parse(stream); + }); + } + + @Test + public void testParseBrokenMessageOnSlowPath() { + InputStream stream = createInputStream(dropLastOneByte(response.toByteArray()), false); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + assertThrows( + StatusRuntimeException.class, + () -> { + marshaller.parse(stream); + }); + } + + @Test + public void testResponseContentLifecycleHandle() throws IOException { + AtomicBoolean wasClosedCalled = new AtomicBoolean(false); + Closeable verifyClosed = () -> wasClosedCalled.set(true); + + ResponseContentLifecycleHandle handle = + new ResponseContentLifecycleHandle(response, verifyClosed); + handle.close(); + + assertTrue(wasClosedCalled.get()); + + ResponseContentLifecycleHandle nullHandle = new ResponseContentLifecycleHandle(response, null); + nullHandle.close(); + // No NullPointerException means test passes + } + + @Test + public void testMarshallerClose_clean() throws IOException { + CloseAuditingInputStream stream1 = + CloseAuditingInputStream.of(createInputStream(response.toByteArray(), true)); + CloseAuditingInputStream stream2 = + CloseAuditingInputStream.of(createInputStream(response.toByteArray(), true)); + CloseAuditingInputStream stream3 = + CloseAuditingInputStream.of(createInputStream(response.toByteArray(), true)); + + ReadObjectResponseZeroCopyMessageMarshaller.closeAllStreams( + ImmutableList.of(stream1, stream2, stream3)); + + assertThat(stream1.closed).isTrue(); + assertThat(stream2.closed).isTrue(); + assertThat(stream3.closed).isTrue(); + } + + @SuppressWarnings("resource") + @Test + public void testMarshallerClose_multipleIoExceptions() { + CloseAuditingInputStream stream1 = + new CloseAuditingInputStream(null) { + @Override + void onClose() throws IOException { + throw new IOException("Kaboom stream1"); + } + }; + CloseAuditingInputStream stream2 = + new CloseAuditingInputStream(null) { + @Override + void onClose() throws IOException { + throw new IOException("Kaboom stream2"); + } + }; + CloseAuditingInputStream stream3 = + new CloseAuditingInputStream(null) { + @Override + void onClose() throws IOException { + throw new IOException("Kaboom stream3"); + } + }; + + IOException ioException = + assertThrows( + IOException.class, + () -> + ReadObjectResponseZeroCopyMessageMarshaller.closeAllStreams( + ImmutableList.of(stream1, stream2, stream3))); + + assertThat(stream1.closed).isTrue(); + assertThat(stream2.closed).isTrue(); + assertThat(stream3.closed).isTrue(); + + assertThat(ioException).hasMessageThat().isEqualTo("Kaboom stream1"); + List messages = + Arrays.stream(ioException.getSuppressed()) + .map(Throwable::getMessage) + .collect(Collectors.toList()); + assertThat(messages).isEqualTo(ImmutableList.of("Kaboom stream2", "Kaboom stream3")); + } + + private static class CloseAuditingInputStream extends FilterInputStream { + + private boolean closed = false; + + private CloseAuditingInputStream(InputStream in) { + super(in); + } + + public static CloseAuditingInputStream of(InputStream in) { + return new CloseAuditingInputStream(in); + } + + @Override + public void close() throws IOException { + closed = true; + onClose(); + super.close(); + } + + void onClose() throws IOException {} + } +} From a457814339472b7ba00f83dd3820f5bdd39d6482 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 14:13:38 -0700 Subject: [PATCH 23/40] build: Update protobuf to 25.3 in WORKSPACE (#2457) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Make Managed Folders operations public PiperOrigin-RevId: 620299849 Source-Link: https://github.com/googleapis/googleapis/commit/c5b9e24c82f0bfd27b8afae048308e03db2d0185 Source-Link: https://github.com/googleapis/googleapis-gen/commit/61b8d3923141c21ca58c63d0a6a1ccb15de526fe Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNjFiOGQzOTIzMTQxYzIxY2E1OGM2M2QwYTZhMWNjYjE1ZGU1MjZmZSJ9 chore(storage/control): correct Go package PiperOrigin-RevId: 617296686 Source-Link: https://github.com/googleapis/googleapis/commit/0ad322748ad708677141f19ff392d9d3745a3dd4 Source-Link: https://github.com/googleapis/googleapis-gen/commit/6abee0c4da5cd010ffa0a1b861dd665722971542 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNmFiZWUwYzRkYTVjZDAxMGZmYTBhMWI4NjFkZDY2NTcyMjk3MTU0MiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * build: Update protobuf to 25.3 in WORKSPACE PiperOrigin-RevId: 624989428 Source-Link: https://github.com/googleapis/googleapis/commit/caf600abae856335abbfcfa6d978bca051c2bc8c Source-Link: https://github.com/googleapis/googleapis-gen/commit/cc580b8ea4c07f774093d0f8c4afedd2eae6e856 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiY2M1ODBiOGVhNGMwN2Y3NzQwOTNkMGY4YzRhZmVkZDJlYWU2ZTg1NiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix clirr * moving clirr file --------- Co-authored-by: Owl Bot Co-authored-by: Sydney Munro --- README.md | 16 +- .../control/v2/StorageControlClient.java | 721 ++++++++- .../control/v2/StorageControlSettings.java | 49 + .../storage/control/v2/gapic_metadata.json | 12 + .../v2/stub/GrpcStorageControlStub.java | 190 +++ .../control/v2/stub/StorageControlStub.java | 29 + .../v2/stub/StorageControlStubSettings.java | 176 ++- .../reflect-config.json | 108 ++ .../storage/control/v2/gapic_metadata.json | 12 + .../control/v2/MockStorageControlImpl.java | 85 + .../control/v2/StorageControlClientTest.java | 335 ++++ .../clirr-ignored-differences.xml | 41 + .../control/v2/StorageControlGrpc.java | 475 ++++++ .../CommonLongRunningOperationMetadata.java | 2 +- ...LongRunningOperationMetadataOrBuilder.java | 2 +- .../control/v2/CreateFolderRequest.java | 44 +- .../v2/CreateFolderRequestOrBuilder.java | 14 +- .../v2/CreateManagedFolderRequest.java | 1373 +++++++++++++++++ .../CreateManagedFolderRequestOrBuilder.java | 163 ++ .../control/v2/DeleteFolderRequest.java | 2 +- .../v2/DeleteFolderRequestOrBuilder.java | 2 +- .../v2/DeleteManagedFolderRequest.java | 1235 +++++++++++++++ .../DeleteManagedFolderRequestOrBuilder.java | 160 ++ .../com/google/storage/control/v2/Folder.java | 2 +- .../storage/control/v2/FolderOrBuilder.java | 2 +- .../storage/control/v2/GetFolderRequest.java | 2 +- .../control/v2/GetFolderRequestOrBuilder.java | 2 +- .../control/v2/GetManagedFolderRequest.java | 1130 ++++++++++++++ .../v2/GetManagedFolderRequestOrBuilder.java | 144 ++ .../control/v2/GetStorageLayoutRequest.java | 2 +- .../v2/GetStorageLayoutRequestOrBuilder.java | 2 +- .../control/v2/ListFoldersRequest.java | 2 +- .../v2/ListFoldersRequestOrBuilder.java | 2 +- .../control/v2/ListFoldersResponse.java | 2 +- .../v2/ListFoldersResponseOrBuilder.java | 2 +- .../control/v2/ListManagedFoldersRequest.java | 1318 ++++++++++++++++ .../ListManagedFoldersRequestOrBuilder.java | 154 ++ .../v2/ListManagedFoldersResponse.java | 1133 ++++++++++++++ .../ListManagedFoldersResponseOrBuilder.java | 105 ++ .../storage/control/v2/ManagedFolder.java | 1320 ++++++++++++++++ .../storage/control/v2/ManagedFolderName.java | 227 +++ .../control/v2/ManagedFolderOrBuilder.java | 146 ++ .../storage/control/v2/PendingRenameInfo.java | 2 +- .../v2/PendingRenameInfoOrBuilder.java | 2 +- .../control/v2/RenameFolderMetadata.java | 2 +- .../v2/RenameFolderMetadataOrBuilder.java | 2 +- .../control/v2/RenameFolderRequest.java | 2 +- .../v2/RenameFolderRequestOrBuilder.java | 2 +- .../control/v2/StorageControlProto.java | 214 ++- .../storage/control/v2/StorageLayout.java | 2 +- .../control/v2/StorageLayoutOrBuilder.java | 2 +- .../storage/control/v2/storage_control.proto | 207 ++- .../storage/v2/BidiWriteObjectRequest.java | 2 +- .../v2/BidiWriteObjectRequestOrBuilder.java | 2 +- .../storage/v2/BidiWriteObjectResponse.java | 2 +- .../v2/BidiWriteObjectResponseOrBuilder.java | 2 +- .../java/com/google/storage/v2/Bucket.java | 2 +- .../storage/v2/BucketAccessControl.java | 2 +- .../v2/BucketAccessControlOrBuilder.java | 2 +- .../google/storage/v2/BucketOrBuilder.java | 2 +- .../v2/CancelResumableWriteRequest.java | 2 +- .../CancelResumableWriteRequestOrBuilder.java | 2 +- .../v2/CancelResumableWriteResponse.java | 2 +- ...CancelResumableWriteResponseOrBuilder.java | 2 +- .../google/storage/v2/ChecksummedData.java | 2 +- .../storage/v2/ChecksummedDataOrBuilder.java | 2 +- .../storage/v2/CommonObjectRequestParams.java | 2 +- .../CommonObjectRequestParamsOrBuilder.java | 2 +- .../storage/v2/ComposeObjectRequest.java | 2 +- .../v2/ComposeObjectRequestOrBuilder.java | 2 +- .../com/google/storage/v2/ContentRange.java | 2 +- .../storage/v2/ContentRangeOrBuilder.java | 2 +- .../storage/v2/CreateBucketRequest.java | 2 +- .../v2/CreateBucketRequestOrBuilder.java | 2 +- .../storage/v2/CreateHmacKeyRequest.java | 2 +- .../v2/CreateHmacKeyRequestOrBuilder.java | 2 +- .../storage/v2/CreateHmacKeyResponse.java | 2 +- .../v2/CreateHmacKeyResponseOrBuilder.java | 2 +- .../v2/CreateNotificationConfigRequest.java | 2 +- ...ateNotificationConfigRequestOrBuilder.java | 2 +- .../google/storage/v2/CustomerEncryption.java | 2 +- .../v2/CustomerEncryptionOrBuilder.java | 2 +- .../storage/v2/DeleteBucketRequest.java | 2 +- .../v2/DeleteBucketRequestOrBuilder.java | 2 +- .../storage/v2/DeleteHmacKeyRequest.java | 2 +- .../v2/DeleteHmacKeyRequestOrBuilder.java | 2 +- .../v2/DeleteNotificationConfigRequest.java | 2 +- ...eteNotificationConfigRequestOrBuilder.java | 2 +- .../storage/v2/DeleteObjectRequest.java | 2 +- .../v2/DeleteObjectRequestOrBuilder.java | 2 +- .../google/storage/v2/GetBucketRequest.java | 2 +- .../storage/v2/GetBucketRequestOrBuilder.java | 2 +- .../google/storage/v2/GetHmacKeyRequest.java | 2 +- .../v2/GetHmacKeyRequestOrBuilder.java | 2 +- .../v2/GetNotificationConfigRequest.java | 2 +- ...GetNotificationConfigRequestOrBuilder.java | 2 +- .../google/storage/v2/GetObjectRequest.java | 2 +- .../storage/v2/GetObjectRequestOrBuilder.java | 2 +- .../storage/v2/GetServiceAccountRequest.java | 2 +- .../v2/GetServiceAccountRequestOrBuilder.java | 2 +- .../google/storage/v2/HmacKeyMetadata.java | 2 +- .../storage/v2/HmacKeyMetadataOrBuilder.java | 2 +- .../google/storage/v2/ListBucketsRequest.java | 2 +- .../v2/ListBucketsRequestOrBuilder.java | 2 +- .../storage/v2/ListBucketsResponse.java | 2 +- .../v2/ListBucketsResponseOrBuilder.java | 2 +- .../storage/v2/ListHmacKeysRequest.java | 2 +- .../v2/ListHmacKeysRequestOrBuilder.java | 2 +- .../storage/v2/ListHmacKeysResponse.java | 2 +- .../v2/ListHmacKeysResponseOrBuilder.java | 2 +- .../v2/ListNotificationConfigsRequest.java | 2 +- ...stNotificationConfigsRequestOrBuilder.java | 2 +- .../v2/ListNotificationConfigsResponse.java | 2 +- ...tNotificationConfigsResponseOrBuilder.java | 2 +- .../google/storage/v2/ListObjectsRequest.java | 2 +- .../v2/ListObjectsRequestOrBuilder.java | 2 +- .../storage/v2/ListObjectsResponse.java | 2 +- .../v2/ListObjectsResponseOrBuilder.java | 2 +- .../v2/LockBucketRetentionPolicyRequest.java | 2 +- ...BucketRetentionPolicyRequestOrBuilder.java | 2 +- .../google/storage/v2/NotificationConfig.java | 2 +- .../v2/NotificationConfigOrBuilder.java | 2 +- .../java/com/google/storage/v2/Object.java | 2 +- .../storage/v2/ObjectAccessControl.java | 2 +- .../v2/ObjectAccessControlOrBuilder.java | 2 +- .../google/storage/v2/ObjectChecksums.java | 2 +- .../storage/v2/ObjectChecksumsOrBuilder.java | 2 +- .../google/storage/v2/ObjectOrBuilder.java | 2 +- .../java/com/google/storage/v2/Owner.java | 2 +- .../com/google/storage/v2/OwnerOrBuilder.java | 2 +- .../com/google/storage/v2/ProjectTeam.java | 2 +- .../storage/v2/ProjectTeamOrBuilder.java | 2 +- .../storage/v2/QueryWriteStatusRequest.java | 2 +- .../v2/QueryWriteStatusRequestOrBuilder.java | 2 +- .../storage/v2/QueryWriteStatusResponse.java | 2 +- .../v2/QueryWriteStatusResponseOrBuilder.java | 2 +- .../google/storage/v2/ReadObjectRequest.java | 2 +- .../v2/ReadObjectRequestOrBuilder.java | 2 +- .../google/storage/v2/ReadObjectResponse.java | 2 +- .../v2/ReadObjectResponseOrBuilder.java | 2 +- .../storage/v2/RestoreObjectRequest.java | 2 +- .../v2/RestoreObjectRequestOrBuilder.java | 2 +- .../storage/v2/RewriteObjectRequest.java | 2 +- .../v2/RewriteObjectRequestOrBuilder.java | 2 +- .../google/storage/v2/RewriteResponse.java | 2 +- .../storage/v2/RewriteResponseOrBuilder.java | 2 +- .../com/google/storage/v2/ServiceAccount.java | 2 +- .../storage/v2/ServiceAccountOrBuilder.java | 2 +- .../google/storage/v2/ServiceConstants.java | 2 +- .../storage/v2/ServiceConstantsOrBuilder.java | 2 +- .../v2/StartResumableWriteRequest.java | 2 +- .../StartResumableWriteRequestOrBuilder.java | 2 +- .../v2/StartResumableWriteResponse.java | 2 +- .../StartResumableWriteResponseOrBuilder.java | 2 +- .../com/google/storage/v2/StorageProto.java | 2 +- .../storage/v2/UpdateBucketRequest.java | 2 +- .../v2/UpdateBucketRequestOrBuilder.java | 2 +- .../storage/v2/UpdateHmacKeyRequest.java | 2 +- .../v2/UpdateHmacKeyRequestOrBuilder.java | 2 +- .../storage/v2/UpdateObjectRequest.java | 2 +- .../v2/UpdateObjectRequestOrBuilder.java | 2 +- .../google/storage/v2/WriteObjectRequest.java | 2 +- .../v2/WriteObjectRequestOrBuilder.java | 2 +- .../storage/v2/WriteObjectResponse.java | 2 +- .../v2/WriteObjectResponseOrBuilder.java | 2 +- .../google/storage/v2/WriteObjectSpec.java | 2 +- .../storage/v2/WriteObjectSpecOrBuilder.java | 2 +- .../QuickstartStorageControlSample.java | 9 +- .../transfermanager/DownloadBucket.java | 39 +- .../storage/transfermanager/DownloadMany.java | 27 +- .../transfermanager/UploadDirectory.java | 24 +- .../storage/transfermanager/UploadMany.java | 21 +- .../example/storage/QuickstartSampleIT.java | 6 +- .../ITTransferManagerSamples.java | 34 +- 174 files changed, 11491 insertions(+), 279 deletions(-) create mode 100644 grpc-google-cloud-storage-control-v2/clirr-ignored-differences.xml create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequest.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequestOrBuilder.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequest.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequestOrBuilder.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequest.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequestOrBuilder.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequest.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequestOrBuilder.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponse.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponseOrBuilder.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolder.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderName.java create mode 100644 proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderOrBuilder.java diff --git a/README.md b/README.md index b6472addff..37601a50f2 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud google-cloud-storage + + com.google.cloud + google-cloud-storage-control + ``` @@ -44,13 +48,18 @@ If you are using Maven without the BOM, add this to your dependencies: google-cloud-storage 2.36.0 + + com.google.cloud + google-cloud-storage-control + 2.36.0-alpha + ``` If you are using Gradle 5.x or later, add this to your dependencies: ```Groovy -implementation platform('com.google.cloud:libraries-bom:26.35.0') +implementation platform('com.google.cloud:libraries-bom:26.37.0') implementation 'com.google.cloud:google-cloud-storage' ``` @@ -233,6 +242,7 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/ | Quickstart Grpc Dp Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartGrpcDpSample.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/QuickstartGrpcDpSample.java) | | Quickstart Grpc Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartGrpcSample.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/QuickstartGrpcSample.java) | | Quickstart Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartSample.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/QuickstartSample.java) | +| Quickstart Storage Control Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.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/QuickstartStorageControlSample.java) | | Add Bucket Default Owner | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/AddBucketDefaultOwner.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/AddBucketDefaultOwner.java) | | Add Bucket Iam Conditional Binding | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamConditionalBinding.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamConditionalBinding.java) | | Add Bucket Iam Member | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamMember.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamMember.java) | @@ -337,6 +347,10 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/ | Upload Kms Encrypted Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/UploadKmsEncryptedObject.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/UploadKmsEncryptedObject.java) | | Upload Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/UploadObject.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/UploadObject.java) | | Upload Object From Memory | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.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/UploadObjectFromMemory.java) | +| Download Bucket | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.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/transfermanager/DownloadBucket.java) | +| Download Many | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.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/transfermanager/DownloadMany.java) | +| Upload Directory | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.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/transfermanager/UploadDirectory.java) | +| Upload Many | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.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/transfermanager/UploadMany.java) | diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java index 5a782fb283..a25fbd67ee 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java @@ -184,6 +184,83 @@ * * * + * + *

        CreateManagedFolder + *

        Creates a new managed folder. + * + *

        Request object method variants only take one parameter, a request object, which must be constructed before the call.

        + *
          + *
        • createManagedFolder(CreateManagedFolderRequest request) + *

        + *

        "Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

        + *
          + *
        • createManagedFolder(BucketName parent, ManagedFolder managedFolder, String managedFolderId) + *

        • createManagedFolder(String parent, ManagedFolder managedFolder, String managedFolderId) + *

        + *

        Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

        + *
          + *
        • createManagedFolderCallable() + *

        + * + * + * + *

        DeleteManagedFolder + *

        Permanently deletes an empty managed folder. + * + *

        Request object method variants only take one parameter, a request object, which must be constructed before the call.

        + *
          + *
        • deleteManagedFolder(DeleteManagedFolderRequest request) + *

        + *

        "Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

        + *
          + *
        • deleteManagedFolder(ManagedFolderName name) + *

        • deleteManagedFolder(String name) + *

        + *

        Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

        + *
          + *
        • deleteManagedFolderCallable() + *

        + * + * + * + *

        GetManagedFolder + *

        Returns metadata for the specified managed folder. + * + *

        Request object method variants only take one parameter, a request object, which must be constructed before the call.

        + *
          + *
        • getManagedFolder(GetManagedFolderRequest request) + *

        + *

        "Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

        + *
          + *
        • getManagedFolder(ManagedFolderName name) + *

        • getManagedFolder(String name) + *

        + *

        Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

        + *
          + *
        • getManagedFolderCallable() + *

        + * + * + * + *

        ListManagedFolders + *

        Retrieves a list of managed folders for a given bucket. + * + *

        Request object method variants only take one parameter, a request object, which must be constructed before the call.

        + *
          + *
        • listManagedFolders(ListManagedFoldersRequest request) + *

        + *

        "Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

        + *
          + *
        • listManagedFolders(BucketName parent) + *

        • listManagedFolders(String parent) + *

        + *

        Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

        + *
          + *
        • listManagedFoldersPagedCallable() + *

        • listManagedFoldersCallable() + *

        + * + * * * *

        See the individual methods for example code. @@ -310,7 +387,10 @@ public final OperationsClient getOperationsClient() { * @param folder Required. Properties of the new folder being created. The bucket and name of the * folder are specified in the parent and folder_id fields, respectively. Populating those * fields in `folder` will result in an error. - * @param folderId Required. The absolute path of the folder, using a single `/` as delimiter. + * @param folderId Required. The full name of a folder, including all its parent folders. Folders + * use single '/' characters as a delimiter. The folder_id must end with a slash. For example, + * the folder_id of "books/biographies/" would create a new "biographies/" folder under the + * "books/" folder. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ public final Folder createFolder(BucketName parent, Folder folder, String folderId) { @@ -347,7 +427,10 @@ public final Folder createFolder(BucketName parent, Folder folder, String folder * @param folder Required. Properties of the new folder being created. The bucket and name of the * folder are specified in the parent and folder_id fields, respectively. Populating those * fields in `folder` will result in an error. - * @param folderId Required. The absolute path of the folder, using a single `/` as delimiter. + * @param folderId Required. The full name of a folder, including all its parent folders. Folders + * use single '/' characters as a delimiter. The folder_id must end with a slash. For example, + * the folder_id of "books/biographies/" would create a new "biographies/" folder under the + * "books/" folder. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ public final Folder createFolder(String parent, Folder folder, String folderId) { @@ -1117,6 +1200,560 @@ public final UnaryCallable getStorageLay return stub.getStorageLayoutCallable(); } + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]");
        +   *   ManagedFolder managedFolder = ManagedFolder.newBuilder().build();
        +   *   String managedFolderId = "managedFolderId-2027084056";
        +   *   ManagedFolder response =
        +   *       storageControlClient.createManagedFolder(parent, managedFolder, managedFolderId);
        +   * }
        +   * }
        + * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @param managedFolder Required. Properties of the managed folder being created. The bucket and + * managed folder names are specified in the `parent` and `managed_folder_id` fields. + * Populating these fields in `managed_folder` will result in an error. + * @param managedFolderId Required. The name of the managed folder. It uses a single `/` as + * delimiter and leading and trailing `/` are allowed. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder createManagedFolder( + BucketName parent, ManagedFolder managedFolder, String managedFolderId) { + CreateManagedFolderRequest request = + CreateManagedFolderRequest.newBuilder() + .setParent(parent == null ? null : parent.toString()) + .setManagedFolder(managedFolder) + .setManagedFolderId(managedFolderId) + .build(); + return createManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   String parent = BucketName.of("[PROJECT]", "[BUCKET]").toString();
        +   *   ManagedFolder managedFolder = ManagedFolder.newBuilder().build();
        +   *   String managedFolderId = "managedFolderId-2027084056";
        +   *   ManagedFolder response =
        +   *       storageControlClient.createManagedFolder(parent, managedFolder, managedFolderId);
        +   * }
        +   * }
        + * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @param managedFolder Required. Properties of the managed folder being created. The bucket and + * managed folder names are specified in the `parent` and `managed_folder_id` fields. + * Populating these fields in `managed_folder` will result in an error. + * @param managedFolderId Required. The name of the managed folder. It uses a single `/` as + * delimiter and leading and trailing `/` are allowed. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder createManagedFolder( + String parent, ManagedFolder managedFolder, String managedFolderId) { + CreateManagedFolderRequest request = + CreateManagedFolderRequest.newBuilder() + .setParent(parent) + .setManagedFolder(managedFolder) + .setManagedFolderId(managedFolderId) + .build(); + return createManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   CreateManagedFolderRequest request =
        +   *       CreateManagedFolderRequest.newBuilder()
        +   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
        +   *           .setManagedFolder(ManagedFolder.newBuilder().build())
        +   *           .setManagedFolderId("managedFolderId-2027084056")
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   ManagedFolder response = storageControlClient.createManagedFolder(request);
        +   * }
        +   * }
        + * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder createManagedFolder(CreateManagedFolderRequest request) { + return createManagedFolderCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   CreateManagedFolderRequest request =
        +   *       CreateManagedFolderRequest.newBuilder()
        +   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
        +   *           .setManagedFolder(ManagedFolder.newBuilder().build())
        +   *           .setManagedFolderId("managedFolderId-2027084056")
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   ApiFuture future =
        +   *       storageControlClient.createManagedFolderCallable().futureCall(request);
        +   *   // Do something.
        +   *   ManagedFolder response = future.get();
        +   * }
        +   * }
        + */ + public final UnaryCallable + createManagedFolderCallable() { + return stub.createManagedFolderCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]");
        +   *   storageControlClient.deleteManagedFolder(name);
        +   * }
        +   * }
        + * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final void deleteManagedFolder(ManagedFolderName name) { + DeleteManagedFolderRequest request = + DeleteManagedFolderRequest.newBuilder() + .setName(name == null ? null : name.toString()) + .build(); + deleteManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   String name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString();
        +   *   storageControlClient.deleteManagedFolder(name);
        +   * }
        +   * }
        + * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final void deleteManagedFolder(String name) { + DeleteManagedFolderRequest request = + DeleteManagedFolderRequest.newBuilder().setName(name).build(); + deleteManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   DeleteManagedFolderRequest request =
        +   *       DeleteManagedFolderRequest.newBuilder()
        +   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
        +   *           .setIfMetagenerationMatch(1043427781)
        +   *           .setIfMetagenerationNotMatch(1025430873)
        +   *           .setAllowNonEmpty(true)
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   storageControlClient.deleteManagedFolder(request);
        +   * }
        +   * }
        + * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final void deleteManagedFolder(DeleteManagedFolderRequest request) { + deleteManagedFolderCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   DeleteManagedFolderRequest request =
        +   *       DeleteManagedFolderRequest.newBuilder()
        +   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
        +   *           .setIfMetagenerationMatch(1043427781)
        +   *           .setIfMetagenerationNotMatch(1025430873)
        +   *           .setAllowNonEmpty(true)
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   ApiFuture future =
        +   *       storageControlClient.deleteManagedFolderCallable().futureCall(request);
        +   *   // Do something.
        +   *   future.get();
        +   * }
        +   * }
        + */ + public final UnaryCallable deleteManagedFolderCallable() { + return stub.deleteManagedFolderCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]");
        +   *   ManagedFolder response = storageControlClient.getManagedFolder(name);
        +   * }
        +   * }
        + * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder getManagedFolder(ManagedFolderName name) { + GetManagedFolderRequest request = + GetManagedFolderRequest.newBuilder().setName(name == null ? null : name.toString()).build(); + return getManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   String name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString();
        +   *   ManagedFolder response = storageControlClient.getManagedFolder(name);
        +   * }
        +   * }
        + * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder getManagedFolder(String name) { + GetManagedFolderRequest request = GetManagedFolderRequest.newBuilder().setName(name).build(); + return getManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   GetManagedFolderRequest request =
        +   *       GetManagedFolderRequest.newBuilder()
        +   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
        +   *           .setIfMetagenerationMatch(1043427781)
        +   *           .setIfMetagenerationNotMatch(1025430873)
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   ManagedFolder response = storageControlClient.getManagedFolder(request);
        +   * }
        +   * }
        + * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder getManagedFolder(GetManagedFolderRequest request) { + return getManagedFolderCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   GetManagedFolderRequest request =
        +   *       GetManagedFolderRequest.newBuilder()
        +   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
        +   *           .setIfMetagenerationMatch(1043427781)
        +   *           .setIfMetagenerationNotMatch(1025430873)
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   ApiFuture future =
        +   *       storageControlClient.getManagedFolderCallable().futureCall(request);
        +   *   // Do something.
        +   *   ManagedFolder response = future.get();
        +   * }
        +   * }
        + */ + public final UnaryCallable getManagedFolderCallable() { + return stub.getManagedFolderCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]");
        +   *   for (ManagedFolder element : storageControlClient.listManagedFolders(parent).iterateAll()) {
        +   *     // doThingsWith(element);
        +   *   }
        +   * }
        +   * }
        + * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListManagedFoldersPagedResponse listManagedFolders(BucketName parent) { + ListManagedFoldersRequest request = + ListManagedFoldersRequest.newBuilder() + .setParent(parent == null ? null : parent.toString()) + .build(); + return listManagedFolders(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   String parent = BucketName.of("[PROJECT]", "[BUCKET]").toString();
        +   *   for (ManagedFolder element : storageControlClient.listManagedFolders(parent).iterateAll()) {
        +   *     // doThingsWith(element);
        +   *   }
        +   * }
        +   * }
        + * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListManagedFoldersPagedResponse listManagedFolders(String parent) { + ListManagedFoldersRequest request = + ListManagedFoldersRequest.newBuilder().setParent(parent).build(); + return listManagedFolders(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   ListManagedFoldersRequest request =
        +   *       ListManagedFoldersRequest.newBuilder()
        +   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
        +   *           .setPageSize(883849137)
        +   *           .setPageToken("pageToken873572522")
        +   *           .setPrefix("prefix-980110702")
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   for (ManagedFolder element : storageControlClient.listManagedFolders(request).iterateAll()) {
        +   *     // doThingsWith(element);
        +   *   }
        +   * }
        +   * }
        + * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListManagedFoldersPagedResponse listManagedFolders( + ListManagedFoldersRequest request) { + return listManagedFoldersPagedCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   ListManagedFoldersRequest request =
        +   *       ListManagedFoldersRequest.newBuilder()
        +   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
        +   *           .setPageSize(883849137)
        +   *           .setPageToken("pageToken873572522")
        +   *           .setPrefix("prefix-980110702")
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   ApiFuture future =
        +   *       storageControlClient.listManagedFoldersPagedCallable().futureCall(request);
        +   *   // Do something.
        +   *   for (ManagedFolder element : future.get().iterateAll()) {
        +   *     // doThingsWith(element);
        +   *   }
        +   * }
        +   * }
        + */ + public final UnaryCallable + listManagedFoldersPagedCallable() { + return stub.listManagedFoldersPagedCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

        Sample code: + * + *

        {@code
        +   * // This snippet has been automatically generated and should be regarded as a code template only.
        +   * // It will require modifications to work:
        +   * // - It may require correct/in-range values for request initialization.
        +   * // - It may require specifying regional endpoints when creating the service client as shown in
        +   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
        +   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
        +   *   ListManagedFoldersRequest request =
        +   *       ListManagedFoldersRequest.newBuilder()
        +   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
        +   *           .setPageSize(883849137)
        +   *           .setPageToken("pageToken873572522")
        +   *           .setPrefix("prefix-980110702")
        +   *           .setRequestId("requestId693933066")
        +   *           .build();
        +   *   while (true) {
        +   *     ListManagedFoldersResponse response =
        +   *         storageControlClient.listManagedFoldersCallable().call(request);
        +   *     for (ManagedFolder element : response.getManagedFoldersList()) {
        +   *       // doThingsWith(element);
        +   *     }
        +   *     String nextPageToken = response.getNextPageToken();
        +   *     if (!Strings.isNullOrEmpty(nextPageToken)) {
        +   *       request = request.toBuilder().setPageToken(nextPageToken).build();
        +   *     } else {
        +   *       break;
        +   *     }
        +   *   }
        +   * }
        +   * }
        + */ + public final UnaryCallable + listManagedFoldersCallable() { + return stub.listManagedFoldersCallable(); + } + @Override public final void close() { stub.close(); @@ -1219,4 +1856,84 @@ protected ListFoldersFixedSizeCollection createCollection( return new ListFoldersFixedSizeCollection(pages, collectionSize); } } + + public static class ListManagedFoldersPagedResponse + extends AbstractPagedListResponse< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ManagedFolder, + ListManagedFoldersPage, + ListManagedFoldersFixedSizeCollection> { + + public static ApiFuture createAsync( + PageContext context, + ApiFuture futureResponse) { + ApiFuture futurePage = + ListManagedFoldersPage.createEmptyPage().createPageAsync(context, futureResponse); + return ApiFutures.transform( + futurePage, + input -> new ListManagedFoldersPagedResponse(input), + MoreExecutors.directExecutor()); + } + + private ListManagedFoldersPagedResponse(ListManagedFoldersPage page) { + super(page, ListManagedFoldersFixedSizeCollection.createEmptyCollection()); + } + } + + public static class ListManagedFoldersPage + extends AbstractPage< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ManagedFolder, + ListManagedFoldersPage> { + + private ListManagedFoldersPage( + PageContext context, + ListManagedFoldersResponse response) { + super(context, response); + } + + private static ListManagedFoldersPage createEmptyPage() { + return new ListManagedFoldersPage(null, null); + } + + @Override + protected ListManagedFoldersPage createPage( + PageContext context, + ListManagedFoldersResponse response) { + return new ListManagedFoldersPage(context, response); + } + + @Override + public ApiFuture createPageAsync( + PageContext context, + ApiFuture futureResponse) { + return super.createPageAsync(context, futureResponse); + } + } + + public static class ListManagedFoldersFixedSizeCollection + extends AbstractFixedSizeCollection< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ManagedFolder, + ListManagedFoldersPage, + ListManagedFoldersFixedSizeCollection> { + + private ListManagedFoldersFixedSizeCollection( + List pages, int collectionSize) { + super(pages, collectionSize); + } + + private static ListManagedFoldersFixedSizeCollection createEmptyCollection() { + return new ListManagedFoldersFixedSizeCollection(null, 0); + } + + @Override + protected ListManagedFoldersFixedSizeCollection createCollection( + List pages, int collectionSize) { + return new ListManagedFoldersFixedSizeCollection(pages, collectionSize); + } + } } diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java index c7f37fa4ad..d63f5272a9 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.core.ApiFunction; import com.google.api.gax.core.GoogleCredentialsProvider; @@ -113,6 +114,29 @@ public UnaryCallSettings getStorageLayou return ((StorageControlStubSettings) getStubSettings()).getStorageLayoutSettings(); } + /** Returns the object with the settings used for calls to createManagedFolder. */ + public UnaryCallSettings + createManagedFolderSettings() { + return ((StorageControlStubSettings) getStubSettings()).createManagedFolderSettings(); + } + + /** Returns the object with the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings deleteManagedFolderSettings() { + return ((StorageControlStubSettings) getStubSettings()).deleteManagedFolderSettings(); + } + + /** Returns the object with the settings used for calls to getManagedFolder. */ + public UnaryCallSettings getManagedFolderSettings() { + return ((StorageControlStubSettings) getStubSettings()).getManagedFolderSettings(); + } + + /** Returns the object with the settings used for calls to listManagedFolders. */ + public PagedCallSettings< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return ((StorageControlStubSettings) getStubSettings()).listManagedFoldersSettings(); + } + public static final StorageControlSettings create(StorageControlStubSettings stub) throws IOException { return new StorageControlSettings.Builder(stub.toBuilder()).build(); @@ -248,6 +272,31 @@ public UnaryCallSettings.Builder renameFolderSet return getStubSettingsBuilder().getStorageLayoutSettings(); } + /** Returns the builder for the settings used for calls to createManagedFolder. */ + public UnaryCallSettings.Builder + createManagedFolderSettings() { + return getStubSettingsBuilder().createManagedFolderSettings(); + } + + /** Returns the builder for the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings.Builder + deleteManagedFolderSettings() { + return getStubSettingsBuilder().deleteManagedFolderSettings(); + } + + /** Returns the builder for the settings used for calls to getManagedFolder. */ + public UnaryCallSettings.Builder + getManagedFolderSettings() { + return getStubSettingsBuilder().getManagedFolderSettings(); + } + + /** Returns the builder for the settings used for calls to listManagedFolders. */ + public PagedCallSettings.Builder< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return getStubSettingsBuilder().listManagedFoldersSettings(); + } + @Override public StorageControlSettings build() throws IOException { return new StorageControlSettings(this); diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json index cafc1e3145..d2d8f4700a 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json @@ -13,18 +13,30 @@ "CreateFolder": { "methods": ["createFolder", "createFolder", "createFolder", "createFolderCallable"] }, + "CreateManagedFolder": { + "methods": ["createManagedFolder", "createManagedFolder", "createManagedFolder", "createManagedFolderCallable"] + }, "DeleteFolder": { "methods": ["deleteFolder", "deleteFolder", "deleteFolder", "deleteFolderCallable"] }, + "DeleteManagedFolder": { + "methods": ["deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolderCallable"] + }, "GetFolder": { "methods": ["getFolder", "getFolder", "getFolder", "getFolderCallable"] }, + "GetManagedFolder": { + "methods": ["getManagedFolder", "getManagedFolder", "getManagedFolder", "getManagedFolderCallable"] + }, "GetStorageLayout": { "methods": ["getStorageLayout", "getStorageLayout", "getStorageLayout", "getStorageLayoutCallable"] }, "ListFolders": { "methods": ["listFolders", "listFolders", "listFolders", "listFoldersPagedCallable", "listFoldersCallable"] }, + "ListManagedFolders": { + "methods": ["listManagedFolders", "listManagedFolders", "listManagedFolders", "listManagedFoldersPagedCallable", "listManagedFoldersCallable"] + }, "RenameFolder": { "methods": ["renameFolderAsync", "renameFolderAsync", "renameFolderAsync", "renameFolderOperationCallable", "renameFolderCallable"] } diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java index 3bd55270af..b075a0493e 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2.stub; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.gax.core.BackgroundResource; import com.google.api.gax.core.BackgroundResourceAggregation; @@ -32,12 +33,18 @@ import com.google.longrunning.stub.GrpcOperationsStub; import com.google.protobuf.Empty; import com.google.storage.control.v2.CreateFolderRequest; +import com.google.storage.control.v2.CreateManagedFolderRequest; import com.google.storage.control.v2.DeleteFolderRequest; +import com.google.storage.control.v2.DeleteManagedFolderRequest; import com.google.storage.control.v2.Folder; import com.google.storage.control.v2.GetFolderRequest; +import com.google.storage.control.v2.GetManagedFolderRequest; import com.google.storage.control.v2.GetStorageLayoutRequest; import com.google.storage.control.v2.ListFoldersRequest; import com.google.storage.control.v2.ListFoldersResponse; +import com.google.storage.control.v2.ListManagedFoldersRequest; +import com.google.storage.control.v2.ListManagedFoldersResponse; +import com.google.storage.control.v2.ManagedFolder; import com.google.storage.control.v2.RenameFolderMetadata; import com.google.storage.control.v2.RenameFolderRequest; import com.google.storage.control.v2.StorageLayout; @@ -109,6 +116,47 @@ public class GrpcStorageControlStub extends StorageControlStub { .setResponseMarshaller(ProtoUtils.marshaller(StorageLayout.getDefaultInstance())) .build(); + private static final MethodDescriptor + createManagedFolderMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/CreateManagedFolder") + .setRequestMarshaller( + ProtoUtils.marshaller(CreateManagedFolderRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(ManagedFolder.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + deleteManagedFolderMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/DeleteManagedFolder") + .setRequestMarshaller( + ProtoUtils.marshaller(DeleteManagedFolderRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(Empty.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + getManagedFolderMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/GetManagedFolder") + .setRequestMarshaller( + ProtoUtils.marshaller(GetManagedFolderRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(ManagedFolder.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + listManagedFoldersMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/ListManagedFolders") + .setRequestMarshaller( + ProtoUtils.marshaller(ListManagedFoldersRequest.getDefaultInstance())) + .setResponseMarshaller( + ProtoUtils.marshaller(ListManagedFoldersResponse.getDefaultInstance())) + .build(); + private final UnaryCallable createFolderCallable; private final UnaryCallable deleteFolderCallable; private final UnaryCallable getFolderCallable; @@ -119,6 +167,14 @@ public class GrpcStorageControlStub extends StorageControlStub { private final OperationCallable renameFolderOperationCallable; private final UnaryCallable getStorageLayoutCallable; + private final UnaryCallable + createManagedFolderCallable; + private final UnaryCallable deleteManagedFolderCallable; + private final UnaryCallable getManagedFolderCallable; + private final UnaryCallable + listManagedFoldersCallable; + private final UnaryCallable + listManagedFoldersPagedCallable; private final BackgroundResource backgroundResources; private final GrpcOperationsStub operationsStub; @@ -136,6 +192,14 @@ public class GrpcStorageControlStub extends StorageControlStub { PathTemplate.create("{bucket=projects/*/buckets/*}/**"); private static final PathTemplate GET_STORAGE_LAYOUT_0_PATH_TEMPLATE = PathTemplate.create("{bucket=projects/*/buckets/*}/**"); + private static final PathTemplate CREATE_MANAGED_FOLDER_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=**}"); + private static final PathTemplate DELETE_MANAGED_FOLDER_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=projects/*/buckets/*}/**"); + private static final PathTemplate GET_MANAGED_FOLDER_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=projects/*/buckets/*}/**"); + private static final PathTemplate LIST_MANAGED_FOLDERS_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=**}"); public static final GrpcStorageControlStub create(StorageControlStubSettings settings) throws IOException { @@ -277,6 +341,82 @@ protected GrpcStorageControlStub( return requestBuilder.build(); }) .build(); + GrpcCallSettings + createManagedFolderTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(createManagedFolderMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add( + request.getParent(), "bucket", CREATE_MANAGED_FOLDER_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + CreateManagedFolderRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); + GrpcCallSettings deleteManagedFolderTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(deleteManagedFolderMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add(request.getName(), "bucket", DELETE_MANAGED_FOLDER_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + DeleteManagedFolderRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); + GrpcCallSettings getManagedFolderTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(getManagedFolderMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add(request.getName(), "bucket", GET_MANAGED_FOLDER_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + GetManagedFolderRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); + GrpcCallSettings + listManagedFoldersTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(listManagedFoldersMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add( + request.getParent(), "bucket", LIST_MANAGED_FOLDERS_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + ListManagedFoldersRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); this.createFolderCallable = callableFactory.createUnaryCallable( @@ -305,6 +445,29 @@ protected GrpcStorageControlStub( this.getStorageLayoutCallable = callableFactory.createUnaryCallable( getStorageLayoutTransportSettings, settings.getStorageLayoutSettings(), clientContext); + this.createManagedFolderCallable = + callableFactory.createUnaryCallable( + createManagedFolderTransportSettings, + settings.createManagedFolderSettings(), + clientContext); + this.deleteManagedFolderCallable = + callableFactory.createUnaryCallable( + deleteManagedFolderTransportSettings, + settings.deleteManagedFolderSettings(), + clientContext); + this.getManagedFolderCallable = + callableFactory.createUnaryCallable( + getManagedFolderTransportSettings, settings.getManagedFolderSettings(), clientContext); + this.listManagedFoldersCallable = + callableFactory.createUnaryCallable( + listManagedFoldersTransportSettings, + settings.listManagedFoldersSettings(), + clientContext); + this.listManagedFoldersPagedCallable = + callableFactory.createPagedCallable( + listManagedFoldersTransportSettings, + settings.listManagedFoldersSettings(), + clientContext); this.backgroundResources = new BackgroundResourceAggregation(clientContext.getBackgroundResources()); @@ -355,6 +518,33 @@ public UnaryCallable getStorageLayoutCal return getStorageLayoutCallable; } + @Override + public UnaryCallable createManagedFolderCallable() { + return createManagedFolderCallable; + } + + @Override + public UnaryCallable deleteManagedFolderCallable() { + return deleteManagedFolderCallable; + } + + @Override + public UnaryCallable getManagedFolderCallable() { + return getManagedFolderCallable; + } + + @Override + public UnaryCallable + listManagedFoldersCallable() { + return listManagedFoldersCallable; + } + + @Override + public UnaryCallable + listManagedFoldersPagedCallable() { + return listManagedFoldersPagedCallable; + } + @Override public final void close() { try { diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java index 681466af98..46f3321d4a 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2.stub; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.gax.core.BackgroundResource; import com.google.api.gax.rpc.OperationCallable; @@ -25,12 +26,18 @@ import com.google.longrunning.stub.OperationsStub; import com.google.protobuf.Empty; import com.google.storage.control.v2.CreateFolderRequest; +import com.google.storage.control.v2.CreateManagedFolderRequest; import com.google.storage.control.v2.DeleteFolderRequest; +import com.google.storage.control.v2.DeleteManagedFolderRequest; import com.google.storage.control.v2.Folder; import com.google.storage.control.v2.GetFolderRequest; +import com.google.storage.control.v2.GetManagedFolderRequest; import com.google.storage.control.v2.GetStorageLayoutRequest; import com.google.storage.control.v2.ListFoldersRequest; import com.google.storage.control.v2.ListFoldersResponse; +import com.google.storage.control.v2.ListManagedFoldersRequest; +import com.google.storage.control.v2.ListManagedFoldersResponse; +import com.google.storage.control.v2.ManagedFolder; import com.google.storage.control.v2.RenameFolderMetadata; import com.google.storage.control.v2.RenameFolderRequest; import com.google.storage.control.v2.StorageLayout; @@ -82,6 +89,28 @@ public UnaryCallable getStorageLayoutCal throw new UnsupportedOperationException("Not implemented: getStorageLayoutCallable()"); } + public UnaryCallable createManagedFolderCallable() { + throw new UnsupportedOperationException("Not implemented: createManagedFolderCallable()"); + } + + public UnaryCallable deleteManagedFolderCallable() { + throw new UnsupportedOperationException("Not implemented: deleteManagedFolderCallable()"); + } + + public UnaryCallable getManagedFolderCallable() { + throw new UnsupportedOperationException("Not implemented: getManagedFolderCallable()"); + } + + public UnaryCallable + listManagedFoldersPagedCallable() { + throw new UnsupportedOperationException("Not implemented: listManagedFoldersPagedCallable()"); + } + + public UnaryCallable + listManagedFoldersCallable() { + throw new UnsupportedOperationException("Not implemented: listManagedFoldersCallable()"); + } + @Override public abstract void close(); } diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java index c1bf741c15..5b34d70054 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2.stub; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; @@ -50,12 +51,18 @@ import com.google.longrunning.Operation; import com.google.protobuf.Empty; import com.google.storage.control.v2.CreateFolderRequest; +import com.google.storage.control.v2.CreateManagedFolderRequest; import com.google.storage.control.v2.DeleteFolderRequest; +import com.google.storage.control.v2.DeleteManagedFolderRequest; import com.google.storage.control.v2.Folder; import com.google.storage.control.v2.GetFolderRequest; +import com.google.storage.control.v2.GetManagedFolderRequest; import com.google.storage.control.v2.GetStorageLayoutRequest; import com.google.storage.control.v2.ListFoldersRequest; import com.google.storage.control.v2.ListFoldersResponse; +import com.google.storage.control.v2.ListManagedFoldersRequest; +import com.google.storage.control.v2.ListManagedFoldersResponse; +import com.google.storage.control.v2.ManagedFolder; import com.google.storage.control.v2.RenameFolderMetadata; import com.google.storage.control.v2.RenameFolderRequest; import com.google.storage.control.v2.StorageLayout; @@ -122,6 +129,13 @@ public class StorageControlStubSettings extends StubSettings renameFolderOperationSettings; private final UnaryCallSettings getStorageLayoutSettings; + private final UnaryCallSettings + createManagedFolderSettings; + private final UnaryCallSettings deleteManagedFolderSettings; + private final UnaryCallSettings getManagedFolderSettings; + private final PagedCallSettings< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings; private static final PagedListDescriptor LIST_FOLDERS_PAGE_STR_DESC = @@ -159,6 +173,46 @@ public Iterable extractResources(ListFoldersResponse payload) { } }; + private static final PagedListDescriptor< + ListManagedFoldersRequest, ListManagedFoldersResponse, ManagedFolder> + LIST_MANAGED_FOLDERS_PAGE_STR_DESC = + new PagedListDescriptor< + ListManagedFoldersRequest, ListManagedFoldersResponse, ManagedFolder>() { + @Override + public String emptyToken() { + return ""; + } + + @Override + public ListManagedFoldersRequest injectToken( + ListManagedFoldersRequest payload, String token) { + return ListManagedFoldersRequest.newBuilder(payload).setPageToken(token).build(); + } + + @Override + public ListManagedFoldersRequest injectPageSize( + ListManagedFoldersRequest payload, int pageSize) { + return ListManagedFoldersRequest.newBuilder(payload).setPageSize(pageSize).build(); + } + + @Override + public Integer extractPageSize(ListManagedFoldersRequest payload) { + return payload.getPageSize(); + } + + @Override + public String extractNextToken(ListManagedFoldersResponse payload) { + return payload.getNextPageToken(); + } + + @Override + public Iterable extractResources(ListManagedFoldersResponse payload) { + return payload.getManagedFoldersList() == null + ? ImmutableList.of() + : payload.getManagedFoldersList(); + } + }; + private static final PagedListResponseFactory< ListFoldersRequest, ListFoldersResponse, ListFoldersPagedResponse> LIST_FOLDERS_PAGE_STR_FACT = @@ -176,6 +230,27 @@ public ApiFuture getFuturePagedResponse( } }; + private static final PagedListResponseFactory< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + LIST_MANAGED_FOLDERS_PAGE_STR_FACT = + new PagedListResponseFactory< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ListManagedFoldersPagedResponse>() { + @Override + public ApiFuture getFuturePagedResponse( + UnaryCallable callable, + ListManagedFoldersRequest request, + ApiCallContext context, + ApiFuture futureResponse) { + PageContext + pageContext = + PageContext.create( + callable, LIST_MANAGED_FOLDERS_PAGE_STR_DESC, request, context); + return ListManagedFoldersPagedResponse.createAsync(pageContext, futureResponse); + } + }; + /** Returns the object with the settings used for calls to createFolder. */ public UnaryCallSettings createFolderSettings() { return createFolderSettings; @@ -213,6 +288,29 @@ public UnaryCallSettings getStorageLayou return getStorageLayoutSettings; } + /** Returns the object with the settings used for calls to createManagedFolder. */ + public UnaryCallSettings + createManagedFolderSettings() { + return createManagedFolderSettings; + } + + /** Returns the object with the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings deleteManagedFolderSettings() { + return deleteManagedFolderSettings; + } + + /** Returns the object with the settings used for calls to getManagedFolder. */ + public UnaryCallSettings getManagedFolderSettings() { + return getManagedFolderSettings; + } + + /** Returns the object with the settings used for calls to listManagedFolders. */ + public PagedCallSettings< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return listManagedFoldersSettings; + } + public StorageControlStub createStub() throws IOException { if (getTransportChannelProvider() .getTransportName() @@ -309,6 +407,10 @@ protected StorageControlStubSettings(Builder settingsBuilder) throws IOException renameFolderSettings = settingsBuilder.renameFolderSettings().build(); renameFolderOperationSettings = settingsBuilder.renameFolderOperationSettings().build(); getStorageLayoutSettings = settingsBuilder.getStorageLayoutSettings().build(); + createManagedFolderSettings = settingsBuilder.createManagedFolderSettings().build(); + deleteManagedFolderSettings = settingsBuilder.deleteManagedFolderSettings().build(); + getManagedFolderSettings = settingsBuilder.getManagedFolderSettings().build(); + listManagedFoldersSettings = settingsBuilder.listManagedFoldersSettings().build(); } /** Builder for StorageControlStubSettings. */ @@ -325,6 +427,15 @@ public static class Builder extends StubSettings.Builder getStorageLayoutSettings; + private final UnaryCallSettings.Builder + createManagedFolderSettings; + private final UnaryCallSettings.Builder + deleteManagedFolderSettings; + private final UnaryCallSettings.Builder + getManagedFolderSettings; + private final PagedCallSettings.Builder< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings; private static final ImmutableMap> RETRYABLE_CODE_DEFINITIONS; @@ -386,6 +497,10 @@ protected Builder(ClientContext clientContext) { renameFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); renameFolderOperationSettings = OperationCallSettings.newBuilder(); getStorageLayoutSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + createManagedFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + deleteManagedFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + getManagedFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + listManagedFoldersSettings = PagedCallSettings.newBuilder(LIST_MANAGED_FOLDERS_PAGE_STR_FACT); unaryMethodSettingsBuilders = ImmutableList.>of( @@ -394,7 +509,11 @@ protected Builder(ClientContext clientContext) { getFolderSettings, listFoldersSettings, renameFolderSettings, - getStorageLayoutSettings); + getStorageLayoutSettings, + createManagedFolderSettings, + deleteManagedFolderSettings, + getManagedFolderSettings, + listManagedFoldersSettings); initDefaults(this); } @@ -408,6 +527,10 @@ protected Builder(StorageControlStubSettings settings) { renameFolderSettings = settings.renameFolderSettings.toBuilder(); renameFolderOperationSettings = settings.renameFolderOperationSettings.toBuilder(); getStorageLayoutSettings = settings.getStorageLayoutSettings.toBuilder(); + createManagedFolderSettings = settings.createManagedFolderSettings.toBuilder(); + deleteManagedFolderSettings = settings.deleteManagedFolderSettings.toBuilder(); + getManagedFolderSettings = settings.getManagedFolderSettings.toBuilder(); + listManagedFoldersSettings = settings.listManagedFoldersSettings.toBuilder(); unaryMethodSettingsBuilders = ImmutableList.>of( @@ -416,7 +539,11 @@ protected Builder(StorageControlStubSettings settings) { getFolderSettings, listFoldersSettings, renameFolderSettings, - getStorageLayoutSettings); + getStorageLayoutSettings, + createManagedFolderSettings, + deleteManagedFolderSettings, + getManagedFolderSettings, + listManagedFoldersSettings); } private static Builder createDefault() { @@ -462,6 +589,26 @@ private static Builder initDefaults(Builder builder) { .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes")) .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params")); + builder + .createManagedFolderSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_1_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_1_params")); + + builder + .deleteManagedFolderSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_1_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_1_params")); + + builder + .getManagedFolderSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params")); + + builder + .listManagedFoldersSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params")); + builder .renameFolderOperationSettings() .setInitialCallSettings( @@ -543,6 +690,31 @@ public UnaryCallSettings.Builder renameFolderSet return getStorageLayoutSettings; } + /** Returns the builder for the settings used for calls to createManagedFolder. */ + public UnaryCallSettings.Builder + createManagedFolderSettings() { + return createManagedFolderSettings; + } + + /** Returns the builder for the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings.Builder + deleteManagedFolderSettings() { + return deleteManagedFolderSettings; + } + + /** Returns the builder for the settings used for calls to getManagedFolder. */ + public UnaryCallSettings.Builder + getManagedFolderSettings() { + return getManagedFolderSettings; + } + + /** Returns the builder for the settings used for calls to listManagedFolders. */ + public PagedCallSettings.Builder< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return listManagedFoldersSettings; + } + /** Returns the endpoint set by the user or the the service's default endpoint. */ @Override public String getEndpoint() { diff --git a/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json b/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json index ed0d3222c3..36399f5086 100644 --- a/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json +++ b/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json @@ -1439,6 +1439,24 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.CreateManagedFolderRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.CreateManagedFolderRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.DeleteFolderRequest", "queryAllDeclaredConstructors": true, @@ -1457,6 +1475,24 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.DeleteManagedFolderRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.DeleteManagedFolderRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.Folder", "queryAllDeclaredConstructors": true, @@ -1493,6 +1529,24 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.GetManagedFolderRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.GetManagedFolderRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.GetStorageLayoutRequest", "queryAllDeclaredConstructors": true, @@ -1547,6 +1601,60 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersResponse", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersResponse$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ManagedFolder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ManagedFolder$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.PendingRenameInfo", "queryAllDeclaredConstructors": true, diff --git a/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json b/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json index cafc1e3145..d2d8f4700a 100644 --- a/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json +++ b/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json @@ -13,18 +13,30 @@ "CreateFolder": { "methods": ["createFolder", "createFolder", "createFolder", "createFolderCallable"] }, + "CreateManagedFolder": { + "methods": ["createManagedFolder", "createManagedFolder", "createManagedFolder", "createManagedFolderCallable"] + }, "DeleteFolder": { "methods": ["deleteFolder", "deleteFolder", "deleteFolder", "deleteFolderCallable"] }, + "DeleteManagedFolder": { + "methods": ["deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolderCallable"] + }, "GetFolder": { "methods": ["getFolder", "getFolder", "getFolder", "getFolderCallable"] }, + "GetManagedFolder": { + "methods": ["getManagedFolder", "getManagedFolder", "getManagedFolder", "getManagedFolderCallable"] + }, "GetStorageLayout": { "methods": ["getStorageLayout", "getStorageLayout", "getStorageLayout", "getStorageLayoutCallable"] }, "ListFolders": { "methods": ["listFolders", "listFolders", "listFolders", "listFoldersPagedCallable", "listFoldersCallable"] }, + "ListManagedFolders": { + "methods": ["listManagedFolders", "listManagedFolders", "listManagedFolders", "listManagedFoldersPagedCallable", "listManagedFoldersCallable"] + }, "RenameFolder": { "methods": ["renameFolderAsync", "renameFolderAsync", "renameFolderAsync", "renameFolderOperationCallable", "renameFolderCallable"] } diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java index 0177422a92..e049667af3 100644 --- a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java +++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java @@ -182,4 +182,89 @@ public void getStorageLayout( Exception.class.getName()))); } } + + @Override + public void createManagedFolder( + CreateManagedFolderRequest request, StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof ManagedFolder) { + requests.add(request); + responseObserver.onNext(((ManagedFolder) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method CreateManagedFolder, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + ManagedFolder.class.getName(), + Exception.class.getName()))); + } + } + + @Override + public void deleteManagedFolder( + DeleteManagedFolderRequest request, StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof Empty) { + requests.add(request); + responseObserver.onNext(((Empty) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method DeleteManagedFolder, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + Empty.class.getName(), + Exception.class.getName()))); + } + } + + @Override + public void getManagedFolder( + GetManagedFolderRequest request, StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof ManagedFolder) { + requests.add(request); + responseObserver.onNext(((ManagedFolder) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method GetManagedFolder, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + ManagedFolder.class.getName(), + Exception.class.getName()))); + } + } + + @Override + public void listManagedFolders( + ListManagedFoldersRequest request, + StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof ListManagedFoldersResponse) { + requests.add(request); + responseObserver.onNext(((ListManagedFoldersResponse) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method ListManagedFolders, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + ListManagedFoldersResponse.class.getName(), + Exception.class.getName()))); + } + } } diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java index 8559283b16..5ac98ecfe2 100644 --- a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java +++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.gax.core.NoCredentialsProvider; import com.google.api.gax.grpc.GaxGrpcProperties; @@ -609,4 +610,338 @@ public void getStorageLayoutExceptionTest2() throws Exception { // Expected exception. } } + + @Test + public void createManagedFolderTest() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + + ManagedFolder actualResponse = + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + CreateManagedFolderRequest actualRequest = ((CreateManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(parent.toString(), actualRequest.getParent()); + Assert.assertEquals(managedFolder, actualRequest.getManagedFolder()); + Assert.assertEquals(managedFolderId, actualRequest.getManagedFolderId()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void createManagedFolderExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void createManagedFolderTest2() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + String parent = "parent-995424086"; + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + + ManagedFolder actualResponse = + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + CreateManagedFolderRequest actualRequest = ((CreateManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(parent, actualRequest.getParent()); + Assert.assertEquals(managedFolder, actualRequest.getManagedFolder()); + Assert.assertEquals(managedFolderId, actualRequest.getManagedFolderId()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void createManagedFolderExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String parent = "parent-995424086"; + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void deleteManagedFolderTest() throws Exception { + Empty expectedResponse = Empty.newBuilder().build(); + mockStorageControl.addResponse(expectedResponse); + + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + + client.deleteManagedFolder(name); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + DeleteManagedFolderRequest actualRequest = ((DeleteManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name.toString(), actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void deleteManagedFolderExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + client.deleteManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void deleteManagedFolderTest2() throws Exception { + Empty expectedResponse = Empty.newBuilder().build(); + mockStorageControl.addResponse(expectedResponse); + + String name = "name3373707"; + + client.deleteManagedFolder(name); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + DeleteManagedFolderRequest actualRequest = ((DeleteManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name, actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void deleteManagedFolderExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String name = "name3373707"; + client.deleteManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getManagedFolderTest() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + + ManagedFolder actualResponse = client.getManagedFolder(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + GetManagedFolderRequest actualRequest = ((GetManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name.toString(), actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void getManagedFolderExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + client.getManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getManagedFolderTest2() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + String name = "name3373707"; + + ManagedFolder actualResponse = client.getManagedFolder(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + GetManagedFolderRequest actualRequest = ((GetManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name, actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void getManagedFolderExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String name = "name3373707"; + client.getManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void listManagedFoldersTest() throws Exception { + ManagedFolder responsesElement = ManagedFolder.newBuilder().build(); + ListManagedFoldersResponse expectedResponse = + ListManagedFoldersResponse.newBuilder() + .setNextPageToken("") + .addAllManagedFolders(Arrays.asList(responsesElement)) + .build(); + mockStorageControl.addResponse(expectedResponse); + + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + + ListManagedFoldersPagedResponse pagedListResponse = client.listManagedFolders(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getManagedFoldersList().get(0), resources.get(0)); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + ListManagedFoldersRequest actualRequest = ((ListManagedFoldersRequest) actualRequests.get(0)); + + Assert.assertEquals(parent.toString(), actualRequest.getParent()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void listManagedFoldersExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + client.listManagedFolders(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void listManagedFoldersTest2() throws Exception { + ManagedFolder responsesElement = ManagedFolder.newBuilder().build(); + ListManagedFoldersResponse expectedResponse = + ListManagedFoldersResponse.newBuilder() + .setNextPageToken("") + .addAllManagedFolders(Arrays.asList(responsesElement)) + .build(); + mockStorageControl.addResponse(expectedResponse); + + String parent = "parent-995424086"; + + ListManagedFoldersPagedResponse pagedListResponse = client.listManagedFolders(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getManagedFoldersList().get(0), resources.get(0)); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + ListManagedFoldersRequest actualRequest = ((ListManagedFoldersRequest) actualRequests.get(0)); + + Assert.assertEquals(parent, actualRequest.getParent()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void listManagedFoldersExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String parent = "parent-995424086"; + client.listManagedFolders(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } } diff --git a/grpc-google-cloud-storage-control-v2/clirr-ignored-differences.xml b/grpc-google-cloud-storage-control-v2/clirr-ignored-differences.xml new file mode 100644 index 0000000000..255b634844 --- /dev/null +++ b/grpc-google-cloud-storage-control-v2/clirr-ignored-differences.xml @@ -0,0 +1,41 @@ + + + + + + + 7012 + com/google/storage/control/v2/* + * deleteManagedFolder(*) + + + 7012 + com/google/storage/control/v2/* + * createManagedFolder(*) + + + 7012 + com/google/storage/control/v2/* + * getManagedFolder(*) + + + 7012 + com/google/storage/control/v2/* + * listManagedFolders(*) + + \ No newline at end of file diff --git a/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java b/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java index 638138a560..476945a178 100644 --- a/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java +++ b/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java @@ -298,6 +298,193 @@ private StorageControlGrpc() {} return getGetStorageLayoutMethod; } + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getCreateManagedFolderMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "CreateManagedFolder", + requestType = com.google.storage.control.v2.CreateManagedFolderRequest.class, + responseType = com.google.storage.control.v2.ManagedFolder.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getCreateManagedFolderMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getCreateManagedFolderMethod; + if ((getCreateManagedFolderMethod = StorageControlGrpc.getCreateManagedFolderMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getCreateManagedFolderMethod = StorageControlGrpc.getCreateManagedFolderMethod) + == null) { + StorageControlGrpc.getCreateManagedFolderMethod = + getCreateManagedFolderMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName( + generateFullMethodName(SERVICE_NAME, "CreateManagedFolder")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.CreateManagedFolderRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ManagedFolder.getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("CreateManagedFolder")) + .build(); + } + } + } + return getCreateManagedFolderMethod; + } + + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.DeleteManagedFolderRequest, com.google.protobuf.Empty> + getDeleteManagedFolderMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "DeleteManagedFolder", + requestType = com.google.storage.control.v2.DeleteManagedFolderRequest.class, + responseType = com.google.protobuf.Empty.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.DeleteManagedFolderRequest, com.google.protobuf.Empty> + getDeleteManagedFolderMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.DeleteManagedFolderRequest, com.google.protobuf.Empty> + getDeleteManagedFolderMethod; + if ((getDeleteManagedFolderMethod = StorageControlGrpc.getDeleteManagedFolderMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getDeleteManagedFolderMethod = StorageControlGrpc.getDeleteManagedFolderMethod) + == null) { + StorageControlGrpc.getDeleteManagedFolderMethod = + getDeleteManagedFolderMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName( + generateFullMethodName(SERVICE_NAME, "DeleteManagedFolder")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.DeleteManagedFolderRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.protobuf.Empty.getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("DeleteManagedFolder")) + .build(); + } + } + } + return getDeleteManagedFolderMethod; + } + + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getGetManagedFolderMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "GetManagedFolder", + requestType = com.google.storage.control.v2.GetManagedFolderRequest.class, + responseType = com.google.storage.control.v2.ManagedFolder.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getGetManagedFolderMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getGetManagedFolderMethod; + if ((getGetManagedFolderMethod = StorageControlGrpc.getGetManagedFolderMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getGetManagedFolderMethod = StorageControlGrpc.getGetManagedFolderMethod) == null) { + StorageControlGrpc.getGetManagedFolderMethod = + getGetManagedFolderMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetManagedFolder")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.GetManagedFolderRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ManagedFolder.getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("GetManagedFolder")) + .build(); + } + } + } + return getGetManagedFolderMethod; + } + + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse> + getListManagedFoldersMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "ListManagedFolders", + requestType = com.google.storage.control.v2.ListManagedFoldersRequest.class, + responseType = com.google.storage.control.v2.ListManagedFoldersResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse> + getListManagedFoldersMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse> + getListManagedFoldersMethod; + if ((getListManagedFoldersMethod = StorageControlGrpc.getListManagedFoldersMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getListManagedFoldersMethod = StorageControlGrpc.getListManagedFoldersMethod) + == null) { + StorageControlGrpc.getListManagedFoldersMethod = + getListManagedFoldersMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "ListManagedFolders")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ListManagedFoldersRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ListManagedFoldersResponse + .getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("ListManagedFolders")) + .build(); + } + } + } + return getListManagedFoldersMethod; + } + /** Creates a new async stub that supports all call types for the service */ public static StorageControlStub newStub(io.grpc.Channel channel) { io.grpc.stub.AbstractStub.StubFactory factory = @@ -433,6 +620,63 @@ default void getStorageLayout( io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( getGetStorageLayoutMethod(), responseObserver); } + + /** + * + * + *
        +     * Creates a new managed folder.
        +     * 
        + */ + default void createManagedFolder( + com.google.storage.control.v2.CreateManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getCreateManagedFolderMethod(), responseObserver); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + default void deleteManagedFolder( + com.google.storage.control.v2.DeleteManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getDeleteManagedFolderMethod(), responseObserver); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + default void getManagedFolder( + com.google.storage.control.v2.GetManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getGetManagedFolderMethod(), responseObserver); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + default void listManagedFolders( + com.google.storage.control.v2.ListManagedFoldersRequest request, + io.grpc.stub.StreamObserver + responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getListManagedFoldersMethod(), responseObserver); + } } /** @@ -565,6 +809,71 @@ public void getStorageLayout( request, responseObserver); } + + /** + * + * + *
        +     * Creates a new managed folder.
        +     * 
        + */ + public void createManagedFolder( + com.google.storage.control.v2.CreateManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getCreateManagedFolderMethod(), getCallOptions()), + request, + responseObserver); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + public void deleteManagedFolder( + com.google.storage.control.v2.DeleteManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getDeleteManagedFolderMethod(), getCallOptions()), + request, + responseObserver); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + public void getManagedFolder( + com.google.storage.control.v2.GetManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetManagedFolderMethod(), getCallOptions()), + request, + responseObserver); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + public void listManagedFolders( + com.google.storage.control.v2.ListManagedFoldersRequest request, + io.grpc.stub.StreamObserver + responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getListManagedFoldersMethod(), getCallOptions()), + request, + responseObserver); + } } /** @@ -665,6 +974,58 @@ public com.google.storage.control.v2.StorageLayout getStorageLayout( return io.grpc.stub.ClientCalls.blockingUnaryCall( getChannel(), getGetStorageLayoutMethod(), getCallOptions(), request); } + + /** + * + * + *
        +     * Creates a new managed folder.
        +     * 
        + */ + public com.google.storage.control.v2.ManagedFolder createManagedFolder( + com.google.storage.control.v2.CreateManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getCreateManagedFolderMethod(), getCallOptions(), request); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + public com.google.protobuf.Empty deleteManagedFolder( + com.google.storage.control.v2.DeleteManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getDeleteManagedFolderMethod(), getCallOptions(), request); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + public com.google.storage.control.v2.ManagedFolder getManagedFolder( + com.google.storage.control.v2.GetManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetManagedFolderMethod(), getCallOptions(), request); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + public com.google.storage.control.v2.ListManagedFoldersResponse listManagedFolders( + com.google.storage.control.v2.ListManagedFoldersRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getListManagedFoldersMethod(), getCallOptions(), request); + } } /** @@ -767,6 +1128,61 @@ protected StorageControlFutureStub build( return io.grpc.stub.ClientCalls.futureUnaryCall( getChannel().newCall(getGetStorageLayoutMethod(), getCallOptions()), request); } + + /** + * + * + *
        +     * Creates a new managed folder.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture< + com.google.storage.control.v2.ManagedFolder> + createManagedFolder(com.google.storage.control.v2.CreateManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getCreateManagedFolderMethod(), getCallOptions()), request); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture + deleteManagedFolder(com.google.storage.control.v2.DeleteManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getDeleteManagedFolderMethod(), getCallOptions()), request); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture< + com.google.storage.control.v2.ManagedFolder> + getManagedFolder(com.google.storage.control.v2.GetManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetManagedFolderMethod(), getCallOptions()), request); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture< + com.google.storage.control.v2.ListManagedFoldersResponse> + listManagedFolders(com.google.storage.control.v2.ListManagedFoldersRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getListManagedFoldersMethod(), getCallOptions()), request); + } } private static final int METHODID_CREATE_FOLDER = 0; @@ -775,6 +1191,10 @@ protected StorageControlFutureStub build( private static final int METHODID_LIST_FOLDERS = 3; private static final int METHODID_RENAME_FOLDER = 4; private static final int METHODID_GET_STORAGE_LAYOUT = 5; + private static final int METHODID_CREATE_MANAGED_FOLDER = 6; + private static final int METHODID_DELETE_MANAGED_FOLDER = 7; + private static final int METHODID_GET_MANAGED_FOLDER = 8; + private static final int METHODID_LIST_MANAGED_FOLDERS = 9; private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -825,6 +1245,30 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_CREATE_MANAGED_FOLDER: + serviceImpl.createManagedFolder( + (com.google.storage.control.v2.CreateManagedFolderRequest) request, + (io.grpc.stub.StreamObserver) + responseObserver); + break; + case METHODID_DELETE_MANAGED_FOLDER: + serviceImpl.deleteManagedFolder( + (com.google.storage.control.v2.DeleteManagedFolderRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_MANAGED_FOLDER: + serviceImpl.getManagedFolder( + (com.google.storage.control.v2.GetManagedFolderRequest) request, + (io.grpc.stub.StreamObserver) + responseObserver); + break; + case METHODID_LIST_MANAGED_FOLDERS: + serviceImpl.listManagedFolders( + (com.google.storage.control.v2.ListManagedFoldersRequest) request, + (io.grpc.stub.StreamObserver< + com.google.storage.control.v2.ListManagedFoldersResponse>) + responseObserver); + break; default: throw new AssertionError(); } @@ -881,6 +1325,33 @@ public static final io.grpc.ServerServiceDefinition bindService(AsyncService ser com.google.storage.control.v2.GetStorageLayoutRequest, com.google.storage.control.v2.StorageLayout>( service, METHODID_GET_STORAGE_LAYOUT))) + .addMethod( + getCreateManagedFolderMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder>( + service, METHODID_CREATE_MANAGED_FOLDER))) + .addMethod( + getDeleteManagedFolderMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.DeleteManagedFolderRequest, + com.google.protobuf.Empty>(service, METHODID_DELETE_MANAGED_FOLDER))) + .addMethod( + getGetManagedFolderMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder>( + service, METHODID_GET_MANAGED_FOLDER))) + .addMethod( + getListManagedFoldersMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse>( + service, METHODID_LIST_MANAGED_FOLDERS))) .build(); } @@ -938,6 +1409,10 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getListFoldersMethod()) .addMethod(getRenameFolderMethod()) .addMethod(getGetStorageLayoutMethod()) + .addMethod(getCreateManagedFolderMethod()) + .addMethod(getDeleteManagedFolderMethod()) + .addMethod(getGetManagedFolderMethod()) + .addMethod(getListManagedFoldersMethod()) .build(); } } diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java index 450d880c9c..c5d0bb3ced 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java index 0428e34e02..e203b7dacb 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface CommonLongRunningOperationMetadataOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java index 53c70b3c54..9fe4ed2e72 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** @@ -187,7 +187,11 @@ public com.google.storage.control.v2.FolderOrBuilder getFolderOrBuilder() { * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -210,7 +214,11 @@ public java.lang.String getFolderId() { * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1105,7 +1113,11 @@ public com.google.storage.control.v2.FolderOrBuilder getFolderOrBuilder() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1127,7 +1139,11 @@ public java.lang.String getFolderId() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1149,7 +1165,11 @@ public com.google.protobuf.ByteString getFolderIdBytes() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1170,7 +1190,11 @@ public Builder setFolderId(java.lang.String value) { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1187,7 +1211,11 @@ public Builder clearFolderId() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java index 9d93558a4b..38b0041b5a 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface CreateFolderRequestOrBuilder @@ -104,7 +104,11 @@ public interface CreateFolderRequestOrBuilder * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -116,7 +120,11 @@ public interface CreateFolderRequestOrBuilder * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequest.java new file mode 100644 index 0000000000..7442427387 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequest.java @@ -0,0 +1,1373 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Request message for CreateManagedFolder.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.CreateManagedFolderRequest} + */ +public final class CreateManagedFolderRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.CreateManagedFolderRequest) + CreateManagedFolderRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use CreateManagedFolderRequest.newBuilder() to construct. + private CreateManagedFolderRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private CreateManagedFolderRequest() { + parent_ = ""; + managedFolderId_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new CreateManagedFolderRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.CreateManagedFolderRequest.class, + com.google.storage.control.v2.CreateManagedFolderRequest.Builder.class); + } + + private int bitField0_; + public static final int PARENT_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object parent_ = ""; + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + @java.lang.Override + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + @java.lang.Override + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int MANAGED_FOLDER_FIELD_NUMBER = 2; + private com.google.storage.control.v2.ManagedFolder managedFolder_; + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return Whether the managedFolder field is set. + */ + @java.lang.Override + public boolean hasManagedFolder() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return The managedFolder. + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getManagedFolder() { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFolderOrBuilder() { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } + + public static final int MANAGED_FOLDER_ID_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object managedFolderId_ = ""; + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The managedFolderId. + */ + @java.lang.Override + public java.lang.String getManagedFolderId() { + java.lang.Object ref = managedFolderId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + managedFolderId_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The bytes for managedFolderId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getManagedFolderIdBytes() { + java.lang.Object ref = managedFolderId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + managedFolderId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REQUEST_ID_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, parent_); + } + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(2, getManagedFolder()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(managedFolderId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, managedFolderId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, requestId_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, parent_); + } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getManagedFolder()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(managedFolderId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, managedFolderId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, requestId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.CreateManagedFolderRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.CreateManagedFolderRequest other = + (com.google.storage.control.v2.CreateManagedFolderRequest) obj; + + if (!getParent().equals(other.getParent())) return false; + if (hasManagedFolder() != other.hasManagedFolder()) return false; + if (hasManagedFolder()) { + if (!getManagedFolder().equals(other.getManagedFolder())) return false; + } + if (!getManagedFolderId().equals(other.getManagedFolderId())) return false; + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PARENT_FIELD_NUMBER; + hash = (53 * hash) + getParent().hashCode(); + if (hasManagedFolder()) { + hash = (37 * hash) + MANAGED_FOLDER_FIELD_NUMBER; + hash = (53 * hash) + getManagedFolder().hashCode(); + } + hash = (37 * hash) + MANAGED_FOLDER_ID_FIELD_NUMBER; + hash = (53 * hash) + getManagedFolderId().hashCode(); + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.CreateManagedFolderRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Request message for CreateManagedFolder.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.CreateManagedFolderRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.CreateManagedFolderRequest) + com.google.storage.control.v2.CreateManagedFolderRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.CreateManagedFolderRequest.class, + com.google.storage.control.v2.CreateManagedFolderRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.CreateManagedFolderRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getManagedFolderFieldBuilder(); + } + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + parent_ = ""; + managedFolder_ = null; + if (managedFolderBuilder_ != null) { + managedFolderBuilder_.dispose(); + managedFolderBuilder_ = null; + } + managedFolderId_ = ""; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.CreateManagedFolderRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest build() { + com.google.storage.control.v2.CreateManagedFolderRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest buildPartial() { + com.google.storage.control.v2.CreateManagedFolderRequest result = + new com.google.storage.control.v2.CreateManagedFolderRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.CreateManagedFolderRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.parent_ = parent_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.managedFolder_ = + managedFolderBuilder_ == null ? managedFolder_ : managedFolderBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.managedFolderId_ = managedFolderId_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.requestId_ = requestId_; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.CreateManagedFolderRequest) { + return mergeFrom((com.google.storage.control.v2.CreateManagedFolderRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.CreateManagedFolderRequest other) { + if (other == com.google.storage.control.v2.CreateManagedFolderRequest.getDefaultInstance()) + return this; + if (!other.getParent().isEmpty()) { + parent_ = other.parent_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasManagedFolder()) { + mergeManagedFolder(other.getManagedFolder()); + } + if (!other.getManagedFolderId().isEmpty()) { + managedFolderId_ = other.managedFolderId_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000008; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + parent_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: + { + input.readMessage(getManagedFolderFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000002; + break; + } // case 18 + case 26: + { + managedFolderId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } // case 26 + case 34: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } // case 34 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object parent_ = ""; + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The parent to set. + * @return This builder for chaining. + */ + public Builder setParent(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearParent() { + parent_ = getDefaultInstance().getParent(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for parent to set. + * @return This builder for chaining. + */ + public Builder setParentBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private com.google.storage.control.v2.ManagedFolder managedFolder_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + managedFolderBuilder_; + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return Whether the managedFolder field is set. + */ + public boolean hasManagedFolder() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return The managedFolder. + */ + public com.google.storage.control.v2.ManagedFolder getManagedFolder() { + if (managedFolderBuilder_ == null) { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } else { + return managedFolderBuilder_.getMessage(); + } + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder setManagedFolder(com.google.storage.control.v2.ManagedFolder value) { + if (managedFolderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + managedFolder_ = value; + } else { + managedFolderBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder setManagedFolder( + com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFolderBuilder_ == null) { + managedFolder_ = builderForValue.build(); + } else { + managedFolderBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder mergeManagedFolder(com.google.storage.control.v2.ManagedFolder value) { + if (managedFolderBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) + && managedFolder_ != null + && managedFolder_ != com.google.storage.control.v2.ManagedFolder.getDefaultInstance()) { + getManagedFolderBuilder().mergeFrom(value); + } else { + managedFolder_ = value; + } + } else { + managedFolderBuilder_.mergeFrom(value); + } + if (managedFolder_ != null) { + bitField0_ |= 0x00000002; + onChanged(); + } + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder clearManagedFolder() { + bitField0_ = (bitField0_ & ~0x00000002); + managedFolder_ = null; + if (managedFolderBuilder_ != null) { + managedFolderBuilder_.dispose(); + managedFolderBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public com.google.storage.control.v2.ManagedFolder.Builder getManagedFolderBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getManagedFolderFieldBuilder().getBuilder(); + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFolderOrBuilder() { + if (managedFolderBuilder_ != null) { + return managedFolderBuilder_.getMessageOrBuilder(); + } else { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + getManagedFolderFieldBuilder() { + if (managedFolderBuilder_ == null) { + managedFolderBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder>( + getManagedFolder(), getParentForChildren(), isClean()); + managedFolder_ = null; + } + return managedFolderBuilder_; + } + + private java.lang.Object managedFolderId_ = ""; + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The managedFolderId. + */ + public java.lang.String getManagedFolderId() { + java.lang.Object ref = managedFolderId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + managedFolderId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The bytes for managedFolderId. + */ + public com.google.protobuf.ByteString getManagedFolderIdBytes() { + java.lang.Object ref = managedFolderId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + managedFolderId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @param value The managedFolderId to set. + * @return This builder for chaining. + */ + public Builder setManagedFolderId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + managedFolderId_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return This builder for chaining. + */ + public Builder clearManagedFolderId() { + managedFolderId_ = getDefaultInstance().getManagedFolderId(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @param value The bytes for managedFolderId to set. + * @return This builder for chaining. + */ + public Builder setManagedFolderIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + managedFolderId_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.CreateManagedFolderRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.CreateManagedFolderRequest) + private static final com.google.storage.control.v2.CreateManagedFolderRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.CreateManagedFolderRequest(); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CreateManagedFolderRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequestOrBuilder.java new file mode 100644 index 0000000000..d59a43a153 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequestOrBuilder.java @@ -0,0 +1,163 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface CreateManagedFolderRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.CreateManagedFolderRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + java.lang.String getParent(); + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + com.google.protobuf.ByteString getParentBytes(); + + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return Whether the managedFolder field is set. + */ + boolean hasManagedFolder(); + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return The managedFolder. + */ + com.google.storage.control.v2.ManagedFolder getManagedFolder(); + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFolderOrBuilder(); + + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The managedFolderId. + */ + java.lang.String getManagedFolderId(); + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The bytes for managedFolderId. + */ + com.google.protobuf.ByteString getManagedFolderIdBytes(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java index 8950379c47..5c70210277 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java index ce10b4540b..2e7004fde4 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface DeleteFolderRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequest.java new file mode 100644 index 0000000000..a46860075d --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequest.java @@ -0,0 +1,1235 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * DeleteManagedFolder RPC request message.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.DeleteManagedFolderRequest} + */ +public final class DeleteManagedFolderRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.DeleteManagedFolderRequest) + DeleteManagedFolderRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use DeleteManagedFolderRequest.newBuilder() to construct. + private DeleteManagedFolderRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private DeleteManagedFolderRequest() { + name_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new DeleteManagedFolderRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.DeleteManagedFolderRequest.class, + com.google.storage.control.v2.DeleteManagedFolderRequest.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 7; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int IF_METAGENERATION_MATCH_FIELD_NUMBER = 3; + private long ifMetagenerationMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + + public static final int IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER = 4; + private long ifMetagenerationNotMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + + public static final int ALLOW_NON_EMPTY_FIELD_NUMBER = 5; + private boolean allowNonEmpty_ = false; + /** + * + * + *
        +   * Allows deletion of a managed folder even if it is not empty.
        +   * A managed folder is empty if it manages no child managed folders or
        +   * objects. Caller must have permission for
        +   * storage.managedFolders.setIamPolicy.
        +   * 
        + * + * bool allow_non_empty = 5; + * + * @return The allowNonEmpty. + */ + @java.lang.Override + public boolean getAllowNonEmpty() { + return allowNonEmpty_; + } + + public static final int REQUEST_ID_FIELD_NUMBER = 6; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeInt64(4, ifMetagenerationNotMatch_); + } + if (allowNonEmpty_ != false) { + output.writeBool(5, allowNonEmpty_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, name_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(4, ifMetagenerationNotMatch_); + } + if (allowNonEmpty_ != false) { + size += com.google.protobuf.CodedOutputStream.computeBoolSize(5, allowNonEmpty_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, name_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.DeleteManagedFolderRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.DeleteManagedFolderRequest other = + (com.google.storage.control.v2.DeleteManagedFolderRequest) obj; + + if (!getName().equals(other.getName())) return false; + if (hasIfMetagenerationMatch() != other.hasIfMetagenerationMatch()) return false; + if (hasIfMetagenerationMatch()) { + if (getIfMetagenerationMatch() != other.getIfMetagenerationMatch()) return false; + } + if (hasIfMetagenerationNotMatch() != other.hasIfMetagenerationNotMatch()) return false; + if (hasIfMetagenerationNotMatch()) { + if (getIfMetagenerationNotMatch() != other.getIfMetagenerationNotMatch()) return false; + } + if (getAllowNonEmpty() != other.getAllowNonEmpty()) return false; + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + if (hasIfMetagenerationMatch()) { + hash = (37 * hash) + IF_METAGENERATION_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationMatch()); + } + if (hasIfMetagenerationNotMatch()) { + hash = (37 * hash) + IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationNotMatch()); + } + hash = (37 * hash) + ALLOW_NON_EMPTY_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getAllowNonEmpty()); + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.DeleteManagedFolderRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * DeleteManagedFolder RPC request message.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.DeleteManagedFolderRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.DeleteManagedFolderRequest) + com.google.storage.control.v2.DeleteManagedFolderRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.DeleteManagedFolderRequest.class, + com.google.storage.control.v2.DeleteManagedFolderRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.DeleteManagedFolderRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + ifMetagenerationMatch_ = 0L; + ifMetagenerationNotMatch_ = 0L; + allowNonEmpty_ = false; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.DeleteManagedFolderRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest build() { + com.google.storage.control.v2.DeleteManagedFolderRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest buildPartial() { + com.google.storage.control.v2.DeleteManagedFolderRequest result = + new com.google.storage.control.v2.DeleteManagedFolderRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.DeleteManagedFolderRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.ifMetagenerationMatch_ = ifMetagenerationMatch_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.ifMetagenerationNotMatch_ = ifMetagenerationNotMatch_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.allowNonEmpty_ = allowNonEmpty_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.requestId_ = requestId_; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.DeleteManagedFolderRequest) { + return mergeFrom((com.google.storage.control.v2.DeleteManagedFolderRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.DeleteManagedFolderRequest other) { + if (other == com.google.storage.control.v2.DeleteManagedFolderRequest.getDefaultInstance()) + return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasIfMetagenerationMatch()) { + setIfMetagenerationMatch(other.getIfMetagenerationMatch()); + } + if (other.hasIfMetagenerationNotMatch()) { + setIfMetagenerationNotMatch(other.getIfMetagenerationNotMatch()); + } + if (other.getAllowNonEmpty() != false) { + setAllowNonEmpty(other.getAllowNonEmpty()); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000010; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 24: + { + ifMetagenerationMatch_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 24 + case 32: + { + ifMetagenerationNotMatch_ = input.readInt64(); + bitField0_ |= 0x00000004; + break; + } // case 32 + case 40: + { + allowNonEmpty_ = input.readBool(); + bitField0_ |= 0x00000008; + break; + } // case 40 + case 50: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000010; + break; + } // case 50 + case 58: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 58 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long ifMetagenerationMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @param value The ifMetagenerationMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationMatch(long value) { + + ifMetagenerationMatch_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationMatch() { + bitField0_ = (bitField0_ & ~0x00000002); + ifMetagenerationMatch_ = 0L; + onChanged(); + return this; + } + + private long ifMetagenerationNotMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @param value The ifMetagenerationNotMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationNotMatch(long value) { + + ifMetagenerationNotMatch_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationNotMatch() { + bitField0_ = (bitField0_ & ~0x00000004); + ifMetagenerationNotMatch_ = 0L; + onChanged(); + return this; + } + + private boolean allowNonEmpty_; + /** + * + * + *
        +     * Allows deletion of a managed folder even if it is not empty.
        +     * A managed folder is empty if it manages no child managed folders or
        +     * objects. Caller must have permission for
        +     * storage.managedFolders.setIamPolicy.
        +     * 
        + * + * bool allow_non_empty = 5; + * + * @return The allowNonEmpty. + */ + @java.lang.Override + public boolean getAllowNonEmpty() { + return allowNonEmpty_; + } + /** + * + * + *
        +     * Allows deletion of a managed folder even if it is not empty.
        +     * A managed folder is empty if it manages no child managed folders or
        +     * objects. Caller must have permission for
        +     * storage.managedFolders.setIamPolicy.
        +     * 
        + * + * bool allow_non_empty = 5; + * + * @param value The allowNonEmpty to set. + * @return This builder for chaining. + */ + public Builder setAllowNonEmpty(boolean value) { + + allowNonEmpty_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Allows deletion of a managed folder even if it is not empty.
        +     * A managed folder is empty if it manages no child managed folders or
        +     * objects. Caller must have permission for
        +     * storage.managedFolders.setIamPolicy.
        +     * 
        + * + * bool allow_non_empty = 5; + * + * @return This builder for chaining. + */ + public Builder clearAllowNonEmpty() { + bitField0_ = (bitField0_ & ~0x00000008); + allowNonEmpty_ = false; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.DeleteManagedFolderRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.DeleteManagedFolderRequest) + private static final com.google.storage.control.v2.DeleteManagedFolderRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.DeleteManagedFolderRequest(); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public DeleteManagedFolderRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequestOrBuilder.java new file mode 100644 index 0000000000..953ece8b28 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequestOrBuilder.java @@ -0,0 +1,160 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface DeleteManagedFolderRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.DeleteManagedFolderRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + java.lang.String getName(); + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + boolean hasIfMetagenerationMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + long getIfMetagenerationMatch(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + boolean hasIfMetagenerationNotMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + long getIfMetagenerationNotMatch(); + + /** + * + * + *
        +   * Allows deletion of a managed folder even if it is not empty.
        +   * A managed folder is empty if it manages no child managed folders or
        +   * objects. Caller must have permission for
        +   * storage.managedFolders.setIamPolicy.
        +   * 
        + * + * bool allow_non_empty = 5; + * + * @return The allowNonEmpty. + */ + boolean getAllowNonEmpty(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java index 728778d85f..c05fc4574a 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java index bdf7597c99..b6a87b4ac1 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface FolderOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java index 8cc43b7e32..abaa8c2ab6 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java index f8db8af0b1..2041920c33 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface GetFolderRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequest.java new file mode 100644 index 0000000000..1d79d2235e --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequest.java @@ -0,0 +1,1130 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Request message for GetManagedFolder.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.GetManagedFolderRequest} + */ +public final class GetManagedFolderRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.GetManagedFolderRequest) + GetManagedFolderRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use GetManagedFolderRequest.newBuilder() to construct. + private GetManagedFolderRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private GetManagedFolderRequest() { + name_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new GetManagedFolderRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.GetManagedFolderRequest.class, + com.google.storage.control.v2.GetManagedFolderRequest.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 6; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int IF_METAGENERATION_MATCH_FIELD_NUMBER = 3; + private long ifMetagenerationMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + + public static final int IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER = 4; + private long ifMetagenerationNotMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + + public static final int REQUEST_ID_FIELD_NUMBER = 5; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeInt64(4, ifMetagenerationNotMatch_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, name_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(4, ifMetagenerationNotMatch_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, name_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.GetManagedFolderRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.GetManagedFolderRequest other = + (com.google.storage.control.v2.GetManagedFolderRequest) obj; + + if (!getName().equals(other.getName())) return false; + if (hasIfMetagenerationMatch() != other.hasIfMetagenerationMatch()) return false; + if (hasIfMetagenerationMatch()) { + if (getIfMetagenerationMatch() != other.getIfMetagenerationMatch()) return false; + } + if (hasIfMetagenerationNotMatch() != other.hasIfMetagenerationNotMatch()) return false; + if (hasIfMetagenerationNotMatch()) { + if (getIfMetagenerationNotMatch() != other.getIfMetagenerationNotMatch()) return false; + } + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + if (hasIfMetagenerationMatch()) { + hash = (37 * hash) + IF_METAGENERATION_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationMatch()); + } + if (hasIfMetagenerationNotMatch()) { + hash = (37 * hash) + IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationNotMatch()); + } + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.GetManagedFolderRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Request message for GetManagedFolder.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.GetManagedFolderRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.GetManagedFolderRequest) + com.google.storage.control.v2.GetManagedFolderRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.GetManagedFolderRequest.class, + com.google.storage.control.v2.GetManagedFolderRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.GetManagedFolderRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + ifMetagenerationMatch_ = 0L; + ifMetagenerationNotMatch_ = 0L; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.GetManagedFolderRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest build() { + com.google.storage.control.v2.GetManagedFolderRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest buildPartial() { + com.google.storage.control.v2.GetManagedFolderRequest result = + new com.google.storage.control.v2.GetManagedFolderRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.GetManagedFolderRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.ifMetagenerationMatch_ = ifMetagenerationMatch_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.ifMetagenerationNotMatch_ = ifMetagenerationNotMatch_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.requestId_ = requestId_; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.GetManagedFolderRequest) { + return mergeFrom((com.google.storage.control.v2.GetManagedFolderRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.GetManagedFolderRequest other) { + if (other == com.google.storage.control.v2.GetManagedFolderRequest.getDefaultInstance()) + return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasIfMetagenerationMatch()) { + setIfMetagenerationMatch(other.getIfMetagenerationMatch()); + } + if (other.hasIfMetagenerationNotMatch()) { + setIfMetagenerationNotMatch(other.getIfMetagenerationNotMatch()); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000008; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 24: + { + ifMetagenerationMatch_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 24 + case 32: + { + ifMetagenerationNotMatch_ = input.readInt64(); + bitField0_ |= 0x00000004; + break; + } // case 32 + case 42: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } // case 42 + case 50: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 50 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long ifMetagenerationMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @param value The ifMetagenerationMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationMatch(long value) { + + ifMetagenerationMatch_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationMatch() { + bitField0_ = (bitField0_ & ~0x00000002); + ifMetagenerationMatch_ = 0L; + onChanged(); + return this; + } + + private long ifMetagenerationNotMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @param value The ifMetagenerationNotMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationNotMatch(long value) { + + ifMetagenerationNotMatch_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationNotMatch() { + bitField0_ = (bitField0_ & ~0x00000004); + ifMetagenerationNotMatch_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.GetManagedFolderRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.GetManagedFolderRequest) + private static final com.google.storage.control.v2.GetManagedFolderRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.GetManagedFolderRequest(); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetManagedFolderRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequestOrBuilder.java new file mode 100644 index 0000000000..191c0a1500 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequestOrBuilder.java @@ -0,0 +1,144 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface GetManagedFolderRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.GetManagedFolderRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + java.lang.String getName(); + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + boolean hasIfMetagenerationMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + long getIfMetagenerationMatch(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + boolean hasIfMetagenerationNotMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + long getIfMetagenerationNotMatch(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java index 8133a90f29..63c3eae7f0 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java index e2abad0ded..984bd15a2e 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface GetStorageLayoutRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java index 9a6815d010..0d8481b802 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java index 0f96630df6..113d2ff3eb 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface ListFoldersRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java index bd59965732..31f6c07568 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java index 66b433997b..fb158a83fb 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface ListFoldersResponseOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequest.java new file mode 100644 index 0000000000..999775be33 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequest.java @@ -0,0 +1,1318 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Request message for ListManagedFolders.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersRequest} + */ +public final class ListManagedFoldersRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.ListManagedFoldersRequest) + ListManagedFoldersRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use ListManagedFoldersRequest.newBuilder() to construct. + private ListManagedFoldersRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ListManagedFoldersRequest() { + parent_ = ""; + pageToken_ = ""; + prefix_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new ListManagedFoldersRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersRequest.class, + com.google.storage.control.v2.ListManagedFoldersRequest.Builder.class); + } + + public static final int PARENT_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object parent_ = ""; + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + @java.lang.Override + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + @java.lang.Override + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PAGE_SIZE_FIELD_NUMBER = 2; + private int pageSize_ = 0; + /** + * + * + *
        +   * Optional. Maximum number of managed folders to return in a single response.
        +   * The service will use this parameter or 1,000 items, whichever is smaller.
        +   * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageSize. + */ + @java.lang.Override + public int getPageSize() { + return pageSize_; + } + + public static final int PAGE_TOKEN_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object pageToken_ = ""; + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageToken. + */ + @java.lang.Override + public java.lang.String getPageToken() { + java.lang.Object ref = pageToken_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pageToken_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for pageToken. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPageTokenBytes() { + java.lang.Object ref = pageToken_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + pageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PREFIX_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private volatile java.lang.Object prefix_ = ""; + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The prefix. + */ + @java.lang.Override + public java.lang.String getPrefix() { + java.lang.Object ref = prefix_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + prefix_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for prefix. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPrefixBytes() { + java.lang.Object ref = prefix_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + prefix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REQUEST_ID_FIELD_NUMBER = 5; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, parent_); + } + if (pageSize_ != 0) { + output.writeInt32(2, pageSize_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pageToken_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, pageToken_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(prefix_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, prefix_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, requestId_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, parent_); + } + if (pageSize_ != 0) { + size += com.google.protobuf.CodedOutputStream.computeInt32Size(2, pageSize_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pageToken_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, pageToken_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(prefix_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, prefix_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, requestId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.ListManagedFoldersRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.ListManagedFoldersRequest other = + (com.google.storage.control.v2.ListManagedFoldersRequest) obj; + + if (!getParent().equals(other.getParent())) return false; + if (getPageSize() != other.getPageSize()) return false; + if (!getPageToken().equals(other.getPageToken())) return false; + if (!getPrefix().equals(other.getPrefix())) return false; + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PARENT_FIELD_NUMBER; + hash = (53 * hash) + getParent().hashCode(); + hash = (37 * hash) + PAGE_SIZE_FIELD_NUMBER; + hash = (53 * hash) + getPageSize(); + hash = (37 * hash) + PAGE_TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getPageToken().hashCode(); + hash = (37 * hash) + PREFIX_FIELD_NUMBER; + hash = (53 * hash) + getPrefix().hashCode(); + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.ListManagedFoldersRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Request message for ListManagedFolders.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.ListManagedFoldersRequest) + com.google.storage.control.v2.ListManagedFoldersRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersRequest.class, + com.google.storage.control.v2.ListManagedFoldersRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.ListManagedFoldersRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + parent_ = ""; + pageSize_ = 0; + pageToken_ = ""; + prefix_ = ""; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.ListManagedFoldersRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest build() { + com.google.storage.control.v2.ListManagedFoldersRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest buildPartial() { + com.google.storage.control.v2.ListManagedFoldersRequest result = + new com.google.storage.control.v2.ListManagedFoldersRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.ListManagedFoldersRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.parent_ = parent_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.pageSize_ = pageSize_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.pageToken_ = pageToken_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.prefix_ = prefix_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.requestId_ = requestId_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.ListManagedFoldersRequest) { + return mergeFrom((com.google.storage.control.v2.ListManagedFoldersRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.ListManagedFoldersRequest other) { + if (other == com.google.storage.control.v2.ListManagedFoldersRequest.getDefaultInstance()) + return this; + if (!other.getParent().isEmpty()) { + parent_ = other.parent_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getPageSize() != 0) { + setPageSize(other.getPageSize()); + } + if (!other.getPageToken().isEmpty()) { + pageToken_ = other.pageToken_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (!other.getPrefix().isEmpty()) { + prefix_ = other.prefix_; + bitField0_ |= 0x00000008; + onChanged(); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000010; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + parent_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 16: + { + pageSize_ = input.readInt32(); + bitField0_ |= 0x00000002; + break; + } // case 16 + case 26: + { + pageToken_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } // case 26 + case 34: + { + prefix_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } // case 34 + case 42: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000010; + break; + } // case 42 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object parent_ = ""; + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The parent to set. + * @return This builder for chaining. + */ + public Builder setParent(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearParent() { + parent_ = getDefaultInstance().getParent(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for parent to set. + * @return This builder for chaining. + */ + public Builder setParentBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private int pageSize_; + /** + * + * + *
        +     * Optional. Maximum number of managed folders to return in a single response.
        +     * The service will use this parameter or 1,000 items, whichever is smaller.
        +     * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageSize. + */ + @java.lang.Override + public int getPageSize() { + return pageSize_; + } + /** + * + * + *
        +     * Optional. Maximum number of managed folders to return in a single response.
        +     * The service will use this parameter or 1,000 items, whichever is smaller.
        +     * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The pageSize to set. + * @return This builder for chaining. + */ + public Builder setPageSize(int value) { + + pageSize_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. Maximum number of managed folders to return in a single response.
        +     * The service will use this parameter or 1,000 items, whichever is smaller.
        +     * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearPageSize() { + bitField0_ = (bitField0_ & ~0x00000002); + pageSize_ = 0; + onChanged(); + return this; + } + + private java.lang.Object pageToken_ = ""; + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageToken. + */ + public java.lang.String getPageToken() { + java.lang.Object ref = pageToken_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pageToken_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for pageToken. + */ + public com.google.protobuf.ByteString getPageTokenBytes() { + java.lang.Object ref = pageToken_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + pageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The pageToken to set. + * @return This builder for chaining. + */ + public Builder setPageToken(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + pageToken_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearPageToken() { + pageToken_ = getDefaultInstance().getPageToken(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The bytes for pageToken to set. + * @return This builder for chaining. + */ + public Builder setPageTokenBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + pageToken_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.lang.Object prefix_ = ""; + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The prefix. + */ + public java.lang.String getPrefix() { + java.lang.Object ref = prefix_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + prefix_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for prefix. + */ + public com.google.protobuf.ByteString getPrefixBytes() { + java.lang.Object ref = prefix_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + prefix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The prefix to set. + * @return This builder for chaining. + */ + public Builder setPrefix(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + prefix_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearPrefix() { + prefix_ = getDefaultInstance().getPrefix(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The bytes for prefix to set. + * @return This builder for chaining. + */ + public Builder setPrefixBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + prefix_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.ListManagedFoldersRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.ListManagedFoldersRequest) + private static final com.google.storage.control.v2.ListManagedFoldersRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.ListManagedFoldersRequest(); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ListManagedFoldersRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequestOrBuilder.java new file mode 100644 index 0000000000..0041f11360 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequestOrBuilder.java @@ -0,0 +1,154 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface ListManagedFoldersRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.ListManagedFoldersRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + java.lang.String getParent(); + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + com.google.protobuf.ByteString getParentBytes(); + + /** + * + * + *
        +   * Optional. Maximum number of managed folders to return in a single response.
        +   * The service will use this parameter or 1,000 items, whichever is smaller.
        +   * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageSize. + */ + int getPageSize(); + + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageToken. + */ + java.lang.String getPageToken(); + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for pageToken. + */ + com.google.protobuf.ByteString getPageTokenBytes(); + + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The prefix. + */ + java.lang.String getPrefix(); + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for prefix. + */ + com.google.protobuf.ByteString getPrefixBytes(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponse.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponse.java new file mode 100644 index 0000000000..abc6cc7b1d --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponse.java @@ -0,0 +1,1133 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Response message for ListManagedFolders.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersResponse} + */ +public final class ListManagedFoldersResponse extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.ListManagedFoldersResponse) + ListManagedFoldersResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use ListManagedFoldersResponse.newBuilder() to construct. + private ListManagedFoldersResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ListManagedFoldersResponse() { + managedFolders_ = java.util.Collections.emptyList(); + nextPageToken_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new ListManagedFoldersResponse(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersResponse.class, + com.google.storage.control.v2.ListManagedFoldersResponse.Builder.class); + } + + public static final int MANAGED_FOLDERS_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private java.util.List managedFolders_; + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public java.util.List getManagedFoldersList() { + return managedFolders_; + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public java.util.List + getManagedFoldersOrBuilderList() { + return managedFolders_; + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public int getManagedFoldersCount() { + return managedFolders_.size(); + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getManagedFolders(int index) { + return managedFolders_.get(index); + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFoldersOrBuilder( + int index) { + return managedFolders_.get(index); + } + + public static final int NEXT_PAGE_TOKEN_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object nextPageToken_ = ""; + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The nextPageToken. + */ + @java.lang.Override + public java.lang.String getNextPageToken() { + java.lang.Object ref = nextPageToken_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + nextPageToken_ = s; + return s; + } + } + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The bytes for nextPageToken. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNextPageTokenBytes() { + java.lang.Object ref = nextPageToken_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + nextPageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + for (int i = 0; i < managedFolders_.size(); i++) { + output.writeMessage(1, managedFolders_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nextPageToken_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nextPageToken_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < managedFolders_.size(); i++) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, managedFolders_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nextPageToken_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nextPageToken_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.ListManagedFoldersResponse)) { + return super.equals(obj); + } + com.google.storage.control.v2.ListManagedFoldersResponse other = + (com.google.storage.control.v2.ListManagedFoldersResponse) obj; + + if (!getManagedFoldersList().equals(other.getManagedFoldersList())) return false; + if (!getNextPageToken().equals(other.getNextPageToken())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getManagedFoldersCount() > 0) { + hash = (37 * hash) + MANAGED_FOLDERS_FIELD_NUMBER; + hash = (53 * hash) + getManagedFoldersList().hashCode(); + } + hash = (37 * hash) + NEXT_PAGE_TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getNextPageToken().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.ListManagedFoldersResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Response message for ListManagedFolders.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersResponse} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.ListManagedFoldersResponse) + com.google.storage.control.v2.ListManagedFoldersResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersResponse.class, + com.google.storage.control.v2.ListManagedFoldersResponse.Builder.class); + } + + // Construct using com.google.storage.control.v2.ListManagedFoldersResponse.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + if (managedFoldersBuilder_ == null) { + managedFolders_ = java.util.Collections.emptyList(); + } else { + managedFolders_ = null; + managedFoldersBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + nextPageToken_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse getDefaultInstanceForType() { + return com.google.storage.control.v2.ListManagedFoldersResponse.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse build() { + com.google.storage.control.v2.ListManagedFoldersResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse buildPartial() { + com.google.storage.control.v2.ListManagedFoldersResponse result = + new com.google.storage.control.v2.ListManagedFoldersResponse(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields( + com.google.storage.control.v2.ListManagedFoldersResponse result) { + if (managedFoldersBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + managedFolders_ = java.util.Collections.unmodifiableList(managedFolders_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.managedFolders_ = managedFolders_; + } else { + result.managedFolders_ = managedFoldersBuilder_.build(); + } + } + + private void buildPartial0(com.google.storage.control.v2.ListManagedFoldersResponse result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.nextPageToken_ = nextPageToken_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.ListManagedFoldersResponse) { + return mergeFrom((com.google.storage.control.v2.ListManagedFoldersResponse) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.ListManagedFoldersResponse other) { + if (other == com.google.storage.control.v2.ListManagedFoldersResponse.getDefaultInstance()) + return this; + if (managedFoldersBuilder_ == null) { + if (!other.managedFolders_.isEmpty()) { + if (managedFolders_.isEmpty()) { + managedFolders_ = other.managedFolders_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureManagedFoldersIsMutable(); + managedFolders_.addAll(other.managedFolders_); + } + onChanged(); + } + } else { + if (!other.managedFolders_.isEmpty()) { + if (managedFoldersBuilder_.isEmpty()) { + managedFoldersBuilder_.dispose(); + managedFoldersBuilder_ = null; + managedFolders_ = other.managedFolders_; + bitField0_ = (bitField0_ & ~0x00000001); + managedFoldersBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders + ? getManagedFoldersFieldBuilder() + : null; + } else { + managedFoldersBuilder_.addAllMessages(other.managedFolders_); + } + } + } + if (!other.getNextPageToken().isEmpty()) { + nextPageToken_ = other.nextPageToken_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + com.google.storage.control.v2.ManagedFolder m = + input.readMessage( + com.google.storage.control.v2.ManagedFolder.parser(), extensionRegistry); + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.add(m); + } else { + managedFoldersBuilder_.addMessage(m); + } + break; + } // case 10 + case 18: + { + nextPageToken_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.util.List managedFolders_ = + java.util.Collections.emptyList(); + + private void ensureManagedFoldersIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + managedFolders_ = + new java.util.ArrayList(managedFolders_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + managedFoldersBuilder_; + + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public java.util.List getManagedFoldersList() { + if (managedFoldersBuilder_ == null) { + return java.util.Collections.unmodifiableList(managedFolders_); + } else { + return managedFoldersBuilder_.getMessageList(); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public int getManagedFoldersCount() { + if (managedFoldersBuilder_ == null) { + return managedFolders_.size(); + } else { + return managedFoldersBuilder_.getCount(); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder getManagedFolders(int index) { + if (managedFoldersBuilder_ == null) { + return managedFolders_.get(index); + } else { + return managedFoldersBuilder_.getMessage(index); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder setManagedFolders(int index, com.google.storage.control.v2.ManagedFolder value) { + if (managedFoldersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureManagedFoldersIsMutable(); + managedFolders_.set(index, value); + onChanged(); + } else { + managedFoldersBuilder_.setMessage(index, value); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder setManagedFolders( + int index, com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.set(index, builderForValue.build()); + onChanged(); + } else { + managedFoldersBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders(com.google.storage.control.v2.ManagedFolder value) { + if (managedFoldersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureManagedFoldersIsMutable(); + managedFolders_.add(value); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(value); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders(int index, com.google.storage.control.v2.ManagedFolder value) { + if (managedFoldersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureManagedFoldersIsMutable(); + managedFolders_.add(index, value); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(index, value); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders( + com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.add(builderForValue.build()); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders( + int index, com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.add(index, builderForValue.build()); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addAllManagedFolders( + java.lang.Iterable values) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, managedFolders_); + onChanged(); + } else { + managedFoldersBuilder_.addAllMessages(values); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder clearManagedFolders() { + if (managedFoldersBuilder_ == null) { + managedFolders_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + managedFoldersBuilder_.clear(); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder removeManagedFolders(int index) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.remove(index); + onChanged(); + } else { + managedFoldersBuilder_.remove(index); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder.Builder getManagedFoldersBuilder(int index) { + return getManagedFoldersFieldBuilder().getBuilder(index); + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFoldersOrBuilder( + int index) { + if (managedFoldersBuilder_ == null) { + return managedFolders_.get(index); + } else { + return managedFoldersBuilder_.getMessageOrBuilder(index); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public java.util.List + getManagedFoldersOrBuilderList() { + if (managedFoldersBuilder_ != null) { + return managedFoldersBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(managedFolders_); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder.Builder addManagedFoldersBuilder() { + return getManagedFoldersFieldBuilder() + .addBuilder(com.google.storage.control.v2.ManagedFolder.getDefaultInstance()); + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder.Builder addManagedFoldersBuilder(int index) { + return getManagedFoldersFieldBuilder() + .addBuilder(index, com.google.storage.control.v2.ManagedFolder.getDefaultInstance()); + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public java.util.List + getManagedFoldersBuilderList() { + return getManagedFoldersFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + getManagedFoldersFieldBuilder() { + if (managedFoldersBuilder_ == null) { + managedFoldersBuilder_ = + new com.google.protobuf.RepeatedFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder>( + managedFolders_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + managedFolders_ = null; + } + return managedFoldersBuilder_; + } + + private java.lang.Object nextPageToken_ = ""; + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @return The nextPageToken. + */ + public java.lang.String getNextPageToken() { + java.lang.Object ref = nextPageToken_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + nextPageToken_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @return The bytes for nextPageToken. + */ + public com.google.protobuf.ByteString getNextPageTokenBytes() { + java.lang.Object ref = nextPageToken_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + nextPageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @param value The nextPageToken to set. + * @return This builder for chaining. + */ + public Builder setNextPageToken(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + nextPageToken_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @return This builder for chaining. + */ + public Builder clearNextPageToken() { + nextPageToken_ = getDefaultInstance().getNextPageToken(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @param value The bytes for nextPageToken to set. + * @return This builder for chaining. + */ + public Builder setNextPageTokenBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + nextPageToken_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.ListManagedFoldersResponse) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.ListManagedFoldersResponse) + private static final com.google.storage.control.v2.ListManagedFoldersResponse DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.ListManagedFoldersResponse(); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ListManagedFoldersResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponseOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponseOrBuilder.java new file mode 100644 index 0000000000..322c36b639 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponseOrBuilder.java @@ -0,0 +1,105 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface ListManagedFoldersResponseOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.ListManagedFoldersResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + java.util.List getManagedFoldersList(); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + com.google.storage.control.v2.ManagedFolder getManagedFolders(int index); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + int getManagedFoldersCount(); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + java.util.List + getManagedFoldersOrBuilderList(); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFoldersOrBuilder(int index); + + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The nextPageToken. + */ + java.lang.String getNextPageToken(); + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The bytes for nextPageToken. + */ + com.google.protobuf.ByteString getNextPageTokenBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolder.java new file mode 100644 index 0000000000..86435b6650 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolder.java @@ -0,0 +1,1320 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * A managed folder.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.ManagedFolder} + */ +public final class ManagedFolder extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.ManagedFolder) + ManagedFolderOrBuilder { + private static final long serialVersionUID = 0L; + // Use ManagedFolder.newBuilder() to construct. + private ManagedFolder(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ManagedFolder() { + name_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new ManagedFolder(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ManagedFolder.class, + com.google.storage.control.v2.ManagedFolder.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int METAGENERATION_FIELD_NUMBER = 3; + private long metageneration_ = 0L; + /** + * + * + *
        +   * Output only. The metadata version of this managed folder. It increases
        +   * whenever the metadata is updated. Used for preconditions and for detecting
        +   * changes in metadata. Managed folders don't have a generation number.
        +   * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return The metageneration. + */ + @java.lang.Override + public long getMetageneration() { + return metageneration_; + } + + public static final int CREATE_TIME_FIELD_NUMBER = 4; + private com.google.protobuf.Timestamp createTime_; + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the createTime field is set. + */ + @java.lang.Override + public boolean hasCreateTime() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The createTime. + */ + @java.lang.Override + public com.google.protobuf.Timestamp getCreateTime() { + return createTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createTime_; + } + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder() { + return createTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createTime_; + } + + public static final int UPDATE_TIME_FIELD_NUMBER = 5; + private com.google.protobuf.Timestamp updateTime_; + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the updateTime field is set. + */ + @java.lang.Override + public boolean hasUpdateTime() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The updateTime. + */ + @java.lang.Override + public com.google.protobuf.Timestamp getUpdateTime() { + return updateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : updateTime_; + } + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() { + return updateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : updateTime_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (metageneration_ != 0L) { + output.writeInt64(3, metageneration_); + } + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(4, getCreateTime()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(5, getUpdateTime()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (metageneration_ != 0L) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(3, metageneration_); + } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getCreateTime()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getUpdateTime()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.ManagedFolder)) { + return super.equals(obj); + } + com.google.storage.control.v2.ManagedFolder other = + (com.google.storage.control.v2.ManagedFolder) obj; + + if (!getName().equals(other.getName())) return false; + if (getMetageneration() != other.getMetageneration()) return false; + if (hasCreateTime() != other.hasCreateTime()) return false; + if (hasCreateTime()) { + if (!getCreateTime().equals(other.getCreateTime())) return false; + } + if (hasUpdateTime() != other.hasUpdateTime()) return false; + if (hasUpdateTime()) { + if (!getUpdateTime().equals(other.getUpdateTime())) return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + hash = (37 * hash) + METAGENERATION_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getMetageneration()); + if (hasCreateTime()) { + hash = (37 * hash) + CREATE_TIME_FIELD_NUMBER; + hash = (53 * hash) + getCreateTime().hashCode(); + } + if (hasUpdateTime()) { + hash = (37 * hash) + UPDATE_TIME_FIELD_NUMBER; + hash = (53 * hash) + getUpdateTime().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom(java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ManagedFolder parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(com.google.storage.control.v2.ManagedFolder prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * A managed folder.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.ManagedFolder} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.ManagedFolder) + com.google.storage.control.v2.ManagedFolderOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ManagedFolder.class, + com.google.storage.control.v2.ManagedFolder.Builder.class); + } + + // Construct using com.google.storage.control.v2.ManagedFolder.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getCreateTimeFieldBuilder(); + getUpdateTimeFieldBuilder(); + } + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + metageneration_ = 0L; + createTime_ = null; + if (createTimeBuilder_ != null) { + createTimeBuilder_.dispose(); + createTimeBuilder_ = null; + } + updateTime_ = null; + if (updateTimeBuilder_ != null) { + updateTimeBuilder_.dispose(); + updateTimeBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getDefaultInstanceForType() { + return com.google.storage.control.v2.ManagedFolder.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder build() { + com.google.storage.control.v2.ManagedFolder result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder buildPartial() { + com.google.storage.control.v2.ManagedFolder result = + new com.google.storage.control.v2.ManagedFolder(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.ManagedFolder result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.metageneration_ = metageneration_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000004) != 0)) { + result.createTime_ = createTimeBuilder_ == null ? createTime_ : createTimeBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.updateTime_ = updateTimeBuilder_ == null ? updateTime_ : updateTimeBuilder_.build(); + to_bitField0_ |= 0x00000002; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.ManagedFolder) { + return mergeFrom((com.google.storage.control.v2.ManagedFolder) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.ManagedFolder other) { + if (other == com.google.storage.control.v2.ManagedFolder.getDefaultInstance()) return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getMetageneration() != 0L) { + setMetageneration(other.getMetageneration()); + } + if (other.hasCreateTime()) { + mergeCreateTime(other.getCreateTime()); + } + if (other.hasUpdateTime()) { + mergeUpdateTime(other.getUpdateTime()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 24: + { + metageneration_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 24 + case 34: + { + input.readMessage(getCreateTimeFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000004; + break; + } // case 34 + case 42: + { + input.readMessage(getUpdateTimeFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000008; + break; + } // case 42 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long metageneration_; + /** + * + * + *
        +     * Output only. The metadata version of this managed folder. It increases
        +     * whenever the metadata is updated. Used for preconditions and for detecting
        +     * changes in metadata. Managed folders don't have a generation number.
        +     * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return The metageneration. + */ + @java.lang.Override + public long getMetageneration() { + return metageneration_; + } + /** + * + * + *
        +     * Output only. The metadata version of this managed folder. It increases
        +     * whenever the metadata is updated. Used for preconditions and for detecting
        +     * changes in metadata. Managed folders don't have a generation number.
        +     * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @param value The metageneration to set. + * @return This builder for chaining. + */ + public Builder setMetageneration(long value) { + + metageneration_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The metadata version of this managed folder. It increases
        +     * whenever the metadata is updated. Used for preconditions and for detecting
        +     * changes in metadata. Managed folders don't have a generation number.
        +     * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return This builder for chaining. + */ + public Builder clearMetageneration() { + bitField0_ = (bitField0_ & ~0x00000002); + metageneration_ = 0L; + onChanged(); + return this; + } + + private com.google.protobuf.Timestamp createTime_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + createTimeBuilder_; + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the createTime field is set. + */ + public boolean hasCreateTime() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The createTime. + */ + public com.google.protobuf.Timestamp getCreateTime() { + if (createTimeBuilder_ == null) { + return createTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : createTime_; + } else { + return createTimeBuilder_.getMessage(); + } + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setCreateTime(com.google.protobuf.Timestamp value) { + if (createTimeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + createTime_ = value; + } else { + createTimeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setCreateTime(com.google.protobuf.Timestamp.Builder builderForValue) { + if (createTimeBuilder_ == null) { + createTime_ = builderForValue.build(); + } else { + createTimeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder mergeCreateTime(com.google.protobuf.Timestamp value) { + if (createTimeBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) + && createTime_ != null + && createTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) { + getCreateTimeBuilder().mergeFrom(value); + } else { + createTime_ = value; + } + } else { + createTimeBuilder_.mergeFrom(value); + } + if (createTime_ != null) { + bitField0_ |= 0x00000004; + onChanged(); + } + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder clearCreateTime() { + bitField0_ = (bitField0_ & ~0x00000004); + createTime_ = null; + if (createTimeBuilder_ != null) { + createTimeBuilder_.dispose(); + createTimeBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.Timestamp.Builder getCreateTimeBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCreateTimeFieldBuilder().getBuilder(); + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder() { + if (createTimeBuilder_ != null) { + return createTimeBuilder_.getMessageOrBuilder(); + } else { + return createTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : createTime_; + } + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + getCreateTimeFieldBuilder() { + if (createTimeBuilder_ == null) { + createTimeBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder>( + getCreateTime(), getParentForChildren(), isClean()); + createTime_ = null; + } + return createTimeBuilder_; + } + + private com.google.protobuf.Timestamp updateTime_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + updateTimeBuilder_; + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the updateTime field is set. + */ + public boolean hasUpdateTime() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The updateTime. + */ + public com.google.protobuf.Timestamp getUpdateTime() { + if (updateTimeBuilder_ == null) { + return updateTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : updateTime_; + } else { + return updateTimeBuilder_.getMessage(); + } + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setUpdateTime(com.google.protobuf.Timestamp value) { + if (updateTimeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + updateTime_ = value; + } else { + updateTimeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setUpdateTime(com.google.protobuf.Timestamp.Builder builderForValue) { + if (updateTimeBuilder_ == null) { + updateTime_ = builderForValue.build(); + } else { + updateTimeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder mergeUpdateTime(com.google.protobuf.Timestamp value) { + if (updateTimeBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) + && updateTime_ != null + && updateTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) { + getUpdateTimeBuilder().mergeFrom(value); + } else { + updateTime_ = value; + } + } else { + updateTimeBuilder_.mergeFrom(value); + } + if (updateTime_ != null) { + bitField0_ |= 0x00000008; + onChanged(); + } + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder clearUpdateTime() { + bitField0_ = (bitField0_ & ~0x00000008); + updateTime_ = null; + if (updateTimeBuilder_ != null) { + updateTimeBuilder_.dispose(); + updateTimeBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.Timestamp.Builder getUpdateTimeBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getUpdateTimeFieldBuilder().getBuilder(); + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() { + if (updateTimeBuilder_ != null) { + return updateTimeBuilder_.getMessageOrBuilder(); + } else { + return updateTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : updateTime_; + } + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + getUpdateTimeFieldBuilder() { + if (updateTimeBuilder_ == null) { + updateTimeBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder>( + getUpdateTime(), getParentForChildren(), isClean()); + updateTime_ = null; + } + return updateTimeBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.ManagedFolder) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.ManagedFolder) + private static final com.google.storage.control.v2.ManagedFolder DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.ManagedFolder(); + } + + public static com.google.storage.control.v2.ManagedFolder getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ManagedFolder parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderName.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderName.java new file mode 100644 index 0000000000..a8251fc222 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderName.java @@ -0,0 +1,227 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.storage.control.v2; + +import com.google.api.pathtemplate.PathTemplate; +import com.google.api.resourcenames.ResourceName; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +@Generated("by gapic-generator-java") +public class ManagedFolderName implements ResourceName { + private static final PathTemplate PROJECT_BUCKET_MANAGEDFOLDER = + PathTemplate.createWithoutUrlEncoding( + "projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}"); + private volatile Map fieldValuesMap; + private final String project; + private final String bucket; + private final String managedFolder; + + @Deprecated + protected ManagedFolderName() { + project = null; + bucket = null; + managedFolder = null; + } + + private ManagedFolderName(Builder builder) { + project = Preconditions.checkNotNull(builder.getProject()); + bucket = Preconditions.checkNotNull(builder.getBucket()); + managedFolder = Preconditions.checkNotNull(builder.getManagedFolder()); + } + + public String getProject() { + return project; + } + + public String getBucket() { + return bucket; + } + + public String getManagedFolder() { + return managedFolder; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder(this); + } + + public static ManagedFolderName of(String project, String bucket, String managedFolder) { + return newBuilder() + .setProject(project) + .setBucket(bucket) + .setManagedFolder(managedFolder) + .build(); + } + + public static String format(String project, String bucket, String managedFolder) { + return newBuilder() + .setProject(project) + .setBucket(bucket) + .setManagedFolder(managedFolder) + .build() + .toString(); + } + + public static ManagedFolderName parse(String formattedString) { + if (formattedString.isEmpty()) { + return null; + } + Map matchMap = + PROJECT_BUCKET_MANAGEDFOLDER.validatedMatch( + formattedString, "ManagedFolderName.parse: formattedString not in valid format"); + return of(matchMap.get("project"), matchMap.get("bucket"), matchMap.get("managedFolder")); + } + + public static List parseList(List formattedStrings) { + List list = new ArrayList<>(formattedStrings.size()); + for (String formattedString : formattedStrings) { + list.add(parse(formattedString)); + } + return list; + } + + public static List toStringList(List values) { + List list = new ArrayList<>(values.size()); + for (ManagedFolderName value : values) { + if (value == null) { + list.add(""); + } else { + list.add(value.toString()); + } + } + return list; + } + + public static boolean isParsableFrom(String formattedString) { + return PROJECT_BUCKET_MANAGEDFOLDER.matches(formattedString); + } + + @Override + public Map getFieldValuesMap() { + if (fieldValuesMap == null) { + synchronized (this) { + if (fieldValuesMap == null) { + ImmutableMap.Builder fieldMapBuilder = ImmutableMap.builder(); + if (project != null) { + fieldMapBuilder.put("project", project); + } + if (bucket != null) { + fieldMapBuilder.put("bucket", bucket); + } + if (managedFolder != null) { + fieldMapBuilder.put("managedFolder", managedFolder); + } + fieldValuesMap = fieldMapBuilder.build(); + } + } + } + return fieldValuesMap; + } + + public String getFieldValue(String fieldName) { + return getFieldValuesMap().get(fieldName); + } + + @Override + public String toString() { + return PROJECT_BUCKET_MANAGEDFOLDER.instantiate( + "project", project, "bucket", bucket, "managedFolder", managedFolder); + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null && getClass() == o.getClass()) { + ManagedFolderName that = ((ManagedFolderName) o); + return Objects.equals(this.project, that.project) + && Objects.equals(this.bucket, that.bucket) + && Objects.equals(this.managedFolder, that.managedFolder); + } + return false; + } + + @Override + public int hashCode() { + int h = 1; + h *= 1000003; + h ^= Objects.hashCode(project); + h *= 1000003; + h ^= Objects.hashCode(bucket); + h *= 1000003; + h ^= Objects.hashCode(managedFolder); + return h; + } + + /** Builder for projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}. */ + public static class Builder { + private String project; + private String bucket; + private String managedFolder; + + protected Builder() {} + + public String getProject() { + return project; + } + + public String getBucket() { + return bucket; + } + + public String getManagedFolder() { + return managedFolder; + } + + public Builder setProject(String project) { + this.project = project; + return this; + } + + public Builder setBucket(String bucket) { + this.bucket = bucket; + return this; + } + + public Builder setManagedFolder(String managedFolder) { + this.managedFolder = managedFolder; + return this; + } + + private Builder(ManagedFolderName managedFolderName) { + this.project = managedFolderName.project; + this.bucket = managedFolderName.bucket; + this.managedFolder = managedFolderName.managedFolder; + } + + public ManagedFolderName build() { + return new ManagedFolderName(this); + } + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderOrBuilder.java new file mode 100644 index 0000000000..e5d481ae8f --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderOrBuilder.java @@ -0,0 +1,146 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface ManagedFolderOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.ManagedFolder) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The name. + */ + java.lang.String getName(); + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * + * + *
        +   * Output only. The metadata version of this managed folder. It increases
        +   * whenever the metadata is updated. Used for preconditions and for detecting
        +   * changes in metadata. Managed folders don't have a generation number.
        +   * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return The metageneration. + */ + long getMetageneration(); + + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the createTime field is set. + */ + boolean hasCreateTime(); + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The createTime. + */ + com.google.protobuf.Timestamp getCreateTime(); + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder(); + + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the updateTime field is set. + */ + boolean hasUpdateTime(); + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The updateTime. + */ + com.google.protobuf.Timestamp getUpdateTime(); + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java index d87413bf94..059f96157b 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java index cb6beb5341..5331177419 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface PendingRenameInfoOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java index 5b0b33191d..f6cddfa643 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java index 7589a93aee..6af4130aec 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface RenameFolderMetadataOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java index 17472abf8d..46a2ba440c 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java index 9234f04e58..b7799da96b 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface RenameFolderRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java index 4d08cb6316..5f8c311a8d 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public final class StorageControlProto { @@ -84,6 +84,30 @@ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry r internal_static_google_storage_control_v2_GetStorageLayoutRequest_descriptor; static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_google_storage_control_v2_GetStorageLayoutRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_ManagedFolder_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { return descriptor; @@ -171,48 +195,100 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + "ket}/storageLayout\"\206\001\n\027GetStorageLayoutR" + "equest\022:\n\004name\030\001 \001(\tB,\340A\002\372A&\n$storage.go" + "ogleapis.com/StorageLayout\022\016\n\006prefix\030\002 \001" - + "(\t\022\037\n\nrequest_id\030\003 \001(\tB\013\340A\001\342\214\317\327\010\002\010\0012\223\n\n\016" - + "StorageControl\022\232\001\n\014CreateFolder\022..google" - + ".storage.control.v2.CreateFolderRequest\032" - + "!.google.storage.control.v2.Folder\"7\332A\027p" - + "arent,folder,folder_id\212\323\344\223\002\027\022\025\n\006parent\022\013" - + "{bucket=**}\022\217\001\n\014DeleteFolder\022..google.st" - + "orage.control.v2.DeleteFolderRequest\032\026.g" - + "oogle.protobuf.Empty\"7\332A\004name\212\323\344\223\002*\022(\n\004n" - + "ame\022 {bucket=projects/*/buckets/*}/**\022\224\001" - + "\n\tGetFolder\022+.google.storage.control.v2." - + "GetFolderRequest\032!.google.storage.contro" - + "l.v2.Folder\"7\332A\004name\212\323\344\223\002*\022(\n\004name\022 {buc" - + "ket=projects/*/buckets/*}/**\022\224\001\n\013ListFol" - + "ders\022-.google.storage.control.v2.ListFol" - + "dersRequest\032..google.storage.control.v2." - + "ListFoldersResponse\"&\332A\006parent\212\323\344\223\002\027\022\025\n\006" - + "parent\022\013{bucket=**}\022\315\001\n\014RenameFolder\022..g" - + "oogle.storage.control.v2.RenameFolderReq" - + "uest\032\035.google.longrunning.Operation\"n\312A\036" - + "\n\006Folder\022\024RenameFolderMetadata\332A\032name,de" - + "stination_folder_id\212\323\344\223\002*\022(\n\004name\022 {buck" - + "et=projects/*/buckets/*}/**\022\251\001\n\020GetStora" - + "geLayout\0222.google.storage.control.v2.Get" - + "StorageLayoutRequest\032(.google.storage.co" - + "ntrol.v2.StorageLayout\"7\332A\004name\212\323\344\223\002*\022(\n" - + "\004name\022 {bucket=projects/*/buckets/*}/**\032" - + "\247\002\312A\026storage.googleapis.com\322A\212\002https://w" - + "ww.googleapis.com/auth/cloud-platform,ht" - + "tps://www.googleapis.com/auth/cloud-plat" - + "form.read-only,https://www.googleapis.co" - + "m/auth/devstorage.full_control,https://w" - + "ww.googleapis.com/auth/devstorage.read_o" - + "nly,https://www.googleapis.com/auth/devs" - + "torage.read_writeB\264\002\n\035com.google.storage" - + ".control.v2B\023StorageControlProtoP\001ZKclou" - + "d.google.com/go/storage/control/apiv2/st" - + "oragecontrolpb;storagecontrolpb\252\002\037Google" - + ".Cloud.Storage.Control.V2\312\002\037Google\\Cloud" - + "\\Storage\\Control\\V2\352\002#Google::Cloud::Sto" - + "rage::Control::V2\352AD\n\035storage.googleapis" - + ".com/Bucket\022#projects/{project}/buckets/" - + "{bucket}b\006proto3" + + "(\t\022\037\n\nrequest_id\030\003 \001(\tB\013\340A\001\342\214\317\327\010\002\010\001\"\276\002\n\r" + + "ManagedFolder\022\021\n\004name\030\001 \001(\tB\003\340A\010\022\033\n\016meta" + + "generation\030\003 \001(\003B\003\340A\003\0224\n\013create_time\030\004 \001" + + "(\0132\032.google.protobuf.TimestampB\003\340A\003\0224\n\013u" + + "pdate_time\030\005 \001(\0132\032.google.protobuf.Times" + + "tampB\003\340A\003:\220\001\352A\214\001\n$storage.googleapis.com" + + "/ManagedFolder\022Eprojects/{project}/bucke" + + "ts/{bucket}/managedFolders/{managedFolde" + + "r=**}*\016managedFolders2\rmanagedFolder\"\202\002\n" + + "\027GetManagedFolderRequest\022:\n\004name\030\006 \001(\tB," + + "\340A\002\372A&\n$storage.googleapis.com/ManagedFo" + + "lder\022$\n\027if_metageneration_match\030\003 \001(\003H\000\210" + + "\001\001\022(\n\033if_metageneration_not_match\030\004 \001(\003H" + + "\001\210\001\001\022\037\n\nrequest_id\030\005 \001(\tB\013\340A\001\342\214\317\327\010\002\010\001B\032\n" + + "\030_if_metageneration_matchB\036\n\034_if_metagen" + + "eration_not_match\"\342\001\n\032CreateManagedFolde" + + "rRequest\022<\n\006parent\030\001 \001(\tB,\340A\002\372A&\022$storag" + + "e.googleapis.com/ManagedFolder\022E\n\016manage" + + "d_folder\030\002 \001(\0132(.google.storage.control." + + "v2.ManagedFolderB\003\340A\002\022\036\n\021managed_folder_" + + "id\030\003 \001(\tB\003\340A\002\022\037\n\nrequest_id\030\004 \001(\tB\013\340A\001\342\214" + + "\317\327\010\002\010\001\"\236\002\n\032DeleteManagedFolderRequest\022:\n" + + "\004name\030\007 \001(\tB,\340A\002\372A&\n$storage.googleapis." + + "com/ManagedFolder\022$\n\027if_metageneration_m" + + "atch\030\003 \001(\003H\000\210\001\001\022(\n\033if_metageneration_not" + + "_match\030\004 \001(\003H\001\210\001\001\022\027\n\017allow_non_empty\030\005 \001" + + "(\010\022\037\n\nrequest_id\030\006 \001(\tB\013\340A\001\342\214\317\327\010\002\010\001B\032\n\030_" + + "if_metageneration_matchB\036\n\034_if_metagener" + + "ation_not_match\"\300\001\n\031ListManagedFoldersRe" + + "quest\022<\n\006parent\030\001 \001(\tB,\340A\002\372A&\022$storage.g" + + "oogleapis.com/ManagedFolder\022\026\n\tpage_size" + + "\030\002 \001(\005B\003\340A\001\022\027\n\npage_token\030\003 \001(\tB\003\340A\001\022\023\n\006" + + "prefix\030\004 \001(\tB\003\340A\001\022\037\n\nrequest_id\030\005 \001(\tB\013\340" + + "A\001\342\214\317\327\010\002\010\001\"x\n\032ListManagedFoldersResponse" + + "\022A\n\017managed_folders\030\001 \003(\0132(.google.stora" + + "ge.control.v2.ManagedFolder\022\027\n\017next_page" + + "_token\030\002 \001(\t2\315\017\n\016StorageControl\022\232\001\n\014Crea" + + "teFolder\022..google.storage.control.v2.Cre" + + "ateFolderRequest\032!.google.storage.contro" + + "l.v2.Folder\"7\332A\027parent,folder,folder_id\212" + + "\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\022\217\001\n\014DeleteF" + + "older\022..google.storage.control.v2.Delete" + + "FolderRequest\032\026.google.protobuf.Empty\"7\332" + + "A\004name\212\323\344\223\002*\022(\n\004name\022 {bucket=projects/*" + + "/buckets/*}/**\022\224\001\n\tGetFolder\022+.google.st" + + "orage.control.v2.GetFolderRequest\032!.goog" + + "le.storage.control.v2.Folder\"7\332A\004name\212\323\344" + + "\223\002*\022(\n\004name\022 {bucket=projects/*/buckets/" + + "*}/**\022\224\001\n\013ListFolders\022-.google.storage.c" + + "ontrol.v2.ListFoldersRequest\032..google.st" + + "orage.control.v2.ListFoldersResponse\"&\332A" + + "\006parent\212\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\022\315\001\n" + + "\014RenameFolder\022..google.storage.control.v" + + "2.RenameFolderRequest\032\035.google.longrunni" + + "ng.Operation\"n\312A\036\n\006Folder\022\024RenameFolderM" + + "etadata\332A\032name,destination_folder_id\212\323\344\223" + + "\002*\022(\n\004name\022 {bucket=projects/*/buckets/*" + + "}/**\022\251\001\n\020GetStorageLayout\0222.google.stora" + + "ge.control.v2.GetStorageLayoutRequest\032(." + + "google.storage.control.v2.StorageLayout\"" + + "7\332A\004name\212\323\344\223\002*\022(\n\004name\022 {bucket=projects" + + "/*/buckets/*}/**\022\277\001\n\023CreateManagedFolder" + + "\0225.google.storage.control.v2.CreateManag" + + "edFolderRequest\032(.google.storage.control" + + ".v2.ManagedFolder\"G\332A\'parent,managed_fol" + + "der,managed_folder_id\212\323\344\223\002\027\022\025\n\006parent\022\013{" + + "bucket=**}\022\235\001\n\023DeleteManagedFolder\0225.goo" + + "gle.storage.control.v2.DeleteManagedFold" + + "erRequest\032\026.google.protobuf.Empty\"7\332A\004na" + + "me\212\323\344\223\002*\022(\n\004name\022 {bucket=projects/*/buc" + + "kets/*}/**\022\251\001\n\020GetManagedFolder\0222.google" + + ".storage.control.v2.GetManagedFolderRequ" + + "est\032(.google.storage.control.v2.ManagedF" + + "older\"7\332A\004name\212\323\344\223\002*\022(\n\004name\022 {bucket=pr" + + "ojects/*/buckets/*}/**\022\251\001\n\022ListManagedFo" + + "lders\0224.google.storage.control.v2.ListMa" + + "nagedFoldersRequest\0325.google.storage.con" + + "trol.v2.ListManagedFoldersResponse\"&\332A\006p" + + "arent\212\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\032\247\002\312A\026" + + "storage.googleapis.com\322A\212\002https://www.go" + + "ogleapis.com/auth/cloud-platform,https:/" + + "/www.googleapis.com/auth/cloud-platform." + + "read-only,https://www.googleapis.com/aut" + + "h/devstorage.full_control,https://www.go" + + "ogleapis.com/auth/devstorage.read_only,h" + + "ttps://www.googleapis.com/auth/devstorag" + + "e.read_writeB\246\002\n\035com.google.storage.cont" + + "rol.v2B\023StorageControlProtoP\001Z=cloud.goo" + + "gle.com/go/storage/control/apiv2/control" + + "pb;controlpb\252\002\037Google.Cloud.Storage.Cont" + + "rol.V2\312\002\037Google\\Cloud\\Storage\\Control\\V2" + + "\352\002#Google::Cloud::Storage::Control::V2\352A" + + "D\n\035storage.googleapis.com/Bucket\022#projec" + + "ts/{project}/buckets/{bucket}b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( @@ -355,6 +431,58 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { new java.lang.String[] { "Name", "Prefix", "RequestId", }); + internal_static_google_storage_control_v2_ManagedFolder_descriptor = + getDescriptor().getMessageTypes().get(12); + internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_ManagedFolder_descriptor, + new java.lang.String[] { + "Name", "Metageneration", "CreateTime", "UpdateTime", + }); + internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor = + getDescriptor().getMessageTypes().get(13); + internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor, + new java.lang.String[] { + "Name", "IfMetagenerationMatch", "IfMetagenerationNotMatch", "RequestId", + }); + internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor = + getDescriptor().getMessageTypes().get(14); + internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor, + new java.lang.String[] { + "Parent", "ManagedFolder", "ManagedFolderId", "RequestId", + }); + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor = + getDescriptor().getMessageTypes().get(15); + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor, + new java.lang.String[] { + "Name", + "IfMetagenerationMatch", + "IfMetagenerationNotMatch", + "AllowNonEmpty", + "RequestId", + }); + internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor = + getDescriptor().getMessageTypes().get(16); + internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor, + new java.lang.String[] { + "Parent", "PageSize", "PageToken", "Prefix", "RequestId", + }); + internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor = + getDescriptor().getMessageTypes().get(17); + internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor, + new java.lang.String[] { + "ManagedFolders", "NextPageToken", + }); com.google.protobuf.ExtensionRegistry registry = com.google.protobuf.ExtensionRegistry.newInstance(); registry.add(com.google.api.ClientProto.defaultHost); diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java index 01221716f0..df62a75829 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java index 70994aa721..cc07785db2 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface StorageLayoutOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto b/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto index ddc391c5f5..5e460eb9ca 100644 --- a/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto +++ b/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto @@ -26,7 +26,7 @@ import "google/protobuf/empty.proto"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "Google.Cloud.Storage.Control.V2"; -option go_package = "cloud.google.com/go/storage/control/apiv2/storagecontrolpb;storagecontrolpb"; +option go_package = "cloud.google.com/go/storage/control/apiv2/controlpb;controlpb"; option java_multiple_files = true; option java_outer_classname = "StorageControlProto"; option java_package = "com.google.storage.control.v2"; @@ -112,6 +112,47 @@ service StorageControl { }; option (google.api.method_signature) = "name"; } + + // Creates a new managed folder. + rpc CreateManagedFolder(CreateManagedFolderRequest) returns (ManagedFolder) { + option (google.api.routing) = { + routing_parameters { field: "parent" path_template: "{bucket=**}" } + }; + option (google.api.method_signature) = + "parent,managed_folder,managed_folder_id"; + } + + // Permanently deletes an empty managed folder. + rpc DeleteManagedFolder(DeleteManagedFolderRequest) + returns (google.protobuf.Empty) { + option (google.api.routing) = { + routing_parameters { + field: "name" + path_template: "{bucket=projects/*/buckets/*}/**" + } + }; + option (google.api.method_signature) = "name"; + } + + // Returns metadata for the specified managed folder. + rpc GetManagedFolder(GetManagedFolderRequest) returns (ManagedFolder) { + option (google.api.routing) = { + routing_parameters { + field: "name" + path_template: "{bucket=projects/*/buckets/*}/**" + } + }; + option (google.api.method_signature) = "name"; + } + + // Retrieves a list of managed folders for a given bucket. + rpc ListManagedFolders(ListManagedFoldersRequest) + returns (ListManagedFoldersResponse) { + option (google.api.routing) = { + routing_parameters { field: "parent" path_template: "{bucket=**}" } + }; + option (google.api.method_signature) = "parent"; + } } // Contains information about a pending rename operation. @@ -195,7 +236,11 @@ message CreateFolderRequest { // error. Folder folder = 2 [(google.api.field_behavior) = REQUIRED]; - // Required. The absolute path of the folder, using a single `/` as delimiter. + // Required. The full name of a folder, including all its parent folders. + // Folders use single '/' characters as a delimiter. + // The folder_id must end with a slash. + // For example, the folder_id of "books/biographies/" would create a new + // "biographies/" folder under the "books/" folder. string folder_id = 3 [(google.api.field_behavior) = REQUIRED]; // Optional. If true, parent folder doesn't have to be present and all missing @@ -428,3 +473,161 @@ message GetStorageLayoutRequest { (google.api.field_behavior) = OPTIONAL ]; } + +// A managed folder. +message ManagedFolder { + option (google.api.resource) = { + type: "storage.googleapis.com/ManagedFolder" + pattern: "projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}" + plural: "managedFolders" + singular: "managedFolder" + }; + + // Identifier. The name of this managed folder. + // Format: + // `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + string name = 1 [(google.api.field_behavior) = IDENTIFIER]; + + // Output only. The metadata version of this managed folder. It increases + // whenever the metadata is updated. Used for preconditions and for detecting + // changes in metadata. Managed folders don't have a generation number. + int64 metageneration = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The creation time of the managed folder. + google.protobuf.Timestamp create_time = 4 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The modification time of the managed folder. + google.protobuf.Timestamp update_time = 5 + [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +// Request message for GetManagedFolder. +message GetManagedFolderRequest { + // Required. Name of the managed folder. + // Format: + // `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + string name = 6 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // The operation succeeds conditional on the managed folder's current + // metageneration matching the value here specified. + optional int64 if_metageneration_match = 3; + + // The operation succeeds conditional on the managed folder's current + // metageneration NOT matching the value here specified. + optional int64 if_metageneration_not_match = 4; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 5 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// Request message for CreateManagedFolder. +message CreateManagedFolderRequest { + // Required. Name of the bucket this managed folder belongs to. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // Required. Properties of the managed folder being created. + // The bucket and managed folder names are specified in the `parent` and + // `managed_folder_id` fields. Populating these fields in `managed_folder` + // will result in an error. + ManagedFolder managed_folder = 2 [(google.api.field_behavior) = REQUIRED]; + + // Required. The name of the managed folder. It uses a single `/` as delimiter + // and leading and trailing `/` are allowed. + string managed_folder_id = 3 [(google.api.field_behavior) = REQUIRED]; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 4 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// DeleteManagedFolder RPC request message. +message DeleteManagedFolderRequest { + // Required. Name of the managed folder. + // Format: + // `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + string name = 7 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // The operation succeeds conditional on the managed folder's current + // metageneration matching the value here specified. + optional int64 if_metageneration_match = 3; + + // The operation succeeds conditional on the managed folder's current + // metageneration NOT matching the value here specified. + optional int64 if_metageneration_not_match = 4; + + // Allows deletion of a managed folder even if it is not empty. + // A managed folder is empty if it manages no child managed folders or + // objects. Caller must have permission for + // storage.managedFolders.setIamPolicy. + bool allow_non_empty = 5; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 6 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// Request message for ListManagedFolders. +message ListManagedFoldersRequest { + // Required. Name of the bucket this managed folder belongs to. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // Optional. Maximum number of managed folders to return in a single response. + // The service will use this parameter or 1,000 items, whichever is smaller. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A previously-returned page token representing part of the larger + // set of results to view. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Filter results to match managed folders with name starting with + // this prefix. + string prefix = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 5 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// Response message for ListManagedFolders. +message ListManagedFoldersResponse { + // The list of matching managed folders + repeated ManagedFolder managed_folders = 1; + + // The continuation token, used to page through large result sets. Provide + // this value in a subsequent request to return the next page of results. + string next_page_token = 2; +} diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java index 966db3096c..910d25b01d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java index 25eb60d126..0277e95f72 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BidiWriteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java index ecc93d8293..c101557ed6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java index 4677316445..528a442896 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BidiWriteObjectResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java index 347b9632a6..67a5df95bd 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java index ec3a58fb93..b2c6ce1a8f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java index a9828d2239..2c2582831a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BucketAccessControlOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java index 8c6c315be4..d404726a3b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BucketOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java index 14f0654359..665a6bd9e7 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java index 1b091899fb..7f147ed6b6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CancelResumableWriteRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java index 611ce5d0bf..520b8eafae 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java index 12713bdba6..ba03212461 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CancelResumableWriteResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java index 02cf2fd73c..824ba38894 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java index e2e6c5f2c4..d5199d01d6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ChecksummedDataOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java index 5083977e8c..52a536ab54 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java index 9e125a682f..8232fa50e7 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CommonObjectRequestParamsOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java index f8e6e75e34..c400203b53 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java index 4c5fad6de5..1eaa01f1a3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ComposeObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java index 354a5e6eb4..98a1721113 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java index f85ddc28df..d4cf266f8e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ContentRangeOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java index 95f1d7555a..8c1eed4745 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java index 34ac8754dd..32fa4e23d6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java index b7fb2a1e4a..278b0bee55 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java index 6e190c0126..df1e6b8135 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java index 15ecdafe29..4e763b462c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java index efa4aa0ba4..1b0ca68d84 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateHmacKeyResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java index 8d7c5bb8d2..32583d678c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java index 7b4ec70aaf..fb106cbd0d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateNotificationConfigRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java index d6f5da1d26..9c12a01357 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java index 9822f680ac..dea3c58a16 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CustomerEncryptionOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java index d47d6858f1..a41ce6b14a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java index c62cc0d345..e16f379ea9 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java index 03efca0bdf..f424f3e660 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java index 0bcff6a226..25f792bd18 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java index b0a1229387..3ed33c9ef2 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java index 34c0255038..c0b97b8da3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteNotificationConfigRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java index 7a512521b9..225ab6115b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java index ff1b26eeac..26265c14dc 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java index 7c221513b4..e436ba6cfc 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java index 322ff10644..0a797f87ca 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java index 49a48fe993..1ac5037e16 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java index 634982db7d..810b54f45a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java index f7eddbb181..ac58e69583 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java index 5e9802702c..722654bff8 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetNotificationConfigRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java index f4efc51529..383c4f611c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java index ecf25653e8..3c9d4e4b29 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java index 3819b8d186..103bc4a558 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java index 63891d701f..9d883a5127 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetServiceAccountRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java index 4f6c090d26..08557a21b6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java index 0070c3beec..10537fa671 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface HmacKeyMetadataOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java index 80ed57b2e8..3f0459ea2d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java index e0f513de62..57c83288a6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListBucketsRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java index 479d8e5004..9f3b2e621e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java index ba54e45019..d097829222 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListBucketsResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java index 4bb92e4bb8..833ed56d45 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java index 7b98cab439..170f169364 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListHmacKeysRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java index 6d7469ac8a..54344d68a8 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java index bb0e3da58b..994e550681 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListHmacKeysResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java index 191a58ee0b..199bc95e08 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java index 6b7b7789d7..1c08d45143 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListNotificationConfigsRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java index 71040f24c0..9e0c00e9ae 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java index 04a105ca44..ee7634c0bc 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListNotificationConfigsResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java index 22ec3b58ea..ddb575f2ac 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java index 215d9afc59..6abda60794 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListObjectsRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java index 0e845ba1dc..392f5c5cc9 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java index 36d17c565d..ef5e82b8a3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListObjectsResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java index f3a53269d0..f866fcaa34 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java index 889ceb8ff6..8c9b7e67c8 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface LockBucketRetentionPolicyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java index 0a0e5a5951..479b8ffb2b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java index 8133f4e80e..56cb9e6c3b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface NotificationConfigOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java index 13e834eb36..7e4d6f90d4 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java index 89f0076a9b..6a56338b5a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java index 5c9a4196d5..11e3909aa4 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ObjectAccessControlOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java index b14c58b699..6a515e0597 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java index 27c07d87c2..f58e290a93 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ObjectChecksumsOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java index db5ea2166c..62f72c138e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ObjectOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java index 3cf0d0396c..9a6afaf97e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java index 60155b5978..d9a742fd5f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface OwnerOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java index d7d6fc4372..0f512e2c72 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java index 4fc6b346e6..39317d44ea 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ProjectTeamOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java index 6f3c4cce6f..bed16901c3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java index c35bb3baf0..055478ae9f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface QueryWriteStatusRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java index 61ee8a83d9..b71c9d45ac 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java index 3ba839ad5d..f3a139e588 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface QueryWriteStatusResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java index be84b61983..55778a11fd 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java index 432a4da5d9..94ad9c8236 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ReadObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java index 8af403a236..e86769077a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java index 1ba816a2f9..b57255da69 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ReadObjectResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java index af68901a65..c01c3d744d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java index 9fcc63edbf..b7f8a0f18e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface RestoreObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java index 45d3cd237d..d5aaa957b4 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java index 923f2eea74..2ea2851176 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface RewriteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java index 8ffa674ddb..2e6aaf6873 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java index b45f32bdd7..47a97cacb2 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface RewriteResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java index b992bbe7a6..775517f952 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java index 662e2e777c..835c27b6af 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ServiceAccountOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java index 87cd402171..ebe87b2582 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java index c187cdb996..db818ba878 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ServiceConstantsOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java index 88f4236f57..626db2a07d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java index 51cc325add..1d1a842a25 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface StartResumableWriteRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java index d9502fbca9..a1fda1a6ca 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java index 3172451eb7..d0ec115de3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface StartResumableWriteResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java index fab5bd6825..caa3bf077d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public final class StorageProto { diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java index 30f7424aa0..85cd112fc2 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java index 67e1b64cbc..98179a9935 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface UpdateBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java index cdf494ccd7..b6f06d1fe1 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java index 7a14645ccf..8683e6816d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface UpdateHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java index fe7c51344a..f1583c5781 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java index 24446a84b7..962d3e3881 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface UpdateObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java index 9071cfe9d9..aeabc66494 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java index f0efb8f1ac..fd2a6639a1 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface WriteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java index 5ae8dc20e6..b01fd73775 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java index 55ffac3007..536ca8263e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface WriteObjectResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java index 0aad6e0eb9..867a6ade1d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java index 8643b90e81..6c0bdb6b6f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface WriteObjectSpecOrBuilder diff --git a/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java b/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java index 71c824e417..28ad20d183 100644 --- a/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java +++ b/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java @@ -28,10 +28,11 @@ public static void main(String... args) throws Exception { // Instantiates a client in a try-with-resource to automatically cleanup underlying resources try (StorageControlClient storageControlClient = StorageControlClient.create()) { - GetStorageLayoutRequest request = GetStorageLayoutRequest.newBuilder() - // Set project to "_" to signify global bucket - .setName(StorageLayoutName.format("_", bucketName)) - .build(); + GetStorageLayoutRequest request = + GetStorageLayoutRequest.newBuilder() + // Set project to "_" to signify global bucket + .setName(StorageLayoutName.format("_", bucketName)) + .build(); StorageLayout response = storageControlClient.getStorageLayout(request); System.out.printf("Performed getStorageLayout request for %s", response.getName()); } diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java index 5e09f5a911..b77a6fee67 100644 --- a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java @@ -30,31 +30,32 @@ class DownloadBucket { - public static void downloadBucketContents(String projectId, - String bucketName, Path destinationDirectory) { + public static void downloadBucketContents( + String projectId, String bucketName, Path destinationDirectory) { Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService(); - List blobs = storage - .list(bucketName) - .streamAll() - .map(blob -> blob.asBlobInfo()) - .collect(Collectors.toList()); + List blobs = + storage + .list(bucketName) + .streamAll() + .map(blob -> blob.asBlobInfo()) + .collect(Collectors.toList()); TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); - ParallelDownloadConfig parallelDownloadConfig = ParallelDownloadConfig.newBuilder() - .setBucketName(bucketName) - .setDownloadDirectory(destinationDirectory) - .build(); + ParallelDownloadConfig parallelDownloadConfig = + ParallelDownloadConfig.newBuilder() + .setBucketName(bucketName) + .setDownloadDirectory(destinationDirectory) + .build(); - List results = transferManager - .downloadBlobs(blobs, parallelDownloadConfig) - .getDownloadResults(); + List results = + transferManager.downloadBlobs(blobs, parallelDownloadConfig).getDownloadResults(); for (DownloadResult result : results) { - System.out.println("Download of " + result.getInput().getName() - + " completed with status " - + result.getStatus()); + System.out.println( + "Download of " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); } - } - } // [END storage_transfer_manager_download_bucket] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java index 4fd1720b38..aae4d80596 100644 --- a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java @@ -27,25 +27,26 @@ class DownloadMany { - public static void downloadManyBlobs(String bucketName, - List blobs, Path destinationDirectory) { + public static void downloadManyBlobs( + String bucketName, List blobs, Path destinationDirectory) { TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); - ParallelDownloadConfig parallelDownloadConfig = ParallelDownloadConfig.newBuilder() - .setBucketName(bucketName) - .setDownloadDirectory(destinationDirectory) - .build(); + ParallelDownloadConfig parallelDownloadConfig = + ParallelDownloadConfig.newBuilder() + .setBucketName(bucketName) + .setDownloadDirectory(destinationDirectory) + .build(); - List results = transferManager - .downloadBlobs(blobs, parallelDownloadConfig) - .getDownloadResults(); + List results = + transferManager.downloadBlobs(blobs, parallelDownloadConfig).getDownloadResults(); for (DownloadResult result : results) { - System.out.println("Download of " + result.getInput().getName() - + " completed with status " + result.getStatus()); + System.out.println( + "Download of " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); } - } - } // [END storage_transfer_manager_download_many] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java index 096b2daedb..0a14bec049 100644 --- a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java @@ -33,27 +33,25 @@ class UploadDirectory { public static void uploadDirectoryContents(String bucketName, Path sourceDirectory) throws IOException { TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); - ParallelUploadConfig parallelUploadConfig = ParallelUploadConfig - .newBuilder() - .setBucketName(bucketName) - .build(); + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucketName).build(); // Create a list to store the file paths List filePaths = new ArrayList<>(); // Get all files in the directory // try-with-resource to ensure pathStream is closed try (Stream pathStream = Files.walk(sourceDirectory)) { - pathStream.filter(Files::isRegularFile) - .forEach(filePaths::add); + pathStream.filter(Files::isRegularFile).forEach(filePaths::add); } - List results = transferManager - .uploadFiles(filePaths, parallelUploadConfig) - .getUploadResults(); + List results = + transferManager.uploadFiles(filePaths, parallelUploadConfig).getUploadResults(); for (UploadResult result : results) { - System.out.println("Upload for " + result.getInput().getName() - + " completed with status " + result.getStatus()); + System.out.println( + "Upload for " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); } } - } -// [END storage_transfer_manager_upload_directory] \ No newline at end of file +// [END storage_transfer_manager_upload_directory] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java index 245df36492..b477f87bdd 100644 --- a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java @@ -27,19 +27,18 @@ class UploadMany { - public static void uploadManyFiles(String bucketName, List files) - throws IOException { + public static void uploadManyFiles(String bucketName, List files) throws IOException { TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); - ParallelUploadConfig parallelUploadConfig = ParallelUploadConfig - .newBuilder() - .setBucketName(bucketName) - .build(); - List results = transferManager - .uploadFiles(files, parallelUploadConfig) - .getUploadResults(); + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucketName).build(); + List results = + transferManager.uploadFiles(files, parallelUploadConfig).getUploadResults(); for (UploadResult result : results) { - System.out.println("Upload for " + result.getInput().getName() - + " completed with status " + result.getStatus()); + System.out.println( + "Upload for " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); } } } diff --git a/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java b/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java index c34b08de6d..847ec0d75a 100644 --- a/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java +++ b/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java @@ -83,7 +83,9 @@ public void testQuickstartStorageControl() throws Exception { QuickstartStorageControlSample.main(bucketName); String got = stdOutCaptureRule.getCapturedOutputAsUtf8String(); assertThat(got) - .contains(String.format("Performed getStorageLayout request for %s", - StorageLayoutName.format("_", bucketName))); + .contains( + String.format( + "Performed getStorageLayout request for %s", + StorageLayoutName.format("_", bucketName))); } } diff --git a/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java b/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java index e43b3a16f7..4a9a3d0440 100644 --- a/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java +++ b/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java @@ -19,7 +19,6 @@ import static com.google.common.truth.Truth.assertThat; -import com.google.cloud.storage.BlobId; import com.google.cloud.storage.BlobInfo; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.Storage; @@ -29,7 +28,6 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.BeforeClass; @@ -37,14 +35,12 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; - public class ITTransferManagerSamples { private static final String BUCKET = RemoteStorageHelper.generateBucketName(); private static Storage storage; private static List blobs; private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); - @Rule - public final StdOutCaptureRule stdOutCaptureRule = new StdOutCaptureRule(); + @Rule public final StdOutCaptureRule stdOutCaptureRule = new StdOutCaptureRule(); @Rule public final TemporaryFolder tmp = new TemporaryFolder(); @Rule public final TemporaryFolder tmpDirectory = new TemporaryFolder(); @@ -53,22 +49,22 @@ public static void beforeClass() { RemoteStorageHelper helper = RemoteStorageHelper.create(); storage = helper.getOptions().getService(); storage.create(BucketInfo.of(BUCKET)); - blobs = Arrays.asList(BlobInfo.newBuilder(BUCKET, "blob1").build(), - BlobInfo.newBuilder(BUCKET, "blob2").build(), - BlobInfo.newBuilder(BUCKET, "blob3").build()); + blobs = + Arrays.asList( + BlobInfo.newBuilder(BUCKET, "blob1").build(), + BlobInfo.newBuilder(BUCKET, "blob2").build(), + BlobInfo.newBuilder(BUCKET, "blob3").build()); for (BlobInfo blob : blobs) { storage.create(blob); } - } - + @Test public void uploadFiles() throws Exception { File tmpFile = File.createTempFile("file", ".txt"); File tmpFile2 = File.createTempFile("file2", ".txt"); File tmpFile3 = File.createTempFile("file3", ".txt"); - List files = - ImmutableList.of(tmpFile.toPath(), tmpFile2.toPath(), tmpFile3.toPath()); + List files = ImmutableList.of(tmpFile.toPath(), tmpFile2.toPath(), tmpFile3.toPath()); UploadMany.uploadManyFiles(BUCKET, files); String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); assertThat(snippetOutput.contains("file")).isTrue(); @@ -92,15 +88,16 @@ public void uploadDirectory() throws IOException { public void downloadBucket() { String downloadFullBucketName = RemoteStorageHelper.generateBucketName(); storage.create(BucketInfo.of(downloadFullBucketName)); - List bucketBlobs = Arrays.asList( - BlobInfo.newBuilder(downloadFullBucketName, "bucketb1").build(), - BlobInfo.newBuilder(downloadFullBucketName, "bucketb2").build(), - BlobInfo.newBuilder(downloadFullBucketName, "bucketb3").build()); + List bucketBlobs = + Arrays.asList( + BlobInfo.newBuilder(downloadFullBucketName, "bucketb1").build(), + BlobInfo.newBuilder(downloadFullBucketName, "bucketb2").build(), + BlobInfo.newBuilder(downloadFullBucketName, "bucketb3").build()); for (BlobInfo blob : bucketBlobs) { storage.create(blob); } - DownloadBucket - .downloadBucketContents(PROJECT_ID, downloadFullBucketName, tmp.getRoot().toPath()); + DownloadBucket.downloadBucketContents( + PROJECT_ID, downloadFullBucketName, tmp.getRoot().toPath()); String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); assertThat(snippetOutput.contains("bucketb1")).isTrue(); assertThat(snippetOutput.contains("bucketb2")).isTrue(); @@ -115,5 +112,4 @@ public void downloadFiles() { assertThat(snippetOutput.contains("blob2")).isTrue(); assertThat(snippetOutput.contains("blob3")).isTrue(); } - } From 2dc4748353be4fe06ec7df2e413ed5752d350f8b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 00:16:40 +0200 Subject: [PATCH 24/40] deps: update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.43.0 (#2459) --- .../com/google/cloud/storage/it/runner/registry/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile b/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile index 2c621adeed..a1ab72d758 100644 --- a/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile +++ b/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile @@ -1 +1 @@ -FROM gcr.io/cloud-devrel-public-resources/storage-testbench:v0.42.0 +FROM gcr.io/cloud-devrel-public-resources/storage-testbench:v0.43.0 From 9c2ee909d02fef5afc201589f5ced4062e2f14e8 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 00:48:46 +0200 Subject: [PATCH 25/40] deps: update dependency com.google.apis:google-api-services-storage to v1-rev20240319-2.0.0 (#2460) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fd08055813..5464d3e8e8 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ com.google.apis google-api-services-storage - v1-rev20240311-2.0.0 + v1-rev20240319-2.0.0 com.google.cloud From f5286424e58aeb782156c054c5c8a9b0b9fec380 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 00:50:03 +0200 Subject: [PATCH 26/40] test(deps): update cross product test dependencies (#2461) --- google-cloud-storage/pom.xml | 6 +++--- pom.xml | 2 +- samples/install-without-bom/pom.xml | 2 +- samples/native-image-sample/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- samples/snippets/pom.xml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index c6219b776d..edba4c3653 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -16,7 +16,7 @@ google-cloud-storage - 1.109.3 + 1.110.1 5.10.2 @@ -181,13 +181,13 @@ com.google.api.grpc proto-google-cloud-kms-v1 - 0.131.0 + 0.135.0 test com.google.cloud google-cloud-kms - 2.40.0 + 2.44.0 test diff --git a/pom.xml b/pom.xml index 5464d3e8e8..bbdbbd51ec 100644 --- a/pom.xml +++ b/pom.xml @@ -86,7 +86,7 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.128.1 test diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 7144a5dbeb..b6a9302527 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.127.2 + 1.128.1 test diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index fc3e6f2371..3bc048e15b 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -61,7 +61,7 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.128.1 test diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 57278b0397..325cb934ba 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -58,7 +58,7 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.128.1 test diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 3d0dd50955..1c92857710 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -76,7 +76,7 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.128.1 test From d2ba996188138fa075df25bfe05b27e06be19ce1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 00:51:13 +0200 Subject: [PATCH 27/40] chore(deps): update dependency com.google.cloud:google-cloud-storage to v2.36.1 (#2463) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update dependency com.google.cloud:google-cloud-storage to v2.36.1 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- README.md | 2 +- samples/install-without-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 37601a50f2..39e970e57a 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-storage - 2.36.0 + 2.36.1 com.google.cloud diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index b6a9302527..600202aad8 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,7 +30,7 @@ com.google.cloud google-cloud-storage - 2.36.0 + 2.36.1 com.google.cloud From c12f3290a029c25cdac458cda44835c0a43c33e7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 00:51:42 +0200 Subject: [PATCH 28/40] deps: update dependency com.google.cloud:sdk-platform-java-config to v3.28.1 (#2467) --- .github/workflows/unmanaged_dependency_check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 434ae77860..b33ec59176 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.27.0 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.28.1 with: bom-path: google-cloud-storage-bom/pom.xml From 0a837678ef1fd5c2013f3e11b59a078581b4cd1c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 17:49:08 +0200 Subject: [PATCH 29/40] chore(deps): update dependency com.google.cloud:libraries-bom to v26.37.0 (#2478) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update dependency com.google.cloud:libraries-bom to v26.37.0 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- README.md | 2 +- samples/native-image-sample/pom.xml | 2 +- samples/snippets/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 39e970e57a..e5b41028c2 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.34.0 + 26.37.0 pom import diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index 3bc048e15b..6317262180 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -29,7 +29,7 @@ com.google.cloud libraries-bom - 26.34.0 + 26.37.0 pom import diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 1c92857710..296fe80588 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -31,7 +31,7 @@ com.google.cloud libraries-bom - 26.34.0 + 26.37.0 pom import From a336d3922df5dd6237e072f0c3742c4bcd6f8d3b Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:08:50 -0700 Subject: [PATCH 30/40] chore: adding 'infrastructure-public-image-' tags for owlbot-java (#1947) (#2490) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: adding 'infrastructure-public-image-' tags for owlbot-java (#1947) Source-Link: https://github.com/googleapis/synthtool/commit/349943b54f15f9f9655a3d1c35d58acb68165678 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-java:latest@sha256:033161f610016d155d58f96769ad5a821d203824684e8a13fc50be8c25a5f9cf * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot Co-authored-by: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> --- .github/.OwlBot.lock.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index bf48c82da1..d47d3d76b1 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:0d1bb26a1a99ae0456176bf891b8490e9aab424a5cb4e4d301d9703c4dc43b58 -# created: 2024-01-30T19:46:55.029238294Z + digest: sha256:033161f610016d155d58f96769ad5a821d203824684e8a13fc50be8c25a5f9cf +# created: 2024-04-04T20:03:23.876897177Z From 4baef8faf2869ebe5e8f12e8542b1034ca4e0d37 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 23:20:07 +0200 Subject: [PATCH 31/40] build(deps): update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.0 (#2496) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build(deps): update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.0 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- README.md | 5 +++++ samples/native-image-sample/pom.xml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e5b41028c2..6803432c7e 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,11 @@ If you are using Maven without the BOM, add this to your dependencies: google-cloud-storage-control 2.36.0-alpha + + com.google.cloud + google-cloud-storage-control + 2.36.0-alpha + ``` diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index 6317262180..b066547fc3 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -78,7 +78,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.4.0 From 9b0253ca1a03d6a90a1008794b00c6825d26ff0c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Apr 2024 23:20:29 +0200 Subject: [PATCH 32/40] deps: update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.44.0 (#2497) --- .../com/google/cloud/storage/it/runner/registry/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile b/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile index a1ab72d758..a18e9da047 100644 --- a/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile +++ b/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile @@ -1 +1 @@ -FROM gcr.io/cloud-devrel-public-resources/storage-testbench:v0.43.0 +FROM gcr.io/cloud-devrel-public-resources/storage-testbench:v0.44.0 From 4ac5fc1d9fed6a7fec090b23cd4d0ddb6568e597 Mon Sep 17 00:00:00 2001 From: Alice <65933803+alicejli@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:41:54 -0400 Subject: [PATCH 33/40] chore: include recommended_package in repo-metadata.json (#2498) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: include recommended_package in repo-metadata.json * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .repo-metadata.json | 3 ++- README.md | 5 ----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.repo-metadata.json b/.repo-metadata.json index a9b3a810bc..e37a0cdb0c 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -15,5 +15,6 @@ "requires_billing": true, "library_type": "GAPIC_COMBO", "extra_versioned_modules": "gapic-google-cloud-storage-v2", - "excluded_poms": "google-cloud-storage-bom,google-cloud-storage" + "excluded_poms": "google-cloud-storage-bom,google-cloud-storage", + "recommended_package": "com.google.cloud.storage" } diff --git a/README.md b/README.md index 6803432c7e..e5b41028c2 100644 --- a/README.md +++ b/README.md @@ -53,11 +53,6 @@ If you are using Maven without the BOM, add this to your dependencies: google-cloud-storage-control 2.36.0-alpha - - com.google.cloud - google-cloud-storage-control - 2.36.0-alpha - ``` From 09043c5587ae9e6adeb425f5c2f7c4f65ec5e20e Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Wed, 17 Apr 2024 18:48:07 -0400 Subject: [PATCH 34/40] fix: update Grpc Retry Conformance after new additions to testbench (#2309) --- .../storage/GrpcRetryAlgorithmManager.java | 4 +- .../google/cloud/storage/GrpcStorageImpl.java | 63 +++- .../ITGrpcStorageImplUploadRetryTest.java | 310 ------------------ .../PackagePrivateMethodWorkarounds.java | 17 +- .../retry/ITRetryConformanceTest.java | 7 +- .../conformance/retry/RpcMethodMapping.java | 10 +- .../conformance/retry/RpcMethodMappings.java | 5 +- .../retry/TestRetryConformance.java | 26 +- 8 files changed, 87 insertions(+), 355 deletions(-) delete mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/ITGrpcStorageImplUploadRetryTest.java diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java index de7af195b9..3a97c2e952 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java @@ -86,11 +86,11 @@ public ResultRetryAlgorithm getFor(CreateNotificationConfigRequest req) { } public ResultRetryAlgorithm getFor(DeleteBucketRequest req) { - return retryStrategy.getNonidempotentHandler(); + return retryStrategy.getIdempotentHandler(); } public ResultRetryAlgorithm getFor(DeleteHmacKeyRequest req) { - return retryStrategy.getNonidempotentHandler(); + return retryStrategy.getIdempotentHandler(); } public ResultRetryAlgorithm getFor(DeleteNotificationConfigRequest req) { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java index e5e81c060e..c195ce78f3 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java @@ -262,8 +262,32 @@ public Blob create( @Override public Blob create(BlobInfo blobInfo, InputStream content, BlobWriteOption... options) { try { - return createFrom(blobInfo, content, options); - } catch (IOException e) { + requireNonNull(blobInfo, "blobInfo must be non null"); + InputStream inputStreamParam = firstNonNull(content, new ByteArrayInputStream(ZERO_BYTES)); + + Opts optsWithDefaults = Opts.unwrap(options).prepend(defaultOpts); + GrpcCallContext grpcCallContext = + optsWithDefaults.grpcMetadataMapper().apply(GrpcCallContext.createDefault()); + WriteObjectRequest req = getWriteObjectRequest(blobInfo, optsWithDefaults); + Hasher hasher = Hasher.enabled(); + GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); + UnbufferedWritableByteChannelSession session = + ResumableMedia.gapic() + .write() + .byteChannel(storageClient.writeObjectCallable().withDefaultCallContext(merge)) + .setByteStringStrategy(ByteStringStrategy.noCopy()) + .setHasher(hasher) + .direct() + .unbuffered() + .setRequest(req) + .build(); + + try (UnbufferedWritableByteChannel c = session.open()) { + ByteStreams.copy(Channels.newChannel(inputStreamParam), c); + } + ApiFuture responseApiFuture = session.getResult(); + return this.getBlob(responseApiFuture); + } catch (IOException | ApiException e) { throw StorageException.coalesce(e); } } @@ -549,17 +573,20 @@ public boolean delete(String bucket, BucketSourceOption... options) { DeleteBucketRequest.Builder builder = DeleteBucketRequest.newBuilder().setName(bucketNameCodec.encode(bucket)); DeleteBucketRequest req = opts.deleteBucketsRequest().apply(builder).build(); - try { - GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); - Retrying.run( - getOptions(), - retryAlgorithmManager.getFor(req), - () -> storageClient.deleteBucketCallable().call(req, merge), - Decoder.identity()); - return true; - } catch (StorageException e) { - return false; - } + GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); + return Boolean.TRUE.equals( + Retrying.run( + getOptions(), + retryAlgorithmManager.getFor(req), + () -> { + try { + storageClient.deleteBucketCallable().call(req, merge); + return true; + } catch (NotFoundException e) { + return false; + } + }, + Decoder.identity())); } @Override @@ -760,11 +787,19 @@ public GrpcBlobWriteChannel writer(BlobInfo blobInfo, BlobWriteOption... options opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault()); WriteObjectRequest req = getWriteObjectRequest(blobInfo, opts); Hasher hasher = Hasher.noop(); + // in JSON, the starting of the resumable session happens before the invocation of write can + // happen. Emulate the same thing here. + // 1. create the future + ApiFuture startResumableWrite = startResumableWrite(grpcCallContext, req); + // 2. await the result of the future + ResumableWrite resumableWrite = ApiFutureUtils.await(startResumableWrite); + // 3. wrap the result in another future container before constructing the BlobWriteChannel + ApiFuture wrapped = ApiFutures.immediateFuture(resumableWrite); return new GrpcBlobWriteChannel( storageClient.writeObjectCallable(), getOptions(), retryAlgorithmManager.idempotent(), - () -> startResumableWrite(grpcCallContext, req), + () -> wrapped, hasher); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGrpcStorageImplUploadRetryTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGrpcStorageImplUploadRetryTest.java deleted file mode 100644 index 12f1bd6b9a..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGrpcStorageImplUploadRetryTest.java +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright 2022 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.google.cloud.storage; - -import static com.google.cloud.storage.ByteSizeConstants._2MiB; -import static com.google.common.truth.Truth.assertThat; - -import com.google.api.core.ApiFuture; -import com.google.api.gax.grpc.GrpcCallContext; -import com.google.cloud.storage.ITGapicUnbufferedWritableByteChannelTest.DirectWriteService; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.Storage.BlobWriteOption; -import com.google.common.collect.ImmutableList; -import com.google.protobuf.ByteString; -import com.google.storage.v2.ChecksummedData; -import com.google.storage.v2.Object; -import com.google.storage.v2.ObjectChecksums; -import com.google.storage.v2.QueryWriteStatusRequest; -import com.google.storage.v2.QueryWriteStatusResponse; -import com.google.storage.v2.StartResumableWriteRequest; -import com.google.storage.v2.StartResumableWriteResponse; -import com.google.storage.v2.StorageGrpc.StorageImplBase; -import com.google.storage.v2.WriteObjectRequest; -import com.google.storage.v2.WriteObjectResponse; -import com.google.storage.v2.WriteObjectSpec; -import io.grpc.Status.Code; -import io.grpc.stub.StreamObserver; -import java.io.InputStream; -import java.nio.channels.Channels; -import java.nio.file.Path; -import java.util.concurrent.atomic.AtomicBoolean; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; - -/** - * Verify some simplistic retries can take place and that we're constructing {@link - * WriteObjectRequest}s as expected. - */ -public final class ITGrpcStorageImplUploadRetryTest { - private static final String FORMATTED_BUCKET_NAME = "projects/_/buckets/buck"; - private static final int objectContentSize = 64; - private static final byte[] bytes = DataGenerator.base64Characters().genBytes(objectContentSize); - - @Rule public final TemporaryFolder tmpDir = new TemporaryFolder(); - - private Path baseDir; - - @Before - public void setUp() throws Exception { - baseDir = tmpDir.getRoot().toPath(); - } - - @Test - public void create_bytes() throws Exception { - Direct.FakeService service = Direct.FakeService.create(); - - try (FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService()) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.create(info, bytes, BlobTargetOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void create_inputStream() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService(); - InputStream in = Channels.newInputStream(tmpFile.reader())) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.create(info, in, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void createFrom_path_smallerThanBufferSize() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService()) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.createFrom(info, tmpFile.getPath(), _2MiB, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void createFrom_path_largerThanBufferSize() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService()) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.createFrom(info, tmpFile.getPath(), 16, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void createFrom_inputStream() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService(); - InputStream in = Channels.newInputStream(tmpFile.reader())) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.createFrom(info, in, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void startResumableWrite() throws Exception { - - AtomicBoolean returnError = new AtomicBoolean(true); - StorageImplBase service = - new StorageImplBase() { - @Override - public void startResumableWrite( - StartResumableWriteRequest request, StreamObserver obs) { - if (request.equals(Resumable.startReq)) { - if (returnError.get()) { - // clear the need to error. We only error on the first request. - returnError.compareAndSet(true, false); - obs.onError(TestUtils.apiException(Code.INTERNAL, "should retry")); - } else { - obs.onNext(Resumable.startResp); - obs.onCompleted(); - } - } else { - obs.onError( - TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - } - }; - - try (FakeServer server = FakeServer.of(service); - GrpcStorageImpl s = (GrpcStorageImpl) server.getGrpcStorageOptions().getService()) { - ApiFuture f = - s.startResumableWrite(GrpcCallContext.createDefault(), Resumable.baseReq); - ResumableWrite resumableWrite = f.get(); - StartResumableWriteResponse resp = resumableWrite.getRes(); - assertThat(resp).isNotNull(); - assertThat(resp.getUploadId()).isEqualTo(Resumable.uploadId); - } - - assertThat(returnError.get()).isFalse(); - } - - private static final class Direct { - private static final Object obj = - Object.newBuilder().setBucket(FORMATTED_BUCKET_NAME).setName("obj").build(); - private static final WriteObjectSpec spec = - WriteObjectSpec.newBuilder().setResource(obj).setIfGenerationMatch(0).build(); - - private static final ChecksummedData checksummedData = - TestUtils.getChecksummedData(ByteString.copyFrom(bytes), Hasher.enabled()); - private static final WriteObjectRequest req1 = - WriteObjectRequest.newBuilder() - .setWriteObjectSpec(spec) - .setChecksummedData(checksummedData) - .setObjectChecksums(ObjectChecksums.newBuilder().setCrc32C(checksummedData.getCrc32C())) - .setFinishWrite(true) - .build(); - private static final WriteObjectResponse resp1 = - WriteObjectResponse.newBuilder() - .setResource(obj.toBuilder().setSize(objectContentSize)) - .build(); - - private static final class FakeService extends DirectWriteService { - private final AtomicBoolean returnError; - - private FakeService(AtomicBoolean returnError) { - super( - (obs, reqs) -> { - if (reqs.equals(ImmutableList.of(req1))) { - if (returnError.get()) { - // clear the need to error. We only error on the first request. - returnError.compareAndSet(true, false); - obs.onError(TestUtils.apiException(Code.INTERNAL, "should retry")); - } else { - obs.onNext(resp1); - obs.onCompleted(); - } - } else { - obs.onError( - TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - }); - this.returnError = returnError; - } - - // a bit of constructor lifecycle hackery to appease the compiler - // Even though the thing past to super() is a lazy function, the closing over of the outer - // fields happens earlier than they are available. To side step this fact, we provide the - // AtomicBoolean as a constructor argument which can be closed over without issue, and then - // bind it to the class field after super(). - static Direct.FakeService create() { - return new Direct.FakeService(new AtomicBoolean(true)); - } - } - } - - private static final class Resumable { - - private static final String uploadId = "upload-id"; - - private static final Object obj = - Object.newBuilder().setBucket(FORMATTED_BUCKET_NAME).setName("obj").build(); - private static final WriteObjectSpec spec = - WriteObjectSpec.newBuilder().setResource(obj).setIfGenerationMatch(0).build(); - - private static final WriteObjectRequest baseReq = - WriteObjectRequest.newBuilder().setWriteObjectSpec(spec).build(); - private static final StartResumableWriteRequest startReq = - StartResumableWriteRequest.newBuilder().setWriteObjectSpec(spec).build(); - private static final StartResumableWriteResponse startResp = - StartResumableWriteResponse.newBuilder().setUploadId(uploadId).build(); - - private static final ChecksummedData checksummedData = - TestUtils.getChecksummedData(ByteString.copyFrom(bytes), Hasher.noop()); - private static final WriteObjectRequest req1 = - WriteObjectRequest.newBuilder() - .setUploadId(uploadId) - .setChecksummedData(checksummedData) - .setFinishWrite(true) - .build(); - private static final WriteObjectResponse resp1 = - WriteObjectResponse.newBuilder() - .setResource(obj.toBuilder().setSize(objectContentSize)) - .build(); - - private static final class FakeService extends DirectWriteService { - private final AtomicBoolean returnError; - - private FakeService(AtomicBoolean returnError) { - super( - (obs, reqs) -> { - if (reqs.equals(ImmutableList.of(req1))) { - if (returnError.get()) { - // clear the need to error. We only error on the first request. - returnError.compareAndSet(true, false); - obs.onError(TestUtils.apiException(Code.INTERNAL, "should retry")); - } else { - obs.onNext(resp1); - obs.onCompleted(); - } - } else { - obs.onError( - TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - }); - this.returnError = returnError; - } - - @Override - public void startResumableWrite( - StartResumableWriteRequest request, StreamObserver obs) { - if (request.equals(startReq)) { - obs.onNext(startResp); - obs.onCompleted(); - } else { - obs.onError(TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - } - - @Override - public void queryWriteStatus( - QueryWriteStatusRequest request, - StreamObserver responseObserver) { - responseObserver.onNext(QueryWriteStatusResponse.newBuilder().setPersistedSize(0).build()); - responseObserver.onCompleted(); - } - - // a bit of constructor lifecycle hackery to appease the compiler - // Even though the thing passed to super() is a lazy function, the closing over of the outer - // fields happens earlier than they are available. To side step this fact, we provide the - // AtomicBoolean as a constructor argument which can be closed over without issue, and then - // bind it to the class field after super(). - static FakeService create() { - return new FakeService(new AtomicBoolean(true)); - } - } - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java index 9b577014c5..23b7f3710e 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java @@ -20,7 +20,6 @@ import com.google.api.core.ApiFutures; import com.google.cloud.ReadChannel; import com.google.cloud.WriteChannel; -import com.google.cloud.storage.BucketInfo.BuilderImpl; import com.google.common.collect.ImmutableList; import java.util.Optional; import java.util.concurrent.ExecutionException; @@ -40,23 +39,11 @@ public final class PackagePrivateMethodWorkarounds { private PackagePrivateMethodWorkarounds() {} public static Bucket bucketCopyWithStorage(Bucket b, Storage s) { - BucketInfo.BuilderImpl builder = - (BuilderImpl) - Conversions.json() - .bucketInfo() - .decode(Conversions.json().bucketInfo().encode(b)) - .toBuilder(); - return new Bucket(s, builder); + return b.asBucket(s); } public static Blob blobCopyWithStorage(Blob b, Storage s) { - BlobInfo.BuilderImpl builder = - (BlobInfo.BuilderImpl) - Conversions.json() - .blobInfo() - .decode(Conversions.json().blobInfo().encode(b)) - .toBuilder(); - return new Blob(s, builder); + return b.asBlob(s); } public static Function> maybeGetBlobInfoFunction() { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java index 8957473484..8d0a24a86f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java @@ -19,6 +19,7 @@ import static com.google.cloud.storage.PackagePrivateMethodWorkarounds.blobCopyWithStorage; import static com.google.cloud.storage.PackagePrivateMethodWorkarounds.bucketCopyWithStorage; import static com.google.cloud.storage.conformance.retry.Ctx.ctx; +import static com.google.cloud.storage.conformance.retry.ITRetryConformanceTest.RetryTestCaseResolver.lift; import static com.google.cloud.storage.conformance.retry.State.empty; import static com.google.common.truth.Truth.assertThat; import static java.util.Objects.requireNonNull; @@ -117,6 +118,7 @@ public void setUp() throws Throwable { public void tearDown() throws Throwable { LOGGER.fine("Running teardown..."); if (ctx != null) { + ctx = ctx.leftMap(s -> nonTestStorage); getReplaceStorageInObjectsFromCtx() .andThen(mapping.getTearDown()) .apply(ctx, testRetryConformance); @@ -168,7 +170,10 @@ public ImmutableList parameters() { .setHost(testBench.getBaseUri().replaceAll("https?://", "")) .setTestAllowFilter( RetryTestCaseResolver.includeAll() - .and(RetryTestCaseResolver.lift(trc -> trc.getTransport() == Transport.HTTP))) + .and( + (lift(trc -> trc.getTransport() == Transport.GRPC) + .and((m, trc) -> m == RpcMethod.storage.buckets.setIamPolicy)) + .negate())) .build(); List retryTestCases; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java index 1c3947adbf..6ecc0068d0 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java @@ -21,6 +21,7 @@ import static org.junit.Assert.fail; import com.google.cloud.storage.StorageException; +import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.conformance.retry.CtxFunctions.ResourceSetup; import com.google.cloud.storage.conformance.retry.CtxFunctions.ResourceTeardown; import com.google.cloud.storage.conformance.retry.Functions.CtxFunction; @@ -42,7 +43,6 @@ */ @Immutable final class RpcMethodMapping { - private final int mappingId; private final RpcMethod method; private final Predicate applicable; @@ -107,6 +107,14 @@ public CtxFunction getTest() { if (instructions.contains("return-reset-connection") && code == 0) { matchExpectedCode = true; } + // testbench resetting the connection is turned into an UNAVAILABLE in grpc, which we then + // map to 503. Add graceful handling here, since we can't disambiguate between reset + // connection and 503 from the service. + if (c.getTransport() == Transport.GRPC + && instructions.contains("return-reset-connection") + && code == 503) { + matchExpectedCode = true; + } if (matchExpectedCode) { return ctx; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java index 9dc246373c..3f98a94fa4 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java @@ -53,6 +53,7 @@ import com.google.cloud.storage.Storage.SignUrlOption; import com.google.cloud.storage.Storage.UriScheme; import com.google.cloud.storage.StorageRoles; +import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.conformance.retry.CtxFunctions.Local; import com.google.cloud.storage.conformance.retry.CtxFunctions.ResourceSetup; import com.google.cloud.storage.conformance.retry.CtxFunctions.Rpc; @@ -1607,7 +1608,9 @@ private static void insert(ArrayList a) { .build()); a.add( RpcMethodMapping.newBuilder(54, objects.insert) - .withApplicable(not(TestRetryConformance::isPreconditionsProvided)) + .withApplicable( + not(TestRetryConformance::isPreconditionsProvided) + .and(trc -> trc.getTransport() == Transport.HTTP)) .withSetup(defaultSetup.andThen(Local.blobInfoWithoutGeneration)) .withTest( (ctx, c) -> diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java index 65c0734807..4f1afd83e5 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java @@ -27,7 +27,6 @@ import com.google.cloud.storage.DataGenerator; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.common.base.Joiner; -import com.google.common.base.Suppliers; import com.google.common.io.ByteStreams; import com.google.errorprone.annotations.Immutable; import java.io.ByteArrayInputStream; @@ -42,6 +41,7 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -153,13 +153,11 @@ final class TestRetryConformance { String.format( "%s_s%03d-%s-m%03d_top1_%s", BASE_ID, scenarioId, instructionsString.toLowerCase(), mappingId, transportTag); + // define a lazy supplier for bytes. this.lazyHelloWorldUtf8Bytes = - Suppliers.memoize( - () -> { - // define a lazy supplier for bytes. - return genBytes(method); - }); - this.helloWorldFilePath = resolvePathForResource(objectName, method); + () -> genBytes(this.method, this.instruction.getInstructionsList()); + this.helloWorldFilePath = + resolvePathForResource(objectName, method, this.instruction.getInstructionsList()); this.serviceAccountCredentials = resolveServiceAccountCredentials(); } @@ -239,13 +237,14 @@ public String toString() { return getTestName(); } - private static Supplier resolvePathForResource(String objectName, Method method) { + private static Supplier resolvePathForResource( + String objectName, Method method, List instructionList) { return () -> { try { File tempFile = File.createTempFile(objectName, ""); tempFile.deleteOnExit(); - byte[] bytes = genBytes(method); + byte[] bytes = genBytes(method, instructionList); try (ByteArrayInputStream in = new ByteArrayInputStream(bytes); FileOutputStream out = new FileOutputStream(tempFile)) { long copy = ByteStreams.copy(in, out); @@ -276,14 +275,19 @@ public String getTopicName() { return topicName; } - private static byte[] genBytes(Method method) { + private static byte[] genBytes(Method method, List instructionsList) { // Not all tests need data for an object, though some tests - resumable upload - needs // more than 8MiB. // We want to avoid allocating 8.1MiB for each test unnecessarily, especially since we // instantiate all permuted test cases. ~1000 * 8.1MiB ~~ > 8GiB. switch (method.getName()) { case "storage.objects.insert": - return DataGenerator.base64Characters().genBytes(_8MiB * 2 + _512KiB); + boolean after8m = instructionsList.stream().anyMatch(s -> s.endsWith("after-8192K")); + if (after8m) { + return DataGenerator.base64Characters().genBytes(_8MiB * 2 + _512KiB); + } else { + return DataGenerator.base64Characters().genBytes(_512KiB); + } case "storage.objects.get": return DataGenerator.base64Characters().genBytes(_512KiB); default: From 032f2f2693c6c75cc4ae0339be805c0bb94fa064 Mon Sep 17 00:00:00 2001 From: BenWhitehead Date: Wed, 17 Apr 2024 19:49:14 -0400 Subject: [PATCH 35/40] fix: update grpc handling of IAM Policy etag to account for base64 encoding (#2499) Etags returned by the JSON api are base64 encoded, and IAM Policy is currently modeled around this for its public api. Update GrpcConversions to base64 decode/encode appropriately. --- .../com/google/cloud/storage/GrpcConversions.java | 11 +++++++++-- .../cloud/storage/GrpcRetryAlgorithmManager.java | 8 ++++++-- .../cloud/storage/conformance/retry/CtxFunctions.java | 4 ++++ .../conformance/retry/ITRetryConformanceTest.java | 8 +------- .../storage/conformance/retry/RpcMethodMappings.java | 3 ++- 5 files changed, 22 insertions(+), 12 deletions(-) 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 28c51873b0..63a33b80a1 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 @@ -60,11 +60,13 @@ import com.google.storage.v2.Owner; import com.google.type.Date; import com.google.type.Expr; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; import java.time.LocalDate; import java.time.OffsetDateTime; import java.time.ZoneOffset; +import java.util.Base64; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -118,6 +120,11 @@ final class GrpcConversions { hierarchicalNamespaceCodec = Codec.of(this::hierarchicalNamespaceEncode, this::hierarchicalNamespaceDecode); + private final Codec byteStringB64StringCodec = + Codec.of( + bs -> Base64.getEncoder().encodeToString(bs.toByteArray()), + s -> ByteString.copyFrom(Base64.getDecoder().decode(s.getBytes(StandardCharsets.UTF_8)))); + @VisibleForTesting final Codec timestampCodec = Codec.of( @@ -1048,7 +1055,7 @@ private NotificationInfo notificationDecode(NotificationConfig from) { private com.google.iam.v1.Policy policyEncode(Policy from) { com.google.iam.v1.Policy.Builder to = com.google.iam.v1.Policy.newBuilder(); - ifNonNull(from.getEtag(), ByteString::copyFromUtf8, to::setEtag); + ifNonNull(from.getEtag(), byteStringB64StringCodec::decode, to::setEtag); ifNonNull(from.getVersion(), to::setVersion); from.getBindingsList().stream().map(bindingCodec::encode).forEach(to::addBindings); return to.build(); @@ -1058,7 +1065,7 @@ private Policy policyDecode(com.google.iam.v1.Policy from) { Policy.Builder to = Policy.newBuilder(); ByteString etag = from.getEtag(); if (!etag.isEmpty()) { - to.setEtag(etag.toStringUtf8()); + to.setEtag(byteStringB64StringCodec.encode(etag)); } to.setVersion(from.getVersion()); List bindingsList = from.getBindingsList(); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java index 3a97c2e952..1178c7c942 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java @@ -20,6 +20,7 @@ import com.google.iam.v1.GetIamPolicyRequest; import com.google.iam.v1.SetIamPolicyRequest; import com.google.iam.v1.TestIamPermissionsRequest; +import com.google.protobuf.ByteString; import com.google.storage.v2.BidiWriteObjectRequest; import com.google.storage.v2.ComposeObjectRequest; import com.google.storage.v2.CreateBucketRequest; @@ -168,8 +169,11 @@ public ResultRetryAlgorithm getFor(RewriteObjectRequest req) { } public ResultRetryAlgorithm getFor(SetIamPolicyRequest req) { - // TODO: etag - return retryStrategy.getNonidempotentHandler(); + if (req.getPolicy().getEtag().equals(ByteString.empty())) { + return retryStrategy.getNonidempotentHandler(); + } else { + return retryStrategy.getIdempotentHandler(); + } } public ResultRetryAlgorithm getFor(StartResumableWriteRequest req) { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java index 7617be79f9..8a415fd8f6 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java @@ -136,6 +136,10 @@ static final class Local { static final class Rpc { static final CtxFunction createEmptyBlob = (ctx, c) -> ctx.map(state -> state.with(ctx.getStorage().create(state.getBlobInfo()))); + static final CtxFunction bucketIamPolicy = + (ctx, c) -> + ctx.map( + state -> state.with(ctx.getStorage().getIamPolicy(state.getBucket().getName()))); } static final class ResourceSetup { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java index 8d0a24a86f..814729f840 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java @@ -19,7 +19,6 @@ import static com.google.cloud.storage.PackagePrivateMethodWorkarounds.blobCopyWithStorage; import static com.google.cloud.storage.PackagePrivateMethodWorkarounds.bucketCopyWithStorage; import static com.google.cloud.storage.conformance.retry.Ctx.ctx; -import static com.google.cloud.storage.conformance.retry.ITRetryConformanceTest.RetryTestCaseResolver.lift; import static com.google.cloud.storage.conformance.retry.State.empty; import static com.google.common.truth.Truth.assertThat; import static java.util.Objects.requireNonNull; @@ -168,12 +167,7 @@ public ImmutableList parameters() { .setMappings(new RpcMethodMappings()) .setProjectId("conformance-tests") .setHost(testBench.getBaseUri().replaceAll("https?://", "")) - .setTestAllowFilter( - RetryTestCaseResolver.includeAll() - .and( - (lift(trc -> trc.getTransport() == Transport.GRPC) - .and((m, trc) -> m == RpcMethod.storage.buckets.setIamPolicy)) - .negate())) + .setTestAllowFilter(RetryTestCaseResolver.includeAll()) .build(); List retryTestCases; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java index 3f98a94fa4..a60b1bb984 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java @@ -685,6 +685,7 @@ private static void setIamPolicy(ArrayList a) { a.add( RpcMethodMapping.newBuilder(240, buckets.setIamPolicy) .withApplicable(TestRetryConformance::isPreconditionsProvided) + .withSetup(ResourceSetup.defaultSetup.andThen(Rpc.bucketIamPolicy)) .withTest( (ctx, c) -> ctx.map( @@ -694,7 +695,7 @@ private static void setIamPolicy(ArrayList a) { .setIamPolicy( state.getBucket().getName(), Policy.newBuilder() - .setEtag("h??") + .setEtag(state.getPolicy().getEtag()) .setVersion(3) .setBindings( ImmutableList.of( From 93b6d01ee8553f39563ca0b507328826b32b5fb4 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 07:40:58 -0700 Subject: [PATCH 36/40] chore: owlbot-java adding the Docker tag in images section (#1949) (#2491) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: owlbot-java adding the Docker tag in images section (#1949) Source-Link: https://github.com/googleapis/synthtool/commit/4b49307944160a308513a34f73dbd6b00b6617d2 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-java:latest@sha256:25b384ee1674eda3984ec41c15b514a63bbeb5eda4d57c73c7e6f5adef2fd2f1 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot Co-authored-by: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> --- .github/.OwlBot.lock.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index d47d3d76b1..6983bb2634 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:033161f610016d155d58f96769ad5a821d203824684e8a13fc50be8c25a5f9cf -# created: 2024-04-04T20:03:23.876897177Z + digest: sha256:25b384ee1674eda3984ec41c15b514a63bbeb5eda4d57c73c7e6f5adef2fd2f1 +# created: 2024-04-05T19:12:34.133475268Z From d75bb2dec4fb788b49376176968c777cf72e137d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 19 Apr 2024 03:52:20 +0200 Subject: [PATCH 37/40] test(deps): update cross product test dependencies (#2500) --- google-cloud-storage/pom.xml | 2 +- pom.xml | 2 +- samples/install-without-bom/pom.xml | 2 +- samples/native-image-sample/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- samples/snippets/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index edba4c3653..24e51ed000 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -16,7 +16,7 @@ google-cloud-storage - 1.110.1 + 1.111.0 5.10.2 diff --git a/pom.xml b/pom.xml index bbdbbd51ec..f6cd504240 100644 --- a/pom.xml +++ b/pom.xml @@ -86,7 +86,7 @@ com.google.cloud google-cloud-pubsub - 1.128.1 + 1.129.0 test diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 600202aad8..27141fb96d 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.128.1 + 1.129.0 test diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index b066547fc3..3e349ff758 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -61,7 +61,7 @@ com.google.cloud google-cloud-pubsub - 1.128.1 + 1.129.0 test diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 325cb934ba..28ae57dee5 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -58,7 +58,7 @@ com.google.cloud google-cloud-pubsub - 1.128.1 + 1.129.0 test diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 296fe80588..e798300176 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -76,7 +76,7 @@ com.google.cloud google-cloud-pubsub - 1.128.1 + 1.129.0 test From 037fa7daf06ebffab1b36b638ff147c3bb83553d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 19 Apr 2024 03:53:29 +0200 Subject: [PATCH 38/40] chore(deps): update dependency com.google.cloud:google-cloud-storage-control to v2.36.1-alpha (#2488) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update dependency com.google.cloud:google-cloud-storage-control to v2.36.1-alpha * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot Co-authored-by: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> --- README.md | 2 +- samples/install-without-bom/pom.xml | 2 +- samples/native-image-sample/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e5b41028c2..f40b6f6f32 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-storage-control - 2.36.0-alpha + 2.36.1-alpha ``` diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 27141fb96d..81719b9521 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -35,7 +35,7 @@ com.google.cloud google-cloud-storage-control - 2.36.0-alpha + 2.36.1-alpha diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index 3e349ff758..55d2354618 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -67,7 +67,7 @@ com.google.cloud google-cloud-storage-control - 2.36.0-alpha + 2.36.1-alpha compile From 7ed8446dcbff165408331df97e2d15a1cd70b7be Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 19 Apr 2024 04:22:07 +0200 Subject: [PATCH 39/40] deps: update dependency com.google.cloud:sdk-platform-java-config to v3.29.0 (#2502) --- .github/workflows/unmanaged_dependency_check.yaml | 2 +- .kokoro/presubmit/graalvm-native-17.cfg | 2 +- .kokoro/presubmit/graalvm-native.cfg | 2 +- google-cloud-storage-bom/pom.xml | 2 +- pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index b33ec59176..b7ee2ca7d2 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.28.1 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.29.0 with: bom-path: google-cloud-storage-bom/pom.xml diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg index b3873194b1..7c1a9bb67b 100644 --- a/.kokoro/presubmit/graalvm-native-17.cfg +++ b/.kokoro/presubmit/graalvm-native-17.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.28.1" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.29.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native.cfg b/.kokoro/presubmit/graalvm-native.cfg index 46b04f3c18..39055d62da 100644 --- a/.kokoro/presubmit/graalvm-native.cfg +++ b/.kokoro/presubmit/graalvm-native.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.28.1" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.29.0" } env_vars: { diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index 45869aceb7..e750fb98a6 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.28.1 + 3.29.0 diff --git a/pom.xml b/pom.xml index f6cd504240..b011dab9c6 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.28.1 + 3.29.0 From 03943c77ff0807016fd2c33ef0861483ddb66f8c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 22:24:09 -0700 Subject: [PATCH 40/40] chore(main): release 2.37.0 (#2480) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(main): release 2.37.0 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Owl Bot --- CHANGELOG.md | 36 +++++++++++++++++++ README.md | 2 +- 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/install-without-bom/pom.xml | 2 +- samples/native-image-sample/pom.xml | 2 +- samples/snapshot/pom.xml | 4 +-- storage-shared-benchmarking/pom.xml | 4 +-- versions.txt | 14 ++++---- 16 files changed, 80 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aba99a0b0b..47ad7b8cb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## [2.37.0](https://github.com/googleapis/java-storage/compare/v2.36.1...v2.37.0) (2024-04-19) + + +### Features + +* Adds a ZeroCopy response marshaller for grpc ReadObject handling ([#2489](https://github.com/googleapis/java-storage/issues/2489)) ([8c7404d](https://github.com/googleapis/java-storage/commit/8c7404dea8ef16a7b61accad4fe614e033a5ad2c)) +* Port BufferToDiskThenUpload to work with HttpStorageOptions ([#2473](https://github.com/googleapis/java-storage/issues/2473)) ([d84e255](https://github.com/googleapis/java-storage/commit/d84e25559afecc27026c7f4fe7aeaf0d0ce705b4)) +* Port DefaultBlobWriteSessionConfig to work with HttpStorageOptions ([#2472](https://github.com/googleapis/java-storage/issues/2472)) ([e5772a4](https://github.com/googleapis/java-storage/commit/e5772a4f4ec5d747fcd403477a35ceeb94492280)) +* Port ParallelCompositeUploadBlobWriteSessionConfig to work with HttpStorageOptions ([#2474](https://github.com/googleapis/java-storage/issues/2474)) ([3bf6026](https://github.com/googleapis/java-storage/commit/3bf60264f47aad8101bb4b4cff9cc0449cf1c4f3)) +* Transfer Manager ParallelCompositeUploads ([#2494](https://github.com/googleapis/java-storage/issues/2494)) ([8b54549](https://github.com/googleapis/java-storage/commit/8b5454910c74563c9598f9d5cc23fa509ec749d9)) + + +### Bug Fixes + +* Ensure all BlobWriteSession types conform to the semantics specified in BlobWriteSession ([#2482](https://github.com/googleapis/java-storage/issues/2482)) ([d47afcf](https://github.com/googleapis/java-storage/commit/d47afcfe2bcb2e7e266a5197456b6f9661e91004)) +* Fix BidiBlobWriteSessionConfigs to respect preconditions ([#2481](https://github.com/googleapis/java-storage/issues/2481)) ([955d78a](https://github.com/googleapis/java-storage/commit/955d78af0fecd4b65506df4bfd44fc683e23c2ec)) +* Update ApiaryUnbufferedWritableByteChannel to be graceful of non-quantum aligned write calls ([#2493](https://github.com/googleapis/java-storage/issues/2493)) ([f548335](https://github.com/googleapis/java-storage/commit/f5483356a3ba6327a712ef2f5534b61a649174df)) +* Update BidiBlobWriteSessionConfig to respect a provided bufferSize ([#2471](https://github.com/googleapis/java-storage/issues/2471)) ([e1fb857](https://github.com/googleapis/java-storage/commit/e1fb8577e6b7a36981fb78937fe8c5dd606a4c2a)) +* Update grpc handling of IAM Policy etag to account for base64 encoding ([#2499](https://github.com/googleapis/java-storage/issues/2499)) ([032f2f2](https://github.com/googleapis/java-storage/commit/032f2f2693c6c75cc4ae0339be805c0bb94fa064)) +* Update Grpc Retry Conformance after new additions to testbench ([#2309](https://github.com/googleapis/java-storage/issues/2309)) ([09043c5](https://github.com/googleapis/java-storage/commit/09043c5587ae9e6adeb425f5c2f7c4f65ec5e20e)) + + +### Dependencies + +* Update dependency com.google.apis:google-api-services-storage to v1-rev20240319-2.0.0 ([#2460](https://github.com/googleapis/java-storage/issues/2460)) ([9c2ee90](https://github.com/googleapis/java-storage/commit/9c2ee909d02fef5afc201589f5ced4062e2f14e8)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.28.1 ([#2467](https://github.com/googleapis/java-storage/issues/2467)) ([c12f329](https://github.com/googleapis/java-storage/commit/c12f3290a029c25cdac458cda44835c0a43c33e7)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.29.0 ([#2502](https://github.com/googleapis/java-storage/issues/2502)) ([7ed8446](https://github.com/googleapis/java-storage/commit/7ed8446dcbff165408331df97e2d15a1cd70b7be)) +* Update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.43.0 ([#2459](https://github.com/googleapis/java-storage/issues/2459)) ([2dc4748](https://github.com/googleapis/java-storage/commit/2dc4748353be4fe06ec7df2e413ed5752d350f8b)) +* Update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.44.0 ([#2497](https://github.com/googleapis/java-storage/issues/2497)) ([9b0253c](https://github.com/googleapis/java-storage/commit/9b0253ca1a03d6a90a1008794b00c6825d26ff0c)) + + +### Documentation + +* Add summary and reference docs for Storage Control API to readme ([#2485](https://github.com/googleapis/java-storage/issues/2485)) ([70fd088](https://github.com/googleapis/java-storage/commit/70fd088975280ed9a650ca09825ccb28297d89f7)) +* Create Samples for transfer manager ([#2492](https://github.com/googleapis/java-storage/issues/2492)) ([e2030b2](https://github.com/googleapis/java-storage/commit/e2030b281d45b69840962e0a80c4b6b85e300b20)) + ## [2.36.1](https://github.com/googleapis/java-storage/compare/v2.36.0...v2.36.1) (2024-03-20) diff --git a/README.md b/README.md index f40b6f6f32..9007e34e31 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.37.0 ``` diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml index 6c338239b4..1b0ce8da7f 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.36.2-alpha-SNAPSHOT + 2.37.0-alpha gapic-google-cloud-storage-v2 GRPC library for gapic-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.2-SNAPSHOT + 2.37.0 diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index e750fb98a6..244967fec6 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.36.2-SNAPSHOT + 2.37.0 pom com.google.cloud @@ -69,37 +69,37 @@ com.google.cloud google-cloud-storage - 2.36.2-SNAPSHOT + 2.37.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc proto-google-cloud-storage-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.cloud google-cloud-storage-control - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index aadfc3d152..852c797ba5 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.36.2-alpha-SNAPSHOT + 2.37.0-alpha google-cloud-storage-control GRPC library for google-cloud-storage-control com.google.cloud google-cloud-storage-parent - 2.36.2-SNAPSHOT + 2.37.0 diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 24e51ed000..e9f67c2bb8 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 2.36.2-SNAPSHOT + 2.37.0 jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,7 +12,7 @@ com.google.cloud google-cloud-storage-parent - 2.36.2-SNAPSHOT + 2.37.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 62eccdcda4..14a1ad299f 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.36.2-alpha-SNAPSHOT + 2.37.0-alpha grpc-google-cloud-storage-control-v2 GRPC library for google-cloud-storage com.google.cloud google-cloud-storage-parent - 2.36.2-SNAPSHOT + 2.37.0 diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml index 04a5ad3a8a..4f0df73852 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.36.2-alpha-SNAPSHOT + 2.37.0-alpha grpc-google-cloud-storage-v2 GRPC library for grpc-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.2-SNAPSHOT + 2.37.0 diff --git a/pom.xml b/pom.xml index b011dab9c6..8aaf36f4f9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 2.36.2-SNAPSHOT + 2.37.0 Storage Parent https://github.com/googleapis/java-storage @@ -76,7 +76,7 @@ com.google.cloud google-cloud-storage - 2.36.2-SNAPSHOT + 2.37.0 com.google.apis @@ -98,32 +98,32 @@ com.google.api.grpc proto-google-cloud-storage-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc gapic-google-cloud-storage-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.cloud google-cloud-storage-control - 2.36.2-alpha-SNAPSHOT + 2.37.0-alpha com.google.cloud diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml index a4078283e9..3a14b19d1f 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.36.2-alpha-SNAPSHOT + 2.37.0-alpha proto-google-cloud-storage-control-v2 Proto library for proto-google-cloud-storage-control-v2 com.google.cloud google-cloud-storage-parent - 2.36.2-SNAPSHOT + 2.37.0 diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml index a9b8514347..6b73749779 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.36.2-alpha-SNAPSHOT + 2.37.0-alpha proto-google-cloud-storage-v2 PROTO library for proto-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.2-SNAPSHOT + 2.37.0 diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 81719b9521..f982806546 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -35,7 +35,7 @@ com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.37.0 diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index 55d2354618..601761caf8 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -67,7 +67,7 @@ com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.37.0 compile diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 28ae57dee5..617edd0c02 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,12 +28,12 @@ com.google.cloud google-cloud-storage - 2.36.2-SNAPSHOT + 2.37.0 com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.37.0 compile diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml index a7e3cc59bc..306e28a61c 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.36.2-SNAPSHOT + 2.37.0 @@ -31,7 +31,7 @@ com.google.cloud google-cloud-storage - 2.36.2-SNAPSHOT + 2.37.0 tests diff --git a/versions.txt b/versions.txt index 2d4f51065d..d17f59a970 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-storage:2.36.1:2.36.2-SNAPSHOT -gapic-google-cloud-storage-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT -grpc-google-cloud-storage-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT -proto-google-cloud-storage-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT -google-cloud-storage-control:2.36.1-alpha:2.36.2-alpha-SNAPSHOT -proto-google-cloud-storage-control-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT -grpc-google-cloud-storage-control-v2:2.36.1-alpha:2.36.2-alpha-SNAPSHOT +google-cloud-storage:2.37.0:2.37.0 +gapic-google-cloud-storage-v2:2.37.0-alpha:2.37.0-alpha +grpc-google-cloud-storage-v2:2.37.0-alpha:2.37.0-alpha +proto-google-cloud-storage-v2:2.37.0-alpha:2.37.0-alpha +google-cloud-storage-control:2.37.0-alpha:2.37.0-alpha +proto-google-cloud-storage-control-v2:2.37.0-alpha:2.37.0-alpha +grpc-google-cloud-storage-control-v2:2.37.0-alpha:2.37.0-alpha