diff --git a/src/gen/io/defang/v1/fabric_connect.d.ts b/src/gen/io/defang/v1/fabric_connect.d.ts index 015b2eec7..560a6bbeb 100644 --- a/src/gen/io/defang/v1/fabric_connect.d.ts +++ b/src/gen/io/defang/v1/fabric_connect.d.ts @@ -53,6 +53,7 @@ export declare const FabricController: { readonly I: typeof Empty, readonly O: typeof Empty, readonly kind: MethodKind.Unary, + readonly idempotency: MethodIdempotency.Idempotent, }, /** * @generated from rpc io.defang.v1.FabricController.Tail @@ -62,6 +63,7 @@ export declare const FabricController: { readonly I: typeof TailRequest, readonly O: typeof TailResponse, readonly kind: MethodKind.ServerStreaming, + readonly idempotency: MethodIdempotency.NoSideEffects, }, /** * @generated from rpc io.defang.v1.FabricController.Update @@ -119,6 +121,7 @@ export declare const FabricController: { readonly I: typeof SubscribeRequest, readonly O: typeof SubscribeResponse, readonly kind: MethodKind.ServerStreaming, + readonly idempotency: MethodIdempotency.NoSideEffects, }, /** * rpc Promote(google.protobuf.Empty) returns (google.protobuf.Empty); diff --git a/src/gen/io/defang/v1/fabric_connect.js b/src/gen/io/defang/v1/fabric_connect.js index ae8d01aa2..9bba22c32 100644 --- a/src/gen/io/defang/v1/fabric_connect.js +++ b/src/gen/io/defang/v1/fabric_connect.js @@ -53,6 +53,7 @@ export const FabricController = { I: Empty, O: Empty, kind: MethodKind.Unary, + idempotency: MethodIdempotency.Idempotent, }, /** * @generated from rpc io.defang.v1.FabricController.Tail @@ -62,6 +63,7 @@ export const FabricController = { I: TailRequest, O: TailResponse, kind: MethodKind.ServerStreaming, + idempotency: MethodIdempotency.NoSideEffects, }, /** * @generated from rpc io.defang.v1.FabricController.Update @@ -119,6 +121,7 @@ export const FabricController = { I: SubscribeRequest, O: SubscribeResponse, kind: MethodKind.ServerStreaming, + idempotency: MethodIdempotency.NoSideEffects, }, /** * rpc Promote(google.protobuf.Empty) returns (google.protobuf.Empty); diff --git a/src/gen/io/defang/v1/fabric_pb.d.ts b/src/gen/io/defang/v1/fabric_pb.d.ts index d185bcbc6..ad626a39b 100644 --- a/src/gen/io/defang/v1/fabric_pb.d.ts +++ b/src/gen/io/defang/v1/fabric_pb.d.ts @@ -203,9 +203,9 @@ export declare class DeployRequest extends Message { project: string; /** - * @generated from field: google.protobuf.Struct compose = 3; + * @generated from field: string compose_yaml = 3; */ - compose?: Struct; + composeYaml: string; constructor(data?: PartialMessage); diff --git a/src/gen/io/defang/v1/fabric_pb.js b/src/gen/io/defang/v1/fabric_pb.js index b1c4ed0af..2be0d95bd 100644 --- a/src/gen/io/defang/v1/fabric_pb.js +++ b/src/gen/io/defang/v1/fabric_pb.js @@ -90,7 +90,7 @@ export const DeployRequest = /*@__PURE__*/ proto3.makeMessageType( () => [ { no: 1, name: "services", kind: "message", T: Service, repeated: true }, { no: 2, name: "project", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "compose", kind: "message", T: Struct }, + { no: 3, name: "compose_yaml", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ], ); diff --git a/src/pkg/cli/client/retrier.go b/src/pkg/cli/client/retrier.go index 6d265ddc0..6ca9ff07c 100644 --- a/src/pkg/cli/client/retrier.go +++ b/src/pkg/cli/client/retrier.go @@ -13,7 +13,7 @@ type Retrier struct{} func (Retrier) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc { return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { res, err := next(ctx, req) - if connect.CodeOf(err) == connect.CodeUnavailable { + if connect.CodeOf(err) == connect.CodeUnavailable || req.Spec().IdempotencyLevel == connect.IdempotencyNoSideEffects { // Retry once after a 1 second sleep pkg.SleepWithContext(ctx, 1*time.Second) res, err = next(ctx, req) diff --git a/src/pkg/cli/client/retrier_test.go b/src/pkg/cli/client/retrier_test.go index 7e6bc603a..886279ce4 100644 --- a/src/pkg/cli/client/retrier_test.go +++ b/src/pkg/cli/client/retrier_test.go @@ -5,6 +5,7 @@ import ( "errors" "net/http/httptest" "testing" + "time" defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" "github.com/DefangLabs/defang/src/protos/io/defang/v1/defangv1connect" @@ -13,18 +14,28 @@ import ( type grpcMockHandler struct { defangv1connect.UnimplementedFabricControllerHandler - tries int + getTries int + deployTries int + tailTries int +} + +func (g *grpcMockHandler) Get(context.Context, *connect.Request[defangv1.ServiceID]) (*connect.Response[defangv1.ServiceInfo], error) { + println(time.Now().Format(time.RFC3339Nano), "Get") + g.getTries++ + return nil, connect.NewError(connect.CodeUnavailable, errors.New("unavailable")) } func (g *grpcMockHandler) Deploy(context.Context, *connect.Request[defangv1.DeployRequest]) (*connect.Response[defangv1.DeployResponse], error) { - g.tries++ + println(time.Now().Format(time.RFC3339Nano), "Deploy") + g.deployTries++ return nil, connect.NewError(connect.CodeUnavailable, errors.New("unavailable")) } -// func (g *grpcMockHandler) Tail(ctx context.Context, r *connect.Request[defangv1.TailRequest], s *connect.ServerStream[defangv1.TailResponse]) error { -// g.tries++ -// return connect.NewError(connect.CodeUnavailable, errors.New("unavailable")) -// } +func (g *grpcMockHandler) Tail(ctx context.Context, r *connect.Request[defangv1.TailRequest], s *connect.ServerStream[defangv1.TailResponse]) error { + println(time.Now().Format(time.RFC3339Nano), "Tail") + g.tailTries++ + return connect.NewError(connect.CodeUnavailable, errors.New("unavailable")) +} func TestRetrier(t *testing.T) { fabricServer := &grpcMockHandler{} @@ -35,11 +46,41 @@ func TestRetrier(t *testing.T) { fabricClient := defangv1connect.NewFabricControllerClient(server.Client(), server.URL, connect.WithGRPC(), connect.WithInterceptors(Retrier{})) - _, err := fabricClient.Deploy(context.Background(), connect.NewRequest(&defangv1.DeployRequest{})) - if err == nil { - t.Fatal("expected error") - } - if fabricServer.tries != 2 { - t.Fatalf("expected 2 tries, got %d", fabricServer.tries) - } + t.Run("Unary idempotent", func(t *testing.T) { + _, err := fabricClient.Get(context.Background(), connect.NewRequest(&defangv1.ServiceID{})) + if err == nil { + t.Fatal("expected error") + } + if fabricServer.getTries != 2 { + t.Fatalf("expected 2 tries, got %d", fabricServer.getTries) + } + }) + + t.Run("Unary", func(t *testing.T) { + _, err := fabricClient.Deploy(context.Background(), connect.NewRequest(&defangv1.DeployRequest{})) + if err == nil { + t.Fatal("expected error") + } + if fabricServer.deployTries != 2 { + t.Fatalf("expected 2 tries, got %d", fabricServer.deployTries) + } + }) + + t.Run("Streaming", func(t *testing.T) { + ss, err := fabricClient.Tail(context.Background(), connect.NewRequest(&defangv1.TailRequest{})) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + if ss.Receive() == true { + t.Error("expected false") + } + if ss.Err() == nil { + t.Errorf("expected error") + } + // TODO: implement retries for streaming calls + if fabricServer.tailTries != 1 { + t.Fatalf("expected 1 tries, got %d", fabricServer.tailTries) + } + }) } diff --git a/src/protos/io/defang/v1/defangv1connect/fabric.connect.go b/src/protos/io/defang/v1/defangv1connect/fabric.connect.go index effb20859..1b75fdde3 100644 --- a/src/protos/io/defang/v1/defangv1connect/fabric.connect.go +++ b/src/protos/io/defang/v1/defangv1connect/fabric.connect.go @@ -175,12 +175,14 @@ func NewFabricControllerClient(httpClient connect_go.HTTPClient, baseURL string, revokeToken: connect_go.NewClient[emptypb.Empty, emptypb.Empty]( httpClient, baseURL+FabricControllerRevokeTokenProcedure, - opts..., + connect_go.WithIdempotency(connect_go.IdempotencyIdempotent), + connect_go.WithClientOptions(opts...), ), tail: connect_go.NewClient[v1.TailRequest, v1.TailResponse]( httpClient, baseURL+FabricControllerTailProcedure, - opts..., + connect_go.WithIdempotency(connect_go.IdempotencyNoSideEffects), + connect_go.WithClientOptions(opts...), ), update: connect_go.NewClient[v1.Service, v1.ServiceInfo]( httpClient, @@ -211,7 +213,8 @@ func NewFabricControllerClient(httpClient connect_go.HTTPClient, baseURL string, subscribe: connect_go.NewClient[v1.SubscribeRequest, v1.SubscribeResponse]( httpClient, baseURL+FabricControllerSubscribeProcedure, - opts..., + connect_go.WithIdempotency(connect_go.IdempotencyNoSideEffects), + connect_go.WithClientOptions(opts...), ), getServices: connect_go.NewClient[emptypb.Empty, v1.ListServicesResponse]( httpClient, @@ -532,12 +535,14 @@ func NewFabricControllerHandler(svc FabricControllerHandler, opts ...connect_go. fabricControllerRevokeTokenHandler := connect_go.NewUnaryHandler( FabricControllerRevokeTokenProcedure, svc.RevokeToken, - opts..., + connect_go.WithIdempotency(connect_go.IdempotencyIdempotent), + connect_go.WithHandlerOptions(opts...), ) fabricControllerTailHandler := connect_go.NewServerStreamHandler( FabricControllerTailProcedure, svc.Tail, - opts..., + connect_go.WithIdempotency(connect_go.IdempotencyNoSideEffects), + connect_go.WithHandlerOptions(opts...), ) fabricControllerUpdateHandler := connect_go.NewUnaryHandler( FabricControllerUpdateProcedure, @@ -568,7 +573,8 @@ func NewFabricControllerHandler(svc FabricControllerHandler, opts ...connect_go. fabricControllerSubscribeHandler := connect_go.NewServerStreamHandler( FabricControllerSubscribeProcedure, svc.Subscribe, - opts..., + connect_go.WithIdempotency(connect_go.IdempotencyNoSideEffects), + connect_go.WithHandlerOptions(opts...), ) fabricControllerGetServicesHandler := connect_go.NewUnaryHandler( FabricControllerGetServicesProcedure, diff --git a/src/protos/io/defang/v1/fabric.pb.go b/src/protos/io/defang/v1/fabric.pb.go index 0375bd074..44e9b74e8 100644 --- a/src/protos/io/defang/v1/fabric.pb.go +++ b/src/protos/io/defang/v1/fabric.pb.go @@ -367,9 +367,9 @@ type DeployRequest struct { unknownFields protoimpl.UnknownFields // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. - Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` // deprecated; use compose - Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` - Compose *structpb.Struct `protobuf:"bytes,3,opt,name=compose,proto3" json:"compose,omitempty"` + Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` // deprecated; use compose + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + ComposeYaml string `protobuf:"bytes,3,opt,name=compose_yaml,json=composeYaml,proto3" json:"compose_yaml,omitempty"` } func (x *DeployRequest) Reset() { @@ -419,11 +419,11 @@ func (x *DeployRequest) GetProject() string { return "" } -func (x *DeployRequest) GetCompose() *structpb.Struct { +func (x *DeployRequest) GetComposeYaml() string { if x != nil { - return x.Compose + return x.ComposeYaml } - return nil + return "" } type DeployResponse struct { @@ -3041,17 +3041,16 @@ var file_io_defang_v1_fabric_proto_rawDesc = []byte{ 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x93, 0x01, 0x0a, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x59, 0x61, + 0x6d, 0x6c, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, @@ -3363,7 +3362,7 @@ var file_io_defang_v1_fabric_proto_rawDesc = []byte{ 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x02, 0x32, - 0xd2, 0x0f, 0x0a, 0x10, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0xe1, 0x0f, 0x0a, 0x10, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, @@ -3376,130 +3375,131 @@ var file_io_defang_v1_fabric_proto_rawDesc = []byte{ 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x52, 0x65, 0x76, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x04, 0x54, 0x61, 0x69, 0x6c, 0x12, - 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x43, 0x0a, 0x06, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x1a, 0x19, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x48, - 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x3f, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x44, 0x0a, 0x04, + 0x54, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, + 0x30, 0x01, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, + 0x88, 0x02, 0x01, 0x12, 0x43, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1b, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, + 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x48, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, + 0x02, 0x01, 0x12, 0x3f, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x53, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3f, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x09, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3f, 0x0a, 0x07, 0x52, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, + 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, - 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, - 0x3a, 0x0a, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x45, 0x55, 0x4c, 0x41, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3a, + 0x0a, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x45, 0x55, 0x4c, 0x41, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x08, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x53, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x50, + 0x75, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0d, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x0b, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x52, + 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, + 0x4c, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, + 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, + 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, + 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x08, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x53, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3e, 0x0a, 0x09, - 0x50, 0x75, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0d, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x15, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, + 0x01, 0x12, 0x43, 0x0a, 0x06, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3b, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, + 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, - 0x52, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, - 0x52, 0x4c, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, - 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, - 0x02, 0x01, 0x12, 0x43, 0x0a, 0x06, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3b, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x42, 0xb0, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x46, 0x61, 0x62, 0x72, 0x69, - 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x4c, 0x61, 0x62, 0x73, 0x2f, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2f, 0x69, 0x6f, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, 0x44, 0x58, 0xaa, 0x02, 0x0c, - 0x49, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x49, - 0x6f, 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x49, 0x6f, - 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x49, 0x6f, 0x3a, 0x3a, 0x44, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x74, 0x79, 0x42, 0xb0, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x69, 0x6f, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, 0x44, 0x58, 0xaa, 0x02, 0x0c, 0x49, + 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6f, + 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x49, 0x6f, 0x5c, + 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x49, 0x6f, 0x3a, 0x3a, 0x44, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3568,104 +3568,103 @@ var file_io_defang_v1_fabric_proto_goTypes = []any{ nil, // 48: io.defang.v1.TrackRequest.PropertiesEntry nil, // 49: io.defang.v1.Build.ArgsEntry nil, // 50: io.defang.v1.Service.EnvironmentEntry - (*structpb.Struct)(nil), // 51: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 52: google.protobuf.Timestamp + (*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 52: google.protobuf.Struct (*emptypb.Empty)(nil), // 53: google.protobuf.Empty } var file_io_defang_v1_fabric_proto_depIdxs = []int32{ 48, // 0: io.defang.v1.TrackRequest.properties:type_name -> io.defang.v1.TrackRequest.PropertiesEntry 38, // 1: io.defang.v1.DeployRequest.services:type_name -> io.defang.v1.Service - 51, // 2: io.defang.v1.DeployRequest.compose:type_name -> google.protobuf.Struct - 17, // 3: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo - 11, // 4: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File - 29, // 5: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.ServiceID - 52, // 6: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp - 52, // 7: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp - 52, // 8: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp - 52, // 9: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp - 25, // 10: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry - 17, // 11: io.defang.v1.ListServicesResponse.services:type_name -> io.defang.v1.ServiceInfo - 51, // 12: io.defang.v1.ListServicesResponse.compose:type_name -> google.protobuf.Struct - 17, // 13: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo - 51, // 14: io.defang.v1.ProjectUpdate.compose:type_name -> google.protobuf.Struct - 30, // 15: io.defang.v1.Resource.devices:type_name -> io.defang.v1.Device - 31, // 16: io.defang.v1.Resources.reservations:type_name -> io.defang.v1.Resource - 32, // 17: io.defang.v1.Deploy.resources:type_name -> io.defang.v1.Resources - 1, // 18: io.defang.v1.Port.protocol:type_name -> io.defang.v1.Protocol - 2, // 19: io.defang.v1.Port.mode:type_name -> io.defang.v1.Mode - 49, // 20: io.defang.v1.Build.args:type_name -> io.defang.v1.Build.ArgsEntry - 0, // 21: io.defang.v1.Service.platform:type_name -> io.defang.v1.Platform - 33, // 22: io.defang.v1.Service.deploy:type_name -> io.defang.v1.Deploy - 34, // 23: io.defang.v1.Service.ports:type_name -> io.defang.v1.Port - 50, // 24: io.defang.v1.Service.environment:type_name -> io.defang.v1.Service.EnvironmentEntry - 36, // 25: io.defang.v1.Service.build:type_name -> io.defang.v1.Build - 35, // 26: io.defang.v1.Service.secrets:type_name -> io.defang.v1.Secret - 37, // 27: io.defang.v1.Service.healthcheck:type_name -> io.defang.v1.HealthCheck - 39, // 28: io.defang.v1.Service.static_files:type_name -> io.defang.v1.StaticFiles - 3, // 29: io.defang.v1.Service.networks:type_name -> io.defang.v1.Network - 40, // 30: io.defang.v1.Service.redis:type_name -> io.defang.v1.Redis - 52, // 31: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp - 41, // 32: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event - 17, // 33: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo - 53, // 34: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty - 53, // 35: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty - 20, // 36: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest - 53, // 37: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty - 24, // 38: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest - 38, // 39: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service - 6, // 40: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest - 29, // 41: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.ServiceID - 8, // 42: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest - 42, // 43: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest - 43, // 44: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest - 53, // 45: io.defang.v1.FabricController.GetServices:input_type -> google.protobuf.Empty - 4, // 46: io.defang.v1.FabricController.Restart:input_type -> io.defang.v1.RestartRequest - 10, // 47: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest - 10, // 48: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest - 14, // 49: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest - 53, // 50: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty - 53, // 51: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty - 19, // 52: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.SecretValue - 18, // 53: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets - 53, // 54: io.defang.v1.FabricController.ListSecrets:input_type -> google.protobuf.Empty - 15, // 55: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest - 45, // 56: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest - 53, // 57: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> google.protobuf.Empty - 53, // 58: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> google.protobuf.Empty - 53, // 59: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty - 5, // 60: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest - 22, // 61: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status - 23, // 62: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version - 21, // 63: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse - 53, // 64: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty - 26, // 65: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse - 17, // 66: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo - 7, // 67: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse - 17, // 68: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo - 9, // 69: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse - 53, // 70: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty - 44, // 71: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse - 27, // 72: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.ListServicesResponse - 53, // 73: io.defang.v1.FabricController.Restart:output_type -> google.protobuf.Empty - 12, // 74: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse - 13, // 75: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse - 12, // 76: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse - 53, // 77: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty - 53, // 78: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty - 53, // 79: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty - 53, // 80: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty - 18, // 81: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets - 16, // 82: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse - 46, // 83: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 53, // 84: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty - 46, // 85: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 47, // 86: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse - 53, // 87: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty - 61, // [61:88] is the sub-list for method output_type - 34, // [34:61] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name + 17, // 2: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo + 11, // 3: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File + 29, // 4: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.ServiceID + 51, // 5: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp + 51, // 6: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp + 51, // 7: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp + 51, // 8: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp + 25, // 9: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry + 17, // 10: io.defang.v1.ListServicesResponse.services:type_name -> io.defang.v1.ServiceInfo + 52, // 11: io.defang.v1.ListServicesResponse.compose:type_name -> google.protobuf.Struct + 17, // 12: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo + 52, // 13: io.defang.v1.ProjectUpdate.compose:type_name -> google.protobuf.Struct + 30, // 14: io.defang.v1.Resource.devices:type_name -> io.defang.v1.Device + 31, // 15: io.defang.v1.Resources.reservations:type_name -> io.defang.v1.Resource + 32, // 16: io.defang.v1.Deploy.resources:type_name -> io.defang.v1.Resources + 1, // 17: io.defang.v1.Port.protocol:type_name -> io.defang.v1.Protocol + 2, // 18: io.defang.v1.Port.mode:type_name -> io.defang.v1.Mode + 49, // 19: io.defang.v1.Build.args:type_name -> io.defang.v1.Build.ArgsEntry + 0, // 20: io.defang.v1.Service.platform:type_name -> io.defang.v1.Platform + 33, // 21: io.defang.v1.Service.deploy:type_name -> io.defang.v1.Deploy + 34, // 22: io.defang.v1.Service.ports:type_name -> io.defang.v1.Port + 50, // 23: io.defang.v1.Service.environment:type_name -> io.defang.v1.Service.EnvironmentEntry + 36, // 24: io.defang.v1.Service.build:type_name -> io.defang.v1.Build + 35, // 25: io.defang.v1.Service.secrets:type_name -> io.defang.v1.Secret + 37, // 26: io.defang.v1.Service.healthcheck:type_name -> io.defang.v1.HealthCheck + 39, // 27: io.defang.v1.Service.static_files:type_name -> io.defang.v1.StaticFiles + 3, // 28: io.defang.v1.Service.networks:type_name -> io.defang.v1.Network + 40, // 29: io.defang.v1.Service.redis:type_name -> io.defang.v1.Redis + 51, // 30: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp + 41, // 31: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event + 17, // 32: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo + 53, // 33: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty + 53, // 34: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty + 20, // 35: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest + 53, // 36: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty + 24, // 37: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest + 38, // 38: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service + 6, // 39: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest + 29, // 40: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.ServiceID + 8, // 41: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest + 42, // 42: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest + 43, // 43: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest + 53, // 44: io.defang.v1.FabricController.GetServices:input_type -> google.protobuf.Empty + 4, // 45: io.defang.v1.FabricController.Restart:input_type -> io.defang.v1.RestartRequest + 10, // 46: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest + 10, // 47: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest + 14, // 48: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest + 53, // 49: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty + 53, // 50: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty + 19, // 51: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.SecretValue + 18, // 52: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets + 53, // 53: io.defang.v1.FabricController.ListSecrets:input_type -> google.protobuf.Empty + 15, // 54: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest + 45, // 55: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest + 53, // 56: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> google.protobuf.Empty + 53, // 57: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> google.protobuf.Empty + 53, // 58: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty + 5, // 59: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest + 22, // 60: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status + 23, // 61: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version + 21, // 62: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse + 53, // 63: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty + 26, // 64: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse + 17, // 65: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo + 7, // 66: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse + 17, // 67: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo + 9, // 68: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse + 53, // 69: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty + 44, // 70: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse + 27, // 71: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.ListServicesResponse + 53, // 72: io.defang.v1.FabricController.Restart:output_type -> google.protobuf.Empty + 12, // 73: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse + 13, // 74: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse + 12, // 75: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse + 53, // 76: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty + 53, // 77: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty + 53, // 78: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty + 53, // 79: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty + 18, // 80: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets + 16, // 81: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse + 46, // 82: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 53, // 83: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty + 46, // 84: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 47, // 85: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse + 53, // 86: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty + 60, // [60:87] is the sub-list for method output_type + 33, // [33:60] is the sub-list for method input_type + 33, // [33:33] is the sub-list for extension type_name + 33, // [33:33] is the sub-list for extension extendee + 0, // [0:33] is the sub-list for field type_name } func init() { file_io_defang_v1_fabric_proto_init() } diff --git a/src/protos/io/defang/v1/fabric.proto b/src/protos/io/defang/v1/fabric.proto index 8a7aaff2f..6945f929c 100644 --- a/src/protos/io/defang/v1/fabric.proto +++ b/src/protos/io/defang/v1/fabric.proto @@ -21,9 +21,13 @@ service FabricController { }; // public rpc Token(TokenRequest) returns (TokenResponse); // public - rpc RevokeToken(google.protobuf.Empty) returns (google.protobuf.Empty); + rpc RevokeToken(google.protobuf.Empty) returns (google.protobuf.Empty) { + option idempotency_level = IDEMPOTENT; + } - rpc Tail(TailRequest) returns (stream TailResponse); + rpc Tail(TailRequest) returns (stream TailResponse) { + option idempotency_level = NO_SIDE_EFFECTS; + } rpc Update(Service) returns (ServiceInfo) { option deprecated = true; }; // deprecated; use Deploy @@ -32,10 +36,13 @@ service FabricController { option idempotency_level = NO_SIDE_EFFECTS; }; // should be GetService rpc Delete(DeleteRequest) returns (DeleteResponse){ + option idempotency_level = IDEMPOTENT; option deprecated = true; }; // deprecated; use Deploy rpc Publish(PublishRequest) returns (google.protobuf.Empty); - rpc Subscribe(SubscribeRequest) returns (stream SubscribeResponse); + rpc Subscribe(SubscribeRequest) returns (stream SubscribeResponse) { + option idempotency_level = NO_SIDE_EFFECTS; + } // rpc Promote(google.protobuf.Empty) returns (google.protobuf.Empty); rpc GetServices(google.protobuf.Empty) returns (ListServicesResponse) { option idempotency_level = NO_SIDE_EFFECTS; @@ -52,14 +59,19 @@ service FabricController { option idempotency_level = NO_SIDE_EFFECTS; } - rpc SignEULA(google.protobuf.Empty) - returns (google.protobuf.Empty); // AgreeToS + rpc SignEULA(google.protobuf.Empty) returns (google.protobuf.Empty) { + option idempotency_level = IDEMPOTENT; + } // AgreeToS rpc CheckToS(google.protobuf.Empty) returns (google.protobuf.Empty) { option idempotency_level = NO_SIDE_EFFECTS; } - rpc PutSecret(SecretValue) returns (google.protobuf.Empty); - rpc DeleteSecrets(Secrets) returns (google.protobuf.Empty); + rpc PutSecret(SecretValue) returns (google.protobuf.Empty) { + option idempotency_level = IDEMPOTENT; + } + rpc DeleteSecrets(Secrets) returns (google.protobuf.Empty) { + option idempotency_level = IDEMPOTENT; + } rpc ListSecrets(google.protobuf.Empty) returns (Secrets) { option idempotency_level = NO_SIDE_EFFECTS; }; // no values @@ -95,7 +107,7 @@ message TrackRequest { message DeployRequest { repeated Service services = 1 [deprecated = true]; // deprecated; use compose string project = 2; - google.protobuf.Struct compose = 3; + string compose_yaml = 3; } message DeployResponse {