Skip to content

Commit 84e4adf

Browse files
authored
feat: implement GrpcStorageImpl#*HmacKey (#1576)
* GrpcStorageImpl#createHmacKey * GrpcStorageImpl#getHmacKey * GrpcStorageImpl#updateHmacKey * GrpcStorageImpl#deleteHmacKey Add tests for each Hmac method to ITGrpcTest
1 parent 480a09d commit 84e4adf

File tree

7 files changed

+196
-42
lines changed

7 files changed

+196
-42
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ private com.google.api.services.storage.model.HmacKeyMetadata hmacKeyMetadataEnc
649649
to.setId(from.getId());
650650
to.setProjectId(from.getProjectId());
651651
ifNonNull(from.getServiceAccount(), ServiceAccount::getEmail, to::setServiceAccountEmail);
652-
ifNonNull(from.getState(), Object::toString, to::setState);
652+
ifNonNull(from.getState(), Enum::name, to::setState);
653653
ifNonNull(from.getCreateTimeOffsetDateTime(), dateTimeCodec::encode, to::setTimeCreated);
654654
ifNonNull(from.getUpdateTimeOffsetDateTime(), dateTimeCodec::encode, to::setUpdated);
655655
return to;

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static com.google.cloud.storage.Utils.durationMillisCodec;
2121
import static com.google.cloud.storage.Utils.ifNonNull;
2222
import static com.google.cloud.storage.Utils.lift;
23+
import static com.google.cloud.storage.Utils.projectNameCodec;
2324
import static com.google.cloud.storage.Utils.toImmutableListOf;
2425
import static com.google.cloud.storage.Utils.todo;
2526

@@ -678,12 +679,12 @@ private BucketInfo.LifecycleRule lifecycleRuleDecode(Bucket.Lifecycle.Rule from)
678679

679680
private HmacKeyMetadata hmacKeyMetadataEncode(HmacKey.HmacKeyMetadata from) {
680681
HmacKeyMetadata.Builder to = HmacKeyMetadata.newBuilder();
681-
to.setAccessId(from.getAccessId());
682-
// TODO etag
683-
to.setId(from.getId());
684-
to.setProject(from.getProjectId());
682+
ifNonNull(from.getEtag(), to::setEtag);
683+
ifNonNull(from.getId(), to::setId);
684+
ifNonNull(from.getAccessId(), to::setAccessId);
685+
ifNonNull(from.getProjectId(), projectNameCodec::encode, to::setProject);
685686
ifNonNull(from.getServiceAccount(), ServiceAccount::getEmail, to::setServiceAccountEmail);
686-
ifNonNull(from.getState(), java.lang.Object::toString, to::setState);
687+
ifNonNull(from.getState(), Enum::name, to::setState);
687688
ifNonNull(from.getCreateTimeOffsetDateTime(), timestampCodec::encode, to::setCreateTime);
688689
ifNonNull(from.getUpdateTimeOffsetDateTime(), timestampCodec::encode, to::setUpdateTime);
689690
return to.build();
@@ -694,7 +695,7 @@ private HmacKey.HmacKeyMetadata hmacKeyMetadataDecode(HmacKeyMetadata from) {
694695
.setAccessId(from.getAccessId())
695696
.setCreateTimeOffsetDateTime(timestampCodec.decode(from.getCreateTime()))
696697
.setId(from.getId())
697-
.setProjectId(from.getProject())
698+
.setProjectId(projectNameCodec.decode(from.getProject()))
698699
.setState(HmacKey.HmacKeyState.valueOf(from.getState()))
699700
.setUpdateTimeOffsetDateTime(timestampCodec.decode(from.getUpdateTime()))
700701
.build();

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

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,23 +50,28 @@
5050
import com.google.cloud.storage.UnifiedOpts.BucketSourceOpt;
5151
import com.google.cloud.storage.UnifiedOpts.BucketTargetOpt;
5252
import com.google.cloud.storage.UnifiedOpts.HmacKeyListOpt;
53+
import com.google.cloud.storage.UnifiedOpts.HmacKeySourceOpt;
5354
import com.google.cloud.storage.UnifiedOpts.HmacKeyTargetOpt;
5455
import com.google.cloud.storage.UnifiedOpts.ObjectListOpt;
5556
import com.google.cloud.storage.UnifiedOpts.ObjectSourceOpt;
5657
import com.google.cloud.storage.UnifiedOpts.ObjectTargetOpt;
5758
import com.google.cloud.storage.UnifiedOpts.Opts;
5859
import com.google.cloud.storage.UnifiedOpts.ProjectId;
5960
import com.google.common.collect.ImmutableSet;
61+
import com.google.common.io.BaseEncoding;
6062
import com.google.common.io.ByteStreams;
63+
import com.google.protobuf.ByteString;
6164
import com.google.protobuf.FieldMask;
6265
import com.google.protobuf.Message;
6366
import com.google.storage.v2.ComposeObjectRequest;
6467
import com.google.storage.v2.ComposeObjectRequest.SourceObject;
6568
import com.google.storage.v2.CreateBucketRequest;
69+
import com.google.storage.v2.CreateHmacKeyRequest;
6670
import com.google.storage.v2.DeleteBucketRequest;
6771
import com.google.storage.v2.DeleteHmacKeyRequest;
6872
import com.google.storage.v2.DeleteObjectRequest;
6973
import com.google.storage.v2.GetBucketRequest;
74+
import com.google.storage.v2.GetHmacKeyRequest;
7075
import com.google.storage.v2.GetObjectRequest;
7176
import com.google.storage.v2.GetServiceAccountRequest;
7277
import com.google.storage.v2.ListBucketsRequest;
@@ -83,6 +88,7 @@
8388
import com.google.storage.v2.StorageClient.ListObjectsPage;
8489
import com.google.storage.v2.StorageClient.ListObjectsPagedResponse;
8590
import com.google.storage.v2.UpdateBucketRequest;
91+
import com.google.storage.v2.UpdateHmacKeyRequest;
8692
import com.google.storage.v2.UpdateObjectRequest;
8793
import com.google.storage.v2.WriteObjectRequest;
8894
import com.google.storage.v2.WriteObjectResponse;
@@ -141,7 +147,7 @@ final class GrpcStorageImpl extends BaseService<StorageOptions> implements Stora
141147
private final GrpcRetryAlgorithmManager retryAlgorithmManager;
142148
private final SyntaxDecoders syntaxDecoders;
143149

144-
private final transient ProjectId defaultProjectId;
150+
@Deprecated private final transient ProjectId defaultProjectId;
145151

146152
GrpcStorageImpl(GrpcStorageOptions options, StorageClient storageClient) {
147153
super(options);
@@ -389,9 +395,12 @@ public Page<Bucket> list(BucketListOption... options) {
389395
Opts<BucketListOpt> opts = Opts.unwrap(options);
390396
GrpcCallContext grpcCallContext =
391397
opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault());
392-
ListBucketsRequest.Builder builder =
393-
ListBucketsRequest.newBuilder().setParent(projectNameCodec.encode(defaultProjectId.val));
394-
ListBucketsRequest request = opts.listBucketsRequest().apply(builder).build();
398+
ListBucketsRequest request =
399+
defaultProjectId
400+
.listBuckets()
401+
.andThen(opts.listBucketsRequest())
402+
.apply(ListBucketsRequest.newBuilder())
403+
.build();
395404
ListBucketsPagedResponse call = listBucketsCallable.call(request, grpcCallContext);
396405
ListBucketsPage page = call.getPage();
397406
return new TransformingPageDecorator<>(page, syntaxDecoders.bucket);
@@ -873,7 +882,27 @@ public List<Acl> listAcls(BlobId blob) {
873882

874883
@Override
875884
public HmacKey createHmacKey(ServiceAccount serviceAccount, CreateHmacKeyOption... options) {
876-
return todo();
885+
Opts<HmacKeyTargetOpt> opts = Opts.unwrap(options);
886+
GrpcCallContext grpcCallContext =
887+
opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault());
888+
CreateHmacKeyRequest request =
889+
defaultProjectId
890+
.createHmacKey()
891+
.andThen(opts.createHmacKeysRequest())
892+
.apply(CreateHmacKeyRequest.newBuilder())
893+
.setServiceAccountEmail(serviceAccount.getEmail())
894+
.build();
895+
return Retrying.run(
896+
getOptions(),
897+
retryAlgorithmManager.getFor(request),
898+
() -> grpcStorageStub.createHmacKeyCallable().call(request, grpcCallContext),
899+
resp -> {
900+
ByteString secretKeyBytes = resp.getSecretKeyBytes();
901+
String b64SecretKey = BaseEncoding.base64().encode(secretKeyBytes.toByteArray());
902+
return HmacKey.newBuilder(b64SecretKey)
903+
.setMetadata(codecs.hmacKeyMetadata().decode(resp.getMetadata()))
904+
.build();
905+
});
877906
}
878907

879908
@Override
@@ -884,19 +913,34 @@ public Page<HmacKeyMetadata> listHmacKeys(ListHmacKeysOption... options) {
884913
GrpcCallContext grpcCallContext =
885914
opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault());
886915

887-
ProjectId projectId = opts.projectId().orElse(defaultProjectId);
888-
889-
ListHmacKeysRequest.Builder builder =
890-
projectId.listHmacKeys().apply(ListHmacKeysRequest.newBuilder());
891-
ListHmacKeysRequest request = opts.listHmacKeysRequest().apply(builder).build();
916+
ListHmacKeysRequest request =
917+
defaultProjectId
918+
.listHmacKeys()
919+
.andThen(opts.listHmacKeysRequest())
920+
.apply(ListHmacKeysRequest.newBuilder())
921+
.build();
892922
ListHmacKeysPagedResponse call = listHmacKeysCallable.call(request, grpcCallContext);
893923
ListHmacKeysPage page = call.getPage();
894924
return new TransformingPageDecorator<>(page, codecs.hmacKeyMetadata());
895925
}
896926

897927
@Override
898928
public HmacKeyMetadata getHmacKey(String accessId, GetHmacKeyOption... options) {
899-
return todo();
929+
Opts<HmacKeySourceOpt> opts = Opts.unwrap(options);
930+
GrpcCallContext grpcCallContext =
931+
opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault());
932+
GetHmacKeyRequest request =
933+
defaultProjectId
934+
.getHmacKey()
935+
.andThen(opts.getHmacKeysRequest())
936+
.apply(GetHmacKeyRequest.newBuilder())
937+
.setAccessId(accessId)
938+
.build();
939+
return Retrying.run(
940+
getOptions(),
941+
retryAlgorithmManager.getFor(request),
942+
() -> grpcStorageStub.getHmacKeyCallable().call(request, grpcCallContext),
943+
codecs.hmacKeyMetadata());
900944
}
901945

902946
@Override
@@ -907,7 +951,7 @@ public void deleteHmacKey(HmacKeyMetadata hmacKeyMetadata, DeleteHmacKeyOption..
907951
DeleteHmacKeyRequest req =
908952
DeleteHmacKeyRequest.newBuilder()
909953
.setAccessId(hmacKeyMetadata.getAccessId())
910-
.setProject(hmacKeyMetadata.getProjectId())
954+
.setProject(projectNameCodec.encode(hmacKeyMetadata.getProjectId()))
911955
.build();
912956
Retrying.run(
913957
getOptions(),
@@ -922,7 +966,21 @@ public void deleteHmacKey(HmacKeyMetadata hmacKeyMetadata, DeleteHmacKeyOption..
922966
@Override
923967
public HmacKeyMetadata updateHmacKeyState(
924968
HmacKeyMetadata hmacKeyMetadata, HmacKeyState state, UpdateHmacKeyOption... options) {
925-
return todo();
969+
Opts<HmacKeyTargetOpt> opts = Opts.unwrap(options);
970+
GrpcCallContext grpcCallContext =
971+
opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault());
972+
com.google.storage.v2.HmacKeyMetadata encode =
973+
codecs.hmacKeyMetadata().encode(hmacKeyMetadata).toBuilder().setState(state.name()).build();
974+
975+
UpdateHmacKeyRequest.Builder builder =
976+
opts.updateHmacKeysRequest().apply(UpdateHmacKeyRequest.newBuilder()).setHmacKey(encode);
977+
UpdateHmacKeyRequest request =
978+
builder.setUpdateMask(FieldMask.newBuilder().addPaths("state").build()).build();
979+
return Retrying.run(
980+
getOptions(),
981+
retryAlgorithmManager.getFor(request),
982+
() -> grpcStorageStub.updateHmacKeyCallable().call(request, grpcCallContext),
983+
codecs.hmacKeyMetadata());
926984
}
927985

928986
@Override

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import java.util.Collection;
5858
import java.util.Locale;
5959
import java.util.Objects;
60-
import java.util.Optional;
6160
import java.util.function.Function;
6261
import java.util.function.Predicate;
6362
import java.util.stream.Stream;
@@ -1104,7 +1103,7 @@ public Mapper<ListObjectsRequest.Builder> listObjects() {
11041103
*/
11051104
@Deprecated
11061105
static final class ProjectId extends RpcOptVal<String>
1107-
implements HmacKeySourceOpt, HmacKeyTargetOpt, HmacKeyListOpt {
1106+
implements HmacKeySourceOpt, HmacKeyTargetOpt, HmacKeyListOpt, BucketListOpt {
11081107
private static final long serialVersionUID = 1471462503030451598L;
11091108

11101109
private ProjectId(String val) {
@@ -1122,9 +1121,14 @@ public Mapper<GetHmacKeyRequest.Builder> getHmacKey() {
11221121
}
11231122

11241123
@Override
1125-
public Mapper<DeleteHmacKeyRequest.Builder> deleteHmacKey() {
1124+
public Mapper<CreateHmacKeyRequest.Builder> createHmacKey() {
11261125
return b -> b.setProject(projectNameCodec.encode(val));
11271126
}
1127+
1128+
@Override
1129+
public Mapper<ListBucketsRequest.Builder> listBuckets() {
1130+
return b -> b.setParent(projectNameCodec.encode(val));
1131+
}
11281132
}
11291133

11301134
static final class Projection extends RpcOptVal<String> implements BucketTargetOpt {
@@ -1958,11 +1962,6 @@ Mapper<BlobInfo.Builder> blobInfoMapper() {
19581962
return fuseMappers(ObjectTargetOpt.class, ObjectTargetOpt::blobInfo);
19591963
}
19601964

1961-
@Deprecated
1962-
Optional<ProjectId> projectId() {
1963-
return filterTo(ProjectId.class).findFirst();
1964-
}
1965-
19661965
private Mapper<ImmutableMap.Builder<StorageRpc.Option, Object>> rpcOptionMapper() {
19671966
return fuseMappers(RpcOptVal.class, RpcOptVal::mapper);
19681967
}

google-cloud-storage/src/test/java/com/google/cloud/storage/UnifiedOptsGrpcTest.java

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
import com.google.storage.v2.CommonObjectRequestParams;
3535
import com.google.storage.v2.ComposeObjectRequest;
3636
import com.google.storage.v2.CreateBucketRequest;
37+
import com.google.storage.v2.CreateHmacKeyRequest;
3738
import com.google.storage.v2.DeleteBucketRequest;
38-
import com.google.storage.v2.DeleteHmacKeyRequest;
3939
import com.google.storage.v2.DeleteObjectRequest;
4040
import com.google.storage.v2.GetBucketRequest;
4141
import com.google.storage.v2.GetHmacKeyRequest;
@@ -828,14 +828,14 @@ public void getHmacKey_nonResource() {
828828
}
829829

830830
@Test
831-
public void deleteHmacKey_nonResource() {
832-
DeleteHmacKeyRequest expected =
833-
DeleteHmacKeyRequest.newBuilder().setProject("projects/proj").build();
831+
public void createHmacKey_nonResource() {
832+
CreateHmacKeyRequest expected =
833+
CreateHmacKeyRequest.newBuilder().setProject("projects/proj").build();
834834

835-
DeleteHmacKeyRequest actual =
835+
CreateHmacKeyRequest actual =
836836
UnifiedOpts.projectId("proj")
837-
.deleteHmacKey()
838-
.apply(DeleteHmacKeyRequest.newBuilder())
837+
.createHmacKey()
838+
.apply(CreateHmacKeyRequest.newBuilder())
839839
.build();
840840
assertThat(actual).isEqualTo(expected);
841841
}
@@ -867,14 +867,40 @@ public void getHmacKey_resource() {
867867
}
868868

869869
@Test
870-
public void deleteHmacKey_resource() {
871-
DeleteHmacKeyRequest expected =
872-
DeleteHmacKeyRequest.newBuilder().setProject("projects/proj").build();
870+
public void createHmacKey_resource() {
871+
CreateHmacKeyRequest expected =
872+
CreateHmacKeyRequest.newBuilder().setProject("projects/proj").build();
873873

874-
DeleteHmacKeyRequest actual =
874+
CreateHmacKeyRequest actual =
875875
UnifiedOpts.projectId("projects/proj")
876-
.deleteHmacKey()
877-
.apply(DeleteHmacKeyRequest.newBuilder())
876+
.createHmacKey()
877+
.apply(CreateHmacKeyRequest.newBuilder())
878+
.build();
879+
assertThat(actual).isEqualTo(expected);
880+
}
881+
882+
@Test
883+
public void listBuckets_nonResource() {
884+
ListBucketsRequest expected =
885+
ListBucketsRequest.newBuilder().setParent("projects/proj").build();
886+
887+
ListBucketsRequest actual =
888+
UnifiedOpts.projectId("proj")
889+
.listBuckets()
890+
.apply(ListBucketsRequest.newBuilder())
891+
.build();
892+
assertThat(actual).isEqualTo(expected);
893+
}
894+
895+
@Test
896+
public void listBuckets_resource() {
897+
ListBucketsRequest expected =
898+
ListBucketsRequest.newBuilder().setParent("projects/proj").build();
899+
900+
ListBucketsRequest actual =
901+
UnifiedOpts.projectId("projects/proj")
902+
.listBuckets()
903+
.apply(ListBucketsRequest.newBuilder())
878904
.build();
879905
assertThat(actual).isEqualTo(expected);
880906
}

0 commit comments

Comments
 (0)