Skip to content

Commit dc787f3

Browse files
authored
RSDK-10138: Add Go API for user-defined metadata and bump api version to v0.1.401 (viamrobotics#4844)
1 parent 576e4df commit dc787f3

File tree

5 files changed

+310
-5
lines changed

5 files changed

+310
-5
lines changed

app/app_client.go

+96
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,30 @@ func (c *AppClient) DeleteOrganization(ctx context.Context, orgID string) error
682682
return err
683683
}
684684

685+
// GetOrganizationMetadata gets the user-defined metadata for an organization.
686+
func (c *AppClient) GetOrganizationMetadata(ctx context.Context, organizationID string) (map[string]interface{}, error) {
687+
resp, err := c.client.GetOrganizationMetadata(ctx, &pb.GetOrganizationMetadataRequest{
688+
OrganizationId: organizationID,
689+
})
690+
if err != nil {
691+
return nil, err
692+
}
693+
return resp.Data.AsMap(), nil
694+
}
695+
696+
// UpdateOrganizationMetadata updates the user-defined metadata for an organization.
697+
func (c *AppClient) UpdateOrganizationMetadata(ctx context.Context, organizationID string, data interface{}) error {
698+
d, err := protoutils.StructToStructPb(data)
699+
if err != nil {
700+
return err
701+
}
702+
_, err = c.client.UpdateOrganizationMetadata(ctx, &pb.UpdateOrganizationMetadataRequest{
703+
OrganizationId: organizationID,
704+
Data: d,
705+
})
706+
return err
707+
}
708+
685709
// ListOrganizationMembers lists all members of an organization and all invited members to the organization.
686710
func (c *AppClient) ListOrganizationMembers(ctx context.Context, orgID string) ([]*OrganizationMember, []*OrganizationInvite, error) {
687711
resp, err := c.client.ListOrganizationMembers(ctx, &pb.ListOrganizationMembersRequest{
@@ -987,6 +1011,30 @@ func (c *AppClient) DeleteLocationSecret(ctx context.Context, locationID, secret
9871011
return err
9881012
}
9891013

1014+
// GetLocationMetadata gets the user-defined metadata for a location.
1015+
func (c *AppClient) GetLocationMetadata(ctx context.Context, locationID string) (map[string]interface{}, error) {
1016+
resp, err := c.client.GetLocationMetadata(ctx, &pb.GetLocationMetadataRequest{
1017+
LocationId: locationID,
1018+
})
1019+
if err != nil {
1020+
return nil, err
1021+
}
1022+
return resp.Data.AsMap(), nil
1023+
}
1024+
1025+
// UpdateLocationMetadata updates the user-defined metadata for a location.
1026+
func (c *AppClient) UpdateLocationMetadata(ctx context.Context, locationID string, data interface{}) error {
1027+
d, err := protoutils.StructToStructPb(data)
1028+
if err != nil {
1029+
return err
1030+
}
1031+
_, err = c.client.UpdateLocationMetadata(ctx, &pb.UpdateLocationMetadataRequest{
1032+
LocationId: locationID,
1033+
Data: d,
1034+
})
1035+
return err
1036+
}
1037+
9901038
// GetRobot gets a specific robot by ID.
9911039
func (c *AppClient) GetRobot(ctx context.Context, id string) (*Robot, error) {
9921040
resp, err := c.client.GetRobot(ctx, &pb.GetRobotRequest{
@@ -998,6 +1046,30 @@ func (c *AppClient) GetRobot(ctx context.Context, id string) (*Robot, error) {
9981046
return robotFromProto(resp.Robot), nil
9991047
}
10001048

1049+
// GetRobotMetadata gets the user-defined metadata for a robot.
1050+
func (c *AppClient) GetRobotMetadata(ctx context.Context, robotID string) (map[string]interface{}, error) {
1051+
resp, err := c.client.GetRobotMetadata(ctx, &pb.GetRobotMetadataRequest{
1052+
Id: robotID,
1053+
})
1054+
if err != nil {
1055+
return nil, err
1056+
}
1057+
return resp.Data.AsMap(), nil
1058+
}
1059+
1060+
// UpdateRobotMetadata updates the user-defined metadata for a robot.
1061+
func (c *AppClient) UpdateRobotMetadata(ctx context.Context, robotID string, data interface{}) error {
1062+
d, err := protoutils.StructToStructPb(data)
1063+
if err != nil {
1064+
return err
1065+
}
1066+
_, err = c.client.UpdateRobotMetadata(ctx, &pb.UpdateRobotMetadataRequest{
1067+
Id: robotID,
1068+
Data: d,
1069+
})
1070+
return err
1071+
}
1072+
10011073
// GetRoverRentalRobots gets rover rental robots within an organization.
10021074
func (c *AppClient) GetRoverRentalRobots(ctx context.Context, orgID string) ([]*RoverRentalRobot, error) {
10031075
resp, err := c.client.GetRoverRentalRobots(ctx, &pb.GetRoverRentalRobotsRequest{
@@ -1168,6 +1240,30 @@ func (c *AppClient) DeleteRobotPart(ctx context.Context, partID string) error {
11681240
return err
11691241
}
11701242

1243+
// GetRobotPartMetadata gets the user-defined metadata for a robot part.
1244+
func (c *AppClient) GetRobotPartMetadata(ctx context.Context, robotID string) (map[string]interface{}, error) {
1245+
resp, err := c.client.GetRobotMetadata(ctx, &pb.GetRobotMetadataRequest{
1246+
Id: robotID,
1247+
})
1248+
if err != nil {
1249+
return nil, err
1250+
}
1251+
return resp.Data.AsMap(), nil
1252+
}
1253+
1254+
// UpdateRobotPartMetadata updates the user-defined metadata for a robot part.
1255+
func (c *AppClient) UpdateRobotPartMetadata(ctx context.Context, robotID string, data interface{}) error {
1256+
d, err := protoutils.StructToStructPb(data)
1257+
if err != nil {
1258+
return err
1259+
}
1260+
_, err = c.client.UpdateRobotPartMetadata(ctx, &pb.UpdateRobotPartMetadataRequest{
1261+
Id: robotID,
1262+
Data: d,
1263+
})
1264+
return err
1265+
}
1266+
11711267
// GetRobotAPIKeys gets the robot API keys for the robot.
11721268
func (c *AppClient) GetRobotAPIKeys(ctx context.Context, robotID string) ([]*APIKeyWithAuthorizations, error) {
11731269
resp, err := c.client.GetRobotAPIKeys(ctx, &pb.GetRobotAPIKeysRequest{

app/app_client_test.go

+115-2
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ var (
414414
Permissions: []string{permission},
415415
},
416416
}
417-
metadata = registryItemMLTrainingMetadata{
417+
mlTrainingMetadata = registryItemMLTrainingMetadata{
418418
MlTrainingMetadata: &MLTrainingMetadata{
419419
Versions: []*MLTrainingVersion{
420420
{
@@ -440,7 +440,7 @@ var (
440440
TotalExternalRobotUsage: totalExternalRobotUsage,
441441
TotalOrganizationUsage: totalOrganizationUsage,
442442
TotalExternalOrganizationUsage: totalExternalOrganizationUsage,
443-
Metadata: &metadata,
443+
Metadata: &mlTrainingMetadata,
444444
CreatedAt: &createdOn,
445445
UpdatedAt: &lastUpdated,
446446
}
@@ -526,6 +526,15 @@ var (
526526
Platform: platform,
527527
PlatformTags: tags,
528528
}
529+
userDefinedMetadata = struct {
530+
A int
531+
B bool
532+
C string
533+
D []string
534+
E struct{ MyField bool }
535+
F interface{}
536+
}{42, true, "x", []string{"y", "z"}, struct{ MyField bool }{true}, nil}
537+
pbUserDefinedMetadata, _ = protoutils.StructToStructPb(userDefinedMetadata)
529538
)
530539

531540
func sharedSecretStateToProto(state SharedSecretState) pb.SharedSecret_State {
@@ -884,6 +893,32 @@ func TestAppClient(t *testing.T) {
884893
test.That(t, err, test.ShouldBeNil)
885894
})
886895

896+
t.Run("GetOrganizationMetadata", func(t *testing.T) {
897+
grpcClient.GetOrganizationMetadataFunc = func(
898+
ctx context.Context, in *pb.GetOrganizationMetadataRequest, opts ...grpc.CallOption,
899+
) (*pb.GetOrganizationMetadataResponse, error) {
900+
test.That(t, in.OrganizationId, test.ShouldEqual, organizationID)
901+
return &pb.GetOrganizationMetadataResponse{
902+
Data: pbUserDefinedMetadata,
903+
}, nil
904+
}
905+
resp, err := client.GetOrganizationMetadata(context.Background(), organizationID)
906+
test.That(t, err, test.ShouldBeNil)
907+
test.That(t, resp, test.ShouldResemble, pbUserDefinedMetadata.AsMap())
908+
})
909+
910+
t.Run("UpdateOrganizationMetadata", func(t *testing.T) {
911+
grpcClient.UpdateOrganizationMetadataFunc = func(
912+
ctx context.Context, in *pb.UpdateOrganizationMetadataRequest, opts ...grpc.CallOption,
913+
) (*pb.UpdateOrganizationMetadataResponse, error) {
914+
test.That(t, in.OrganizationId, test.ShouldEqual, organizationID)
915+
test.That(t, in.Data, test.ShouldResemble, pbUserDefinedMetadata)
916+
return &pb.UpdateOrganizationMetadataResponse{}, nil
917+
}
918+
err := client.UpdateOrganizationMetadata(context.Background(), organizationID, userDefinedMetadata)
919+
test.That(t, err, test.ShouldBeNil)
920+
})
921+
887922
t.Run("ListOrganizationMembers", func(t *testing.T) {
888923
expectedMembers := []*OrganizationMember{&member}
889924
expectedInvites := []*OrganizationInvite{&invite}
@@ -1192,6 +1227,32 @@ func TestAppClient(t *testing.T) {
11921227
test.That(t, err, test.ShouldBeNil)
11931228
})
11941229

1230+
t.Run("GetLocationMetadata", func(t *testing.T) {
1231+
grpcClient.GetLocationMetadataFunc = func(
1232+
ctx context.Context, in *pb.GetLocationMetadataRequest, opts ...grpc.CallOption,
1233+
) (*pb.GetLocationMetadataResponse, error) {
1234+
test.That(t, in.LocationId, test.ShouldEqual, locationID)
1235+
return &pb.GetLocationMetadataResponse{
1236+
Data: pbUserDefinedMetadata,
1237+
}, nil
1238+
}
1239+
resp, err := client.GetLocationMetadata(context.Background(), locationID)
1240+
test.That(t, err, test.ShouldBeNil)
1241+
test.That(t, resp, test.ShouldResemble, pbUserDefinedMetadata.AsMap())
1242+
})
1243+
1244+
t.Run("UpdateLocationMetadata", func(t *testing.T) {
1245+
grpcClient.UpdateLocationMetadataFunc = func(
1246+
ctx context.Context, in *pb.UpdateLocationMetadataRequest, opts ...grpc.CallOption,
1247+
) (*pb.UpdateLocationMetadataResponse, error) {
1248+
test.That(t, in.LocationId, test.ShouldEqual, locationID)
1249+
test.That(t, in.Data, test.ShouldResemble, pbUserDefinedMetadata)
1250+
return &pb.UpdateLocationMetadataResponse{}, nil
1251+
}
1252+
err := client.UpdateLocationMetadata(context.Background(), locationID, userDefinedMetadata)
1253+
test.That(t, err, test.ShouldBeNil)
1254+
})
1255+
11951256
t.Run("GetRobot", func(t *testing.T) {
11961257
grpcClient.GetRobotFunc = func(
11971258
ctx context.Context, in *pb.GetRobotRequest, opts ...grpc.CallOption,
@@ -1259,6 +1320,32 @@ func TestAppClient(t *testing.T) {
12591320
test.That(t, part, test.ShouldResemble, &robotPart)
12601321
})
12611322

1323+
t.Run("GetRobotMetadata", func(t *testing.T) {
1324+
grpcClient.GetRobotMetadataFunc = func(
1325+
ctx context.Context, in *pb.GetRobotMetadataRequest, opts ...grpc.CallOption,
1326+
) (*pb.GetRobotMetadataResponse, error) {
1327+
test.That(t, in.Id, test.ShouldEqual, robotID)
1328+
return &pb.GetRobotMetadataResponse{
1329+
Data: pbUserDefinedMetadata,
1330+
}, nil
1331+
}
1332+
resp, err := client.GetRobotMetadata(context.Background(), robotID)
1333+
test.That(t, err, test.ShouldBeNil)
1334+
test.That(t, resp, test.ShouldResemble, pbUserDefinedMetadata.AsMap())
1335+
})
1336+
1337+
t.Run("UpdateRobotMetadata", func(t *testing.T) {
1338+
grpcClient.UpdateRobotMetadataFunc = func(
1339+
ctx context.Context, in *pb.UpdateRobotMetadataRequest, opts ...grpc.CallOption,
1340+
) (*pb.UpdateRobotMetadataResponse, error) {
1341+
test.That(t, in.Id, test.ShouldEqual, robotID)
1342+
test.That(t, in.Data, test.ShouldResemble, pbUserDefinedMetadata)
1343+
return &pb.UpdateRobotMetadataResponse{}, nil
1344+
}
1345+
err := client.UpdateRobotMetadata(context.Background(), robotID, userDefinedMetadata)
1346+
test.That(t, err, test.ShouldBeNil)
1347+
})
1348+
12621349
t.Run("GetRobotPartLogs", func(t *testing.T) {
12631350
grpcClient.GetRobotPartLogsFunc = func(
12641351
ctx context.Context, in *pb.GetRobotPartLogsRequest, opts ...grpc.CallOption,
@@ -1372,6 +1459,32 @@ func TestAppClient(t *testing.T) {
13721459
test.That(t, err, test.ShouldBeNil)
13731460
})
13741461

1462+
t.Run("GetRobotPartMetadata", func(t *testing.T) {
1463+
grpcClient.GetRobotPartMetadataFunc = func(
1464+
ctx context.Context, in *pb.GetRobotPartMetadataRequest, opts ...grpc.CallOption,
1465+
) (*pb.GetRobotPartMetadataResponse, error) {
1466+
test.That(t, in.Id, test.ShouldEqual, robotID)
1467+
return &pb.GetRobotPartMetadataResponse{
1468+
Data: pbUserDefinedMetadata,
1469+
}, nil
1470+
}
1471+
resp, err := client.GetRobotPartMetadata(context.Background(), robotID)
1472+
test.That(t, err, test.ShouldBeNil)
1473+
test.That(t, resp, test.ShouldResemble, pbUserDefinedMetadata.AsMap())
1474+
})
1475+
1476+
t.Run("UpdateRobotPartMetadata", func(t *testing.T) {
1477+
grpcClient.UpdateRobotPartMetadataFunc = func(
1478+
ctx context.Context, in *pb.UpdateRobotPartMetadataRequest, opts ...grpc.CallOption,
1479+
) (*pb.UpdateRobotPartMetadataResponse, error) {
1480+
test.That(t, in.Id, test.ShouldEqual, robotID)
1481+
test.That(t, in.Data, test.ShouldResemble, pbUserDefinedMetadata)
1482+
return &pb.UpdateRobotPartMetadataResponse{}, nil
1483+
}
1484+
err := client.UpdateRobotPartMetadata(context.Background(), robotID, userDefinedMetadata)
1485+
test.That(t, err, test.ShouldBeNil)
1486+
})
1487+
13751488
t.Run("GetRobotAPIKeys", func(t *testing.T) {
13761489
expectedAPIKeyWithAuthorizations := []*APIKeyWithAuthorizations{&apiKeyWithAuthorizations}
13771490
grpcClient.GetRobotAPIKeysFunc = func(

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ require (
7575
go.uber.org/atomic v1.11.0
7676
go.uber.org/multierr v1.11.0
7777
go.uber.org/zap v1.27.0
78-
go.viam.com/api v0.1.397
78+
go.viam.com/api v0.1.401
7979
go.viam.com/test v1.2.4
8080
go.viam.com/utils v0.1.132
8181
goji.io v2.0.2+incompatible

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -1520,8 +1520,8 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
15201520
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
15211521
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
15221522
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
1523-
go.viam.com/api v0.1.397 h1:BGHQ71TmGDtUOWSmY66STA8/hcbUFV+okWAtgYVK7SA=
1524-
go.viam.com/api v0.1.397/go.mod h1:drvlBWaiHFxPziz5jayHvibez1qG7lylcNCC1LF8onU=
1523+
go.viam.com/api v0.1.401 h1:ZbqO++aaB2YkccbVsiu/YWzZnw3e7Ha9dGs3IP7D2bc=
1524+
go.viam.com/api v0.1.401/go.mod h1:drvlBWaiHFxPziz5jayHvibez1qG7lylcNCC1LF8onU=
15251525
go.viam.com/test v1.2.4 h1:JYgZhsuGAQ8sL9jWkziAXN9VJJiKbjoi9BsO33TW3ug=
15261526
go.viam.com/test v1.2.4/go.mod h1:zI2xzosHdqXAJ/kFqcN+OIF78kQuTV2nIhGZ8EzvaJI=
15271527
go.viam.com/utils v0.1.132 h1:gow4LPLP7Sun7LhU6j16ngeHukp0Qnepsv9kVdhQpWM=

0 commit comments

Comments
 (0)