Skip to content

Commit 86f6b1f

Browse files
chore: merge main into generate-libraries-main
2 parents 3435d8d + adb8d45 commit 86f6b1f

17 files changed

+623
-26
lines changed

google-cloud-storage/clirr-ignored-differences.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@
167167
<method>com.google.cloud.storage.BucketInfo$Builder setGoogleManagedEncryptionEnforcementConfig(com.google.cloud.storage.BucketInfo$GoogleManagedEncryptionEnforcementConfig)</method>
168168
</difference>
169169

170+
<difference>
171+
<differenceType>7013</differenceType>
172+
<className>com/google/cloud/storage/BucketInfo$Builder</className>
173+
<method>com.google.cloud.storage.BucketInfo$Builder setIsUnreachable(java.lang.Boolean)</method>
174+
</difference>
175+
170176
<!-- make beta api constructors private, they still retain their factory methods. -->
171177
<difference>
172178
<differenceType>7004</differenceType>

google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,12 @@ public Builder setCustomerSuppliedEncryptionEnforcementConfig(
789789
return this;
790790
}
791791

792+
@Override
793+
public Builder setIsUnreachable(Boolean isUnreachable) {
794+
infoBuilder.setIsUnreachable(isUnreachable);
795+
return this;
796+
}
797+
792798
@Override
793799
public Bucket build() {
794800
return new Bucket(storage, infoBuilder);
@@ -997,6 +1003,12 @@ public Builder clearCustomerSuppliedEncryptionEnforcementConfig() {
9971003
infoBuilder.clearCustomerSuppliedEncryptionEnforcementConfig();
9981004
return this;
9991005
}
1006+
1007+
@Override
1008+
Builder clearIsUnreachable() {
1009+
infoBuilder.clearIsUnreachable();
1010+
return this;
1011+
}
10001012
}
10011013

10021014
Bucket(Storage storage, BucketInfo.BuilderImpl infoBuilder) {

google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ public class BucketInfo implements Serializable {
131131
customerManagedEncryptionEnforcementConfig;
132132
private final @Nullable CustomerSuppliedEncryptionEnforcementConfig
133133
customerSuppliedEncryptionEnforcementConfig;
134+
private final Boolean isUnreachable;
134135

135136
private final transient ImmutableSet<NamedField> modifiedFields;
136137

@@ -2638,6 +2639,8 @@ public Builder setRetentionPeriodDuration(Duration retentionPeriod) {
26382639
*/
26392640
public abstract Builder setIpFilter(IpFilter ipFilter);
26402641

2642+
public abstract Builder setIsUnreachable(Boolean isUnreachable);
2643+
26412644
/** Creates a {@code BucketInfo} object. */
26422645
public abstract BucketInfo build();
26432646

@@ -2708,6 +2711,8 @@ public Builder setRetentionPeriodDuration(Duration retentionPeriod) {
27082711
abstract Builder clearCustomerManagedEncryptionEnforcementConfig();
27092712

27102713
abstract Builder clearCustomerSuppliedEncryptionEnforcementConfig();
2714+
2715+
abstract Builder clearIsUnreachable();
27112716
}
27122717

27132718
static final class BuilderImpl extends Builder {
@@ -2751,6 +2756,7 @@ static final class BuilderImpl extends Builder {
27512756
private GoogleManagedEncryptionEnforcementConfig googleManagedEncryptionEnforcementConfig;
27522757
private CustomerManagedEncryptionEnforcementConfig customerManagedEncryptionEnforcementConfig;
27532758
private CustomerSuppliedEncryptionEnforcementConfig customerSuppliedEncryptionEnforcementConfig;
2759+
private Boolean isUnreachable;
27542760
private final ImmutableSet.Builder<NamedField> modifiedFields = ImmutableSet.builder();
27552761

27562762
BuilderImpl(String name) {
@@ -2799,6 +2805,7 @@ static final class BuilderImpl extends Builder {
27992805
bucketInfo.customerManagedEncryptionEnforcementConfig;
28002806
customerSuppliedEncryptionEnforcementConfig =
28012807
bucketInfo.customerSuppliedEncryptionEnforcementConfig;
2808+
isUnreachable = bucketInfo.isUnreachable;
28022809
}
28032810

28042811
@Override
@@ -3250,6 +3257,13 @@ public Builder setIpFilter(IpFilter ipFilter) {
32503257
return this;
32513258
}
32523259

3260+
@Override
3261+
public Builder setIsUnreachable(Boolean isUnreachable) {
3262+
Boolean tmp = firstNonNull(isUnreachable, Data.<Boolean>nullOf(Boolean.class));
3263+
this.isUnreachable = tmp;
3264+
return this;
3265+
}
3266+
32533267
@Override
32543268
public BucketInfo build() {
32553269
checkNotNull(name);
@@ -3460,6 +3474,12 @@ BuilderImpl clearCustomerSuppliedEncryptionEnforcementConfig() {
34603474
return this;
34613475
}
34623476

3477+
@Override
3478+
BuilderImpl clearIsUnreachable() {
3479+
this.isUnreachable = null;
3480+
return this;
3481+
}
3482+
34633483
private Builder clearDeleteLifecycleRules() {
34643484
if (lifecycleRules != null && !lifecycleRules.isEmpty()) {
34653485
ImmutableList<LifecycleRule> nonDeleteRules =
@@ -3513,6 +3533,7 @@ private Builder clearDeleteLifecycleRules() {
35133533
customerManagedEncryptionEnforcementConfig = builder.customerManagedEncryptionEnforcementConfig;
35143534
customerSuppliedEncryptionEnforcementConfig =
35153535
builder.customerSuppliedEncryptionEnforcementConfig;
3536+
isUnreachable = builder.isUnreachable;
35163537
modifiedFields = builder.modifiedFields.build();
35173538
}
35183539

@@ -3886,6 +3907,16 @@ public HierarchicalNamespace getHierarchicalNamespace() {
38863907
return customerSuppliedEncryptionEnforcementConfig;
38873908
}
38883909

3910+
/**
3911+
* Returns a {@code Boolean} with {@code true} if the bucket is unreachable, else {@code null}
3912+
*
3913+
* <p>A bucket may be unreachable if the region in which it resides is experiencing an outage or
3914+
* if there are other temporary access issues.
3915+
*/
3916+
public Boolean isUnreachable() {
3917+
return Data.isNull(isUnreachable) ? null : isUnreachable;
3918+
}
3919+
38893920
/** Returns a builder for the current bucket. */
38903921
public Builder toBuilder() {
38913922
return new BuilderImpl(this);
@@ -3931,7 +3962,8 @@ public int hashCode() {
39313962
ipFilter,
39323963
googleManagedEncryptionEnforcementConfig,
39333964
customerManagedEncryptionEnforcementConfig,
3934-
customerSuppliedEncryptionEnforcementConfig);
3965+
customerSuppliedEncryptionEnforcementConfig,
3966+
isUnreachable);
39353967
}
39363968

39373969
@Override
@@ -3985,7 +4017,8 @@ public boolean equals(Object o) {
39854017
that.customerManagedEncryptionEnforcementConfig)
39864018
&& Objects.equals(
39874019
customerSuppliedEncryptionEnforcementConfig,
3988-
that.customerSuppliedEncryptionEnforcementConfig);
4020+
that.customerSuppliedEncryptionEnforcementConfig)
4021+
&& Objects.equals(isUnreachable, that.isUnreachable);
39894022
}
39904023

39914024
@Override

google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java

Lines changed: 105 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -454,26 +454,37 @@ public Page<Bucket> list(BucketListOption... options) {
454454
Opts<BucketListOpt> opts = Opts.unwrap(options).prepend(defaultOpts).prepend(ALL_BUCKET_FIELDS);
455455
GrpcCallContext grpcCallContext =
456456
opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault());
457+
457458
ListBucketsRequest request =
458459
defaultProjectId
459460
.get()
460461
.listBuckets()
461462
.andThen(opts.listBucketsRequest())
462463
.apply(ListBucketsRequest.newBuilder())
463464
.build();
464-
try {
465-
GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext());
466-
return retrier.run(
467-
retryAlgorithmManager.getFor(request),
468-
() -> storageClient.listBucketsPagedCallable().call(request, merge),
469-
resp ->
470-
new TransformingPageDecorator<>(
471-
resp.getPage(),
472-
syntaxDecoders.bucket.andThen(opts.clearBucketFields()),
473-
retrier,
474-
retryAlgorithmManager.getFor(request)));
475-
} catch (Exception e) {
476-
throw StorageException.coalesce(e);
465+
466+
if (!request.getReturnPartialSuccess()) {
467+
try {
468+
GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext());
469+
return retrier.run(
470+
retryAlgorithmManager.getFor(request),
471+
() -> storageClient.listBucketsPagedCallable().call(request, merge),
472+
resp ->
473+
new TransformingPageDecorator<>(
474+
resp.getPage(),
475+
syntaxDecoders.bucket.andThen(opts.clearBucketFields()),
476+
retrier,
477+
retryAlgorithmManager.getFor(request)));
478+
} catch (Exception e) {
479+
throw StorageException.coalesce(e);
480+
}
481+
} else {
482+
try {
483+
com.google.storage.v2.ListBucketsResponse response = listBuckets(grpcCallContext, request);
484+
return new ListBucketsWithPartialSuccessPage(grpcCallContext, request, response, opts);
485+
} catch (Exception e) {
486+
throw StorageException.coalesce(e);
487+
}
477488
}
478489
}
479490

@@ -1619,6 +1630,78 @@ public Iterable<Blob> getValues() {
16191630
}
16201631
}
16211632

1633+
private final class ListBucketsWithPartialSuccessPage implements Page<Bucket> {
1634+
1635+
private final GrpcCallContext ctx;
1636+
private final ListBucketsRequest req;
1637+
private final com.google.storage.v2.ListBucketsResponse resp;
1638+
private final Opts<BucketListOpt> opts;
1639+
1640+
private ListBucketsWithPartialSuccessPage(
1641+
GrpcCallContext ctx,
1642+
ListBucketsRequest req,
1643+
com.google.storage.v2.ListBucketsResponse resp,
1644+
Opts<BucketListOpt> opts) {
1645+
this.ctx = ctx;
1646+
this.req = req;
1647+
this.resp = resp;
1648+
this.opts = opts;
1649+
}
1650+
1651+
@Override
1652+
public boolean hasNextPage() {
1653+
return !resp.getNextPageToken().isEmpty();
1654+
}
1655+
1656+
@Override
1657+
public String getNextPageToken() {
1658+
return resp.getNextPageToken();
1659+
}
1660+
1661+
@Override
1662+
public Page<Bucket> getNextPage() {
1663+
if (!hasNextPage()) {
1664+
return null;
1665+
}
1666+
ListBucketsRequest nextPageReq =
1667+
req.toBuilder().setPageToken(resp.getNextPageToken()).build();
1668+
try {
1669+
com.google.storage.v2.ListBucketsResponse nextPageResp = listBuckets(ctx, nextPageReq);
1670+
return new ListBucketsWithPartialSuccessPage(ctx, nextPageReq, nextPageResp, opts);
1671+
} catch (Exception e) {
1672+
throw StorageException.coalesce(e);
1673+
}
1674+
}
1675+
1676+
@Override
1677+
public Iterable<Bucket> getValues() {
1678+
Decoder<com.google.storage.v2.Bucket, Bucket> bucketDecoder =
1679+
syntaxDecoders.bucket.andThen(opts.clearBucketFields());
1680+
Stream<Bucket> reachable = resp.getBucketsList().stream().map(bucketDecoder::decode);
1681+
Stream<Bucket> unreachable =
1682+
resp.getUnreachableList().stream()
1683+
.map(
1684+
name -> {
1685+
String decoded = bucketNameCodec.decode(name);
1686+
return BucketInfo.newBuilder(decoded)
1687+
.setIsUnreachable(true)
1688+
.build()
1689+
.asBucket(GrpcStorageImpl.this);
1690+
});
1691+
return Streams.concat(reachable, unreachable).collect(ImmutableList.toImmutableList());
1692+
}
1693+
1694+
@Override
1695+
public Iterable<Bucket> iterateAll() {
1696+
Page<Bucket> curr = this;
1697+
return () ->
1698+
streamIterate(curr, p -> p != null && p.hasNextPage(), Page::getNextPage)
1699+
.filter(Objects::nonNull)
1700+
.flatMap(p -> StreamSupport.stream(p.getValues().spliterator(), false))
1701+
.iterator();
1702+
}
1703+
}
1704+
16221705
static final class TransformingPageDecorator<
16231706
RequestT,
16241707
ResponseT,
@@ -1858,6 +1941,15 @@ private SourceObject sourceObjectEncode(SourceBlob from) {
18581941
return to.build();
18591942
}
18601943

1944+
private com.google.storage.v2.ListBucketsResponse listBuckets(
1945+
GrpcCallContext grpcCallContext, ListBucketsRequest request) {
1946+
GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext());
1947+
return retrier.run(
1948+
retryAlgorithmManager.getFor(request),
1949+
() -> storageClient.listBucketsCallable().call(request, merge),
1950+
Decoder.identity());
1951+
}
1952+
18611953
private com.google.storage.v2.Bucket getBucketWithDefaultAcls(String bucketName) {
18621954
Fields fields =
18631955
UnifiedOpts.fields(

google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.cloud.storage.Storage.BucketField.IP_FILTER;
2020
import static com.google.cloud.storage.Storage.BucketField.SOFT_DELETE_POLICY;
21+
import static com.google.cloud.storage.Utils.bucketNameCodec;
2122
import static com.google.cloud.storage.Utils.dateTimeCodec;
2223
import static com.google.cloud.storage.Utils.durationSecondsCodec;
2324
import static com.google.cloud.storage.Utils.ifNonNull;
@@ -609,7 +610,7 @@ private Bucket bucketInfoEncode(BucketInfo from) {
609610

610611
@SuppressWarnings("deprecation")
611612
private BucketInfo bucketInfoDecode(com.google.api.services.storage.model.Bucket from) {
612-
BucketInfo.Builder to = new BucketInfo.BuilderImpl(from.getName());
613+
BucketInfo.Builder to = new BucketInfo.BuilderImpl(bucketNameCodec.decode(from.getName()));
613614
ifNonNull(from.getProjectNumber(), to::setProject);
614615
ifNonNull(from.getAcl(), toListOf(bucketAcl()::decode), to::setAcl);
615616
ifNonNull(from.getCors(), toListOf(cors()::decode), to::setCors);
@@ -674,6 +675,9 @@ private BucketInfo bucketInfoDecode(com.google.api.services.storage.model.Bucket
674675
ifNonNull(from.getObjectRetention(), this::objectRetentionDecode, to::setObjectRetention);
675676
ifNonNull(from.getSoftDeletePolicy(), this::softDeletePolicyDecode, to::setSoftDeletePolicy);
676677
ifNonNull(from.getIpFilter(), ipFilterCodec::decode, to::setIpFilter);
678+
if (from.containsKey("isUnreachable")) {
679+
to.setIsUnreachable(Boolean.TRUE);
680+
}
677681
return to.build();
678682
}
679683

google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ ListPartsResponse sendListPartsRequest(ListPartsRequest request) throws IOExcept
113113
false);
114114
HttpRequest httpRequest = requestFactory.buildGetRequest(new GenericUrl(listUri));
115115
httpRequest.getHeaders().putAll(headerProvider.getHeaders());
116+
if (request.userProject() != null) {
117+
httpRequest.getHeaders().put("x-goog-user-project", request.userProject());
118+
}
116119
httpRequest.setParser(objectParser);
117120
httpRequest.setThrowExceptionOnExecuteError(true);
118121
return httpRequest.execute().parseAs(ListPartsResponse.class);
@@ -149,6 +152,9 @@ ListMultipartUploadsResponse sendListMultipartUploadsRequest(ListMultipartUpload
149152
false);
150153
HttpRequest httpRequest = requestFactory.buildGetRequest(new GenericUrl(listUri));
151154
httpRequest.getHeaders().putAll(headerProvider.getHeaders());
155+
if (request.userProject() != null) {
156+
httpRequest.getHeaders().put("x-goog-user-project", request.userProject());
157+
}
152158
httpRequest.setParser(objectParser);
153159
httpRequest.setThrowExceptionOnExecuteError(true);
154160
return httpRequest.execute().parseAs(ListMultipartUploadsResponse.class);
@@ -167,6 +173,9 @@ AbortMultipartUploadResponse sendAbortMultipartUploadRequest(AbortMultipartUploa
167173

168174
HttpRequest httpRequest = requestFactory.buildDeleteRequest(new GenericUrl(abortUri));
169175
httpRequest.getHeaders().putAll(headerProvider.getHeaders());
176+
if (request.userProject() != null) {
177+
httpRequest.getHeaders().put("x-goog-user-project", request.userProject());
178+
}
170179
httpRequest.setParser(objectParser);
171180
httpRequest.setThrowExceptionOnExecuteError(true);
172181
return httpRequest.execute().parseAs(AbortMultipartUploadResponse.class);
@@ -213,6 +222,9 @@ UploadPartResponse sendUploadPartRequest(
213222
HttpRequest httpRequest =
214223
requestFactory.buildPutRequest(new GenericUrl(uploadUri), rewindableContent);
215224
httpRequest.getHeaders().putAll(headerProvider.getHeaders());
225+
if (request.userProject() != null) {
226+
httpRequest.getHeaders().put("x-goog-user-project", request.userProject());
227+
}
216228
if (request.getCrc32c() != null) {
217229
addChecksumHeader(request.getCrc32c(), httpRequest.getHeaders());
218230
} else {

google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2470,6 +2470,11 @@ public static BucketListOption pageSize(long pageSize) {
24702470
return new BucketListOption(UnifiedOpts.pageSize(pageSize));
24712471
}
24722472

2473+
@TransportCompatibility({Transport.HTTP, Transport.GRPC})
2474+
public static BucketListOption returnPartialSuccess(boolean returnPartialSuccess) {
2475+
return new BucketListOption(UnifiedOpts.returnPartialSuccess(returnPartialSuccess));
2476+
}
2477+
24732478
/** Returns an option to specify the page token from which to start listing buckets. */
24742479
@TransportCompatibility({Transport.HTTP, Transport.GRPC})
24752480
public static BucketListOption pageToken(@NonNull String pageToken) {

0 commit comments

Comments
 (0)