Skip to content

Commit 4fedc34

Browse files
BrennaEpptritone
andauthored
chore(storage): handle object metadata (grpc) (#7688)
* chore(storage): handle object metadata (grpc) * explictly send keys --------- Co-authored-by: Chris Cotter <[email protected]>
1 parent 2a5c165 commit 4fedc34

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

storage/grpc_client.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,19 @@ func (c *grpcStorageClient) UpdateObject(ctx context.Context, bucket, object str
550550
if uattrs.ACL != nil || len(uattrs.PredefinedACL) > 0 {
551551
fieldMask.Paths = append(fieldMask.Paths, "acl")
552552
}
553-
// TODO(cathyo): Handle metadata. Pending b/230510191.
553+
554+
if uattrs.Metadata != nil {
555+
// We don't support deleting a specific metadata key; metadata is deleted
556+
// as a whole if provided an empty map, so we do not use dot notation here
557+
if len(uattrs.Metadata) == 0 {
558+
fieldMask.Paths = append(fieldMask.Paths, "metadata")
559+
} else {
560+
// We can, however, use dot notation for adding keys
561+
for key := range uattrs.Metadata {
562+
fieldMask.Paths = append(fieldMask.Paths, fmt.Sprintf("metadata.%s", key))
563+
}
564+
}
565+
}
554566

555567
req.UpdateMask = fieldMask
556568

storage/integration_test.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,7 +1349,8 @@ func TestIntegration_Objects(t *testing.T) {
13491349
}
13501350

13511351
func TestIntegration_ObjectUpdate(t *testing.T) {
1352-
multiTransportTest(skipGRPC("metadata pending b/230510191"), t, func(t *testing.T, ctx context.Context, bucket string, _ string, client *Client) {
1352+
ctx := skipJSONReads(context.Background(), "no reads in test")
1353+
multiTransportTest(ctx, t, func(t *testing.T, ctx context.Context, bucket string, _ string, client *Client) {
13531354
b := client.Bucket(bucket)
13541355

13551356
o := b.Object("update-obj" + uidSpaceObjects.New())
@@ -1361,11 +1362,11 @@ func TestIntegration_ObjectUpdate(t *testing.T) {
13611362
if err := w.Close(); err != nil {
13621363
t.Fatalf("w.Close: %v", err)
13631364
}
1364-
t.Cleanup(func() {
1365+
defer func() {
13651366
if err := o.Delete(ctx); err != nil {
13661367
t.Errorf("o.Delete : %v", err)
13671368
}
1368-
})
1369+
}()
13691370

13701371
attrs, err := o.Attrs(ctx)
13711372
if err != nil {
@@ -1401,6 +1402,21 @@ func TestIntegration_ObjectUpdate(t *testing.T) {
14011402
t.Errorf("updated.Updated should be newer than update.Created")
14021403
}
14031404

1405+
// Add another metadata key
1406+
anotherKey := map[string]string{"key2": "value2"}
1407+
metadata["key2"] = "value2"
1408+
1409+
updated, err = o.Update(ctx, ObjectAttrsToUpdate{
1410+
Metadata: anotherKey,
1411+
})
1412+
if err != nil {
1413+
t.Fatalf("o.Update: %v", err)
1414+
}
1415+
1416+
if got, want := updated.Metadata, metadata; !testutil.Equal(got, want) {
1417+
t.Errorf("updated.Metadata == %+v; want %+v", updated.Metadata, want)
1418+
}
1419+
14041420
// Delete ContentType and ContentLanguage and Metadata.
14051421
updated, err = o.If(Conditions{MetagenerationMatch: updated.Metageneration}).Update(ctx, ObjectAttrsToUpdate{
14061422
ContentType: "",

storage/storage.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1163,7 +1163,7 @@ func (uattrs *ObjectAttrsToUpdate) toProtoObject(bucket, object string) *storage
11631163
o.Acl = toProtoObjectACL(uattrs.ACL)
11641164
}
11651165

1166-
// TODO(cathyo): Handle metadata. Pending b/230510191.
1166+
o.Metadata = uattrs.Metadata
11671167

11681168
return o
11691169
}

0 commit comments

Comments
 (0)