diff --git a/README.md b/README.md index 0c342bf..8869b99 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ mise install mise run dev mise run dev:down mise run dev:logs -buf generate +buf generate --path proto/composia/controller/v1 --path proto/composia/agent/v1/agent.proto ``` ## Binary Builds diff --git a/gen/go/proto/composia/controller/v1/backup.pb.go b/gen/go/proto/composia/controller/v1/backup.pb.go index 042298d..4dfade1 100644 --- a/gen/go/proto/composia/controller/v1/backup.pb.go +++ b/gen/go/proto/composia/controller/v1/backup.pb.go @@ -635,10 +635,11 @@ const file_proto_composia_controller_v1_backup_proto_rawDesc = "" + "\arestore\x18\x01 \x01(\v2\".composia.controller.v1.CapabilityR\arestore\"L\n" + "\x14RestoreBackupRequest\x12\x1b\n" + "\tbackup_id\x18\x01 \x01(\tR\bbackupId\x12\x17\n" + - "\anode_id\x18\x02 \x01(\tR\x06nodeId2\xca\x02\n" + - "\x13BackupRecordService\x12f\n" + + "\anode_id\x18\x02 \x01(\tR\x06nodeId2\xde\x01\n" + + "\x12BackupQueryService\x12f\n" + "\vListBackups\x12*.composia.controller.v1.ListBackupsRequest\x1a+.composia.controller.v1.ListBackupsResponse\x12`\n" + - "\tGetBackup\x12(.composia.controller.v1.GetBackupRequest\x1a).composia.controller.v1.GetBackupResponse\x12i\n" + + "\tGetBackup\x12(.composia.controller.v1.GetBackupRequest\x1a).composia.controller.v1.GetBackupResponse2\x81\x01\n" + + "\x14BackupCommandService\x12i\n" + "\rRestoreBackup\x12,.composia.controller.v1.RestoreBackupRequest\x1a*.composia.controller.v1.TaskActionResponseBXZVforgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1b\x06proto3" var ( @@ -669,12 +670,12 @@ var file_proto_composia_controller_v1_backup_proto_depIdxs = []int32{ 0, // 0: composia.controller.v1.ListBackupsResponse.backups:type_name -> composia.controller.v1.BackupSummary 5, // 1: composia.controller.v1.GetBackupResponse.actions:type_name -> composia.controller.v1.BackupActionCapabilities 7, // 2: composia.controller.v1.BackupActionCapabilities.restore:type_name -> composia.controller.v1.Capability - 1, // 3: composia.controller.v1.BackupRecordService.ListBackups:input_type -> composia.controller.v1.ListBackupsRequest - 3, // 4: composia.controller.v1.BackupRecordService.GetBackup:input_type -> composia.controller.v1.GetBackupRequest - 6, // 5: composia.controller.v1.BackupRecordService.RestoreBackup:input_type -> composia.controller.v1.RestoreBackupRequest - 2, // 6: composia.controller.v1.BackupRecordService.ListBackups:output_type -> composia.controller.v1.ListBackupsResponse - 4, // 7: composia.controller.v1.BackupRecordService.GetBackup:output_type -> composia.controller.v1.GetBackupResponse - 8, // 8: composia.controller.v1.BackupRecordService.RestoreBackup:output_type -> composia.controller.v1.TaskActionResponse + 1, // 3: composia.controller.v1.BackupQueryService.ListBackups:input_type -> composia.controller.v1.ListBackupsRequest + 3, // 4: composia.controller.v1.BackupQueryService.GetBackup:input_type -> composia.controller.v1.GetBackupRequest + 6, // 5: composia.controller.v1.BackupCommandService.RestoreBackup:input_type -> composia.controller.v1.RestoreBackupRequest + 2, // 6: composia.controller.v1.BackupQueryService.ListBackups:output_type -> composia.controller.v1.ListBackupsResponse + 4, // 7: composia.controller.v1.BackupQueryService.GetBackup:output_type -> composia.controller.v1.GetBackupResponse + 8, // 8: composia.controller.v1.BackupCommandService.RestoreBackup:output_type -> composia.controller.v1.TaskActionResponse 6, // [6:9] is the sub-list for method output_type 3, // [3:6] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name @@ -697,7 +698,7 @@ func file_proto_composia_controller_v1_backup_proto_init() { NumEnums: 0, NumMessages: 7, NumExtensions: 0, - NumServices: 1, + NumServices: 2, }, GoTypes: file_proto_composia_controller_v1_backup_proto_goTypes, DependencyIndexes: file_proto_composia_controller_v1_backup_proto_depIdxs, diff --git a/gen/go/proto/composia/controller/v1/container.pb.go b/gen/go/proto/composia/controller/v1/container.pb.go index 977e7a1..8801dac 100644 --- a/gen/go/proto/composia/controller/v1/container.pb.go +++ b/gen/go/proto/composia/controller/v1/container.pb.go @@ -892,8 +892,8 @@ const file_proto_composia_controller_v1_container_proto_rawDesc = "" + "\x1cCONTAINER_ACTION_UNSPECIFIED\x10\x00\x12\x1a\n" + "\x16CONTAINER_ACTION_START\x10\x01\x12\x19\n" + "\x15CONTAINER_ACTION_STOP\x10\x02\x12\x1c\n" + - "\x18CONTAINER_ACTION_RESTART\x10\x032\x9b\a\n" + - "\x10ContainerService\x12s\n" + + "\x18CONTAINER_ACTION_RESTART\x10\x032\x9f\a\n" + + "\x14DockerCommandService\x12s\n" + "\x12RunContainerAction\x121.composia.controller.v1.RunContainerActionRequest\x1a*.composia.controller.v1.TaskActionResponse\x12m\n" + "\x0fRemoveContainer\x12..composia.controller.v1.RemoveContainerRequest\x1a*.composia.controller.v1.TaskActionResponse\x12w\n" + "\x10GetContainerLogs\x12/.composia.controller.v1.GetContainerLogsRequest\x1a0.composia.controller.v1.GetContainerLogsResponse0\x01\x12x\n" + @@ -934,22 +934,22 @@ var file_proto_composia_controller_v1_container_proto_goTypes = []any{ } var file_proto_composia_controller_v1_container_proto_depIdxs = []int32{ 0, // 0: composia.controller.v1.RunContainerActionRequest.action:type_name -> composia.controller.v1.ContainerAction - 1, // 1: composia.controller.v1.ContainerService.RunContainerAction:input_type -> composia.controller.v1.RunContainerActionRequest - 2, // 2: composia.controller.v1.ContainerService.RemoveContainer:input_type -> composia.controller.v1.RemoveContainerRequest - 3, // 3: composia.controller.v1.ContainerService.GetContainerLogs:input_type -> composia.controller.v1.GetContainerLogsRequest - 5, // 4: composia.controller.v1.ContainerService.OpenContainerExec:input_type -> composia.controller.v1.OpenContainerExecRequest - 7, // 5: composia.controller.v1.ContainerService.RunContainerExec:input_type -> composia.controller.v1.RunContainerExecRequest - 9, // 6: composia.controller.v1.ContainerService.RemoveNetwork:input_type -> composia.controller.v1.RemoveNetworkRequest - 10, // 7: composia.controller.v1.ContainerService.RemoveVolume:input_type -> composia.controller.v1.RemoveVolumeRequest - 11, // 8: composia.controller.v1.ContainerService.RemoveImage:input_type -> composia.controller.v1.RemoveImageRequest - 12, // 9: composia.controller.v1.ContainerService.RunContainerAction:output_type -> composia.controller.v1.TaskActionResponse - 12, // 10: composia.controller.v1.ContainerService.RemoveContainer:output_type -> composia.controller.v1.TaskActionResponse - 4, // 11: composia.controller.v1.ContainerService.GetContainerLogs:output_type -> composia.controller.v1.GetContainerLogsResponse - 6, // 12: composia.controller.v1.ContainerService.OpenContainerExec:output_type -> composia.controller.v1.OpenContainerExecResponse - 8, // 13: composia.controller.v1.ContainerService.RunContainerExec:output_type -> composia.controller.v1.RunContainerExecResponse - 12, // 14: composia.controller.v1.ContainerService.RemoveNetwork:output_type -> composia.controller.v1.TaskActionResponse - 12, // 15: composia.controller.v1.ContainerService.RemoveVolume:output_type -> composia.controller.v1.TaskActionResponse - 12, // 16: composia.controller.v1.ContainerService.RemoveImage:output_type -> composia.controller.v1.TaskActionResponse + 1, // 1: composia.controller.v1.DockerCommandService.RunContainerAction:input_type -> composia.controller.v1.RunContainerActionRequest + 2, // 2: composia.controller.v1.DockerCommandService.RemoveContainer:input_type -> composia.controller.v1.RemoveContainerRequest + 3, // 3: composia.controller.v1.DockerCommandService.GetContainerLogs:input_type -> composia.controller.v1.GetContainerLogsRequest + 5, // 4: composia.controller.v1.DockerCommandService.OpenContainerExec:input_type -> composia.controller.v1.OpenContainerExecRequest + 7, // 5: composia.controller.v1.DockerCommandService.RunContainerExec:input_type -> composia.controller.v1.RunContainerExecRequest + 9, // 6: composia.controller.v1.DockerCommandService.RemoveNetwork:input_type -> composia.controller.v1.RemoveNetworkRequest + 10, // 7: composia.controller.v1.DockerCommandService.RemoveVolume:input_type -> composia.controller.v1.RemoveVolumeRequest + 11, // 8: composia.controller.v1.DockerCommandService.RemoveImage:input_type -> composia.controller.v1.RemoveImageRequest + 12, // 9: composia.controller.v1.DockerCommandService.RunContainerAction:output_type -> composia.controller.v1.TaskActionResponse + 12, // 10: composia.controller.v1.DockerCommandService.RemoveContainer:output_type -> composia.controller.v1.TaskActionResponse + 4, // 11: composia.controller.v1.DockerCommandService.GetContainerLogs:output_type -> composia.controller.v1.GetContainerLogsResponse + 6, // 12: composia.controller.v1.DockerCommandService.OpenContainerExec:output_type -> composia.controller.v1.OpenContainerExecResponse + 8, // 13: composia.controller.v1.DockerCommandService.RunContainerExec:output_type -> composia.controller.v1.RunContainerExecResponse + 12, // 14: composia.controller.v1.DockerCommandService.RemoveNetwork:output_type -> composia.controller.v1.TaskActionResponse + 12, // 15: composia.controller.v1.DockerCommandService.RemoveVolume:output_type -> composia.controller.v1.TaskActionResponse + 12, // 16: composia.controller.v1.DockerCommandService.RemoveImage:output_type -> composia.controller.v1.TaskActionResponse 9, // [9:17] is the sub-list for method output_type 1, // [1:9] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name diff --git a/gen/go/proto/composia/controller/v1/controllerv1connect/backup.connect.go b/gen/go/proto/composia/controller/v1/controllerv1connect/backup.connect.go index f706d33..67fe0b1 100644 --- a/gen/go/proto/composia/controller/v1/controllerv1connect/backup.connect.go +++ b/gen/go/proto/composia/controller/v1/controllerv1connect/backup.connect.go @@ -21,8 +21,10 @@ import ( const _ = connect.IsAtLeastVersion1_13_0 const ( - // BackupRecordServiceName is the fully-qualified name of the BackupRecordService service. - BackupRecordServiceName = "composia.controller.v1.BackupRecordService" + // BackupQueryServiceName is the fully-qualified name of the BackupQueryService service. + BackupQueryServiceName = "composia.controller.v1.BackupQueryService" + // BackupCommandServiceName is the fully-qualified name of the BackupCommandService service. + BackupCommandServiceName = "composia.controller.v1.BackupCommandService" ) // These constants are the fully-qualified names of the RPCs defined in this package. They're @@ -33,142 +35,189 @@ const ( // reflection-formatted method names, remove the leading slash and convert the remaining slash to a // period. const ( - // BackupRecordServiceListBackupsProcedure is the fully-qualified name of the BackupRecordService's + // BackupQueryServiceListBackupsProcedure is the fully-qualified name of the BackupQueryService's // ListBackups RPC. - BackupRecordServiceListBackupsProcedure = "/composia.controller.v1.BackupRecordService/ListBackups" - // BackupRecordServiceGetBackupProcedure is the fully-qualified name of the BackupRecordService's + BackupQueryServiceListBackupsProcedure = "/composia.controller.v1.BackupQueryService/ListBackups" + // BackupQueryServiceGetBackupProcedure is the fully-qualified name of the BackupQueryService's // GetBackup RPC. - BackupRecordServiceGetBackupProcedure = "/composia.controller.v1.BackupRecordService/GetBackup" - // BackupRecordServiceRestoreBackupProcedure is the fully-qualified name of the - // BackupRecordService's RestoreBackup RPC. - BackupRecordServiceRestoreBackupProcedure = "/composia.controller.v1.BackupRecordService/RestoreBackup" + BackupQueryServiceGetBackupProcedure = "/composia.controller.v1.BackupQueryService/GetBackup" + // BackupCommandServiceRestoreBackupProcedure is the fully-qualified name of the + // BackupCommandService's RestoreBackup RPC. + BackupCommandServiceRestoreBackupProcedure = "/composia.controller.v1.BackupCommandService/RestoreBackup" ) -// BackupRecordServiceClient is a client for the composia.controller.v1.BackupRecordService service. -type BackupRecordServiceClient interface { +// BackupQueryServiceClient is a client for the composia.controller.v1.BackupQueryService service. +type BackupQueryServiceClient interface { // ListBackups returns backup records with filtering and pagination. ListBackups(context.Context, *connect.Request[v1.ListBackupsRequest]) (*connect.Response[v1.ListBackupsResponse], error) // GetBackup returns one backup record by ID. GetBackup(context.Context, *connect.Request[v1.GetBackupRequest]) (*connect.Response[v1.GetBackupResponse], error) - // RestoreBackup starts an async restore task from one backup record. - RestoreBackup(context.Context, *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) } -// NewBackupRecordServiceClient constructs a client for the -// composia.controller.v1.BackupRecordService service. By default, it uses the Connect protocol with -// the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To use -// the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() options. +// NewBackupQueryServiceClient constructs a client for the composia.controller.v1.BackupQueryService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. // // The URL supplied here should be the base URL for the Connect or gRPC server (for example, // http://api.acme.com or https://acme.com/grpc). -func NewBackupRecordServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) BackupRecordServiceClient { +func NewBackupQueryServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) BackupQueryServiceClient { baseURL = strings.TrimRight(baseURL, "/") - backupRecordServiceMethods := v1.File_proto_composia_controller_v1_backup_proto.Services().ByName("BackupRecordService").Methods() - return &backupRecordServiceClient{ + backupQueryServiceMethods := v1.File_proto_composia_controller_v1_backup_proto.Services().ByName("BackupQueryService").Methods() + return &backupQueryServiceClient{ listBackups: connect.NewClient[v1.ListBackupsRequest, v1.ListBackupsResponse]( httpClient, - baseURL+BackupRecordServiceListBackupsProcedure, - connect.WithSchema(backupRecordServiceMethods.ByName("ListBackups")), + baseURL+BackupQueryServiceListBackupsProcedure, + connect.WithSchema(backupQueryServiceMethods.ByName("ListBackups")), connect.WithClientOptions(opts...), ), getBackup: connect.NewClient[v1.GetBackupRequest, v1.GetBackupResponse]( httpClient, - baseURL+BackupRecordServiceGetBackupProcedure, - connect.WithSchema(backupRecordServiceMethods.ByName("GetBackup")), - connect.WithClientOptions(opts...), - ), - restoreBackup: connect.NewClient[v1.RestoreBackupRequest, v1.TaskActionResponse]( - httpClient, - baseURL+BackupRecordServiceRestoreBackupProcedure, - connect.WithSchema(backupRecordServiceMethods.ByName("RestoreBackup")), + baseURL+BackupQueryServiceGetBackupProcedure, + connect.WithSchema(backupQueryServiceMethods.ByName("GetBackup")), connect.WithClientOptions(opts...), ), } } -// backupRecordServiceClient implements BackupRecordServiceClient. -type backupRecordServiceClient struct { - listBackups *connect.Client[v1.ListBackupsRequest, v1.ListBackupsResponse] - getBackup *connect.Client[v1.GetBackupRequest, v1.GetBackupResponse] - restoreBackup *connect.Client[v1.RestoreBackupRequest, v1.TaskActionResponse] +// backupQueryServiceClient implements BackupQueryServiceClient. +type backupQueryServiceClient struct { + listBackups *connect.Client[v1.ListBackupsRequest, v1.ListBackupsResponse] + getBackup *connect.Client[v1.GetBackupRequest, v1.GetBackupResponse] } -// ListBackups calls composia.controller.v1.BackupRecordService.ListBackups. -func (c *backupRecordServiceClient) ListBackups(ctx context.Context, req *connect.Request[v1.ListBackupsRequest]) (*connect.Response[v1.ListBackupsResponse], error) { +// ListBackups calls composia.controller.v1.BackupQueryService.ListBackups. +func (c *backupQueryServiceClient) ListBackups(ctx context.Context, req *connect.Request[v1.ListBackupsRequest]) (*connect.Response[v1.ListBackupsResponse], error) { return c.listBackups.CallUnary(ctx, req) } -// GetBackup calls composia.controller.v1.BackupRecordService.GetBackup. -func (c *backupRecordServiceClient) GetBackup(ctx context.Context, req *connect.Request[v1.GetBackupRequest]) (*connect.Response[v1.GetBackupResponse], error) { +// GetBackup calls composia.controller.v1.BackupQueryService.GetBackup. +func (c *backupQueryServiceClient) GetBackup(ctx context.Context, req *connect.Request[v1.GetBackupRequest]) (*connect.Response[v1.GetBackupResponse], error) { return c.getBackup.CallUnary(ctx, req) } -// RestoreBackup calls composia.controller.v1.BackupRecordService.RestoreBackup. -func (c *backupRecordServiceClient) RestoreBackup(ctx context.Context, req *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) { - return c.restoreBackup.CallUnary(ctx, req) -} - -// BackupRecordServiceHandler is an implementation of the composia.controller.v1.BackupRecordService +// BackupQueryServiceHandler is an implementation of the composia.controller.v1.BackupQueryService // service. -type BackupRecordServiceHandler interface { +type BackupQueryServiceHandler interface { // ListBackups returns backup records with filtering and pagination. ListBackups(context.Context, *connect.Request[v1.ListBackupsRequest]) (*connect.Response[v1.ListBackupsResponse], error) // GetBackup returns one backup record by ID. GetBackup(context.Context, *connect.Request[v1.GetBackupRequest]) (*connect.Response[v1.GetBackupResponse], error) - // RestoreBackup starts an async restore task from one backup record. - RestoreBackup(context.Context, *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) } -// NewBackupRecordServiceHandler builds an HTTP handler from the service implementation. It returns +// NewBackupQueryServiceHandler builds an HTTP handler from the service implementation. It returns // the path on which to mount the handler and the handler itself. // // By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf // and JSON codecs. They also support gzip compression. -func NewBackupRecordServiceHandler(svc BackupRecordServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { - backupRecordServiceMethods := v1.File_proto_composia_controller_v1_backup_proto.Services().ByName("BackupRecordService").Methods() - backupRecordServiceListBackupsHandler := connect.NewUnaryHandler( - BackupRecordServiceListBackupsProcedure, +func NewBackupQueryServiceHandler(svc BackupQueryServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + backupQueryServiceMethods := v1.File_proto_composia_controller_v1_backup_proto.Services().ByName("BackupQueryService").Methods() + backupQueryServiceListBackupsHandler := connect.NewUnaryHandler( + BackupQueryServiceListBackupsProcedure, svc.ListBackups, - connect.WithSchema(backupRecordServiceMethods.ByName("ListBackups")), + connect.WithSchema(backupQueryServiceMethods.ByName("ListBackups")), connect.WithHandlerOptions(opts...), ) - backupRecordServiceGetBackupHandler := connect.NewUnaryHandler( - BackupRecordServiceGetBackupProcedure, + backupQueryServiceGetBackupHandler := connect.NewUnaryHandler( + BackupQueryServiceGetBackupProcedure, svc.GetBackup, - connect.WithSchema(backupRecordServiceMethods.ByName("GetBackup")), - connect.WithHandlerOptions(opts...), - ) - backupRecordServiceRestoreBackupHandler := connect.NewUnaryHandler( - BackupRecordServiceRestoreBackupProcedure, - svc.RestoreBackup, - connect.WithSchema(backupRecordServiceMethods.ByName("RestoreBackup")), + connect.WithSchema(backupQueryServiceMethods.ByName("GetBackup")), connect.WithHandlerOptions(opts...), ) - return "/composia.controller.v1.BackupRecordService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return "/composia.controller.v1.BackupQueryService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { - case BackupRecordServiceListBackupsProcedure: - backupRecordServiceListBackupsHandler.ServeHTTP(w, r) - case BackupRecordServiceGetBackupProcedure: - backupRecordServiceGetBackupHandler.ServeHTTP(w, r) - case BackupRecordServiceRestoreBackupProcedure: - backupRecordServiceRestoreBackupHandler.ServeHTTP(w, r) + case BackupQueryServiceListBackupsProcedure: + backupQueryServiceListBackupsHandler.ServeHTTP(w, r) + case BackupQueryServiceGetBackupProcedure: + backupQueryServiceGetBackupHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } }) } -// UnimplementedBackupRecordServiceHandler returns CodeUnimplemented from all methods. -type UnimplementedBackupRecordServiceHandler struct{} +// UnimplementedBackupQueryServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedBackupQueryServiceHandler struct{} + +func (UnimplementedBackupQueryServiceHandler) ListBackups(context.Context, *connect.Request[v1.ListBackupsRequest]) (*connect.Response[v1.ListBackupsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.BackupQueryService.ListBackups is not implemented")) +} + +func (UnimplementedBackupQueryServiceHandler) GetBackup(context.Context, *connect.Request[v1.GetBackupRequest]) (*connect.Response[v1.GetBackupResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.BackupQueryService.GetBackup is not implemented")) +} + +// BackupCommandServiceClient is a client for the composia.controller.v1.BackupCommandService +// service. +type BackupCommandServiceClient interface { + // RestoreBackup starts an async restore task from one backup record. + RestoreBackup(context.Context, *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) +} + +// NewBackupCommandServiceClient constructs a client for the +// composia.controller.v1.BackupCommandService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewBackupCommandServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) BackupCommandServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + backupCommandServiceMethods := v1.File_proto_composia_controller_v1_backup_proto.Services().ByName("BackupCommandService").Methods() + return &backupCommandServiceClient{ + restoreBackup: connect.NewClient[v1.RestoreBackupRequest, v1.TaskActionResponse]( + httpClient, + baseURL+BackupCommandServiceRestoreBackupProcedure, + connect.WithSchema(backupCommandServiceMethods.ByName("RestoreBackup")), + connect.WithClientOptions(opts...), + ), + } +} + +// backupCommandServiceClient implements BackupCommandServiceClient. +type backupCommandServiceClient struct { + restoreBackup *connect.Client[v1.RestoreBackupRequest, v1.TaskActionResponse] +} -func (UnimplementedBackupRecordServiceHandler) ListBackups(context.Context, *connect.Request[v1.ListBackupsRequest]) (*connect.Response[v1.ListBackupsResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.BackupRecordService.ListBackups is not implemented")) +// RestoreBackup calls composia.controller.v1.BackupCommandService.RestoreBackup. +func (c *backupCommandServiceClient) RestoreBackup(ctx context.Context, req *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) { + return c.restoreBackup.CallUnary(ctx, req) +} + +// BackupCommandServiceHandler is an implementation of the +// composia.controller.v1.BackupCommandService service. +type BackupCommandServiceHandler interface { + // RestoreBackup starts an async restore task from one backup record. + RestoreBackup(context.Context, *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) } -func (UnimplementedBackupRecordServiceHandler) GetBackup(context.Context, *connect.Request[v1.GetBackupRequest]) (*connect.Response[v1.GetBackupResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.BackupRecordService.GetBackup is not implemented")) +// NewBackupCommandServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewBackupCommandServiceHandler(svc BackupCommandServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + backupCommandServiceMethods := v1.File_proto_composia_controller_v1_backup_proto.Services().ByName("BackupCommandService").Methods() + backupCommandServiceRestoreBackupHandler := connect.NewUnaryHandler( + BackupCommandServiceRestoreBackupProcedure, + svc.RestoreBackup, + connect.WithSchema(backupCommandServiceMethods.ByName("RestoreBackup")), + connect.WithHandlerOptions(opts...), + ) + return "/composia.controller.v1.BackupCommandService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case BackupCommandServiceRestoreBackupProcedure: + backupCommandServiceRestoreBackupHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) } -func (UnimplementedBackupRecordServiceHandler) RestoreBackup(context.Context, *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.BackupRecordService.RestoreBackup is not implemented")) +// UnimplementedBackupCommandServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedBackupCommandServiceHandler struct{} + +func (UnimplementedBackupCommandServiceHandler) RestoreBackup(context.Context, *connect.Request[v1.RestoreBackupRequest]) (*connect.Response[v1.TaskActionResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.BackupCommandService.RestoreBackup is not implemented")) } diff --git a/gen/go/proto/composia/controller/v1/controllerv1connect/container.connect.go b/gen/go/proto/composia/controller/v1/controllerv1connect/container.connect.go index e848114..55b1a1d 100644 --- a/gen/go/proto/composia/controller/v1/controllerv1connect/container.connect.go +++ b/gen/go/proto/composia/controller/v1/controllerv1connect/container.connect.go @@ -21,8 +21,8 @@ import ( const _ = connect.IsAtLeastVersion1_13_0 const ( - // ContainerServiceName is the fully-qualified name of the ContainerService service. - ContainerServiceName = "composia.controller.v1.ContainerService" + // DockerCommandServiceName is the fully-qualified name of the DockerCommandService service. + DockerCommandServiceName = "composia.controller.v1.DockerCommandService" ) // These constants are the fully-qualified names of the RPCs defined in this package. They're @@ -33,34 +33,35 @@ const ( // reflection-formatted method names, remove the leading slash and convert the remaining slash to a // period. const ( - // ContainerServiceRunContainerActionProcedure is the fully-qualified name of the ContainerService's - // RunContainerAction RPC. - ContainerServiceRunContainerActionProcedure = "/composia.controller.v1.ContainerService/RunContainerAction" - // ContainerServiceRemoveContainerProcedure is the fully-qualified name of the ContainerService's - // RemoveContainer RPC. - ContainerServiceRemoveContainerProcedure = "/composia.controller.v1.ContainerService/RemoveContainer" - // ContainerServiceGetContainerLogsProcedure is the fully-qualified name of the ContainerService's - // GetContainerLogs RPC. - ContainerServiceGetContainerLogsProcedure = "/composia.controller.v1.ContainerService/GetContainerLogs" - // ContainerServiceOpenContainerExecProcedure is the fully-qualified name of the ContainerService's - // OpenContainerExec RPC. - ContainerServiceOpenContainerExecProcedure = "/composia.controller.v1.ContainerService/OpenContainerExec" - // ContainerServiceRunContainerExecProcedure is the fully-qualified name of the ContainerService's - // RunContainerExec RPC. - ContainerServiceRunContainerExecProcedure = "/composia.controller.v1.ContainerService/RunContainerExec" - // ContainerServiceRemoveNetworkProcedure is the fully-qualified name of the ContainerService's - // RemoveNetwork RPC. - ContainerServiceRemoveNetworkProcedure = "/composia.controller.v1.ContainerService/RemoveNetwork" - // ContainerServiceRemoveVolumeProcedure is the fully-qualified name of the ContainerService's - // RemoveVolume RPC. - ContainerServiceRemoveVolumeProcedure = "/composia.controller.v1.ContainerService/RemoveVolume" - // ContainerServiceRemoveImageProcedure is the fully-qualified name of the ContainerService's - // RemoveImage RPC. - ContainerServiceRemoveImageProcedure = "/composia.controller.v1.ContainerService/RemoveImage" + // DockerCommandServiceRunContainerActionProcedure is the fully-qualified name of the + // DockerCommandService's RunContainerAction RPC. + DockerCommandServiceRunContainerActionProcedure = "/composia.controller.v1.DockerCommandService/RunContainerAction" + // DockerCommandServiceRemoveContainerProcedure is the fully-qualified name of the + // DockerCommandService's RemoveContainer RPC. + DockerCommandServiceRemoveContainerProcedure = "/composia.controller.v1.DockerCommandService/RemoveContainer" + // DockerCommandServiceGetContainerLogsProcedure is the fully-qualified name of the + // DockerCommandService's GetContainerLogs RPC. + DockerCommandServiceGetContainerLogsProcedure = "/composia.controller.v1.DockerCommandService/GetContainerLogs" + // DockerCommandServiceOpenContainerExecProcedure is the fully-qualified name of the + // DockerCommandService's OpenContainerExec RPC. + DockerCommandServiceOpenContainerExecProcedure = "/composia.controller.v1.DockerCommandService/OpenContainerExec" + // DockerCommandServiceRunContainerExecProcedure is the fully-qualified name of the + // DockerCommandService's RunContainerExec RPC. + DockerCommandServiceRunContainerExecProcedure = "/composia.controller.v1.DockerCommandService/RunContainerExec" + // DockerCommandServiceRemoveNetworkProcedure is the fully-qualified name of the + // DockerCommandService's RemoveNetwork RPC. + DockerCommandServiceRemoveNetworkProcedure = "/composia.controller.v1.DockerCommandService/RemoveNetwork" + // DockerCommandServiceRemoveVolumeProcedure is the fully-qualified name of the + // DockerCommandService's RemoveVolume RPC. + DockerCommandServiceRemoveVolumeProcedure = "/composia.controller.v1.DockerCommandService/RemoveVolume" + // DockerCommandServiceRemoveImageProcedure is the fully-qualified name of the + // DockerCommandService's RemoveImage RPC. + DockerCommandServiceRemoveImageProcedure = "/composia.controller.v1.DockerCommandService/RemoveImage" ) -// ContainerServiceClient is a client for the composia.controller.v1.ContainerService service. -type ContainerServiceClient interface { +// DockerCommandServiceClient is a client for the composia.controller.v1.DockerCommandService +// service. +type DockerCommandServiceClient interface { // RunContainerAction starts an async action for one container on one node. RunContainerAction(context.Context, *connect.Request[v1.RunContainerActionRequest]) (*connect.Response[v1.TaskActionResponse], error) // RemoveContainer starts an async deletion for one container on one node. @@ -79,70 +80,71 @@ type ContainerServiceClient interface { RemoveImage(context.Context, *connect.Request[v1.RemoveImageRequest]) (*connect.Response[v1.TaskActionResponse], error) } -// NewContainerServiceClient constructs a client for the composia.controller.v1.ContainerService -// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for -// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply -// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// NewDockerCommandServiceClient constructs a client for the +// composia.controller.v1.DockerCommandService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. // // The URL supplied here should be the base URL for the Connect or gRPC server (for example, // http://api.acme.com or https://acme.com/grpc). -func NewContainerServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) ContainerServiceClient { +func NewDockerCommandServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) DockerCommandServiceClient { baseURL = strings.TrimRight(baseURL, "/") - containerServiceMethods := v1.File_proto_composia_controller_v1_container_proto.Services().ByName("ContainerService").Methods() - return &containerServiceClient{ + dockerCommandServiceMethods := v1.File_proto_composia_controller_v1_container_proto.Services().ByName("DockerCommandService").Methods() + return &dockerCommandServiceClient{ runContainerAction: connect.NewClient[v1.RunContainerActionRequest, v1.TaskActionResponse]( httpClient, - baseURL+ContainerServiceRunContainerActionProcedure, - connect.WithSchema(containerServiceMethods.ByName("RunContainerAction")), + baseURL+DockerCommandServiceRunContainerActionProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("RunContainerAction")), connect.WithClientOptions(opts...), ), removeContainer: connect.NewClient[v1.RemoveContainerRequest, v1.TaskActionResponse]( httpClient, - baseURL+ContainerServiceRemoveContainerProcedure, - connect.WithSchema(containerServiceMethods.ByName("RemoveContainer")), + baseURL+DockerCommandServiceRemoveContainerProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveContainer")), connect.WithClientOptions(opts...), ), getContainerLogs: connect.NewClient[v1.GetContainerLogsRequest, v1.GetContainerLogsResponse]( httpClient, - baseURL+ContainerServiceGetContainerLogsProcedure, - connect.WithSchema(containerServiceMethods.ByName("GetContainerLogs")), + baseURL+DockerCommandServiceGetContainerLogsProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("GetContainerLogs")), connect.WithClientOptions(opts...), ), openContainerExec: connect.NewClient[v1.OpenContainerExecRequest, v1.OpenContainerExecResponse]( httpClient, - baseURL+ContainerServiceOpenContainerExecProcedure, - connect.WithSchema(containerServiceMethods.ByName("OpenContainerExec")), + baseURL+DockerCommandServiceOpenContainerExecProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("OpenContainerExec")), connect.WithClientOptions(opts...), ), runContainerExec: connect.NewClient[v1.RunContainerExecRequest, v1.RunContainerExecResponse]( httpClient, - baseURL+ContainerServiceRunContainerExecProcedure, - connect.WithSchema(containerServiceMethods.ByName("RunContainerExec")), + baseURL+DockerCommandServiceRunContainerExecProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("RunContainerExec")), connect.WithClientOptions(opts...), ), removeNetwork: connect.NewClient[v1.RemoveNetworkRequest, v1.TaskActionResponse]( httpClient, - baseURL+ContainerServiceRemoveNetworkProcedure, - connect.WithSchema(containerServiceMethods.ByName("RemoveNetwork")), + baseURL+DockerCommandServiceRemoveNetworkProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveNetwork")), connect.WithClientOptions(opts...), ), removeVolume: connect.NewClient[v1.RemoveVolumeRequest, v1.TaskActionResponse]( httpClient, - baseURL+ContainerServiceRemoveVolumeProcedure, - connect.WithSchema(containerServiceMethods.ByName("RemoveVolume")), + baseURL+DockerCommandServiceRemoveVolumeProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveVolume")), connect.WithClientOptions(opts...), ), removeImage: connect.NewClient[v1.RemoveImageRequest, v1.TaskActionResponse]( httpClient, - baseURL+ContainerServiceRemoveImageProcedure, - connect.WithSchema(containerServiceMethods.ByName("RemoveImage")), + baseURL+DockerCommandServiceRemoveImageProcedure, + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveImage")), connect.WithClientOptions(opts...), ), } } -// containerServiceClient implements ContainerServiceClient. -type containerServiceClient struct { +// dockerCommandServiceClient implements DockerCommandServiceClient. +type dockerCommandServiceClient struct { runContainerAction *connect.Client[v1.RunContainerActionRequest, v1.TaskActionResponse] removeContainer *connect.Client[v1.RemoveContainerRequest, v1.TaskActionResponse] getContainerLogs *connect.Client[v1.GetContainerLogsRequest, v1.GetContainerLogsResponse] @@ -153,49 +155,49 @@ type containerServiceClient struct { removeImage *connect.Client[v1.RemoveImageRequest, v1.TaskActionResponse] } -// RunContainerAction calls composia.controller.v1.ContainerService.RunContainerAction. -func (c *containerServiceClient) RunContainerAction(ctx context.Context, req *connect.Request[v1.RunContainerActionRequest]) (*connect.Response[v1.TaskActionResponse], error) { +// RunContainerAction calls composia.controller.v1.DockerCommandService.RunContainerAction. +func (c *dockerCommandServiceClient) RunContainerAction(ctx context.Context, req *connect.Request[v1.RunContainerActionRequest]) (*connect.Response[v1.TaskActionResponse], error) { return c.runContainerAction.CallUnary(ctx, req) } -// RemoveContainer calls composia.controller.v1.ContainerService.RemoveContainer. -func (c *containerServiceClient) RemoveContainer(ctx context.Context, req *connect.Request[v1.RemoveContainerRequest]) (*connect.Response[v1.TaskActionResponse], error) { +// RemoveContainer calls composia.controller.v1.DockerCommandService.RemoveContainer. +func (c *dockerCommandServiceClient) RemoveContainer(ctx context.Context, req *connect.Request[v1.RemoveContainerRequest]) (*connect.Response[v1.TaskActionResponse], error) { return c.removeContainer.CallUnary(ctx, req) } -// GetContainerLogs calls composia.controller.v1.ContainerService.GetContainerLogs. -func (c *containerServiceClient) GetContainerLogs(ctx context.Context, req *connect.Request[v1.GetContainerLogsRequest]) (*connect.ServerStreamForClient[v1.GetContainerLogsResponse], error) { +// GetContainerLogs calls composia.controller.v1.DockerCommandService.GetContainerLogs. +func (c *dockerCommandServiceClient) GetContainerLogs(ctx context.Context, req *connect.Request[v1.GetContainerLogsRequest]) (*connect.ServerStreamForClient[v1.GetContainerLogsResponse], error) { return c.getContainerLogs.CallServerStream(ctx, req) } -// OpenContainerExec calls composia.controller.v1.ContainerService.OpenContainerExec. -func (c *containerServiceClient) OpenContainerExec(ctx context.Context, req *connect.Request[v1.OpenContainerExecRequest]) (*connect.Response[v1.OpenContainerExecResponse], error) { +// OpenContainerExec calls composia.controller.v1.DockerCommandService.OpenContainerExec. +func (c *dockerCommandServiceClient) OpenContainerExec(ctx context.Context, req *connect.Request[v1.OpenContainerExecRequest]) (*connect.Response[v1.OpenContainerExecResponse], error) { return c.openContainerExec.CallUnary(ctx, req) } -// RunContainerExec calls composia.controller.v1.ContainerService.RunContainerExec. -func (c *containerServiceClient) RunContainerExec(ctx context.Context, req *connect.Request[v1.RunContainerExecRequest]) (*connect.Response[v1.RunContainerExecResponse], error) { +// RunContainerExec calls composia.controller.v1.DockerCommandService.RunContainerExec. +func (c *dockerCommandServiceClient) RunContainerExec(ctx context.Context, req *connect.Request[v1.RunContainerExecRequest]) (*connect.Response[v1.RunContainerExecResponse], error) { return c.runContainerExec.CallUnary(ctx, req) } -// RemoveNetwork calls composia.controller.v1.ContainerService.RemoveNetwork. -func (c *containerServiceClient) RemoveNetwork(ctx context.Context, req *connect.Request[v1.RemoveNetworkRequest]) (*connect.Response[v1.TaskActionResponse], error) { +// RemoveNetwork calls composia.controller.v1.DockerCommandService.RemoveNetwork. +func (c *dockerCommandServiceClient) RemoveNetwork(ctx context.Context, req *connect.Request[v1.RemoveNetworkRequest]) (*connect.Response[v1.TaskActionResponse], error) { return c.removeNetwork.CallUnary(ctx, req) } -// RemoveVolume calls composia.controller.v1.ContainerService.RemoveVolume. -func (c *containerServiceClient) RemoveVolume(ctx context.Context, req *connect.Request[v1.RemoveVolumeRequest]) (*connect.Response[v1.TaskActionResponse], error) { +// RemoveVolume calls composia.controller.v1.DockerCommandService.RemoveVolume. +func (c *dockerCommandServiceClient) RemoveVolume(ctx context.Context, req *connect.Request[v1.RemoveVolumeRequest]) (*connect.Response[v1.TaskActionResponse], error) { return c.removeVolume.CallUnary(ctx, req) } -// RemoveImage calls composia.controller.v1.ContainerService.RemoveImage. -func (c *containerServiceClient) RemoveImage(ctx context.Context, req *connect.Request[v1.RemoveImageRequest]) (*connect.Response[v1.TaskActionResponse], error) { +// RemoveImage calls composia.controller.v1.DockerCommandService.RemoveImage. +func (c *dockerCommandServiceClient) RemoveImage(ctx context.Context, req *connect.Request[v1.RemoveImageRequest]) (*connect.Response[v1.TaskActionResponse], error) { return c.removeImage.CallUnary(ctx, req) } -// ContainerServiceHandler is an implementation of the composia.controller.v1.ContainerService -// service. -type ContainerServiceHandler interface { +// DockerCommandServiceHandler is an implementation of the +// composia.controller.v1.DockerCommandService service. +type DockerCommandServiceHandler interface { // RunContainerAction starts an async action for one container on one node. RunContainerAction(context.Context, *connect.Request[v1.RunContainerActionRequest]) (*connect.Response[v1.TaskActionResponse], error) // RemoveContainer starts an async deletion for one container on one node. @@ -214,116 +216,116 @@ type ContainerServiceHandler interface { RemoveImage(context.Context, *connect.Request[v1.RemoveImageRequest]) (*connect.Response[v1.TaskActionResponse], error) } -// NewContainerServiceHandler builds an HTTP handler from the service implementation. It returns the -// path on which to mount the handler and the handler itself. +// NewDockerCommandServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. // // By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf // and JSON codecs. They also support gzip compression. -func NewContainerServiceHandler(svc ContainerServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { - containerServiceMethods := v1.File_proto_composia_controller_v1_container_proto.Services().ByName("ContainerService").Methods() - containerServiceRunContainerActionHandler := connect.NewUnaryHandler( - ContainerServiceRunContainerActionProcedure, +func NewDockerCommandServiceHandler(svc DockerCommandServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + dockerCommandServiceMethods := v1.File_proto_composia_controller_v1_container_proto.Services().ByName("DockerCommandService").Methods() + dockerCommandServiceRunContainerActionHandler := connect.NewUnaryHandler( + DockerCommandServiceRunContainerActionProcedure, svc.RunContainerAction, - connect.WithSchema(containerServiceMethods.ByName("RunContainerAction")), + connect.WithSchema(dockerCommandServiceMethods.ByName("RunContainerAction")), connect.WithHandlerOptions(opts...), ) - containerServiceRemoveContainerHandler := connect.NewUnaryHandler( - ContainerServiceRemoveContainerProcedure, + dockerCommandServiceRemoveContainerHandler := connect.NewUnaryHandler( + DockerCommandServiceRemoveContainerProcedure, svc.RemoveContainer, - connect.WithSchema(containerServiceMethods.ByName("RemoveContainer")), + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveContainer")), connect.WithHandlerOptions(opts...), ) - containerServiceGetContainerLogsHandler := connect.NewServerStreamHandler( - ContainerServiceGetContainerLogsProcedure, + dockerCommandServiceGetContainerLogsHandler := connect.NewServerStreamHandler( + DockerCommandServiceGetContainerLogsProcedure, svc.GetContainerLogs, - connect.WithSchema(containerServiceMethods.ByName("GetContainerLogs")), + connect.WithSchema(dockerCommandServiceMethods.ByName("GetContainerLogs")), connect.WithHandlerOptions(opts...), ) - containerServiceOpenContainerExecHandler := connect.NewUnaryHandler( - ContainerServiceOpenContainerExecProcedure, + dockerCommandServiceOpenContainerExecHandler := connect.NewUnaryHandler( + DockerCommandServiceOpenContainerExecProcedure, svc.OpenContainerExec, - connect.WithSchema(containerServiceMethods.ByName("OpenContainerExec")), + connect.WithSchema(dockerCommandServiceMethods.ByName("OpenContainerExec")), connect.WithHandlerOptions(opts...), ) - containerServiceRunContainerExecHandler := connect.NewUnaryHandler( - ContainerServiceRunContainerExecProcedure, + dockerCommandServiceRunContainerExecHandler := connect.NewUnaryHandler( + DockerCommandServiceRunContainerExecProcedure, svc.RunContainerExec, - connect.WithSchema(containerServiceMethods.ByName("RunContainerExec")), + connect.WithSchema(dockerCommandServiceMethods.ByName("RunContainerExec")), connect.WithHandlerOptions(opts...), ) - containerServiceRemoveNetworkHandler := connect.NewUnaryHandler( - ContainerServiceRemoveNetworkProcedure, + dockerCommandServiceRemoveNetworkHandler := connect.NewUnaryHandler( + DockerCommandServiceRemoveNetworkProcedure, svc.RemoveNetwork, - connect.WithSchema(containerServiceMethods.ByName("RemoveNetwork")), + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveNetwork")), connect.WithHandlerOptions(opts...), ) - containerServiceRemoveVolumeHandler := connect.NewUnaryHandler( - ContainerServiceRemoveVolumeProcedure, + dockerCommandServiceRemoveVolumeHandler := connect.NewUnaryHandler( + DockerCommandServiceRemoveVolumeProcedure, svc.RemoveVolume, - connect.WithSchema(containerServiceMethods.ByName("RemoveVolume")), + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveVolume")), connect.WithHandlerOptions(opts...), ) - containerServiceRemoveImageHandler := connect.NewUnaryHandler( - ContainerServiceRemoveImageProcedure, + dockerCommandServiceRemoveImageHandler := connect.NewUnaryHandler( + DockerCommandServiceRemoveImageProcedure, svc.RemoveImage, - connect.WithSchema(containerServiceMethods.ByName("RemoveImage")), + connect.WithSchema(dockerCommandServiceMethods.ByName("RemoveImage")), connect.WithHandlerOptions(opts...), ) - return "/composia.controller.v1.ContainerService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return "/composia.controller.v1.DockerCommandService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { - case ContainerServiceRunContainerActionProcedure: - containerServiceRunContainerActionHandler.ServeHTTP(w, r) - case ContainerServiceRemoveContainerProcedure: - containerServiceRemoveContainerHandler.ServeHTTP(w, r) - case ContainerServiceGetContainerLogsProcedure: - containerServiceGetContainerLogsHandler.ServeHTTP(w, r) - case ContainerServiceOpenContainerExecProcedure: - containerServiceOpenContainerExecHandler.ServeHTTP(w, r) - case ContainerServiceRunContainerExecProcedure: - containerServiceRunContainerExecHandler.ServeHTTP(w, r) - case ContainerServiceRemoveNetworkProcedure: - containerServiceRemoveNetworkHandler.ServeHTTP(w, r) - case ContainerServiceRemoveVolumeProcedure: - containerServiceRemoveVolumeHandler.ServeHTTP(w, r) - case ContainerServiceRemoveImageProcedure: - containerServiceRemoveImageHandler.ServeHTTP(w, r) + case DockerCommandServiceRunContainerActionProcedure: + dockerCommandServiceRunContainerActionHandler.ServeHTTP(w, r) + case DockerCommandServiceRemoveContainerProcedure: + dockerCommandServiceRemoveContainerHandler.ServeHTTP(w, r) + case DockerCommandServiceGetContainerLogsProcedure: + dockerCommandServiceGetContainerLogsHandler.ServeHTTP(w, r) + case DockerCommandServiceOpenContainerExecProcedure: + dockerCommandServiceOpenContainerExecHandler.ServeHTTP(w, r) + case DockerCommandServiceRunContainerExecProcedure: + dockerCommandServiceRunContainerExecHandler.ServeHTTP(w, r) + case DockerCommandServiceRemoveNetworkProcedure: + dockerCommandServiceRemoveNetworkHandler.ServeHTTP(w, r) + case DockerCommandServiceRemoveVolumeProcedure: + dockerCommandServiceRemoveVolumeHandler.ServeHTTP(w, r) + case DockerCommandServiceRemoveImageProcedure: + dockerCommandServiceRemoveImageHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } }) } -// UnimplementedContainerServiceHandler returns CodeUnimplemented from all methods. -type UnimplementedContainerServiceHandler struct{} +// UnimplementedDockerCommandServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedDockerCommandServiceHandler struct{} -func (UnimplementedContainerServiceHandler) RunContainerAction(context.Context, *connect.Request[v1.RunContainerActionRequest]) (*connect.Response[v1.TaskActionResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.RunContainerAction is not implemented")) +func (UnimplementedDockerCommandServiceHandler) RunContainerAction(context.Context, *connect.Request[v1.RunContainerActionRequest]) (*connect.Response[v1.TaskActionResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.RunContainerAction is not implemented")) } -func (UnimplementedContainerServiceHandler) RemoveContainer(context.Context, *connect.Request[v1.RemoveContainerRequest]) (*connect.Response[v1.TaskActionResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.RemoveContainer is not implemented")) +func (UnimplementedDockerCommandServiceHandler) RemoveContainer(context.Context, *connect.Request[v1.RemoveContainerRequest]) (*connect.Response[v1.TaskActionResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.RemoveContainer is not implemented")) } -func (UnimplementedContainerServiceHandler) GetContainerLogs(context.Context, *connect.Request[v1.GetContainerLogsRequest], *connect.ServerStream[v1.GetContainerLogsResponse]) error { - return connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.GetContainerLogs is not implemented")) +func (UnimplementedDockerCommandServiceHandler) GetContainerLogs(context.Context, *connect.Request[v1.GetContainerLogsRequest], *connect.ServerStream[v1.GetContainerLogsResponse]) error { + return connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.GetContainerLogs is not implemented")) } -func (UnimplementedContainerServiceHandler) OpenContainerExec(context.Context, *connect.Request[v1.OpenContainerExecRequest]) (*connect.Response[v1.OpenContainerExecResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.OpenContainerExec is not implemented")) +func (UnimplementedDockerCommandServiceHandler) OpenContainerExec(context.Context, *connect.Request[v1.OpenContainerExecRequest]) (*connect.Response[v1.OpenContainerExecResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.OpenContainerExec is not implemented")) } -func (UnimplementedContainerServiceHandler) RunContainerExec(context.Context, *connect.Request[v1.RunContainerExecRequest]) (*connect.Response[v1.RunContainerExecResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.RunContainerExec is not implemented")) +func (UnimplementedDockerCommandServiceHandler) RunContainerExec(context.Context, *connect.Request[v1.RunContainerExecRequest]) (*connect.Response[v1.RunContainerExecResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.RunContainerExec is not implemented")) } -func (UnimplementedContainerServiceHandler) RemoveNetwork(context.Context, *connect.Request[v1.RemoveNetworkRequest]) (*connect.Response[v1.TaskActionResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.RemoveNetwork is not implemented")) +func (UnimplementedDockerCommandServiceHandler) RemoveNetwork(context.Context, *connect.Request[v1.RemoveNetworkRequest]) (*connect.Response[v1.TaskActionResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.RemoveNetwork is not implemented")) } -func (UnimplementedContainerServiceHandler) RemoveVolume(context.Context, *connect.Request[v1.RemoveVolumeRequest]) (*connect.Response[v1.TaskActionResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.RemoveVolume is not implemented")) +func (UnimplementedDockerCommandServiceHandler) RemoveVolume(context.Context, *connect.Request[v1.RemoveVolumeRequest]) (*connect.Response[v1.TaskActionResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.RemoveVolume is not implemented")) } -func (UnimplementedContainerServiceHandler) RemoveImage(context.Context, *connect.Request[v1.RemoveImageRequest]) (*connect.Response[v1.TaskActionResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ContainerService.RemoveImage is not implemented")) +func (UnimplementedDockerCommandServiceHandler) RemoveImage(context.Context, *connect.Request[v1.RemoveImageRequest]) (*connect.Response[v1.TaskActionResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.DockerCommandService.RemoveImage is not implemented")) } diff --git a/gen/go/proto/composia/controller/v1/controllerv1connect/repo.connect.go b/gen/go/proto/composia/controller/v1/controllerv1connect/repo.connect.go index c9d1804..f5ca765 100644 --- a/gen/go/proto/composia/controller/v1/controllerv1connect/repo.connect.go +++ b/gen/go/proto/composia/controller/v1/controllerv1connect/repo.connect.go @@ -255,13 +255,13 @@ func (UnimplementedRepoQueryServiceHandler) ValidateRepo(context.Context, *conne // RepoCommandServiceClient is a client for the composia.controller.v1.RepoCommandService service. type RepoCommandServiceClient interface { // UpdateRepoFile writes one file, creates a commit, and reports sync state. - UpdateRepoFile(context.Context, *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.UpdateRepoFileResponse], error) + UpdateRepoFile(context.Context, *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.RepoWriteResult], error) // CreateRepoDirectory creates one directory, creates a commit, and reports sync state. - CreateRepoDirectory(context.Context, *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.CreateRepoDirectoryResponse], error) + CreateRepoDirectory(context.Context, *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.RepoWriteResult], error) // MoveRepoPath moves or renames one repo path. - MoveRepoPath(context.Context, *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.MoveRepoPathResponse], error) + MoveRepoPath(context.Context, *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) // DeleteRepoPath deletes one repo path. - DeleteRepoPath(context.Context, *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.DeleteRepoPathResponse], error) + DeleteRepoPath(context.Context, *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) // SyncRepo pulls or syncs the repo and returns the resulting state snapshot. SyncRepo(context.Context, *connect.Request[v1.SyncRepoRequest]) (*connect.Response[v1.SyncRepoResponse], error) } @@ -277,25 +277,25 @@ func NewRepoCommandServiceClient(httpClient connect.HTTPClient, baseURL string, baseURL = strings.TrimRight(baseURL, "/") repoCommandServiceMethods := v1.File_proto_composia_controller_v1_repo_proto.Services().ByName("RepoCommandService").Methods() return &repoCommandServiceClient{ - updateRepoFile: connect.NewClient[v1.UpdateRepoFileRequest, v1.UpdateRepoFileResponse]( + updateRepoFile: connect.NewClient[v1.UpdateRepoFileRequest, v1.RepoWriteResult]( httpClient, baseURL+RepoCommandServiceUpdateRepoFileProcedure, connect.WithSchema(repoCommandServiceMethods.ByName("UpdateRepoFile")), connect.WithClientOptions(opts...), ), - createRepoDirectory: connect.NewClient[v1.CreateRepoDirectoryRequest, v1.CreateRepoDirectoryResponse]( + createRepoDirectory: connect.NewClient[v1.CreateRepoDirectoryRequest, v1.RepoWriteResult]( httpClient, baseURL+RepoCommandServiceCreateRepoDirectoryProcedure, connect.WithSchema(repoCommandServiceMethods.ByName("CreateRepoDirectory")), connect.WithClientOptions(opts...), ), - moveRepoPath: connect.NewClient[v1.MoveRepoPathRequest, v1.MoveRepoPathResponse]( + moveRepoPath: connect.NewClient[v1.MoveRepoPathRequest, v1.RepoWriteResult]( httpClient, baseURL+RepoCommandServiceMoveRepoPathProcedure, connect.WithSchema(repoCommandServiceMethods.ByName("MoveRepoPath")), connect.WithClientOptions(opts...), ), - deleteRepoPath: connect.NewClient[v1.DeleteRepoPathRequest, v1.DeleteRepoPathResponse]( + deleteRepoPath: connect.NewClient[v1.DeleteRepoPathRequest, v1.RepoWriteResult]( httpClient, baseURL+RepoCommandServiceDeleteRepoPathProcedure, connect.WithSchema(repoCommandServiceMethods.ByName("DeleteRepoPath")), @@ -312,30 +312,30 @@ func NewRepoCommandServiceClient(httpClient connect.HTTPClient, baseURL string, // repoCommandServiceClient implements RepoCommandServiceClient. type repoCommandServiceClient struct { - updateRepoFile *connect.Client[v1.UpdateRepoFileRequest, v1.UpdateRepoFileResponse] - createRepoDirectory *connect.Client[v1.CreateRepoDirectoryRequest, v1.CreateRepoDirectoryResponse] - moveRepoPath *connect.Client[v1.MoveRepoPathRequest, v1.MoveRepoPathResponse] - deleteRepoPath *connect.Client[v1.DeleteRepoPathRequest, v1.DeleteRepoPathResponse] + updateRepoFile *connect.Client[v1.UpdateRepoFileRequest, v1.RepoWriteResult] + createRepoDirectory *connect.Client[v1.CreateRepoDirectoryRequest, v1.RepoWriteResult] + moveRepoPath *connect.Client[v1.MoveRepoPathRequest, v1.RepoWriteResult] + deleteRepoPath *connect.Client[v1.DeleteRepoPathRequest, v1.RepoWriteResult] syncRepo *connect.Client[v1.SyncRepoRequest, v1.SyncRepoResponse] } // UpdateRepoFile calls composia.controller.v1.RepoCommandService.UpdateRepoFile. -func (c *repoCommandServiceClient) UpdateRepoFile(ctx context.Context, req *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.UpdateRepoFileResponse], error) { +func (c *repoCommandServiceClient) UpdateRepoFile(ctx context.Context, req *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.RepoWriteResult], error) { return c.updateRepoFile.CallUnary(ctx, req) } // CreateRepoDirectory calls composia.controller.v1.RepoCommandService.CreateRepoDirectory. -func (c *repoCommandServiceClient) CreateRepoDirectory(ctx context.Context, req *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.CreateRepoDirectoryResponse], error) { +func (c *repoCommandServiceClient) CreateRepoDirectory(ctx context.Context, req *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.RepoWriteResult], error) { return c.createRepoDirectory.CallUnary(ctx, req) } // MoveRepoPath calls composia.controller.v1.RepoCommandService.MoveRepoPath. -func (c *repoCommandServiceClient) MoveRepoPath(ctx context.Context, req *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.MoveRepoPathResponse], error) { +func (c *repoCommandServiceClient) MoveRepoPath(ctx context.Context, req *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) { return c.moveRepoPath.CallUnary(ctx, req) } // DeleteRepoPath calls composia.controller.v1.RepoCommandService.DeleteRepoPath. -func (c *repoCommandServiceClient) DeleteRepoPath(ctx context.Context, req *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.DeleteRepoPathResponse], error) { +func (c *repoCommandServiceClient) DeleteRepoPath(ctx context.Context, req *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) { return c.deleteRepoPath.CallUnary(ctx, req) } @@ -348,13 +348,13 @@ func (c *repoCommandServiceClient) SyncRepo(ctx context.Context, req *connect.Re // service. type RepoCommandServiceHandler interface { // UpdateRepoFile writes one file, creates a commit, and reports sync state. - UpdateRepoFile(context.Context, *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.UpdateRepoFileResponse], error) + UpdateRepoFile(context.Context, *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.RepoWriteResult], error) // CreateRepoDirectory creates one directory, creates a commit, and reports sync state. - CreateRepoDirectory(context.Context, *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.CreateRepoDirectoryResponse], error) + CreateRepoDirectory(context.Context, *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.RepoWriteResult], error) // MoveRepoPath moves or renames one repo path. - MoveRepoPath(context.Context, *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.MoveRepoPathResponse], error) + MoveRepoPath(context.Context, *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) // DeleteRepoPath deletes one repo path. - DeleteRepoPath(context.Context, *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.DeleteRepoPathResponse], error) + DeleteRepoPath(context.Context, *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) // SyncRepo pulls or syncs the repo and returns the resulting state snapshot. SyncRepo(context.Context, *connect.Request[v1.SyncRepoRequest]) (*connect.Response[v1.SyncRepoResponse], error) } @@ -417,19 +417,19 @@ func NewRepoCommandServiceHandler(svc RepoCommandServiceHandler, opts ...connect // UnimplementedRepoCommandServiceHandler returns CodeUnimplemented from all methods. type UnimplementedRepoCommandServiceHandler struct{} -func (UnimplementedRepoCommandServiceHandler) UpdateRepoFile(context.Context, *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.UpdateRepoFileResponse], error) { +func (UnimplementedRepoCommandServiceHandler) UpdateRepoFile(context.Context, *connect.Request[v1.UpdateRepoFileRequest]) (*connect.Response[v1.RepoWriteResult], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.RepoCommandService.UpdateRepoFile is not implemented")) } -func (UnimplementedRepoCommandServiceHandler) CreateRepoDirectory(context.Context, *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.CreateRepoDirectoryResponse], error) { +func (UnimplementedRepoCommandServiceHandler) CreateRepoDirectory(context.Context, *connect.Request[v1.CreateRepoDirectoryRequest]) (*connect.Response[v1.RepoWriteResult], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.RepoCommandService.CreateRepoDirectory is not implemented")) } -func (UnimplementedRepoCommandServiceHandler) MoveRepoPath(context.Context, *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.MoveRepoPathResponse], error) { +func (UnimplementedRepoCommandServiceHandler) MoveRepoPath(context.Context, *connect.Request[v1.MoveRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.RepoCommandService.MoveRepoPath is not implemented")) } -func (UnimplementedRepoCommandServiceHandler) DeleteRepoPath(context.Context, *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.DeleteRepoPathResponse], error) { +func (UnimplementedRepoCommandServiceHandler) DeleteRepoPath(context.Context, *connect.Request[v1.DeleteRepoPathRequest]) (*connect.Response[v1.RepoWriteResult], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.RepoCommandService.DeleteRepoPath is not implemented")) } diff --git a/gen/go/proto/composia/controller/v1/controllerv1connect/secret.connect.go b/gen/go/proto/composia/controller/v1/controllerv1connect/secret.connect.go index cf58ac2..888f250 100644 --- a/gen/go/proto/composia/controller/v1/controllerv1connect/secret.connect.go +++ b/gen/go/proto/composia/controller/v1/controllerv1connect/secret.connect.go @@ -45,7 +45,7 @@ type SecretServiceClient interface { // GetSecret returns the decrypted content for one service secret file. GetSecret(context.Context, *connect.Request[v1.GetSecretRequest]) (*connect.Response[v1.GetSecretResponse], error) // UpdateSecret writes one secret file and reports the resulting repo sync state. - UpdateSecret(context.Context, *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.UpdateSecretResponse], error) + UpdateSecret(context.Context, *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.RepoWriteResult], error) } // NewSecretServiceClient constructs a client for the composia.controller.v1.SecretService service. @@ -65,7 +65,7 @@ func NewSecretServiceClient(httpClient connect.HTTPClient, baseURL string, opts connect.WithSchema(secretServiceMethods.ByName("GetSecret")), connect.WithClientOptions(opts...), ), - updateSecret: connect.NewClient[v1.UpdateSecretRequest, v1.UpdateSecretResponse]( + updateSecret: connect.NewClient[v1.UpdateSecretRequest, v1.RepoWriteResult]( httpClient, baseURL+SecretServiceUpdateSecretProcedure, connect.WithSchema(secretServiceMethods.ByName("UpdateSecret")), @@ -77,7 +77,7 @@ func NewSecretServiceClient(httpClient connect.HTTPClient, baseURL string, opts // secretServiceClient implements SecretServiceClient. type secretServiceClient struct { getSecret *connect.Client[v1.GetSecretRequest, v1.GetSecretResponse] - updateSecret *connect.Client[v1.UpdateSecretRequest, v1.UpdateSecretResponse] + updateSecret *connect.Client[v1.UpdateSecretRequest, v1.RepoWriteResult] } // GetSecret calls composia.controller.v1.SecretService.GetSecret. @@ -86,7 +86,7 @@ func (c *secretServiceClient) GetSecret(ctx context.Context, req *connect.Reques } // UpdateSecret calls composia.controller.v1.SecretService.UpdateSecret. -func (c *secretServiceClient) UpdateSecret(ctx context.Context, req *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.UpdateSecretResponse], error) { +func (c *secretServiceClient) UpdateSecret(ctx context.Context, req *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.RepoWriteResult], error) { return c.updateSecret.CallUnary(ctx, req) } @@ -95,7 +95,7 @@ type SecretServiceHandler interface { // GetSecret returns the decrypted content for one service secret file. GetSecret(context.Context, *connect.Request[v1.GetSecretRequest]) (*connect.Response[v1.GetSecretResponse], error) // UpdateSecret writes one secret file and reports the resulting repo sync state. - UpdateSecret(context.Context, *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.UpdateSecretResponse], error) + UpdateSecret(context.Context, *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.RepoWriteResult], error) } // NewSecretServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -136,6 +136,6 @@ func (UnimplementedSecretServiceHandler) GetSecret(context.Context, *connect.Req return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.SecretService.GetSecret is not implemented")) } -func (UnimplementedSecretServiceHandler) UpdateSecret(context.Context, *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.UpdateSecretResponse], error) { +func (UnimplementedSecretServiceHandler) UpdateSecret(context.Context, *connect.Request[v1.UpdateSecretRequest]) (*connect.Response[v1.RepoWriteResult], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.SecretService.UpdateSecret is not implemented")) } diff --git a/gen/go/proto/composia/controller/v1/controllerv1connect/service.connect.go b/gen/go/proto/composia/controller/v1/controllerv1connect/service.connect.go index 0572dd2..b8f96d7 100644 --- a/gen/go/proto/composia/controller/v1/controllerv1connect/service.connect.go +++ b/gen/go/proto/composia/controller/v1/controllerv1connect/service.connect.go @@ -324,7 +324,7 @@ func (UnimplementedServiceQueryServiceHandler) GetServiceImageUpdateChecks(conte // service. type ServiceCommandServiceClient interface { // UpdateServiceTargetNodes updates the declared target nodes for a service. - UpdateServiceTargetNodes(context.Context, *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.UpdateServiceTargetNodesResponse], error) + UpdateServiceTargetNodes(context.Context, *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.RepoWriteResult], error) // RunServiceAction starts an async action for a service and returns all created tasks. RunServiceAction(context.Context, *connect.Request[v1.RunServiceActionRequest]) (*connect.Response[v1.RunServiceActionResponse], error) // MigrateService starts an async service migration between two nodes. @@ -343,7 +343,7 @@ func NewServiceCommandServiceClient(httpClient connect.HTTPClient, baseURL strin baseURL = strings.TrimRight(baseURL, "/") serviceCommandServiceMethods := v1.File_proto_composia_controller_v1_service_proto.Services().ByName("ServiceCommandService").Methods() return &serviceCommandServiceClient{ - updateServiceTargetNodes: connect.NewClient[v1.UpdateServiceTargetNodesRequest, v1.UpdateServiceTargetNodesResponse]( + updateServiceTargetNodes: connect.NewClient[v1.UpdateServiceTargetNodesRequest, v1.RepoWriteResult]( httpClient, baseURL+ServiceCommandServiceUpdateServiceTargetNodesProcedure, connect.WithSchema(serviceCommandServiceMethods.ByName("UpdateServiceTargetNodes")), @@ -366,14 +366,14 @@ func NewServiceCommandServiceClient(httpClient connect.HTTPClient, baseURL strin // serviceCommandServiceClient implements ServiceCommandServiceClient. type serviceCommandServiceClient struct { - updateServiceTargetNodes *connect.Client[v1.UpdateServiceTargetNodesRequest, v1.UpdateServiceTargetNodesResponse] + updateServiceTargetNodes *connect.Client[v1.UpdateServiceTargetNodesRequest, v1.RepoWriteResult] runServiceAction *connect.Client[v1.RunServiceActionRequest, v1.RunServiceActionResponse] migrateService *connect.Client[v1.MigrateServiceRequest, v1.TaskActionResponse] } // UpdateServiceTargetNodes calls // composia.controller.v1.ServiceCommandService.UpdateServiceTargetNodes. -func (c *serviceCommandServiceClient) UpdateServiceTargetNodes(ctx context.Context, req *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.UpdateServiceTargetNodesResponse], error) { +func (c *serviceCommandServiceClient) UpdateServiceTargetNodes(ctx context.Context, req *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.RepoWriteResult], error) { return c.updateServiceTargetNodes.CallUnary(ctx, req) } @@ -391,7 +391,7 @@ func (c *serviceCommandServiceClient) MigrateService(ctx context.Context, req *c // composia.controller.v1.ServiceCommandService service. type ServiceCommandServiceHandler interface { // UpdateServiceTargetNodes updates the declared target nodes for a service. - UpdateServiceTargetNodes(context.Context, *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.UpdateServiceTargetNodesResponse], error) + UpdateServiceTargetNodes(context.Context, *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.RepoWriteResult], error) // RunServiceAction starts an async action for a service and returns all created tasks. RunServiceAction(context.Context, *connect.Request[v1.RunServiceActionRequest]) (*connect.Response[v1.RunServiceActionResponse], error) // MigrateService starts an async service migration between two nodes. @@ -440,7 +440,7 @@ func NewServiceCommandServiceHandler(svc ServiceCommandServiceHandler, opts ...c // UnimplementedServiceCommandServiceHandler returns CodeUnimplemented from all methods. type UnimplementedServiceCommandServiceHandler struct{} -func (UnimplementedServiceCommandServiceHandler) UpdateServiceTargetNodes(context.Context, *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.UpdateServiceTargetNodesResponse], error) { +func (UnimplementedServiceCommandServiceHandler) UpdateServiceTargetNodes(context.Context, *connect.Request[v1.UpdateServiceTargetNodesRequest]) (*connect.Response[v1.RepoWriteResult], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("composia.controller.v1.ServiceCommandService.UpdateServiceTargetNodes is not implemented")) } diff --git a/gen/go/proto/composia/controller/v1/repo.pb.go b/gen/go/proto/composia/controller/v1/repo.pb.go index 8679b49..97827db 100644 --- a/gen/go/proto/composia/controller/v1/repo.pb.go +++ b/gen/go/proto/composia/controller/v1/repo.pb.go @@ -829,8 +829,8 @@ func (x *UpdateRepoFileRequest) GetCommitMessage() string { return "" } -// UpdateRepoFileResponse reports the commit and sync result for the write. -type UpdateRepoFileResponse struct { +// RepoWriteResult reports the commit and sync result for a repo write. +type RepoWriteResult struct { state protoimpl.MessageState `protogen:"open.v1"` // commit_id is the Git commit created for the write. CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"` @@ -844,20 +844,20 @@ type UpdateRepoFileResponse struct { sizeCache protoimpl.SizeCache } -func (x *UpdateRepoFileResponse) Reset() { - *x = UpdateRepoFileResponse{} +func (x *RepoWriteResult) Reset() { + *x = RepoWriteResult{} mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateRepoFileResponse) String() string { +func (x *RepoWriteResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateRepoFileResponse) ProtoMessage() {} +func (*RepoWriteResult) ProtoMessage() {} -func (x *UpdateRepoFileResponse) ProtoReflect() protoreflect.Message { +func (x *RepoWriteResult) ProtoReflect() protoreflect.Message { mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -869,33 +869,33 @@ func (x *UpdateRepoFileResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateRepoFileResponse.ProtoReflect.Descriptor instead. -func (*UpdateRepoFileResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use RepoWriteResult.ProtoReflect.Descriptor instead. +func (*RepoWriteResult) Descriptor() ([]byte, []int) { return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{14} } -func (x *UpdateRepoFileResponse) GetCommitId() string { +func (x *RepoWriteResult) GetCommitId() string { if x != nil { return x.CommitId } return "" } -func (x *UpdateRepoFileResponse) GetSyncStatus() string { +func (x *RepoWriteResult) GetSyncStatus() string { if x != nil { return x.SyncStatus } return "" } -func (x *UpdateRepoFileResponse) GetPushError() string { +func (x *RepoWriteResult) GetPushError() string { if x != nil { return x.PushError } return "" } -func (x *UpdateRepoFileResponse) GetLastSuccessfulPullAt() string { +func (x *RepoWriteResult) GetLastSuccessfulPullAt() string { if x != nil { return x.LastSuccessfulPullAt } @@ -966,79 +966,6 @@ func (x *CreateRepoDirectoryRequest) GetCommitMessage() string { return "" } -// CreateRepoDirectoryResponse reports the commit and sync result for the create. -type CreateRepoDirectoryResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // commit_id is the Git commit created for the directory creation. - CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"` - // sync_status is the repo sync state after the write. - SyncStatus string `protobuf:"bytes,2,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` - // push_error contains the last push error when sync_status is failed. - PushError string `protobuf:"bytes,3,opt,name=push_error,json=pushError,proto3" json:"push_error,omitempty"` - // last_successful_pull_at is the last successful pull timestamp string. - LastSuccessfulPullAt string `protobuf:"bytes,4,opt,name=last_successful_pull_at,json=lastSuccessfulPullAt,proto3" json:"last_successful_pull_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *CreateRepoDirectoryResponse) Reset() { - *x = CreateRepoDirectoryResponse{} - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateRepoDirectoryResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateRepoDirectoryResponse) ProtoMessage() {} - -func (x *CreateRepoDirectoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[16] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateRepoDirectoryResponse.ProtoReflect.Descriptor instead. -func (*CreateRepoDirectoryResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{16} -} - -func (x *CreateRepoDirectoryResponse) GetCommitId() string { - if x != nil { - return x.CommitId - } - return "" -} - -func (x *CreateRepoDirectoryResponse) GetSyncStatus() string { - if x != nil { - return x.SyncStatus - } - return "" -} - -func (x *CreateRepoDirectoryResponse) GetPushError() string { - if x != nil { - return x.PushError - } - return "" -} - -func (x *CreateRepoDirectoryResponse) GetLastSuccessfulPullAt() string { - if x != nil { - return x.LastSuccessfulPullAt - } - return "" -} - // MoveRepoPathRequest moves one repo-relative path to another. type MoveRepoPathRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1056,7 +983,7 @@ type MoveRepoPathRequest struct { func (x *MoveRepoPathRequest) Reset() { *x = MoveRepoPathRequest{} - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[17] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1068,7 +995,7 @@ func (x *MoveRepoPathRequest) String() string { func (*MoveRepoPathRequest) ProtoMessage() {} func (x *MoveRepoPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[17] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1081,7 +1008,7 @@ func (x *MoveRepoPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveRepoPathRequest.ProtoReflect.Descriptor instead. func (*MoveRepoPathRequest) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{17} + return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{16} } func (x *MoveRepoPathRequest) GetSourcePath() string { @@ -1112,79 +1039,6 @@ func (x *MoveRepoPathRequest) GetCommitMessage() string { return "" } -// MoveRepoPathResponse reports the commit and sync result for the move. -type MoveRepoPathResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // commit_id is the Git commit created for the move. - CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"` - // sync_status is the repo sync state after the write. - SyncStatus string `protobuf:"bytes,2,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` - // push_error contains the last push error when sync_status is failed. - PushError string `protobuf:"bytes,3,opt,name=push_error,json=pushError,proto3" json:"push_error,omitempty"` - // last_successful_pull_at is the last successful pull timestamp string. - LastSuccessfulPullAt string `protobuf:"bytes,4,opt,name=last_successful_pull_at,json=lastSuccessfulPullAt,proto3" json:"last_successful_pull_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *MoveRepoPathResponse) Reset() { - *x = MoveRepoPathResponse{} - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *MoveRepoPathResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MoveRepoPathResponse) ProtoMessage() {} - -func (x *MoveRepoPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[18] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MoveRepoPathResponse.ProtoReflect.Descriptor instead. -func (*MoveRepoPathResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{18} -} - -func (x *MoveRepoPathResponse) GetCommitId() string { - if x != nil { - return x.CommitId - } - return "" -} - -func (x *MoveRepoPathResponse) GetSyncStatus() string { - if x != nil { - return x.SyncStatus - } - return "" -} - -func (x *MoveRepoPathResponse) GetPushError() string { - if x != nil { - return x.PushError - } - return "" -} - -func (x *MoveRepoPathResponse) GetLastSuccessfulPullAt() string { - if x != nil { - return x.LastSuccessfulPullAt - } - return "" -} - // DeleteRepoPathRequest deletes one repo-relative path. type DeleteRepoPathRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1200,7 +1054,7 @@ type DeleteRepoPathRequest struct { func (x *DeleteRepoPathRequest) Reset() { *x = DeleteRepoPathRequest{} - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[19] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1212,7 +1066,7 @@ func (x *DeleteRepoPathRequest) String() string { func (*DeleteRepoPathRequest) ProtoMessage() {} func (x *DeleteRepoPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[19] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1225,7 +1079,7 @@ func (x *DeleteRepoPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRepoPathRequest.ProtoReflect.Descriptor instead. func (*DeleteRepoPathRequest) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{19} + return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{17} } func (x *DeleteRepoPathRequest) GetPath() string { @@ -1249,79 +1103,6 @@ func (x *DeleteRepoPathRequest) GetCommitMessage() string { return "" } -// DeleteRepoPathResponse reports the commit and sync result for the delete. -type DeleteRepoPathResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // commit_id is the Git commit created for the delete. - CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"` - // sync_status is the repo sync state after the write. - SyncStatus string `protobuf:"bytes,2,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` - // push_error contains the last push error when sync_status is failed. - PushError string `protobuf:"bytes,3,opt,name=push_error,json=pushError,proto3" json:"push_error,omitempty"` - // last_successful_pull_at is the last successful pull timestamp string. - LastSuccessfulPullAt string `protobuf:"bytes,4,opt,name=last_successful_pull_at,json=lastSuccessfulPullAt,proto3" json:"last_successful_pull_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *DeleteRepoPathResponse) Reset() { - *x = DeleteRepoPathResponse{} - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeleteRepoPathResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteRepoPathResponse) ProtoMessage() {} - -func (x *DeleteRepoPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[20] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteRepoPathResponse.ProtoReflect.Descriptor instead. -func (*DeleteRepoPathResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{20} -} - -func (x *DeleteRepoPathResponse) GetCommitId() string { - if x != nil { - return x.CommitId - } - return "" -} - -func (x *DeleteRepoPathResponse) GetSyncStatus() string { - if x != nil { - return x.SyncStatus - } - return "" -} - -func (x *DeleteRepoPathResponse) GetPushError() string { - if x != nil { - return x.PushError - } - return "" -} - -func (x *DeleteRepoPathResponse) GetLastSuccessfulPullAt() string { - if x != nil { - return x.LastSuccessfulPullAt - } - return "" -} - // SyncRepoRequest asks the controller to refresh repo state from its remote. type SyncRepoRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1331,7 +1112,7 @@ type SyncRepoRequest struct { func (x *SyncRepoRequest) Reset() { *x = SyncRepoRequest{} - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[21] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1343,7 +1124,7 @@ func (x *SyncRepoRequest) String() string { func (*SyncRepoRequest) ProtoMessage() {} func (x *SyncRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[21] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1356,7 +1137,7 @@ func (x *SyncRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncRepoRequest.ProtoReflect.Descriptor instead. func (*SyncRepoRequest) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{21} + return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{18} } // SyncRepoResponse returns the repo state after a sync attempt. @@ -1378,7 +1159,7 @@ type SyncRepoResponse struct { func (x *SyncRepoResponse) Reset() { *x = SyncRepoResponse{} - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[22] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1390,7 +1171,7 @@ func (x *SyncRepoResponse) String() string { func (*SyncRepoResponse) ProtoMessage() {} func (x *SyncRepoResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[22] + mi := &file_proto_composia_controller_v1_repo_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1403,7 +1184,7 @@ func (x *SyncRepoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncRepoResponse.ProtoReflect.Descriptor instead. func (*SyncRepoResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{22} + return file_proto_composia_controller_v1_repo_proto_rawDescGZIP(), []int{19} } func (x *SyncRepoResponse) GetHeadRevision() string { @@ -1495,8 +1276,8 @@ const file_proto_composia_controller_v1_repo_proto_rawDesc = "" + "\x04path\x18\x01 \x01(\tR\x04path\x12\x18\n" + "\acontent\x18\x02 \x01(\tR\acontent\x12#\n" + "\rbase_revision\x18\x03 \x01(\tR\fbaseRevision\x12%\n" + - "\x0ecommit_message\x18\x04 \x01(\tR\rcommitMessage\"\xac\x01\n" + - "\x16UpdateRepoFileResponse\x12\x1b\n" + + "\x0ecommit_message\x18\x04 \x01(\tR\rcommitMessage\"\xa5\x01\n" + + "\x0fRepoWriteResult\x12\x1b\n" + "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x1f\n" + "\vsync_status\x18\x02 \x01(\tR\n" + "syncStatus\x12\x1d\n" + @@ -1506,38 +1287,17 @@ const file_proto_composia_controller_v1_repo_proto_rawDesc = "" + "\x1aCreateRepoDirectoryRequest\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04path\x12#\n" + "\rbase_revision\x18\x02 \x01(\tR\fbaseRevision\x12%\n" + - "\x0ecommit_message\x18\x03 \x01(\tR\rcommitMessage\"\xb1\x01\n" + - "\x1bCreateRepoDirectoryResponse\x12\x1b\n" + - "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x1f\n" + - "\vsync_status\x18\x02 \x01(\tR\n" + - "syncStatus\x12\x1d\n" + - "\n" + - "push_error\x18\x03 \x01(\tR\tpushError\x125\n" + - "\x17last_successful_pull_at\x18\x04 \x01(\tR\x14lastSuccessfulPullAt\"\xad\x01\n" + + "\x0ecommit_message\x18\x03 \x01(\tR\rcommitMessage\"\xad\x01\n" + "\x13MoveRepoPathRequest\x12\x1f\n" + "\vsource_path\x18\x01 \x01(\tR\n" + "sourcePath\x12)\n" + "\x10destination_path\x18\x02 \x01(\tR\x0fdestinationPath\x12#\n" + "\rbase_revision\x18\x03 \x01(\tR\fbaseRevision\x12%\n" + - "\x0ecommit_message\x18\x04 \x01(\tR\rcommitMessage\"\xaa\x01\n" + - "\x14MoveRepoPathResponse\x12\x1b\n" + - "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x1f\n" + - "\vsync_status\x18\x02 \x01(\tR\n" + - "syncStatus\x12\x1d\n" + - "\n" + - "push_error\x18\x03 \x01(\tR\tpushError\x125\n" + - "\x17last_successful_pull_at\x18\x04 \x01(\tR\x14lastSuccessfulPullAt\"w\n" + + "\x0ecommit_message\x18\x04 \x01(\tR\rcommitMessage\"w\n" + "\x15DeleteRepoPathRequest\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04path\x12#\n" + "\rbase_revision\x18\x02 \x01(\tR\fbaseRevision\x12%\n" + - "\x0ecommit_message\x18\x03 \x01(\tR\rcommitMessage\"\xac\x01\n" + - "\x16DeleteRepoPathResponse\x12\x1b\n" + - "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x1f\n" + - "\vsync_status\x18\x02 \x01(\tR\n" + - "syncStatus\x12\x1d\n" + - "\n" + - "push_error\x18\x03 \x01(\tR\tpushError\x125\n" + - "\x17last_successful_pull_at\x18\x04 \x01(\tR\x14lastSuccessfulPullAt\"\x11\n" + + "\x0ecommit_message\x18\x03 \x01(\tR\rcommitMessage\"\x11\n" + "\x0fSyncRepoRequest\"\xcf\x01\n" + "\x10SyncRepoResponse\x12#\n" + "\rhead_revision\x18\x01 \x01(\tR\fheadRevision\x12\x16\n" + @@ -1551,12 +1311,12 @@ const file_proto_composia_controller_v1_repo_proto_rawDesc = "" + "\rListRepoFiles\x12,.composia.controller.v1.ListRepoFilesRequest\x1a-.composia.controller.v1.ListRepoFilesResponse\x12f\n" + "\vGetRepoFile\x12*.composia.controller.v1.GetRepoFileRequest\x1a+.composia.controller.v1.GetRepoFileResponse\x12r\n" + "\x0fListRepoCommits\x12..composia.controller.v1.ListRepoCommitsRequest\x1a/.composia.controller.v1.ListRepoCommitsResponse\x12i\n" + - "\fValidateRepo\x12+.composia.controller.v1.ValidateRepoRequest\x1a,.composia.controller.v1.ValidateRepoResponse2\xc0\x04\n" + - "\x12RepoCommandService\x12o\n" + - "\x0eUpdateRepoFile\x12-.composia.controller.v1.UpdateRepoFileRequest\x1a..composia.controller.v1.UpdateRepoFileResponse\x12~\n" + - "\x13CreateRepoDirectory\x122.composia.controller.v1.CreateRepoDirectoryRequest\x1a3.composia.controller.v1.CreateRepoDirectoryResponse\x12i\n" + - "\fMoveRepoPath\x12+.composia.controller.v1.MoveRepoPathRequest\x1a,.composia.controller.v1.MoveRepoPathResponse\x12o\n" + - "\x0eDeleteRepoPath\x12-.composia.controller.v1.DeleteRepoPathRequest\x1a..composia.controller.v1.DeleteRepoPathResponse\x12]\n" + + "\fValidateRepo\x12+.composia.controller.v1.ValidateRepoRequest\x1a,.composia.controller.v1.ValidateRepoResponse2\xa1\x04\n" + + "\x12RepoCommandService\x12h\n" + + "\x0eUpdateRepoFile\x12-.composia.controller.v1.UpdateRepoFileRequest\x1a'.composia.controller.v1.RepoWriteResult\x12r\n" + + "\x13CreateRepoDirectory\x122.composia.controller.v1.CreateRepoDirectoryRequest\x1a'.composia.controller.v1.RepoWriteResult\x12d\n" + + "\fMoveRepoPath\x12+.composia.controller.v1.MoveRepoPathRequest\x1a'.composia.controller.v1.RepoWriteResult\x12h\n" + + "\x0eDeleteRepoPath\x12-.composia.controller.v1.DeleteRepoPathRequest\x1a'.composia.controller.v1.RepoWriteResult\x12]\n" + "\bSyncRepo\x12'.composia.controller.v1.SyncRepoRequest\x1a(.composia.controller.v1.SyncRepoResponseBXZVforgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1b\x06proto3" var ( @@ -1571,31 +1331,28 @@ func file_proto_composia_controller_v1_repo_proto_rawDescGZIP() []byte { return file_proto_composia_controller_v1_repo_proto_rawDescData } -var file_proto_composia_controller_v1_repo_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_proto_composia_controller_v1_repo_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_proto_composia_controller_v1_repo_proto_goTypes = []any{ - (*GetRepoHeadRequest)(nil), // 0: composia.controller.v1.GetRepoHeadRequest - (*GetRepoHeadResponse)(nil), // 1: composia.controller.v1.GetRepoHeadResponse - (*RepoFileEntry)(nil), // 2: composia.controller.v1.RepoFileEntry - (*ListRepoFilesRequest)(nil), // 3: composia.controller.v1.ListRepoFilesRequest - (*ListRepoFilesResponse)(nil), // 4: composia.controller.v1.ListRepoFilesResponse - (*GetRepoFileRequest)(nil), // 5: composia.controller.v1.GetRepoFileRequest - (*GetRepoFileResponse)(nil), // 6: composia.controller.v1.GetRepoFileResponse - (*RepoCommitSummary)(nil), // 7: composia.controller.v1.RepoCommitSummary - (*ListRepoCommitsRequest)(nil), // 8: composia.controller.v1.ListRepoCommitsRequest - (*ListRepoCommitsResponse)(nil), // 9: composia.controller.v1.ListRepoCommitsResponse - (*RepoValidationError)(nil), // 10: composia.controller.v1.RepoValidationError - (*ValidateRepoRequest)(nil), // 11: composia.controller.v1.ValidateRepoRequest - (*ValidateRepoResponse)(nil), // 12: composia.controller.v1.ValidateRepoResponse - (*UpdateRepoFileRequest)(nil), // 13: composia.controller.v1.UpdateRepoFileRequest - (*UpdateRepoFileResponse)(nil), // 14: composia.controller.v1.UpdateRepoFileResponse - (*CreateRepoDirectoryRequest)(nil), // 15: composia.controller.v1.CreateRepoDirectoryRequest - (*CreateRepoDirectoryResponse)(nil), // 16: composia.controller.v1.CreateRepoDirectoryResponse - (*MoveRepoPathRequest)(nil), // 17: composia.controller.v1.MoveRepoPathRequest - (*MoveRepoPathResponse)(nil), // 18: composia.controller.v1.MoveRepoPathResponse - (*DeleteRepoPathRequest)(nil), // 19: composia.controller.v1.DeleteRepoPathRequest - (*DeleteRepoPathResponse)(nil), // 20: composia.controller.v1.DeleteRepoPathResponse - (*SyncRepoRequest)(nil), // 21: composia.controller.v1.SyncRepoRequest - (*SyncRepoResponse)(nil), // 22: composia.controller.v1.SyncRepoResponse + (*GetRepoHeadRequest)(nil), // 0: composia.controller.v1.GetRepoHeadRequest + (*GetRepoHeadResponse)(nil), // 1: composia.controller.v1.GetRepoHeadResponse + (*RepoFileEntry)(nil), // 2: composia.controller.v1.RepoFileEntry + (*ListRepoFilesRequest)(nil), // 3: composia.controller.v1.ListRepoFilesRequest + (*ListRepoFilesResponse)(nil), // 4: composia.controller.v1.ListRepoFilesResponse + (*GetRepoFileRequest)(nil), // 5: composia.controller.v1.GetRepoFileRequest + (*GetRepoFileResponse)(nil), // 6: composia.controller.v1.GetRepoFileResponse + (*RepoCommitSummary)(nil), // 7: composia.controller.v1.RepoCommitSummary + (*ListRepoCommitsRequest)(nil), // 8: composia.controller.v1.ListRepoCommitsRequest + (*ListRepoCommitsResponse)(nil), // 9: composia.controller.v1.ListRepoCommitsResponse + (*RepoValidationError)(nil), // 10: composia.controller.v1.RepoValidationError + (*ValidateRepoRequest)(nil), // 11: composia.controller.v1.ValidateRepoRequest + (*ValidateRepoResponse)(nil), // 12: composia.controller.v1.ValidateRepoResponse + (*UpdateRepoFileRequest)(nil), // 13: composia.controller.v1.UpdateRepoFileRequest + (*RepoWriteResult)(nil), // 14: composia.controller.v1.RepoWriteResult + (*CreateRepoDirectoryRequest)(nil), // 15: composia.controller.v1.CreateRepoDirectoryRequest + (*MoveRepoPathRequest)(nil), // 16: composia.controller.v1.MoveRepoPathRequest + (*DeleteRepoPathRequest)(nil), // 17: composia.controller.v1.DeleteRepoPathRequest + (*SyncRepoRequest)(nil), // 18: composia.controller.v1.SyncRepoRequest + (*SyncRepoResponse)(nil), // 19: composia.controller.v1.SyncRepoResponse } var file_proto_composia_controller_v1_repo_proto_depIdxs = []int32{ 2, // 0: composia.controller.v1.ListRepoFilesResponse.entries:type_name -> composia.controller.v1.RepoFileEntry @@ -1608,19 +1365,19 @@ var file_proto_composia_controller_v1_repo_proto_depIdxs = []int32{ 11, // 7: composia.controller.v1.RepoQueryService.ValidateRepo:input_type -> composia.controller.v1.ValidateRepoRequest 13, // 8: composia.controller.v1.RepoCommandService.UpdateRepoFile:input_type -> composia.controller.v1.UpdateRepoFileRequest 15, // 9: composia.controller.v1.RepoCommandService.CreateRepoDirectory:input_type -> composia.controller.v1.CreateRepoDirectoryRequest - 17, // 10: composia.controller.v1.RepoCommandService.MoveRepoPath:input_type -> composia.controller.v1.MoveRepoPathRequest - 19, // 11: composia.controller.v1.RepoCommandService.DeleteRepoPath:input_type -> composia.controller.v1.DeleteRepoPathRequest - 21, // 12: composia.controller.v1.RepoCommandService.SyncRepo:input_type -> composia.controller.v1.SyncRepoRequest + 16, // 10: composia.controller.v1.RepoCommandService.MoveRepoPath:input_type -> composia.controller.v1.MoveRepoPathRequest + 17, // 11: composia.controller.v1.RepoCommandService.DeleteRepoPath:input_type -> composia.controller.v1.DeleteRepoPathRequest + 18, // 12: composia.controller.v1.RepoCommandService.SyncRepo:input_type -> composia.controller.v1.SyncRepoRequest 1, // 13: composia.controller.v1.RepoQueryService.GetRepoHead:output_type -> composia.controller.v1.GetRepoHeadResponse 4, // 14: composia.controller.v1.RepoQueryService.ListRepoFiles:output_type -> composia.controller.v1.ListRepoFilesResponse 6, // 15: composia.controller.v1.RepoQueryService.GetRepoFile:output_type -> composia.controller.v1.GetRepoFileResponse 9, // 16: composia.controller.v1.RepoQueryService.ListRepoCommits:output_type -> composia.controller.v1.ListRepoCommitsResponse 12, // 17: composia.controller.v1.RepoQueryService.ValidateRepo:output_type -> composia.controller.v1.ValidateRepoResponse - 14, // 18: composia.controller.v1.RepoCommandService.UpdateRepoFile:output_type -> composia.controller.v1.UpdateRepoFileResponse - 16, // 19: composia.controller.v1.RepoCommandService.CreateRepoDirectory:output_type -> composia.controller.v1.CreateRepoDirectoryResponse - 18, // 20: composia.controller.v1.RepoCommandService.MoveRepoPath:output_type -> composia.controller.v1.MoveRepoPathResponse - 20, // 21: composia.controller.v1.RepoCommandService.DeleteRepoPath:output_type -> composia.controller.v1.DeleteRepoPathResponse - 22, // 22: composia.controller.v1.RepoCommandService.SyncRepo:output_type -> composia.controller.v1.SyncRepoResponse + 14, // 18: composia.controller.v1.RepoCommandService.UpdateRepoFile:output_type -> composia.controller.v1.RepoWriteResult + 14, // 19: composia.controller.v1.RepoCommandService.CreateRepoDirectory:output_type -> composia.controller.v1.RepoWriteResult + 14, // 20: composia.controller.v1.RepoCommandService.MoveRepoPath:output_type -> composia.controller.v1.RepoWriteResult + 14, // 21: composia.controller.v1.RepoCommandService.DeleteRepoPath:output_type -> composia.controller.v1.RepoWriteResult + 19, // 22: composia.controller.v1.RepoCommandService.SyncRepo:output_type -> composia.controller.v1.SyncRepoResponse 13, // [13:23] is the sub-list for method output_type 3, // [3:13] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name @@ -1639,7 +1396,7 @@ func file_proto_composia_controller_v1_repo_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_composia_controller_v1_repo_proto_rawDesc), len(file_proto_composia_controller_v1_repo_proto_rawDesc)), NumEnums: 0, - NumMessages: 23, + NumMessages: 20, NumExtensions: 0, NumServices: 2, }, diff --git a/gen/go/proto/composia/controller/v1/secret.pb.go b/gen/go/proto/composia/controller/v1/secret.pb.go index 7caf18a..33f3f07 100644 --- a/gen/go/proto/composia/controller/v1/secret.pb.go +++ b/gen/go/proto/composia/controller/v1/secret.pb.go @@ -216,84 +216,11 @@ func (x *UpdateSecretRequest) GetCommitMessage() string { return "" } -// UpdateSecretResponse reports the commit and sync result for the secret update. -type UpdateSecretResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // commit_id is the Git commit created for the secret update. - CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"` - // sync_status is the repo sync state after the write. - SyncStatus string `protobuf:"bytes,2,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` - // push_error contains the last push error when sync_status is failed. - PushError string `protobuf:"bytes,3,opt,name=push_error,json=pushError,proto3" json:"push_error,omitempty"` - // last_successful_pull_at is the last successful pull timestamp string. - LastSuccessfulPullAt string `protobuf:"bytes,4,opt,name=last_successful_pull_at,json=lastSuccessfulPullAt,proto3" json:"last_successful_pull_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *UpdateSecretResponse) Reset() { - *x = UpdateSecretResponse{} - mi := &file_proto_composia_controller_v1_secret_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateSecretResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateSecretResponse) ProtoMessage() {} - -func (x *UpdateSecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_secret_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateSecretResponse.ProtoReflect.Descriptor instead. -func (*UpdateSecretResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_secret_proto_rawDescGZIP(), []int{3} -} - -func (x *UpdateSecretResponse) GetCommitId() string { - if x != nil { - return x.CommitId - } - return "" -} - -func (x *UpdateSecretResponse) GetSyncStatus() string { - if x != nil { - return x.SyncStatus - } - return "" -} - -func (x *UpdateSecretResponse) GetPushError() string { - if x != nil { - return x.PushError - } - return "" -} - -func (x *UpdateSecretResponse) GetLastSuccessfulPullAt() string { - if x != nil { - return x.LastSuccessfulPullAt - } - return "" -} - var File_proto_composia_controller_v1_secret_proto protoreflect.FileDescriptor const file_proto_composia_controller_v1_secret_proto_rawDesc = "" + "\n" + - ")proto/composia/controller/v1/secret.proto\x12\x16composia.controller.v1\"R\n" + + ")proto/composia/controller/v1/secret.proto\x12\x16composia.controller.v1\x1a'proto/composia/controller/v1/repo.proto\"R\n" + "\x10GetSecretRequest\x12!\n" + "\fservice_name\x18\x01 \x01(\tR\vserviceName\x12\x1b\n" + "\tfile_path\x18\x02 \x01(\tR\bfilePath\"m\n" + @@ -306,17 +233,10 @@ const file_proto_composia_controller_v1_secret_proto_rawDesc = "" + "\tfile_path\x18\x02 \x01(\tR\bfilePath\x12\x18\n" + "\acontent\x18\x03 \x01(\tR\acontent\x12#\n" + "\rbase_revision\x18\x04 \x01(\tR\fbaseRevision\x12%\n" + - "\x0ecommit_message\x18\x05 \x01(\tR\rcommitMessage\"\xaa\x01\n" + - "\x14UpdateSecretResponse\x12\x1b\n" + - "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x1f\n" + - "\vsync_status\x18\x02 \x01(\tR\n" + - "syncStatus\x12\x1d\n" + - "\n" + - "push_error\x18\x03 \x01(\tR\tpushError\x125\n" + - "\x17last_successful_pull_at\x18\x04 \x01(\tR\x14lastSuccessfulPullAt2\xdc\x01\n" + + "\x0ecommit_message\x18\x05 \x01(\tR\rcommitMessage2\xd7\x01\n" + "\rSecretService\x12`\n" + - "\tGetSecret\x12(.composia.controller.v1.GetSecretRequest\x1a).composia.controller.v1.GetSecretResponse\x12i\n" + - "\fUpdateSecret\x12+.composia.controller.v1.UpdateSecretRequest\x1a,.composia.controller.v1.UpdateSecretResponseBXZVforgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1b\x06proto3" + "\tGetSecret\x12(.composia.controller.v1.GetSecretRequest\x1a).composia.controller.v1.GetSecretResponse\x12d\n" + + "\fUpdateSecret\x12+.composia.controller.v1.UpdateSecretRequest\x1a'.composia.controller.v1.RepoWriteResultBXZVforgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1b\x06proto3" var ( file_proto_composia_controller_v1_secret_proto_rawDescOnce sync.Once @@ -330,18 +250,18 @@ func file_proto_composia_controller_v1_secret_proto_rawDescGZIP() []byte { return file_proto_composia_controller_v1_secret_proto_rawDescData } -var file_proto_composia_controller_v1_secret_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_proto_composia_controller_v1_secret_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_proto_composia_controller_v1_secret_proto_goTypes = []any{ - (*GetSecretRequest)(nil), // 0: composia.controller.v1.GetSecretRequest - (*GetSecretResponse)(nil), // 1: composia.controller.v1.GetSecretResponse - (*UpdateSecretRequest)(nil), // 2: composia.controller.v1.UpdateSecretRequest - (*UpdateSecretResponse)(nil), // 3: composia.controller.v1.UpdateSecretResponse + (*GetSecretRequest)(nil), // 0: composia.controller.v1.GetSecretRequest + (*GetSecretResponse)(nil), // 1: composia.controller.v1.GetSecretResponse + (*UpdateSecretRequest)(nil), // 2: composia.controller.v1.UpdateSecretRequest + (*RepoWriteResult)(nil), // 3: composia.controller.v1.RepoWriteResult } var file_proto_composia_controller_v1_secret_proto_depIdxs = []int32{ 0, // 0: composia.controller.v1.SecretService.GetSecret:input_type -> composia.controller.v1.GetSecretRequest 2, // 1: composia.controller.v1.SecretService.UpdateSecret:input_type -> composia.controller.v1.UpdateSecretRequest 1, // 2: composia.controller.v1.SecretService.GetSecret:output_type -> composia.controller.v1.GetSecretResponse - 3, // 3: composia.controller.v1.SecretService.UpdateSecret:output_type -> composia.controller.v1.UpdateSecretResponse + 3, // 3: composia.controller.v1.SecretService.UpdateSecret:output_type -> composia.controller.v1.RepoWriteResult 2, // [2:4] is the sub-list for method output_type 0, // [0:2] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name @@ -354,13 +274,14 @@ func file_proto_composia_controller_v1_secret_proto_init() { if File_proto_composia_controller_v1_secret_proto != nil { return } + file_proto_composia_controller_v1_repo_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_composia_controller_v1_secret_proto_rawDesc), len(file_proto_composia_controller_v1_secret_proto_rawDesc)), NumEnums: 0, - NumMessages: 4, + NumMessages: 3, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/proto/composia/controller/v1/service.pb.go b/gen/go/proto/composia/controller/v1/service.pb.go index 6bd127c..8f177c9 100644 --- a/gen/go/proto/composia/controller/v1/service.pb.go +++ b/gen/go/proto/composia/controller/v1/service.pb.go @@ -1840,160 +1840,18 @@ func (x *UpdateServiceTargetNodesRequest) GetCommitMessage() string { return "" } -// UpdateServiceTargetNodesResponse reports the resulting repo write and sync state. -type UpdateServiceTargetNodesResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // commit_id is the Git commit created for the desired-state change. - CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"` - // sync_status is the repo sync state after the write. - SyncStatus string `protobuf:"bytes,2,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` - // push_error contains the last push error when sync_status is failed. - PushError string `protobuf:"bytes,3,opt,name=push_error,json=pushError,proto3" json:"push_error,omitempty"` - // last_successful_pull_at is the last successful controller pull timestamp string. - LastSuccessfulPullAt string `protobuf:"bytes,4,opt,name=last_successful_pull_at,json=lastSuccessfulPullAt,proto3" json:"last_successful_pull_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *UpdateServiceTargetNodesResponse) Reset() { - *x = UpdateServiceTargetNodesResponse{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateServiceTargetNodesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateServiceTargetNodesResponse) ProtoMessage() {} - -func (x *UpdateServiceTargetNodesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[23] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateServiceTargetNodesResponse.ProtoReflect.Descriptor instead. -func (*UpdateServiceTargetNodesResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{23} -} - -func (x *UpdateServiceTargetNodesResponse) GetCommitId() string { - if x != nil { - return x.CommitId - } - return "" -} - -func (x *UpdateServiceTargetNodesResponse) GetSyncStatus() string { - if x != nil { - return x.SyncStatus - } - return "" -} - -func (x *UpdateServiceTargetNodesResponse) GetPushError() string { - if x != nil { - return x.PushError - } - return "" -} - -func (x *UpdateServiceTargetNodesResponse) GetLastSuccessfulPullAt() string { - if x != nil { - return x.LastSuccessfulPullAt - } - return "" -} - -// ServiceActionRepoWriteResult reports the Git write side effect produced by a service action. -type ServiceActionRepoWriteResult struct { - state protoimpl.MessageState `protogen:"open.v1"` - CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"` - SyncStatus string `protobuf:"bytes,2,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` - PushError string `protobuf:"bytes,3,opt,name=push_error,json=pushError,proto3" json:"push_error,omitempty"` - LastSuccessfulPullAt string `protobuf:"bytes,4,opt,name=last_successful_pull_at,json=lastSuccessfulPullAt,proto3" json:"last_successful_pull_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ServiceActionRepoWriteResult) Reset() { - *x = ServiceActionRepoWriteResult{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ServiceActionRepoWriteResult) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceActionRepoWriteResult) ProtoMessage() {} - -func (x *ServiceActionRepoWriteResult) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[24] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServiceActionRepoWriteResult.ProtoReflect.Descriptor instead. -func (*ServiceActionRepoWriteResult) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{24} -} - -func (x *ServiceActionRepoWriteResult) GetCommitId() string { - if x != nil { - return x.CommitId - } - return "" -} - -func (x *ServiceActionRepoWriteResult) GetSyncStatus() string { - if x != nil { - return x.SyncStatus - } - return "" -} - -func (x *ServiceActionRepoWriteResult) GetPushError() string { - if x != nil { - return x.PushError - } - return "" -} - -func (x *ServiceActionRepoWriteResult) GetLastSuccessfulPullAt() string { - if x != nil { - return x.LastSuccessfulPullAt - } - return "" -} - // RunServiceActionResponse returns every queued task and any repo write side effect. type RunServiceActionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Tasks []*TaskActionResponse `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - RepoWrite *ServiceActionRepoWriteResult `protobuf:"bytes,2,opt,name=repo_write,json=repoWrite,proto3" json:"repo_write,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Tasks []*TaskActionResponse `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` + RepoWrite *RepoWriteResult `protobuf:"bytes,2,opt,name=repo_write,json=repoWrite,proto3" json:"repo_write,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *RunServiceActionResponse) Reset() { *x = RunServiceActionResponse{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[25] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2005,7 +1863,7 @@ func (x *RunServiceActionResponse) String() string { func (*RunServiceActionResponse) ProtoMessage() {} func (x *RunServiceActionResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[25] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2018,7 +1876,7 @@ func (x *RunServiceActionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunServiceActionResponse.ProtoReflect.Descriptor instead. func (*RunServiceActionResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{25} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{23} } func (x *RunServiceActionResponse) GetTasks() []*TaskActionResponse { @@ -2028,7 +1886,7 @@ func (x *RunServiceActionResponse) GetTasks() []*TaskActionResponse { return nil } -func (x *RunServiceActionResponse) GetRepoWrite() *ServiceActionRepoWriteResult { +func (x *RunServiceActionResponse) GetRepoWrite() *RepoWriteResult { if x != nil { return x.RepoWrite } @@ -2049,7 +1907,7 @@ type MigrateServiceRequest struct { func (x *MigrateServiceRequest) Reset() { *x = MigrateServiceRequest{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[26] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2061,7 +1919,7 @@ func (x *MigrateServiceRequest) String() string { func (*MigrateServiceRequest) ProtoMessage() {} func (x *MigrateServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[26] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2074,7 +1932,7 @@ func (x *MigrateServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateServiceRequest.ProtoReflect.Descriptor instead. func (*MigrateServiceRequest) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{26} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{24} } func (x *MigrateServiceRequest) GetServiceName() string { @@ -2127,7 +1985,7 @@ type RunServiceActionRequest struct { func (x *RunServiceActionRequest) Reset() { *x = RunServiceActionRequest{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[27] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2139,7 +1997,7 @@ func (x *RunServiceActionRequest) String() string { func (*RunServiceActionRequest) ProtoMessage() {} func (x *RunServiceActionRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[27] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2152,7 +2010,7 @@ func (x *RunServiceActionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunServiceActionRequest.ProtoReflect.Descriptor instead. func (*RunServiceActionRequest) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{27} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{25} } func (x *RunServiceActionRequest) GetServiceName() string { @@ -2237,7 +2095,7 @@ type ImageUpdateSelection struct { func (x *ImageUpdateSelection) Reset() { *x = ImageUpdateSelection{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[28] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2249,7 +2107,7 @@ func (x *ImageUpdateSelection) String() string { func (*ImageUpdateSelection) ProtoMessage() {} func (x *ImageUpdateSelection) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[28] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2262,7 +2120,7 @@ func (x *ImageUpdateSelection) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageUpdateSelection.ProtoReflect.Descriptor instead. func (*ImageUpdateSelection) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{28} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{26} } func (x *ImageUpdateSelection) GetImageName() string { @@ -2303,7 +2161,7 @@ type RunServiceInstanceActionRequest struct { func (x *RunServiceInstanceActionRequest) Reset() { *x = RunServiceInstanceActionRequest{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[29] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2315,7 +2173,7 @@ func (x *RunServiceInstanceActionRequest) String() string { func (*RunServiceInstanceActionRequest) ProtoMessage() {} func (x *RunServiceInstanceActionRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[29] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2328,7 +2186,7 @@ func (x *RunServiceInstanceActionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunServiceInstanceActionRequest.ProtoReflect.Descriptor instead. func (*RunServiceInstanceActionRequest) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{29} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{27} } func (x *RunServiceInstanceActionRequest) GetServiceName() string { @@ -2374,7 +2232,7 @@ type ListServicesRequest struct { func (x *ListServicesRequest) Reset() { *x = ListServicesRequest{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[30] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2386,7 +2244,7 @@ func (x *ListServicesRequest) String() string { func (*ListServicesRequest) ProtoMessage() {} func (x *ListServicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[30] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2399,7 +2257,7 @@ func (x *ListServicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListServicesRequest.ProtoReflect.Descriptor instead. func (*ListServicesRequest) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{30} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{28} } func (x *ListServicesRequest) GetRuntimeStatus() string { @@ -2446,7 +2304,7 @@ type ServiceSummary struct { func (x *ServiceSummary) Reset() { *x = ServiceSummary{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[31] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2458,7 +2316,7 @@ func (x *ServiceSummary) String() string { func (*ServiceSummary) ProtoMessage() {} func (x *ServiceSummary) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[31] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2471,7 +2329,7 @@ func (x *ServiceSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceSummary.ProtoReflect.Descriptor instead. func (*ServiceSummary) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{31} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{29} } func (x *ServiceSummary) GetName() string { @@ -2535,7 +2393,7 @@ type ListServicesResponse struct { func (x *ListServicesResponse) Reset() { *x = ListServicesResponse{} - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[32] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2547,7 +2405,7 @@ func (x *ListServicesResponse) String() string { func (*ListServicesResponse) ProtoMessage() {} func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_composia_controller_v1_service_proto_msgTypes[32] + mi := &file_proto_composia_controller_v1_service_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2560,7 +2418,7 @@ func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListServicesResponse.ProtoReflect.Descriptor instead. func (*ListServicesResponse) Descriptor() ([]byte, []int) { - return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{32} + return file_proto_composia_controller_v1_service_proto_rawDescGZIP(), []int{30} } func (x *ListServicesResponse) GetServices() []*ServiceSummary { @@ -2581,7 +2439,7 @@ var File_proto_composia_controller_v1_service_proto protoreflect.FileDescriptor const file_proto_composia_controller_v1_service_proto_rawDesc = "" + "\n" + - "*proto/composia/controller/v1/service.proto\x12\x16composia.controller.v1\x1a'proto/composia/controller/v1/task.proto\x1a)proto/composia/controller/v1/backup.proto\x1a)proto/composia/controller/v1/system.proto\"\xf3\x01\n" + + "*proto/composia/controller/v1/service.proto\x12\x16composia.controller.v1\x1a'proto/composia/controller/v1/task.proto\x1a)proto/composia/controller/v1/backup.proto\x1a)proto/composia/controller/v1/system.proto\x1a'proto/composia/controller/v1/repo.proto\"\xf3\x01\n" + "\x16ServiceInstanceSummary\x12!\n" + "\fservice_name\x18\x01 \x01(\tR\vserviceName\x12\x17\n" + "\anode_id\x18\x02 \x01(\tR\x06nodeId\x12%\n" + @@ -2715,25 +2573,11 @@ const file_proto_composia_controller_v1_service_proto_rawDesc = "" + "\fservice_name\x18\x01 \x01(\tR\vserviceName\x12\x19\n" + "\bnode_ids\x18\x02 \x03(\tR\anodeIds\x12#\n" + "\rbase_revision\x18\x03 \x01(\tR\fbaseRevision\x12%\n" + - "\x0ecommit_message\x18\x04 \x01(\tR\rcommitMessage\"\xb6\x01\n" + - " UpdateServiceTargetNodesResponse\x12\x1b\n" + - "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x1f\n" + - "\vsync_status\x18\x02 \x01(\tR\n" + - "syncStatus\x12\x1d\n" + - "\n" + - "push_error\x18\x03 \x01(\tR\tpushError\x125\n" + - "\x17last_successful_pull_at\x18\x04 \x01(\tR\x14lastSuccessfulPullAt\"\xb2\x01\n" + - "\x1cServiceActionRepoWriteResult\x12\x1b\n" + - "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x1f\n" + - "\vsync_status\x18\x02 \x01(\tR\n" + - "syncStatus\x12\x1d\n" + - "\n" + - "push_error\x18\x03 \x01(\tR\tpushError\x125\n" + - "\x17last_successful_pull_at\x18\x04 \x01(\tR\x14lastSuccessfulPullAt\"\xb1\x01\n" + + "\x0ecommit_message\x18\x04 \x01(\tR\rcommitMessage\"\xa4\x01\n" + "\x18RunServiceActionResponse\x12@\n" + - "\x05tasks\x18\x01 \x03(\v2*.composia.controller.v1.TaskActionResponseR\x05tasks\x12S\n" + + "\x05tasks\x18\x01 \x03(\v2*.composia.controller.v1.TaskActionResponseR\x05tasks\x12F\n" + "\n" + - "repo_write\x18\x02 \x01(\v24.composia.controller.v1.ServiceActionRepoWriteResultR\trepoWrite\"\x86\x01\n" + + "repo_write\x18\x02 \x01(\v2'.composia.controller.v1.RepoWriteResultR\trepoWrite\"\x86\x01\n" + "\x15MigrateServiceRequest\x12!\n" + "\fservice_name\x18\x01 \x01(\tR\vserviceName\x12$\n" + "\x0esource_node_id\x18\x02 \x01(\tR\fsourceNodeId\x12$\n" + @@ -2809,9 +2653,9 @@ const file_proto_composia_controller_v1_service_proto_rawDesc = "" + "\x13GetServiceWorkspace\x122.composia.controller.v1.GetServiceWorkspaceRequest\x1a3.composia.controller.v1.GetServiceWorkspaceResponse\x12r\n" + "\x0fGetServiceTasks\x12..composia.controller.v1.GetServiceTasksRequest\x1a/.composia.controller.v1.GetServiceTasksResponse\x12x\n" + "\x11GetServiceBackups\x120.composia.controller.v1.GetServiceBackupsRequest\x1a1.composia.controller.v1.GetServiceBackupsResponse\x12\x96\x01\n" + - "\x1bGetServiceImageUpdateChecks\x12:.composia.controller.v1.GetServiceImageUpdateChecksRequest\x1a;.composia.controller.v1.GetServiceImageUpdateChecksResponse2\x8b\x03\n" + - "\x15ServiceCommandService\x12\x8d\x01\n" + - "\x18UpdateServiceTargetNodes\x127.composia.controller.v1.UpdateServiceTargetNodesRequest\x1a8.composia.controller.v1.UpdateServiceTargetNodesResponse\x12u\n" + + "\x1bGetServiceImageUpdateChecks\x12:.composia.controller.v1.GetServiceImageUpdateChecksRequest\x1a;.composia.controller.v1.GetServiceImageUpdateChecksResponse2\xf9\x02\n" + + "\x15ServiceCommandService\x12|\n" + + "\x18UpdateServiceTargetNodes\x127.composia.controller.v1.UpdateServiceTargetNodesRequest\x1a'.composia.controller.v1.RepoWriteResult\x12u\n" + "\x10RunServiceAction\x12/.composia.controller.v1.RunServiceActionRequest\x1a0.composia.controller.v1.RunServiceActionResponse\x12k\n" + "\x0eMigrateService\x12-.composia.controller.v1.MigrateServiceRequest\x1a*.composia.controller.v1.TaskActionResponse2\x9a\x03\n" + "\x16ServiceInstanceService\x12\x81\x01\n" + @@ -2832,7 +2676,7 @@ func file_proto_composia_controller_v1_service_proto_rawDescGZIP() []byte { } var file_proto_composia_controller_v1_service_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_proto_composia_controller_v1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 33) +var file_proto_composia_controller_v1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 31) var file_proto_composia_controller_v1_service_proto_goTypes = []any{ (ServiceAction)(0), // 0: composia.controller.v1.ServiceAction (ComposeRecreateMode)(0), // 1: composia.controller.v1.ComposeRecreateMode @@ -2860,29 +2704,28 @@ var file_proto_composia_controller_v1_service_proto_goTypes = []any{ (*ServiceImageUpdateCheckSummary)(nil), // 23: composia.controller.v1.ServiceImageUpdateCheckSummary (*GetServiceImageUpdateChecksResponse)(nil), // 24: composia.controller.v1.GetServiceImageUpdateChecksResponse (*UpdateServiceTargetNodesRequest)(nil), // 25: composia.controller.v1.UpdateServiceTargetNodesRequest - (*UpdateServiceTargetNodesResponse)(nil), // 26: composia.controller.v1.UpdateServiceTargetNodesResponse - (*ServiceActionRepoWriteResult)(nil), // 27: composia.controller.v1.ServiceActionRepoWriteResult - (*RunServiceActionResponse)(nil), // 28: composia.controller.v1.RunServiceActionResponse - (*MigrateServiceRequest)(nil), // 29: composia.controller.v1.MigrateServiceRequest - (*RunServiceActionRequest)(nil), // 30: composia.controller.v1.RunServiceActionRequest - (*ImageUpdateSelection)(nil), // 31: composia.controller.v1.ImageUpdateSelection - (*RunServiceInstanceActionRequest)(nil), // 32: composia.controller.v1.RunServiceInstanceActionRequest - (*ListServicesRequest)(nil), // 33: composia.controller.v1.ListServicesRequest - (*ServiceSummary)(nil), // 34: composia.controller.v1.ServiceSummary - (*ListServicesResponse)(nil), // 35: composia.controller.v1.ListServicesResponse - (*Capability)(nil), // 36: composia.controller.v1.Capability - (TaskStatus)(0), // 37: composia.controller.v1.TaskStatus - (*TaskSummary)(nil), // 38: composia.controller.v1.TaskSummary - (*BackupSummary)(nil), // 39: composia.controller.v1.BackupSummary - (*TaskActionResponse)(nil), // 40: composia.controller.v1.TaskActionResponse + (*RunServiceActionResponse)(nil), // 26: composia.controller.v1.RunServiceActionResponse + (*MigrateServiceRequest)(nil), // 27: composia.controller.v1.MigrateServiceRequest + (*RunServiceActionRequest)(nil), // 28: composia.controller.v1.RunServiceActionRequest + (*ImageUpdateSelection)(nil), // 29: composia.controller.v1.ImageUpdateSelection + (*RunServiceInstanceActionRequest)(nil), // 30: composia.controller.v1.RunServiceInstanceActionRequest + (*ListServicesRequest)(nil), // 31: composia.controller.v1.ListServicesRequest + (*ServiceSummary)(nil), // 32: composia.controller.v1.ServiceSummary + (*ListServicesResponse)(nil), // 33: composia.controller.v1.ListServicesResponse + (*Capability)(nil), // 34: composia.controller.v1.Capability + (TaskStatus)(0), // 35: composia.controller.v1.TaskStatus + (*TaskSummary)(nil), // 36: composia.controller.v1.TaskSummary + (*BackupSummary)(nil), // 37: composia.controller.v1.BackupSummary + (*TaskActionResponse)(nil), // 38: composia.controller.v1.TaskActionResponse + (*RepoWriteResult)(nil), // 39: composia.controller.v1.RepoWriteResult } var file_proto_composia_controller_v1_service_proto_depIdxs = []int32{ 4, // 0: composia.controller.v1.ServiceInstanceDetail.containers:type_name -> composia.controller.v1.ServiceContainerSummary - 36, // 1: composia.controller.v1.ServiceActionCapabilities.backup:type_name -> composia.controller.v1.Capability - 36, // 2: composia.controller.v1.ServiceActionCapabilities.restore:type_name -> composia.controller.v1.Capability - 36, // 3: composia.controller.v1.ServiceActionCapabilities.migrate:type_name -> composia.controller.v1.Capability - 36, // 4: composia.controller.v1.ServiceActionCapabilities.dns_update:type_name -> composia.controller.v1.Capability - 36, // 5: composia.controller.v1.ServiceActionCapabilities.caddy_sync:type_name -> composia.controller.v1.Capability + 34, // 1: composia.controller.v1.ServiceActionCapabilities.backup:type_name -> composia.controller.v1.Capability + 34, // 2: composia.controller.v1.ServiceActionCapabilities.restore:type_name -> composia.controller.v1.Capability + 34, // 3: composia.controller.v1.ServiceActionCapabilities.migrate:type_name -> composia.controller.v1.Capability + 34, // 4: composia.controller.v1.ServiceActionCapabilities.dns_update:type_name -> composia.controller.v1.Capability + 34, // 5: composia.controller.v1.ServiceActionCapabilities.caddy_sync:type_name -> composia.controller.v1.Capability 5, // 6: composia.controller.v1.GetServiceResponse.instances:type_name -> composia.controller.v1.ServiceInstanceDetail 6, // 7: composia.controller.v1.GetServiceResponse.actions:type_name -> composia.controller.v1.ServiceActionCapabilities 6, // 8: composia.controller.v1.ServiceWorkspaceSummary.actions:type_name -> composia.controller.v1.ServiceActionCapabilities @@ -2890,19 +2733,19 @@ var file_proto_composia_controller_v1_service_proto_depIdxs = []int32{ 9, // 10: composia.controller.v1.GetServiceWorkspaceResponse.workspace:type_name -> composia.controller.v1.ServiceWorkspaceSummary 3, // 11: composia.controller.v1.ListServiceInstancesResponse.instances:type_name -> composia.controller.v1.ServiceInstanceSummary 5, // 12: composia.controller.v1.GetServiceInstanceResponse.instance:type_name -> composia.controller.v1.ServiceInstanceDetail - 37, // 13: composia.controller.v1.GetServiceTasksRequest.status:type_name -> composia.controller.v1.TaskStatus - 38, // 14: composia.controller.v1.GetServiceTasksResponse.tasks:type_name -> composia.controller.v1.TaskSummary - 39, // 15: composia.controller.v1.GetServiceBackupsResponse.backups:type_name -> composia.controller.v1.BackupSummary + 35, // 13: composia.controller.v1.GetServiceTasksRequest.status:type_name -> composia.controller.v1.TaskStatus + 36, // 14: composia.controller.v1.GetServiceTasksResponse.tasks:type_name -> composia.controller.v1.TaskSummary + 37, // 15: composia.controller.v1.GetServiceBackupsResponse.backups:type_name -> composia.controller.v1.BackupSummary 23, // 16: composia.controller.v1.GetServiceImageUpdateChecksResponse.checks:type_name -> composia.controller.v1.ServiceImageUpdateCheckSummary - 40, // 17: composia.controller.v1.RunServiceActionResponse.tasks:type_name -> composia.controller.v1.TaskActionResponse - 27, // 18: composia.controller.v1.RunServiceActionResponse.repo_write:type_name -> composia.controller.v1.ServiceActionRepoWriteResult + 38, // 17: composia.controller.v1.RunServiceActionResponse.tasks:type_name -> composia.controller.v1.TaskActionResponse + 39, // 18: composia.controller.v1.RunServiceActionResponse.repo_write:type_name -> composia.controller.v1.RepoWriteResult 0, // 19: composia.controller.v1.RunServiceActionRequest.action:type_name -> composia.controller.v1.ServiceAction 1, // 20: composia.controller.v1.RunServiceActionRequest.compose_recreate_mode:type_name -> composia.controller.v1.ComposeRecreateMode - 31, // 21: composia.controller.v1.RunServiceActionRequest.image_updates:type_name -> composia.controller.v1.ImageUpdateSelection + 29, // 21: composia.controller.v1.RunServiceActionRequest.image_updates:type_name -> composia.controller.v1.ImageUpdateSelection 2, // 22: composia.controller.v1.RunServiceInstanceActionRequest.action:type_name -> composia.controller.v1.ServiceInstanceAction 1, // 23: composia.controller.v1.RunServiceInstanceActionRequest.compose_recreate_mode:type_name -> composia.controller.v1.ComposeRecreateMode - 34, // 24: composia.controller.v1.ListServicesResponse.services:type_name -> composia.controller.v1.ServiceSummary - 33, // 25: composia.controller.v1.ServiceQueryService.ListServices:input_type -> composia.controller.v1.ListServicesRequest + 32, // 24: composia.controller.v1.ListServicesResponse.services:type_name -> composia.controller.v1.ServiceSummary + 31, // 25: composia.controller.v1.ServiceQueryService.ListServices:input_type -> composia.controller.v1.ListServicesRequest 10, // 26: composia.controller.v1.ServiceQueryService.ListServiceWorkspaces:input_type -> composia.controller.v1.ListServiceWorkspacesRequest 7, // 27: composia.controller.v1.ServiceQueryService.GetService:input_type -> composia.controller.v1.GetServiceRequest 12, // 28: composia.controller.v1.ServiceQueryService.GetServiceWorkspace:input_type -> composia.controller.v1.GetServiceWorkspaceRequest @@ -2910,24 +2753,24 @@ var file_proto_composia_controller_v1_service_proto_depIdxs = []int32{ 20, // 30: composia.controller.v1.ServiceQueryService.GetServiceBackups:input_type -> composia.controller.v1.GetServiceBackupsRequest 22, // 31: composia.controller.v1.ServiceQueryService.GetServiceImageUpdateChecks:input_type -> composia.controller.v1.GetServiceImageUpdateChecksRequest 25, // 32: composia.controller.v1.ServiceCommandService.UpdateServiceTargetNodes:input_type -> composia.controller.v1.UpdateServiceTargetNodesRequest - 30, // 33: composia.controller.v1.ServiceCommandService.RunServiceAction:input_type -> composia.controller.v1.RunServiceActionRequest - 29, // 34: composia.controller.v1.ServiceCommandService.MigrateService:input_type -> composia.controller.v1.MigrateServiceRequest + 28, // 33: composia.controller.v1.ServiceCommandService.RunServiceAction:input_type -> composia.controller.v1.RunServiceActionRequest + 27, // 34: composia.controller.v1.ServiceCommandService.MigrateService:input_type -> composia.controller.v1.MigrateServiceRequest 14, // 35: composia.controller.v1.ServiceInstanceService.ListServiceInstances:input_type -> composia.controller.v1.ListServiceInstancesRequest 16, // 36: composia.controller.v1.ServiceInstanceService.GetServiceInstance:input_type -> composia.controller.v1.GetServiceInstanceRequest - 32, // 37: composia.controller.v1.ServiceInstanceService.RunServiceInstanceAction:input_type -> composia.controller.v1.RunServiceInstanceActionRequest - 35, // 38: composia.controller.v1.ServiceQueryService.ListServices:output_type -> composia.controller.v1.ListServicesResponse + 30, // 37: composia.controller.v1.ServiceInstanceService.RunServiceInstanceAction:input_type -> composia.controller.v1.RunServiceInstanceActionRequest + 33, // 38: composia.controller.v1.ServiceQueryService.ListServices:output_type -> composia.controller.v1.ListServicesResponse 11, // 39: composia.controller.v1.ServiceQueryService.ListServiceWorkspaces:output_type -> composia.controller.v1.ListServiceWorkspacesResponse 8, // 40: composia.controller.v1.ServiceQueryService.GetService:output_type -> composia.controller.v1.GetServiceResponse 13, // 41: composia.controller.v1.ServiceQueryService.GetServiceWorkspace:output_type -> composia.controller.v1.GetServiceWorkspaceResponse 19, // 42: composia.controller.v1.ServiceQueryService.GetServiceTasks:output_type -> composia.controller.v1.GetServiceTasksResponse 21, // 43: composia.controller.v1.ServiceQueryService.GetServiceBackups:output_type -> composia.controller.v1.GetServiceBackupsResponse 24, // 44: composia.controller.v1.ServiceQueryService.GetServiceImageUpdateChecks:output_type -> composia.controller.v1.GetServiceImageUpdateChecksResponse - 26, // 45: composia.controller.v1.ServiceCommandService.UpdateServiceTargetNodes:output_type -> composia.controller.v1.UpdateServiceTargetNodesResponse - 28, // 46: composia.controller.v1.ServiceCommandService.RunServiceAction:output_type -> composia.controller.v1.RunServiceActionResponse - 40, // 47: composia.controller.v1.ServiceCommandService.MigrateService:output_type -> composia.controller.v1.TaskActionResponse + 39, // 45: composia.controller.v1.ServiceCommandService.UpdateServiceTargetNodes:output_type -> composia.controller.v1.RepoWriteResult + 26, // 46: composia.controller.v1.ServiceCommandService.RunServiceAction:output_type -> composia.controller.v1.RunServiceActionResponse + 38, // 47: composia.controller.v1.ServiceCommandService.MigrateService:output_type -> composia.controller.v1.TaskActionResponse 15, // 48: composia.controller.v1.ServiceInstanceService.ListServiceInstances:output_type -> composia.controller.v1.ListServiceInstancesResponse 17, // 49: composia.controller.v1.ServiceInstanceService.GetServiceInstance:output_type -> composia.controller.v1.GetServiceInstanceResponse - 40, // 50: composia.controller.v1.ServiceInstanceService.RunServiceInstanceAction:output_type -> composia.controller.v1.TaskActionResponse + 38, // 50: composia.controller.v1.ServiceInstanceService.RunServiceInstanceAction:output_type -> composia.controller.v1.TaskActionResponse 38, // [38:51] is the sub-list for method output_type 25, // [25:38] is the sub-list for method input_type 25, // [25:25] is the sub-list for extension type_name @@ -2943,14 +2786,15 @@ func file_proto_composia_controller_v1_service_proto_init() { file_proto_composia_controller_v1_task_proto_init() file_proto_composia_controller_v1_backup_proto_init() file_proto_composia_controller_v1_system_proto_init() - file_proto_composia_controller_v1_service_proto_msgTypes[27].OneofWrappers = []any{} + file_proto_composia_controller_v1_repo_proto_init() + file_proto_composia_controller_v1_service_proto_msgTypes[25].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_composia_controller_v1_service_proto_rawDesc), len(file_proto_composia_controller_v1_service_proto_rawDesc)), NumEnums: 3, - NumMessages: 33, + NumMessages: 31, NumExtensions: 0, NumServices: 3, }, diff --git a/internal/app/cli/cli.go b/internal/app/cli/cli.go index 77924f5..5a9d16f 100644 --- a/internal/app/cli/cli.go +++ b/internal/app/cli/cli.go @@ -58,11 +58,12 @@ type controllerClient struct { serviceCommands controllerv1connect.ServiceCommandServiceClient instances controllerv1connect.ServiceInstanceServiceClient tasks controllerv1connect.TaskServiceClient - backups controllerv1connect.BackupRecordServiceClient + backupQueries controllerv1connect.BackupQueryServiceClient + backupCommands controllerv1connect.BackupCommandServiceClient nodes controllerv1connect.NodeQueryServiceClient nodeCommands controllerv1connect.NodeMaintenanceServiceClient docker controllerv1connect.DockerQueryServiceClient - containers controllerv1connect.ContainerServiceClient + dockerCommands controllerv1connect.DockerCommandServiceClient repos controllerv1connect.RepoQueryServiceClient repoCommands controllerv1connect.RepoCommandServiceClient secrets controllerv1connect.SecretServiceClient @@ -421,11 +422,12 @@ func (application *app) configureClient() error { serviceCommands: controllerv1connect.NewServiceCommandServiceClient(httpClient, baseURL, auth), instances: controllerv1connect.NewServiceInstanceServiceClient(httpClient, baseURL, auth), tasks: controllerv1connect.NewTaskServiceClient(httpClient, baseURL, auth), - backups: controllerv1connect.NewBackupRecordServiceClient(httpClient, baseURL, auth), + backupQueries: controllerv1connect.NewBackupQueryServiceClient(httpClient, baseURL, auth), + backupCommands: controllerv1connect.NewBackupCommandServiceClient(httpClient, baseURL, auth), nodes: controllerv1connect.NewNodeQueryServiceClient(httpClient, baseURL, auth), nodeCommands: controllerv1connect.NewNodeMaintenanceServiceClient(httpClient, baseURL, auth), docker: controllerv1connect.NewDockerQueryServiceClient(httpClient, baseURL, auth), - containers: controllerv1connect.NewContainerServiceClient(httpClient, baseURL, auth), + dockerCommands: controllerv1connect.NewDockerCommandServiceClient(httpClient, baseURL, auth), repos: controllerv1connect.NewRepoQueryServiceClient(httpClient, baseURL, auth), repoCommands: controllerv1connect.NewRepoCommandServiceClient(httpClient, baseURL, auth), secrets: controllerv1connect.NewSecretServiceClient(httpClient, baseURL, auth), diff --git a/internal/app/cli/command_backup.go b/internal/app/cli/command_backup.go index 3d87886..89a5c7b 100644 --- a/internal/app/cli/command_backup.go +++ b/internal/app/cli/command_backup.go @@ -52,7 +52,7 @@ func (application *app) runBackupList(args []string) error { if err != nil { return err } - response, err := application.client.backups.ListBackups(application.ctx, newRequest(&controllerv1.ListBackupsRequest{ + response, err := application.client.backupQueries.ListBackups(application.ctx, newRequest(&controllerv1.ListBackupsRequest{ ServiceName: []string(services), Status: []string(statuses), DataName: []string(dataNames), @@ -93,7 +93,7 @@ func (application *app) runBackupGet(args []string) error { if err := requireArgs(args, 1, "composia backup get "); err != nil { return err } - response, err := application.client.backups.GetBackup(application.ctx, newRequest(&controllerv1.GetBackupRequest{BackupId: args[0]})) + response, err := application.client.backupQueries.GetBackup(application.ctx, newRequest(&controllerv1.GetBackupRequest{BackupId: args[0]})) if err != nil { return err } @@ -137,7 +137,7 @@ func (application *app) runBackupRestore(args []string) error { if nodeIDValue == "" { return errorsWithUsage("node is required", "composia backup restore [--wait] [--follow] [--timeout duration] --node node ") } - response, err := application.client.backups.RestoreBackup(application.ctx, newRequest(&controllerv1.RestoreBackupRequest{BackupId: fs.Arg(0), NodeId: nodeIDValue})) + response, err := application.client.backupCommands.RestoreBackup(application.ctx, newRequest(&controllerv1.RestoreBackupRequest{BackupId: fs.Arg(0), NodeId: nodeIDValue})) if err != nil { return err } diff --git a/internal/app/cli/command_container.go b/internal/app/cli/command_container.go index f81e143..9f7c903 100644 --- a/internal/app/cli/command_container.go +++ b/internal/app/cli/command_container.go @@ -127,7 +127,7 @@ func (application *app) runContainerLogs(args []string) error { if strings.TrimSpace(*nodeID) == "" { return errorsWithUsage("node is required", "composia container logs --node node [--tail n|all] [--timestamps] ") } - stream, err := application.client.containers.GetContainerLogs(application.ctx, newRequest(&controllerv1.GetContainerLogsRequest{NodeId: strings.TrimSpace(*nodeID), ContainerId: fs.Arg(0), Tail: *tail, Timestamps: *timestamps})) + stream, err := application.client.dockerCommands.GetContainerLogs(application.ctx, newRequest(&controllerv1.GetContainerLogsRequest{NodeId: strings.TrimSpace(*nodeID), ContainerId: fs.Arg(0), Tail: *tail, Timestamps: *timestamps})) if err != nil { return err } @@ -163,7 +163,7 @@ func (application *app) runContainerAction(actionName string, args []string) err if strings.TrimSpace(*nodeID) == "" { return errorsWithUsage("node is required", usage) } - response, err := application.client.containers.RunContainerAction(application.ctx, newRequest(&controllerv1.RunContainerActionRequest{NodeId: strings.TrimSpace(*nodeID), ContainerId: fs.Arg(0), Action: action})) + response, err := application.client.dockerCommands.RunContainerAction(application.ctx, newRequest(&controllerv1.RunContainerActionRequest{NodeId: strings.TrimSpace(*nodeID), ContainerId: fs.Arg(0), Action: action})) if err != nil { return err } @@ -186,7 +186,7 @@ func (application *app) runContainerRemove(args []string) error { if strings.TrimSpace(*nodeID) == "" { return errorsWithUsage("node is required", usage) } - response, err := application.client.containers.RemoveContainer(application.ctx, newRequest(&controllerv1.RemoveContainerRequest{NodeId: strings.TrimSpace(*nodeID), ContainerId: fs.Arg(0), Force: *force, RemoveVolumes: *volumes})) + response, err := application.client.dockerCommands.RemoveContainer(application.ctx, newRequest(&controllerv1.RemoveContainerRequest{NodeId: strings.TrimSpace(*nodeID), ContainerId: fs.Arg(0), Force: *force, RemoveVolumes: *volumes})) if err != nil { return err } @@ -235,7 +235,7 @@ func (application *app) runContainerExec(args []string) error { if err != nil { return err } - response, err := application.client.containers.RunContainerExec(application.ctx, newRequest(&controllerv1.RunContainerExecRequest{ + response, err := application.client.dockerCommands.RunContainerExec(application.ctx, newRequest(&controllerv1.RunContainerExecRequest{ NodeId: strings.TrimSpace(*nodeID), ContainerId: fs.Arg(0), Command: fs.Args()[1:], @@ -284,7 +284,7 @@ func (application *app) runContainerExecTTY(nodeID, containerID string, command Cols: cols, }) request.Header().Set("X-Composia-Web-Origin", origin) - response, err := application.client.containers.OpenContainerExec(application.ctx, request) + response, err := application.client.dockerCommands.OpenContainerExec(application.ctx, request) if err != nil { return err } diff --git a/internal/app/cli/command_docker_resources.go b/internal/app/cli/command_docker_resources.go index 913d469..b955f8a 100644 --- a/internal/app/cli/command_docker_resources.go +++ b/internal/app/cli/command_docker_resources.go @@ -70,7 +70,7 @@ func (application *app) runNetworkRemove(args []string) error { if err != nil { return err } - response, err := application.client.containers.RemoveNetwork(application.ctx, newRequest(&controllerv1.RemoveNetworkRequest{NodeId: nodeID, NetworkId: id})) + response, err := application.client.dockerCommands.RemoveNetwork(application.ctx, newRequest(&controllerv1.RemoveNetworkRequest{NodeId: nodeID, NetworkId: id})) if err != nil { return err } @@ -140,7 +140,7 @@ func (application *app) runVolumeRemove(args []string) error { if err != nil { return err } - response, err := application.client.containers.RemoveVolume(application.ctx, newRequest(&controllerv1.RemoveVolumeRequest{NodeId: nodeID, VolumeName: id})) + response, err := application.client.dockerCommands.RemoveVolume(application.ctx, newRequest(&controllerv1.RemoveVolumeRequest{NodeId: nodeID, VolumeName: id})) if err != nil { return err } @@ -220,7 +220,7 @@ func (application *app) runImageRemove(args []string) error { if strings.TrimSpace(*nodeID) == "" { return errorsWithUsage("node is required", usage) } - response, err := application.client.containers.RemoveImage(application.ctx, newRequest(&controllerv1.RemoveImageRequest{NodeId: strings.TrimSpace(*nodeID), ImageId: fs.Arg(0), Force: *force})) + response, err := application.client.dockerCommands.RemoveImage(application.ctx, newRequest(&controllerv1.RemoveImageRequest{NodeId: strings.TrimSpace(*nodeID), ImageId: fs.Arg(0), Force: *force})) if err != nil { return err } diff --git a/internal/app/controller/backup_record.go b/internal/app/controller/backup_record.go index 75ede28..d37fcb2 100644 --- a/internal/app/controller/backup_record.go +++ b/internal/app/controller/backup_record.go @@ -13,14 +13,14 @@ import ( "path/filepath" ) -type backupRecordServer struct { +type backupServer struct { db *store.DB cfg *config.ControllerConfig availableNodeIDs map[string]struct{} taskQueue *taskQueueNotifier } -func (server *backupRecordServer) ListBackups(ctx context.Context, req *connect.Request[controllerv1.ListBackupsRequest]) (*connect.Response[controllerv1.ListBackupsResponse], error) { +func (server *backupServer) ListBackups(ctx context.Context, req *connect.Request[controllerv1.ListBackupsRequest]) (*connect.Response[controllerv1.ListBackupsResponse], error) { if req.Msg == nil { req.Msg = &controllerv1.ListBackupsRequest{} } @@ -38,7 +38,7 @@ func (server *backupRecordServer) ListBackups(ctx context.Context, req *connect. return connect.NewResponse(response), nil } -func (server *backupRecordServer) GetBackup(ctx context.Context, req *connect.Request[controllerv1.GetBackupRequest]) (*connect.Response[controllerv1.GetBackupResponse], error) { +func (server *backupServer) GetBackup(ctx context.Context, req *connect.Request[controllerv1.GetBackupRequest]) (*connect.Response[controllerv1.GetBackupResponse], error) { if req.Msg == nil || req.Msg.GetBackupId() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("backup_id is required")) } @@ -69,7 +69,7 @@ func (server *backupRecordServer) GetBackup(ctx context.Context, req *connect.Re return connect.NewResponse(response), nil } -func (server *backupRecordServer) RestoreBackup(ctx context.Context, req *connect.Request[controllerv1.RestoreBackupRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { +func (server *backupServer) RestoreBackup(ctx context.Context, req *connect.Request[controllerv1.RestoreBackupRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { if req.Msg == nil || req.Msg.GetBackupId() == "" || req.Msg.GetNodeId() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("backup_id and node_id are required")) } diff --git a/internal/app/controller/backup_test.go b/internal/app/controller/backup_test.go index d8b9536..f2a7bfc 100644 --- a/internal/app/controller/backup_test.go +++ b/internal/app/controller/backup_test.go @@ -18,7 +18,7 @@ import ( "forgejo.alexma.top/alexma233/composia/internal/platform/store" ) -func TestBackupRecordServiceListAndGetBackup(t *testing.T) { +func TestBackupQueryServiceListAndGetBackup(t *testing.T) { t.Parallel() db := openControllerTestDB(t) @@ -34,7 +34,7 @@ func TestBackupRecordServiceListAndGetBackup(t *testing.T) { if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-1", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "alpha", NodeID: "main", CreatedAt: time.Date(2026, 4, 4, 14, 0, 0, 0, time.UTC)}); err != nil { t.Fatalf("create task-1: %v", err) } - if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-2", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "bravo", CreatedAt: time.Date(2026, 4, 4, 14, 5, 0, 0, time.UTC)}); err != nil { + if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-2", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "bravo", NodeID: "main", CreatedAt: time.Date(2026, 4, 4, 14, 5, 0, 0, time.UTC)}); err != nil { t.Fatalf("create task-2: %v", err) } if err := db.UpsertBackupRecord(ctx, store.BackupDetail{BackupID: "backup-1", TaskID: "task-1", ServiceName: "alpha", DataName: "config", Status: "succeeded", StartedAt: "2026-04-04T14:00:00Z", FinishedAt: "2026-04-04T14:01:00Z", ArtifactRef: "snapshot-1"}); err != nil { @@ -50,14 +50,14 @@ func TestBackupRecordServiceListAndGetBackup(t *testing.T) { } return "test-client", nil }) - path, handler := controllerv1connect.NewBackupRecordServiceHandler(&backupRecordServer{db: db}, connect.WithInterceptors(interceptor)) + queryPath, queryHandler := controllerv1connect.NewBackupQueryServiceHandler(&backupServer{db: db}, connect.WithInterceptors(interceptor)) mux := http.NewServeMux() - mux.Handle(path, handler) + mux.Handle(queryPath, queryHandler) httpServer := httptest.NewServer(mux) defer httpServer.Close() - client := controllerv1connect.NewBackupRecordServiceClient(httpServer.Client(), httpServer.URL, connect.WithInterceptors(rpcutil.NewStaticBearerAuthInterceptor("access-token"))) - listResponse, err := client.ListBackups(ctx, connect.NewRequest(&controllerv1.ListBackupsRequest{ServiceName: []string{"alpha"}, ExcludeStatus: []string{"failed"}})) + queryClient := controllerv1connect.NewBackupQueryServiceClient(httpServer.Client(), httpServer.URL, connect.WithInterceptors(rpcutil.NewStaticBearerAuthInterceptor("access-token"))) + listResponse, err := queryClient.ListBackups(ctx, connect.NewRequest(&controllerv1.ListBackupsRequest{ServiceName: []string{"alpha"}, ExcludeStatus: []string{"failed"}})) if err != nil { t.Fatalf("list backups: %v", err) } @@ -65,7 +65,7 @@ func TestBackupRecordServiceListAndGetBackup(t *testing.T) { t.Fatalf("unexpected backup list response: %+v", listResponse.Msg.GetBackups()) } - getResponse, err := client.GetBackup(ctx, connect.NewRequest(&controllerv1.GetBackupRequest{BackupId: "backup-1"})) + getResponse, err := queryClient.GetBackup(ctx, connect.NewRequest(&controllerv1.GetBackupRequest{BackupId: "backup-1"})) if err != nil { t.Fatalf("get backup: %v", err) } @@ -74,7 +74,7 @@ func TestBackupRecordServiceListAndGetBackup(t *testing.T) { } } -func TestBackupRecordServiceRestoreBackupCreatesPendingRestoreTask(t *testing.T) { +func TestBackupCommandServiceRestoreBackupCreatesPendingRestoreTask(t *testing.T) { t.Parallel() rootDir := t.TempDir() @@ -121,12 +121,12 @@ func TestBackupRecordServiceRestoreBackupCreatesPendingRestoreTask(t *testing.T) } return "test-client", nil }) - path, handler := controllerv1connect.NewBackupRecordServiceHandler( - &backupRecordServer{db: db, cfg: &config.ControllerConfig{RepoDir: repoDir, LogDir: logDir, Nodes: []config.NodeConfig{{ID: "main"}}}, availableNodeIDs: map[string]struct{}{"main": {}}, taskQueue: newTaskQueueNotifier()}, + commandPath, commandHandler := controllerv1connect.NewBackupCommandServiceHandler( + &backupServer{db: db, cfg: &config.ControllerConfig{RepoDir: repoDir, LogDir: logDir, Nodes: []config.NodeConfig{{ID: "main"}}}, availableNodeIDs: map[string]struct{}{"main": {}}, taskQueue: newTaskQueueNotifier()}, connect.WithInterceptors(interceptor), ) mux := http.NewServeMux() - mux.Handle(path, handler) + mux.Handle(commandPath, commandHandler) httpServer := httptest.NewServer(mux) defer httpServer.Close() @@ -136,7 +136,7 @@ func TestBackupRecordServiceRestoreBackupCreatesPendingRestoreTask(t *testing.T) return next(ctx, req) } }) - client := controllerv1connect.NewBackupRecordServiceClient(httpServer.Client(), httpServer.URL, connect.WithInterceptors(rpcutil.NewStaticBearerAuthInterceptor("access-token"), requestInterceptor)) + client := controllerv1connect.NewBackupCommandServiceClient(httpServer.Client(), httpServer.URL, connect.WithInterceptors(rpcutil.NewStaticBearerAuthInterceptor("access-token"), requestInterceptor)) response, err := client.RestoreBackup(ctx, connect.NewRequest(&controllerv1.RestoreBackupRequest{BackupId: "backup-1", NodeId: "main"})) if err != nil { diff --git a/internal/app/controller/bootstrap.go b/internal/app/controller/bootstrap.go index fb5cf37..7ac9628 100644 --- a/internal/app/controller/bootstrap.go +++ b/internal/app/controller/bootstrap.go @@ -108,11 +108,18 @@ func registerAccessHandlers(mux *http.ServeMux, cfg *config.ControllerConfig, db ) mountRPCHandler(mux, rpcutil.ControllerAPIBasePath, secretPath, secretHandler) - backupPath, backupHandler := controllerv1connect.NewBackupRecordServiceHandler( - &backupRecordServer{db: db, cfg: cfg, availableNodeIDs: availableNodeIDs, taskQueue: taskQueue}, + backupSvc := &backupServer{db: db, cfg: cfg, availableNodeIDs: availableNodeIDs, taskQueue: taskQueue} + backupQueryPath, backupQueryHandler := controllerv1connect.NewBackupQueryServiceHandler( + backupSvc, connect.WithInterceptors(interceptor), ) - mountRPCHandler(mux, rpcutil.ControllerAPIBasePath, backupPath, backupHandler) + mountRPCHandler(mux, rpcutil.ControllerAPIBasePath, backupQueryPath, backupQueryHandler) + + backupCommandPath, backupCommandHandler := controllerv1connect.NewBackupCommandServiceHandler( + backupSvc, + connect.WithInterceptors(interceptor), + ) + mountRPCHandler(mux, rpcutil.ControllerAPIBasePath, backupCommandPath, backupCommandHandler) serviceQueryPath, serviceQueryHandler := controllerv1connect.NewServiceQueryServiceHandler( &serviceQueryServer{db: db, cfg: cfg, availableNodeIDs: availableNodeIDs, taskQueue: taskQueue, taskResults: taskResults, dockerQueries: dockerQueries, repoMu: repoMu}, @@ -150,11 +157,11 @@ func registerAccessHandlers(mux *http.ServeMux, cfg *config.ControllerConfig, db ) mountRPCHandler(mux, rpcutil.ControllerAPIBasePath, dockerQueryPath, dockerQueryHandler) - containerPath, containerHandler := controllerv1connect.NewContainerServiceHandler( - &containerServer{db: db, cfg: cfg, taskQueue: taskQueue, taskResults: taskResults, dockerQueries: dockerQueries, execManager: execManager, logManager: logManager}, + dockerCommandPath, dockerCommandHandler := controllerv1connect.NewDockerCommandServiceHandler( + &dockerCommandServer{db: db, cfg: cfg, taskQueue: taskQueue, taskResults: taskResults, dockerQueries: dockerQueries, execManager: execManager, logManager: logManager}, connect.WithInterceptors(interceptor), ) - mountRPCHandler(mux, rpcutil.ControllerAPIBasePath, containerPath, containerHandler) + mountRPCHandler(mux, rpcutil.ControllerAPIBasePath, dockerCommandPath, dockerCommandHandler) taskPath, taskHandler := controllerv1connect.NewTaskServiceHandler( &taskServer{db: db, cfg: cfg, availableNodeIDs: availableNodeIDs, taskQueue: taskQueue, taskResults: taskResults, notifier: notifier}, diff --git a/internal/app/controller/container.go b/internal/app/controller/container.go index b0843fc..9d357c6 100644 --- a/internal/app/controller/container.go +++ b/internal/app/controller/container.go @@ -17,7 +17,7 @@ import ( "path/filepath" ) -type containerServer struct { +type dockerCommandServer struct { db *store.DB cfg *config.ControllerConfig taskQueue *taskQueueNotifier @@ -27,7 +27,7 @@ type containerServer struct { logManager *containerLogTunnelManager } -func (server *containerServer) RunContainerAction(ctx context.Context, req *connect.Request[controllerv1.RunContainerActionRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { +func (server *dockerCommandServer) RunContainerAction(ctx context.Context, req *connect.Request[controllerv1.RunContainerActionRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { if req.Msg == nil { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id, container_id, and action are required")) } @@ -55,7 +55,7 @@ func (server *containerServer) RunContainerAction(ctx context.Context, req *conn return connect.NewResponse(taskActionResponse(record)), nil } -func (server *containerServer) RemoveContainer(ctx context.Context, req *connect.Request[controllerv1.RemoveContainerRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { +func (server *dockerCommandServer) RemoveContainer(ctx context.Context, req *connect.Request[controllerv1.RemoveContainerRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { if req.Msg == nil { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id and container_id are required")) } @@ -73,7 +73,7 @@ func (server *containerServer) RemoveContainer(ctx context.Context, req *connect return connect.NewResponse(taskActionResponse(record)), nil } -func (server *containerServer) RemoveNetwork(ctx context.Context, req *connect.Request[controllerv1.RemoveNetworkRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { +func (server *dockerCommandServer) RemoveNetwork(ctx context.Context, req *connect.Request[controllerv1.RemoveNetworkRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { if req.Msg == nil || req.Msg.GetNodeId() == "" || req.Msg.GetNetworkId() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id and network_id are required")) } @@ -89,7 +89,7 @@ func (server *containerServer) RemoveNetwork(ctx context.Context, req *connect.R return connect.NewResponse(taskActionResponse(record)), nil } -func (server *containerServer) RemoveVolume(ctx context.Context, req *connect.Request[controllerv1.RemoveVolumeRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { +func (server *dockerCommandServer) RemoveVolume(ctx context.Context, req *connect.Request[controllerv1.RemoveVolumeRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { if req.Msg == nil || req.Msg.GetNodeId() == "" || req.Msg.GetVolumeName() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id and volume_name are required")) } @@ -105,7 +105,7 @@ func (server *containerServer) RemoveVolume(ctx context.Context, req *connect.Re return connect.NewResponse(taskActionResponse(record)), nil } -func (server *containerServer) RemoveImage(ctx context.Context, req *connect.Request[controllerv1.RemoveImageRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { +func (server *dockerCommandServer) RemoveImage(ctx context.Context, req *connect.Request[controllerv1.RemoveImageRequest]) (*connect.Response[controllerv1.TaskActionResponse], error) { if req.Msg == nil || req.Msg.GetNodeId() == "" || req.Msg.GetImageId() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id and image_id are required")) } @@ -122,7 +122,7 @@ func (server *containerServer) RemoveImage(ctx context.Context, req *connect.Req return connect.NewResponse(taskActionResponse(record)), nil } -func (server *containerServer) GetContainerLogs(ctx context.Context, req *connect.Request[controllerv1.GetContainerLogsRequest], stream *connect.ServerStream[controllerv1.GetContainerLogsResponse]) error { +func (server *dockerCommandServer) GetContainerLogs(ctx context.Context, req *connect.Request[controllerv1.GetContainerLogsRequest], stream *connect.ServerStream[controllerv1.GetContainerLogsResponse]) error { if req.Msg == nil || req.Msg.GetNodeId() == "" || req.Msg.GetContainerId() == "" { return connect.NewError(connect.CodeInvalidArgument, errors.New("node_id and container_id are required")) } @@ -160,7 +160,7 @@ func (server *containerServer) GetContainerLogs(ctx context.Context, req *connec } } -func (server *containerServer) createContainerTask(ctx context.Context, header http.Header, nodeID, containerID string, taskType task.Type, params map[string]any) (task.Record, error) { +func (server *dockerCommandServer) createContainerTask(ctx context.Context, header http.Header, nodeID, containerID string, taskType task.Type, params map[string]any) (task.Record, error) { if nodeID == "" || containerID == "" { return task.Record{}, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id and container_id are required")) } @@ -193,7 +193,7 @@ func (server *containerServer) createContainerTask(ctx context.Context, header h return createdTask, nil } -func (server *containerServer) createNodeDockerTask(ctx context.Context, header http.Header, nodeID string, taskType task.Type, params map[string]any) (task.Record, error) { +func (server *dockerCommandServer) createNodeDockerTask(ctx context.Context, header http.Header, nodeID string, taskType task.Type, params map[string]any) (task.Record, error) { if nodeID == "" { return task.Record{}, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id is required")) } diff --git a/internal/app/controller/container_log_tunnel.go b/internal/app/controller/container_log_tunnel.go index 4c8a69e..5d2167a 100644 --- a/internal/app/controller/container_log_tunnel.go +++ b/internal/app/controller/container_log_tunnel.go @@ -229,7 +229,7 @@ func (server *agentReportServer) OpenContainerLogTunnel(ctx context.Context, str } } -func (server *containerServer) openContainerLogSession(nodeID, containerID, tail string, timestamps bool) (*containerLogSession, error) { +func (server *dockerCommandServer) openContainerLogSession(nodeID, containerID, tail string, timestamps bool) (*containerLogSession, error) { if server.logManager == nil { return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("container log manager is not configured")) } diff --git a/internal/app/controller/container_logs_test.go b/internal/app/controller/container_logs_test.go index 7cadafe..5248415 100644 --- a/internal/app/controller/container_logs_test.go +++ b/internal/app/controller/container_logs_test.go @@ -17,7 +17,7 @@ import ( "forgejo.alexma.top/alexma233/composia/internal/platform/store" ) -func TestContainerServiceGetContainerLogsStreamsThroughAgentTunnel(t *testing.T) { +func TestDockerCommandServiceGetContainerLogsStreamsThroughAgentTunnel(t *testing.T) { t.Parallel() db := openControllerTestDB(t) @@ -42,8 +42,8 @@ func TestContainerServiceGetContainerLogsStreamsThroughAgentTunnel(t *testing.T) return "web-admin", nil }) - path, handler := controllerv1connect.NewContainerServiceHandler( - &containerServer{ + path, handler := controllerv1connect.NewDockerCommandServiceHandler( + &dockerCommandServer{ db: db, cfg: &config.ControllerConfig{Nodes: []config.NodeConfig{{ID: "main"}}}, logManager: logManager, @@ -55,7 +55,7 @@ func TestContainerServiceGetContainerLogsStreamsThroughAgentTunnel(t *testing.T) httpServer := httptest.NewServer(mux) defer httpServer.Close() - client := controllerv1connect.NewContainerServiceClient( + client := controllerv1connect.NewDockerCommandServiceClient( httpServer.Client(), httpServer.URL, connect.WithInterceptors(rpcutil.NewStaticBearerAuthInterceptor("access-token")), diff --git a/internal/app/controller/exec_tunnel.go b/internal/app/controller/exec_tunnel.go index 46f9960..7cca869 100644 --- a/internal/app/controller/exec_tunnel.go +++ b/internal/app/controller/exec_tunnel.go @@ -530,7 +530,7 @@ func (server *agentReportServer) OpenExecTunnel(ctx context.Context, stream *con } } -func (server *containerServer) openExecSession(ctx context.Context, nodeID, containerID string, command []string, rows, cols uint32) (*execSession, error) { +func (server *dockerCommandServer) openExecSession(ctx context.Context, nodeID, containerID string, command []string, rows, cols uint32) (*execSession, error) { allowedOrigin, _ := ctx.Value(execOriginContextKey{}).(string) allowedOrigin = strings.TrimSpace(allowedOrigin) if allowedOrigin == "" { @@ -549,7 +549,7 @@ func (server *containerServer) openExecSession(ctx context.Context, nodeID, cont return server.execManager.openSession(nodeID, containerID, command, rows, cols, allowedOrigin, createdBy) } -func (server *containerServer) OpenContainerExec(ctx context.Context, req *connect.Request[controllerv1.OpenContainerExecRequest]) (*connect.Response[controllerv1.OpenContainerExecResponse], error) { +func (server *dockerCommandServer) OpenContainerExec(ctx context.Context, req *connect.Request[controllerv1.OpenContainerExecRequest]) (*connect.Response[controllerv1.OpenContainerExecResponse], error) { if req.Msg == nil || req.Msg.GetNodeId() == "" || req.Msg.GetContainerId() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id and container_id are required")) } @@ -575,7 +575,7 @@ func (server *containerServer) OpenContainerExec(ctx context.Context, req *conne }), nil } -func (server *containerServer) RunContainerExec(ctx context.Context, req *connect.Request[controllerv1.RunContainerExecRequest]) (*connect.Response[controllerv1.RunContainerExecResponse], error) { +func (server *dockerCommandServer) RunContainerExec(ctx context.Context, req *connect.Request[controllerv1.RunContainerExecRequest]) (*connect.Response[controllerv1.RunContainerExecResponse], error) { if req.Msg == nil || req.Msg.GetNodeId() == "" || req.Msg.GetContainerId() == "" || len(req.Msg.GetCommand()) == 0 { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("node_id, container_id, and command are required")) } diff --git a/internal/app/controller/exec_tunnel_test.go b/internal/app/controller/exec_tunnel_test.go index fdbf176..e7d2d55 100644 --- a/internal/app/controller/exec_tunnel_test.go +++ b/internal/app/controller/exec_tunnel_test.go @@ -42,8 +42,8 @@ func TestContainerExecRequiresWebOriginHeader(t *testing.T) { return "web-admin", nil }) - path, handler := controllerv1connect.NewContainerServiceHandler( - &containerServer{ + path, handler := controllerv1connect.NewDockerCommandServiceHandler( + &dockerCommandServer{ db: db, cfg: &config.ControllerConfig{Nodes: []config.NodeConfig{{ID: "main"}}}, execManager: execManager, @@ -55,7 +55,7 @@ func TestContainerExecRequiresWebOriginHeader(t *testing.T) { httpServer := httptest.NewServer(mux) defer httpServer.Close() - client := controllerv1connect.NewContainerServiceClient( + client := controllerv1connect.NewDockerCommandServiceClient( httpServer.Client(), httpServer.URL, connect.WithInterceptors(rpcutil.NewStaticBearerAuthInterceptor("access-token")), @@ -97,8 +97,8 @@ func TestContainerExecWebsocketRequiresAllowedOriginAndOneTimeToken(t *testing.T return "web-admin", nil }) - path, handler := controllerv1connect.NewContainerServiceHandler( - &containerServer{ + path, handler := controllerv1connect.NewDockerCommandServiceHandler( + &dockerCommandServer{ db: db, cfg: &config.ControllerConfig{Nodes: []config.NodeConfig{{ID: "main"}}}, execManager: execManager, @@ -111,7 +111,7 @@ func TestContainerExecWebsocketRequiresAllowedOriginAndOneTimeToken(t *testing.T httpServer := httptest.NewServer(mux) defer httpServer.Close() - client := controllerv1connect.NewContainerServiceClient( + client := controllerv1connect.NewDockerCommandServiceClient( httpServer.Client(), httpServer.URL, connect.WithInterceptors(rpcutil.NewStaticBearerAuthInterceptor("access-token")), diff --git a/internal/app/controller/repo_command.go b/internal/app/controller/repo_command.go index 0635ff5..c7cd46d 100644 --- a/internal/app/controller/repo_command.go +++ b/internal/app/controller/repo_command.go @@ -65,7 +65,16 @@ func (server *repoCommandServer) SyncRepo(ctx context.Context, _ *connect.Reques }), nil } -func (server *repoCommandServer) UpdateRepoFile(ctx context.Context, req *connect.Request[controllerv1.UpdateRepoFileRequest]) (*connect.Response[controllerv1.UpdateRepoFileResponse], error) { +func repoWriteResultMessage(result repoWriteResult) *controllerv1.RepoWriteResult { + return &controllerv1.RepoWriteResult{ + CommitId: result.CommitID, + SyncStatus: result.SyncStatus, + PushError: result.PushError, + LastSuccessfulPullAt: result.LastSuccessfulPullAt, + } +} + +func (server *repoCommandServer) UpdateRepoFile(ctx context.Context, req *connect.Request[controllerv1.UpdateRepoFileRequest]) (*connect.Response[controllerv1.RepoWriteResult], error) { if req.Msg == nil || req.Msg.GetPath() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("path is required")) } @@ -78,15 +87,10 @@ func (server *repoCommandServer) UpdateRepoFile(ctx context.Context, req *connec if err != nil { return nil, err } - return connect.NewResponse(&controllerv1.UpdateRepoFileResponse{ - CommitId: result.CommitID, - SyncStatus: result.SyncStatus, - PushError: result.PushError, - LastSuccessfulPullAt: result.LastSuccessfulPullAt, - }), nil + return connect.NewResponse(repoWriteResultMessage(result)), nil } -func (server *repoCommandServer) CreateRepoDirectory(ctx context.Context, req *connect.Request[controllerv1.CreateRepoDirectoryRequest]) (*connect.Response[controllerv1.CreateRepoDirectoryResponse], error) { +func (server *repoCommandServer) CreateRepoDirectory(ctx context.Context, req *connect.Request[controllerv1.CreateRepoDirectoryRequest]) (*connect.Response[controllerv1.RepoWriteResult], error) { if req.Msg == nil || req.Msg.GetPath() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("path is required")) } @@ -99,15 +103,10 @@ func (server *repoCommandServer) CreateRepoDirectory(ctx context.Context, req *c if err != nil { return nil, err } - return connect.NewResponse(&controllerv1.CreateRepoDirectoryResponse{ - CommitId: result.CommitID, - SyncStatus: result.SyncStatus, - PushError: result.PushError, - LastSuccessfulPullAt: result.LastSuccessfulPullAt, - }), nil + return connect.NewResponse(repoWriteResultMessage(result)), nil } -func (server *repoCommandServer) MoveRepoPath(ctx context.Context, req *connect.Request[controllerv1.MoveRepoPathRequest]) (*connect.Response[controllerv1.MoveRepoPathResponse], error) { +func (server *repoCommandServer) MoveRepoPath(ctx context.Context, req *connect.Request[controllerv1.MoveRepoPathRequest]) (*connect.Response[controllerv1.RepoWriteResult], error) { if req.Msg == nil || req.Msg.GetSourcePath() == "" || req.Msg.GetDestinationPath() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("source_path and destination_path are required")) } @@ -120,15 +119,10 @@ func (server *repoCommandServer) MoveRepoPath(ctx context.Context, req *connect. if err != nil { return nil, err } - return connect.NewResponse(&controllerv1.MoveRepoPathResponse{ - CommitId: result.CommitID, - SyncStatus: result.SyncStatus, - PushError: result.PushError, - LastSuccessfulPullAt: result.LastSuccessfulPullAt, - }), nil + return connect.NewResponse(repoWriteResultMessage(result)), nil } -func (server *repoCommandServer) DeleteRepoPath(ctx context.Context, req *connect.Request[controllerv1.DeleteRepoPathRequest]) (*connect.Response[controllerv1.DeleteRepoPathResponse], error) { +func (server *repoCommandServer) DeleteRepoPath(ctx context.Context, req *connect.Request[controllerv1.DeleteRepoPathRequest]) (*connect.Response[controllerv1.RepoWriteResult], error) { if req.Msg == nil || req.Msg.GetPath() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("path is required")) } @@ -141,12 +135,7 @@ func (server *repoCommandServer) DeleteRepoPath(ctx context.Context, req *connec if err != nil { return nil, err } - return connect.NewResponse(&controllerv1.DeleteRepoPathResponse{ - CommitId: result.CommitID, - SyncStatus: result.SyncStatus, - PushError: result.PushError, - LastSuccessfulPullAt: result.LastSuccessfulPullAt, - }), nil + return connect.NewResponse(repoWriteResultMessage(result)), nil } func (server *repoCommandServer) repoLock() *sync.Mutex { diff --git a/internal/app/controller/secret.go b/internal/app/controller/secret.go index 6996352..2a82627 100644 --- a/internal/app/controller/secret.go +++ b/internal/app/controller/secret.go @@ -50,7 +50,7 @@ func (server *secretServer) GetSecret(ctx context.Context, req *connect.Request[ return connect.NewResponse(&controllerv1.GetSecretResponse{ServiceName: service.Name, FilePath: req.Msg.GetFilePath(), Content: plaintext}), nil } -func (server *secretServer) UpdateSecret(ctx context.Context, req *connect.Request[controllerv1.UpdateSecretRequest]) (*connect.Response[controllerv1.UpdateSecretResponse], error) { +func (server *secretServer) UpdateSecret(ctx context.Context, req *connect.Request[controllerv1.UpdateSecretRequest]) (*connect.Response[controllerv1.RepoWriteResult], error) { if req.Msg == nil || req.Msg.GetServiceName() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("service_name is required")) } @@ -82,12 +82,7 @@ func (server *secretServer) UpdateSecret(ctx context.Context, req *connect.Reque if err != nil { return nil, err } - return connect.NewResponse(&controllerv1.UpdateSecretResponse{ - CommitId: result.CommitID, - SyncStatus: result.SyncStatus, - PushError: result.PushError, - LastSuccessfulPullAt: result.LastSuccessfulPullAt, - }), nil + return connect.NewResponse(repoWriteResultMessage(result)), nil } func (server *secretServer) resolveServiceFilePath(serviceName, filePath string) (*repo.Service, string, error) { diff --git a/internal/app/controller/service_command.go b/internal/app/controller/service_command.go index 3732c18..2da1fb4 100644 --- a/internal/app/controller/service_command.go +++ b/internal/app/controller/service_command.go @@ -34,7 +34,7 @@ type serviceCommandServer struct { repoMu *sync.Mutex } -func (server *serviceCommandServer) UpdateServiceTargetNodes(ctx context.Context, req *connect.Request[controllerv1.UpdateServiceTargetNodesRequest]) (*connect.Response[controllerv1.UpdateServiceTargetNodesResponse], error) { +func (server *serviceCommandServer) UpdateServiceTargetNodes(ctx context.Context, req *connect.Request[controllerv1.UpdateServiceTargetNodesRequest]) (*connect.Response[controllerv1.RepoWriteResult], error) { if req.Msg == nil || req.Msg.GetServiceName() == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("service_name is required")) } @@ -64,12 +64,7 @@ func (server *serviceCommandServer) UpdateServiceTargetNodes(ctx context.Context if err != nil { return nil, err } - return connect.NewResponse(&controllerv1.UpdateServiceTargetNodesResponse{ - CommitId: result.CommitID, - SyncStatus: result.SyncStatus, - PushError: result.PushError, - LastSuccessfulPullAt: result.LastSuccessfulPullAt, - }), nil + return connect.NewResponse(repoWriteResultMessage(result)), nil } func (server *serviceCommandServer) RunServiceAction(ctx context.Context, req *connect.Request[controllerv1.RunServiceActionRequest]) (*connect.Response[controllerv1.RunServiceActionResponse], error) { @@ -730,12 +725,7 @@ func runServiceActionResponse(records []task.Record, repoWrite *repoWriteResult) response.Tasks = append(response.Tasks, taskActionResponse(record)) } if repoWrite != nil { - response.RepoWrite = &controllerv1.ServiceActionRepoWriteResult{ - CommitId: repoWrite.CommitID, - SyncStatus: repoWrite.SyncStatus, - PushError: repoWrite.PushError, - LastSuccessfulPullAt: repoWrite.LastSuccessfulPullAt, - } + response.RepoWrite = repoWriteResultMessage(*repoWrite) } return response } diff --git a/internal/app/controller/service_test.go b/internal/app/controller/service_test.go index 5243350..94353ee 100644 --- a/internal/app/controller/service_test.go +++ b/internal/app/controller/service_test.go @@ -349,10 +349,13 @@ func TestServiceQueryServiceGetServiceBackupsReturnsFilteredBackups(t *testing.T if err := syncDeclaredServicesForTests(ctx, db, "alpha", "bravo"); err != nil { t.Fatalf("sync declared services: %v", err) } - if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-1", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "alpha", CreatedAt: time.Date(2026, 4, 4, 11, 0, 0, 0, time.UTC)}); err != nil { + if err := db.SyncConfiguredNodes(ctx, []string{"main"}); err != nil { + t.Fatalf("sync configured nodes: %v", err) + } + if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-1", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "alpha", NodeID: "main", CreatedAt: time.Date(2026, 4, 4, 11, 0, 0, 0, time.UTC)}); err != nil { t.Fatalf("create alpha backup task: %v", err) } - if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-2", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "bravo", CreatedAt: time.Date(2026, 4, 4, 11, 5, 0, 0, time.UTC)}); err != nil { + if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-2", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "bravo", NodeID: "main", CreatedAt: time.Date(2026, 4, 4, 11, 5, 0, 0, time.UTC)}); err != nil { t.Fatalf("create bravo backup task: %v", err) } if err := db.UpsertBackupRecord(ctx, store.BackupDetail{BackupID: "backup-1", TaskID: "task-1", ServiceName: "alpha", DataName: "config", Status: "succeeded", StartedAt: "2026-04-04T11:00:00Z", FinishedAt: "2026-04-04T11:01:00Z"}); err != nil { diff --git a/internal/platform/store/backups.go b/internal/platform/store/backups.go index 2d3d8e2..b52203b 100644 --- a/internal/platform/store/backups.go +++ b/internal/platform/store/backups.go @@ -43,6 +43,9 @@ func (db *DB) UpsertBackupRecord(ctx context.Context, detail BackupDetail) error } detail.NodeID = nodeID } + if detail.NodeID == "" { + return fmt.Errorf("backup %q requires node_id", detail.BackupID) + } _, err := db.sql.ExecContext(ctx, ` INSERT INTO backups ( @@ -72,7 +75,7 @@ func (db *DB) UpsertBackupRecord(ctx context.Context, detail BackupDetail) error detail.BackupID, detail.TaskID, detail.ServiceName, - nullableString(detail.NodeID), + detail.NodeID, detail.DataName, detail.Status, detail.StartedAt, @@ -104,11 +107,11 @@ func (db *DB) ListBackups( whereClause, args = appendBackupFilterInClause(whereClause, args, "backups.service_name", serviceNameFilters) whereClause, args = appendBackupFilterInClause(whereClause, args, "backups.status", statusFilters) whereClause, args = appendBackupFilterInClause(whereClause, args, "backups.data_name", dataNameFilters) - whereClause, args = appendBackupFilterInClause(whereClause, args, "COALESCE(backups.node_id, '')", nodeIDFilters) + whereClause, args = appendBackupFilterInClause(whereClause, args, "backups.node_id", nodeIDFilters) whereClause, args = appendBackupFilterNotInClause(whereClause, args, "backups.service_name", excludeServiceNameFilters) whereClause, args = appendBackupFilterNotInClause(whereClause, args, "backups.status", excludeStatusFilters) whereClause, args = appendBackupFilterNotInClause(whereClause, args, "backups.data_name", excludeDataNameFilters) - whereClause, args = appendBackupFilterNotInClause(whereClause, args, "COALESCE(backups.node_id, '')", excludeNodeIDFilters) + whereClause, args = appendBackupFilterNotInClause(whereClause, args, "backups.node_id", excludeNodeIDFilters) var totalCount uint32 countQuery := `SELECT COUNT(*) FROM backups ` + whereClause @@ -118,7 +121,7 @@ func (db *DB) ListBackups( offset := (page - 1) * limit query := ` - SELECT backups.backup_id, backups.task_id, backups.service_name, COALESCE(backups.node_id, ''), backups.data_name, backups.status, backups.started_at, COALESCE(backups.finished_at, '') + SELECT backups.backup_id, backups.task_id, backups.service_name, backups.node_id, backups.data_name, backups.status, backups.started_at, COALESCE(backups.finished_at, '') FROM backups ` + whereClause query += ` ORDER BY COALESCE(backups.finished_at, backups.started_at) DESC, backups.backup_id DESC LIMIT ? OFFSET ?` @@ -155,7 +158,7 @@ func appendBackupFilterNotInClause(whereClause string, args []any, expression st func (db *DB) GetBackup(ctx context.Context, backupID string) (BackupDetail, error) { var detail BackupDetail err := db.sql.QueryRowContext(ctx, ` - SELECT backups.backup_id, backups.task_id, backups.service_name, COALESCE(backups.node_id, ''), backups.data_name, backups.status, backups.started_at, COALESCE(backups.finished_at, ''), COALESCE(backups.artifact_ref, ''), COALESCE(backups.error_summary, '') + SELECT backups.backup_id, backups.task_id, backups.service_name, backups.node_id, backups.data_name, backups.status, backups.started_at, COALESCE(backups.finished_at, ''), COALESCE(backups.artifact_ref, ''), COALESCE(backups.error_summary, '') FROM backups WHERE backups.backup_id = ? `, backupID).Scan(&detail.BackupID, &detail.TaskID, &detail.ServiceName, &detail.NodeID, &detail.DataName, &detail.Status, &detail.StartedAt, &detail.FinishedAt, &detail.ArtifactRef, &detail.ErrorSummary) @@ -170,7 +173,7 @@ func (db *DB) GetBackup(ctx context.Context, backupID string) (BackupDetail, err func (db *DB) ListBackupsForTask(ctx context.Context, taskID string) ([]BackupDetail, error) { rows, err := db.sql.QueryContext(ctx, ` - SELECT backups.backup_id, backups.task_id, backups.service_name, COALESCE(backups.node_id, ''), backups.data_name, backups.status, backups.started_at, COALESCE(backups.finished_at, ''), COALESCE(backups.artifact_ref, ''), COALESCE(backups.error_summary, '') + SELECT backups.backup_id, backups.task_id, backups.service_name, backups.node_id, backups.data_name, backups.status, backups.started_at, COALESCE(backups.finished_at, ''), COALESCE(backups.artifact_ref, ''), COALESCE(backups.error_summary, '') FROM backups WHERE backups.task_id = ? ORDER BY backups.data_name ASC, backups.backup_id ASC diff --git a/internal/platform/store/backups_test.go b/internal/platform/store/backups_test.go index 7f140c9..a282574 100644 --- a/internal/platform/store/backups_test.go +++ b/internal/platform/store/backups_test.go @@ -78,7 +78,10 @@ func TestGetBackupReturnsDetail(t *testing.T) { if err := syncDeclaredServicesForTests(ctx, db, "alpha"); err != nil { t.Fatalf("sync declared services: %v", err) } - if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-1", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "alpha", CreatedAt: time.Date(2026, 4, 4, 12, 0, 0, 0, time.UTC)}); err != nil { + if err := db.SyncConfiguredNodes(ctx, []string{"main"}); err != nil { + t.Fatalf("sync configured nodes: %v", err) + } + if _, err := db.CreateTask(ctx, task.Record{TaskID: "task-1", Type: task.TypeBackup, Source: task.SourceCLI, ServiceName: "alpha", NodeID: "main", CreatedAt: time.Date(2026, 4, 4, 12, 0, 0, 0, time.UTC)}); err != nil { t.Fatalf("create task: %v", err) } if err := db.UpsertBackupRecord(ctx, BackupDetail{BackupID: "backup-1", TaskID: "task-1", ServiceName: "alpha", DataName: "config", Status: "succeeded", StartedAt: "2026-04-04T12:00:00Z", FinishedAt: "2026-04-04T12:01:00Z", ArtifactRef: "snapshot-1"}); err != nil { @@ -94,7 +97,7 @@ func TestGetBackupReturnsDetail(t *testing.T) { } } -func TestBackupNodeIDFallsBackToSourceTask(t *testing.T) { +func TestBackupNodeIDIsResolvedFromSourceTaskOnWrite(t *testing.T) { t.Parallel() db := openTestDB(t) @@ -119,6 +122,6 @@ func TestBackupNodeIDFallsBackToSourceTask(t *testing.T) { t.Fatalf("get backup: %v", err) } if backup.NodeID != "main" { - t.Fatalf("expected fallback node main, got %q", backup.NodeID) + t.Fatalf("expected resolved node main, got %q", backup.NodeID) } } diff --git a/internal/platform/store/db.go b/internal/platform/store/db.go index 8f89f2f..a5d2521 100644 --- a/internal/platform/store/db.go +++ b/internal/platform/store/db.go @@ -15,7 +15,7 @@ import ( const DatabaseFileName = "composia.db" -const sqliteSchemaVersion = 4 +const sqliteSchemaVersion = 5 var ErrServiceNotFound = errors.New("service not found") @@ -886,7 +886,7 @@ func (db *DB) migrate(ctx context.Context) error { backup_id TEXT PRIMARY KEY, task_id TEXT NOT NULL, service_name TEXT NOT NULL, - node_id TEXT, + node_id TEXT NOT NULL, data_name TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('pending', 'running', 'awaiting_confirmation', 'succeeded', 'failed', 'cancelled')), started_at TEXT NOT NULL, @@ -898,7 +898,6 @@ func (db *DB) migrate(ctx context.Context) error { FOREIGN KEY (service_name, node_id) REFERENCES service_instances(service_name, node_id), FOREIGN KEY (node_id) REFERENCES nodes(node_id) );`, - `ALTER TABLE backups ADD COLUMN node_id TEXT;`, `CREATE TABLE IF NOT EXISTS repo_state ( singleton_id INTEGER PRIMARY KEY CHECK (singleton_id = 1), sync_status TEXT NOT NULL, @@ -910,7 +909,6 @@ func (db *DB) migrate(ctx context.Context) error { `CREATE INDEX IF NOT EXISTS idx_tasks_service_created_at ON tasks(service_name, created_at DESC);`, `CREATE INDEX IF NOT EXISTS idx_tasks_node_created_at ON tasks(node_id, created_at DESC);`, `CREATE INDEX IF NOT EXISTS idx_services_declared_runtime_status ON services(is_declared, runtime_status);`, - `CREATE INDEX IF NOT EXISTS idx_service_instances_service_node ON service_instances(service_name, node_id);`, `CREATE INDEX IF NOT EXISTS idx_service_instances_service_runtime_status ON service_instances(service_name, runtime_status);`, `CREATE INDEX IF NOT EXISTS idx_backups_service_finished_at ON backups(service_name, finished_at DESC);`, `CREATE INDEX IF NOT EXISTS idx_backups_status_finished_at ON backups(status, finished_at DESC);`, @@ -986,7 +984,7 @@ func (db *DB) migrate(ctx context.Context) error { backup_id TEXT PRIMARY KEY, task_id TEXT NOT NULL, service_name TEXT NOT NULL, - node_id TEXT, + node_id TEXT NOT NULL, data_name TEXT NOT NULL, status TEXT NOT NULL, started_at TEXT NOT NULL, @@ -1048,6 +1046,63 @@ func (db *DB) migrate(ctx context.Context) error { `CREATE TRIGGER IF NOT EXISTS trg_service_image_update_checks_validate_insert BEFORE INSERT ON service_image_update_checks FOR EACH ROW BEGIN SELECT CASE WHEN NEW.update_available NOT IN (0, 1) THEN RAISE(ABORT, 'invalid service_image_update_checks.update_available') WHEN NEW.check_status NOT IN ('unknown', 'ok', 'error') THEN RAISE(ABORT, 'invalid service_image_update_checks.check_status') WHEN NEW.candidate_tags_json IS NOT NULL AND json_valid(NEW.candidate_tags_json) = 0 THEN RAISE(ABORT, 'invalid service_image_update_checks.candidate_tags_json') END; END;`, `CREATE TRIGGER IF NOT EXISTS trg_service_image_update_checks_validate_update BEFORE UPDATE OF update_available, check_status, candidate_tags_json ON service_image_update_checks FOR EACH ROW BEGIN SELECT CASE WHEN NEW.update_available NOT IN (0, 1) THEN RAISE(ABORT, 'invalid service_image_update_checks.update_available') WHEN NEW.check_status NOT IN ('unknown', 'ok', 'error') THEN RAISE(ABORT, 'invalid service_image_update_checks.check_status') WHEN NEW.candidate_tags_json IS NOT NULL AND json_valid(NEW.candidate_tags_json) = 0 THEN RAISE(ABORT, 'invalid service_image_update_checks.candidate_tags_json') END; END;`, }, + }, { + version: 5, + statements: []string{ + `DROP INDEX IF EXISTS idx_service_instances_service_node;`, + `ALTER TABLE backups ADD COLUMN node_id TEXT;`, + `UPDATE backups + SET node_id = ( + SELECT tasks.node_id + FROM tasks + WHERE tasks.task_id = backups.task_id + ) + WHERE node_id IS NULL;`, + `CREATE TABLE backups_v5 ( + backup_id TEXT PRIMARY KEY, + task_id TEXT NOT NULL, + service_name TEXT NOT NULL, + node_id TEXT NOT NULL, + data_name TEXT NOT NULL, + status TEXT NOT NULL CHECK (status IN ('pending', 'running', 'awaiting_confirmation', 'succeeded', 'failed', 'cancelled')), + started_at TEXT NOT NULL, + finished_at TEXT, + artifact_ref TEXT, + error_summary TEXT, + FOREIGN KEY (task_id) REFERENCES tasks(task_id), + FOREIGN KEY (service_name) REFERENCES services(service_name), + FOREIGN KEY (service_name, node_id) REFERENCES service_instances(service_name, node_id), + FOREIGN KEY (node_id) REFERENCES nodes(node_id) + );`, + `INSERT INTO backups_v5 ( + backup_id, + task_id, + service_name, + node_id, + data_name, + status, + started_at, + finished_at, + artifact_ref, + error_summary + ) + SELECT + backup_id, + task_id, + service_name, + node_id, + data_name, + status, + started_at, + finished_at, + artifact_ref, + error_summary + FROM backups;`, + `DROP TABLE backups;`, + `ALTER TABLE backups_v5 RENAME TO backups;`, + `CREATE INDEX IF NOT EXISTS idx_backups_service_finished_at ON backups(service_name, finished_at DESC);`, + `CREATE INDEX IF NOT EXISTS idx_backups_status_finished_at ON backups(status, finished_at DESC);`, + }, }} tx, err := db.sql.BeginTx(ctx, nil) diff --git a/internal/platform/store/db_test.go b/internal/platform/store/db_test.go index ae99f54..5279917 100644 --- a/internal/platform/store/db_test.go +++ b/internal/platform/store/db_test.go @@ -175,7 +175,7 @@ func TestMigrateSetsSQLiteUserVersion(t *testing.T) { } } -func TestMigrateAddsBackupNodeIDToLegacyDatabase(t *testing.T) { +func TestMigrateBackfillsBackupNodeIDAndEnforcesInstanceIntegrity(t *testing.T) { t.Parallel() stateDir := filepath.Join(t.TempDir(), "state") diff --git a/proto/composia/controller/v1/backup.proto b/proto/composia/controller/v1/backup.proto index 71c56e9..febc727 100644 --- a/proto/composia/controller/v1/backup.proto +++ b/proto/composia/controller/v1/backup.proto @@ -7,12 +7,16 @@ import "proto/composia/controller/v1/system.proto"; option go_package = "forgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1"; -// BackupRecordService exposes read-only backup record queries. -service BackupRecordService { +// BackupQueryService exposes backup record queries. +service BackupQueryService { // ListBackups returns backup records with filtering and pagination. rpc ListBackups(ListBackupsRequest) returns (ListBackupsResponse); // GetBackup returns one backup record by ID. rpc GetBackup(GetBackupRequest) returns (GetBackupResponse); +} + +// BackupCommandService starts backup-related actions. +service BackupCommandService { // RestoreBackup starts an async restore task from one backup record. rpc RestoreBackup(RestoreBackupRequest) returns (TaskActionResponse); } diff --git a/proto/composia/controller/v1/container.proto b/proto/composia/controller/v1/container.proto index 6ac6c7e..eb82b4b 100644 --- a/proto/composia/controller/v1/container.proto +++ b/proto/composia/controller/v1/container.proto @@ -6,8 +6,8 @@ import "proto/composia/controller/v1/task.proto"; option go_package = "forgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1"; -// ContainerService exposes container-level control and inspection entrypoints. -service ContainerService { +// DockerCommandService exposes node-scoped Docker command entrypoints. +service DockerCommandService { // RunContainerAction starts an async action for one container on one node. rpc RunContainerAction(RunContainerActionRequest) returns (TaskActionResponse); // RemoveContainer starts an async deletion for one container on one node. diff --git a/proto/composia/controller/v1/repo.proto b/proto/composia/controller/v1/repo.proto index 0a3689c..70a405f 100644 --- a/proto/composia/controller/v1/repo.proto +++ b/proto/composia/controller/v1/repo.proto @@ -21,13 +21,13 @@ service RepoQueryService { // RepoCommandService applies changes to the controller Git repo. service RepoCommandService { // UpdateRepoFile writes one file, creates a commit, and reports sync state. - rpc UpdateRepoFile(UpdateRepoFileRequest) returns (UpdateRepoFileResponse); + rpc UpdateRepoFile(UpdateRepoFileRequest) returns (RepoWriteResult); // CreateRepoDirectory creates one directory, creates a commit, and reports sync state. - rpc CreateRepoDirectory(CreateRepoDirectoryRequest) returns (CreateRepoDirectoryResponse); + rpc CreateRepoDirectory(CreateRepoDirectoryRequest) returns (RepoWriteResult); // MoveRepoPath moves or renames one repo path. - rpc MoveRepoPath(MoveRepoPathRequest) returns (MoveRepoPathResponse); + rpc MoveRepoPath(MoveRepoPathRequest) returns (RepoWriteResult); // DeleteRepoPath deletes one repo path. - rpc DeleteRepoPath(DeleteRepoPathRequest) returns (DeleteRepoPathResponse); + rpc DeleteRepoPath(DeleteRepoPathRequest) returns (RepoWriteResult); // SyncRepo pulls or syncs the repo and returns the resulting state snapshot. rpc SyncRepo(SyncRepoRequest) returns (SyncRepoResponse); } @@ -145,8 +145,8 @@ message UpdateRepoFileRequest { string commit_message = 4; } -// UpdateRepoFileResponse reports the commit and sync result for the write. -message UpdateRepoFileResponse { +// RepoWriteResult reports the commit and sync result for a repo write. +message RepoWriteResult { // commit_id is the Git commit created for the write. string commit_id = 1; // sync_status is the repo sync state after the write. @@ -167,18 +167,6 @@ message CreateRepoDirectoryRequest { string commit_message = 3; } -// CreateRepoDirectoryResponse reports the commit and sync result for the create. -message CreateRepoDirectoryResponse { - // commit_id is the Git commit created for the directory creation. - string commit_id = 1; - // sync_status is the repo sync state after the write. - string sync_status = 2; - // push_error contains the last push error when sync_status is failed. - string push_error = 3; - // last_successful_pull_at is the last successful pull timestamp string. - string last_successful_pull_at = 4; -} - // MoveRepoPathRequest moves one repo-relative path to another. message MoveRepoPathRequest { // source_path is the existing repo-relative path to move. @@ -191,18 +179,6 @@ message MoveRepoPathRequest { string commit_message = 4; } -// MoveRepoPathResponse reports the commit and sync result for the move. -message MoveRepoPathResponse { - // commit_id is the Git commit created for the move. - string commit_id = 1; - // sync_status is the repo sync state after the write. - string sync_status = 2; - // push_error contains the last push error when sync_status is failed. - string push_error = 3; - // last_successful_pull_at is the last successful pull timestamp string. - string last_successful_pull_at = 4; -} - // DeleteRepoPathRequest deletes one repo-relative path. message DeleteRepoPathRequest { // path is the repo-relative path to delete. @@ -213,18 +189,6 @@ message DeleteRepoPathRequest { string commit_message = 3; } -// DeleteRepoPathResponse reports the commit and sync result for the delete. -message DeleteRepoPathResponse { - // commit_id is the Git commit created for the delete. - string commit_id = 1; - // sync_status is the repo sync state after the write. - string sync_status = 2; - // push_error contains the last push error when sync_status is failed. - string push_error = 3; - // last_successful_pull_at is the last successful pull timestamp string. - string last_successful_pull_at = 4; -} - // SyncRepoRequest asks the controller to refresh repo state from its remote. message SyncRepoRequest {} diff --git a/proto/composia/controller/v1/secret.proto b/proto/composia/controller/v1/secret.proto index 02a189e..c30316c 100644 --- a/proto/composia/controller/v1/secret.proto +++ b/proto/composia/controller/v1/secret.proto @@ -2,6 +2,8 @@ syntax = "proto3"; package composia.controller.v1; +import "proto/composia/controller/v1/repo.proto"; + option go_package = "forgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1"; // SecretService reads and updates encrypted secret files stored in the repo. @@ -9,7 +11,7 @@ service SecretService { // GetSecret returns the decrypted content for one service secret file. rpc GetSecret(GetSecretRequest) returns (GetSecretResponse); // UpdateSecret writes one secret file and reports the resulting repo sync state. - rpc UpdateSecret(UpdateSecretRequest) returns (UpdateSecretResponse); + rpc UpdateSecret(UpdateSecretRequest) returns (RepoWriteResult); } // GetSecretRequest identifies one decrypted secret file for a service. @@ -37,15 +39,3 @@ message UpdateSecretRequest { // commit_message is used for the generated Git commit. string commit_message = 5; } - -// UpdateSecretResponse reports the commit and sync result for the secret update. -message UpdateSecretResponse { - // commit_id is the Git commit created for the secret update. - string commit_id = 1; - // sync_status is the repo sync state after the write. - string sync_status = 2; - // push_error contains the last push error when sync_status is failed. - string push_error = 3; - // last_successful_pull_at is the last successful pull timestamp string. - string last_successful_pull_at = 4; -} diff --git a/proto/composia/controller/v1/service.proto b/proto/composia/controller/v1/service.proto index 346c471..a5648b4 100644 --- a/proto/composia/controller/v1/service.proto +++ b/proto/composia/controller/v1/service.proto @@ -5,6 +5,7 @@ package composia.controller.v1; import "proto/composia/controller/v1/task.proto"; import "proto/composia/controller/v1/backup.proto"; import "proto/composia/controller/v1/system.proto"; +import "proto/composia/controller/v1/repo.proto"; option go_package = "forgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1;controllerv1"; @@ -29,7 +30,7 @@ service ServiceQueryService { // ServiceCommandService triggers service-level state changes and async actions. service ServiceCommandService { // UpdateServiceTargetNodes updates the declared target nodes for a service. - rpc UpdateServiceTargetNodes(UpdateServiceTargetNodesRequest) returns (UpdateServiceTargetNodesResponse); + rpc UpdateServiceTargetNodes(UpdateServiceTargetNodesRequest) returns (RepoWriteResult); // RunServiceAction starts an async action for a service and returns all created tasks. rpc RunServiceAction(RunServiceActionRequest) returns (RunServiceActionResponse); // MigrateService starts an async service migration between two nodes. @@ -284,30 +285,10 @@ message UpdateServiceTargetNodesRequest { string commit_message = 4; } -// UpdateServiceTargetNodesResponse reports the resulting repo write and sync state. -message UpdateServiceTargetNodesResponse { - // commit_id is the Git commit created for the desired-state change. - string commit_id = 1; - // sync_status is the repo sync state after the write. - string sync_status = 2; - // push_error contains the last push error when sync_status is failed. - string push_error = 3; - // last_successful_pull_at is the last successful controller pull timestamp string. - string last_successful_pull_at = 4; -} - -// ServiceActionRepoWriteResult reports the Git write side effect produced by a service action. -message ServiceActionRepoWriteResult { - string commit_id = 1; - string sync_status = 2; - string push_error = 3; - string last_successful_pull_at = 4; -} - // RunServiceActionResponse returns every queued task and any repo write side effect. message RunServiceActionResponse { repeated TaskActionResponse tasks = 1; - ServiceActionRepoWriteResult repo_write = 2; + RepoWriteResult repo_write = 2; } // MigrateServiceRequest moves a service from one node to another. diff --git a/web/src/lib/server/controller.ts b/web/src/lib/server/controller.ts index 5e4b031..90a9639 100644 --- a/web/src/lib/server/controller.ts +++ b/web/src/lib/server/controller.ts @@ -174,16 +174,9 @@ export type TaskActionResult = { repoRevision: string; }; -export type ServiceActionRepoWriteResult = { - commitId: string; - syncStatus: string; - pushError: string; - lastSuccessfulPullAt: string; -}; - export type ServiceActionResult = { tasks: TaskActionResult[]; - repoWrite?: ServiceActionRepoWriteResult; + repoWrite?: RepoWriteResult; }; export type ImageUpdateCheckSummary = { @@ -964,7 +957,7 @@ export async function loadBackups( config.baseUrl, config.token, controllerProcedure( - "/composia.controller.v1.BackupRecordService/ListBackups", + "/composia.controller.v1.BackupQueryService/ListBackups", ), { page, @@ -1020,7 +1013,7 @@ export async function loadBackupDetail( config.baseUrl, config.token, controllerProcedure( - "/composia.controller.v1.BackupRecordService/GetBackup", + "/composia.controller.v1.BackupQueryService/GetBackup", ), { backupId }, ); @@ -1045,7 +1038,7 @@ export async function restoreBackup( ): Promise { return callTaskAction( controllerProcedure( - "/composia.controller.v1.BackupRecordService/RestoreBackup", + "/composia.controller.v1.BackupCommandService/RestoreBackup", ), { backupId, @@ -1939,7 +1932,7 @@ export async function runContainerAction( ): Promise { return callTaskAction( controllerProcedure( - "/composia.controller.v1.ContainerService/RunContainerAction", + "/composia.controller.v1.DockerCommandService/RunContainerAction", ), { nodeId, containerId, action: toContainerActionEnum(action) }, ); @@ -1952,7 +1945,7 @@ export async function removeNodeContainer( ): Promise { return callTaskAction( controllerProcedure( - "/composia.controller.v1.ContainerService/RemoveContainer", + "/composia.controller.v1.DockerCommandService/RemoveContainer", ), { nodeId, @@ -1976,7 +1969,7 @@ export async function openContainerExec( config.baseUrl, config.token, controllerProcedure( - "/composia.controller.v1.ContainerService/OpenContainerExec", + "/composia.controller.v1.DockerCommandService/OpenContainerExec", ), { nodeId, containerId, command, rows, cols }, { "X-Composia-Web-Origin": browserOrigin }, @@ -2063,7 +2056,7 @@ export async function removeNodeNetwork( ): Promise { return callTaskAction( controllerProcedure( - "/composia.controller.v1.ContainerService/RemoveNetwork", + "/composia.controller.v1.DockerCommandService/RemoveNetwork", ), { nodeId, networkId }, ); @@ -2144,7 +2137,7 @@ export async function removeNodeVolume( ): Promise { return callTaskAction( controllerProcedure( - "/composia.controller.v1.ContainerService/RemoveVolume", + "/composia.controller.v1.DockerCommandService/RemoveVolume", ), { nodeId, volumeName }, ); @@ -2231,7 +2224,7 @@ export async function removeNodeImage( force = false, ): Promise { return callTaskAction( - controllerProcedure("/composia.controller.v1.ContainerService/RemoveImage"), + controllerProcedure("/composia.controller.v1.DockerCommandService/RemoveImage"), { nodeId, imageId, force }, ); } diff --git a/web/src/routes/nodes/[id]/docker/containers/[cid]/logs/+server.ts b/web/src/routes/nodes/[id]/docker/containers/[cid]/logs/+server.ts index d02a24c..35a8f84 100644 --- a/web/src/routes/nodes/[id]/docker/containers/[cid]/logs/+server.ts +++ b/web/src/routes/nodes/[id]/docker/containers/[cid]/logs/+server.ts @@ -25,7 +25,7 @@ export const GET: RequestHandler = async ({ params, url }) => { try { const upstream = await fetch( - `${config.baseUrl}${controllerProcedure("/composia.controller.v1.ContainerService/GetContainerLogs")}`, + `${config.baseUrl}${controllerProcedure("/composia.controller.v1.DockerCommandService/GetContainerLogs")}`, { method: "POST", headers: {