diff --git a/api/api.swagger.json b/api/api.swagger.json index ce53d89..4d1103e 100644 --- a/api/api.swagger.json +++ b/api/api.swagger.json @@ -3,7 +3,7 @@ "info": { "title": "Onepanel", "description": "Onepanel API", - "version": "0.12.0-rc.0", + "version": "0.12.1", "contact": { "name": "Onepanel project", "url": "https://github.com/onepanelio/core" @@ -2339,6 +2339,42 @@ ] } }, + "/apis/v1beta1/{namespace}/workspaces/{uid}/retry": { + "put": { + "operationId": "RetryLastWorkspaceAction", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/grpc.gateway.runtime.Error" + } + } + }, + "parameters": [ + { + "name": "namespace", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "uid", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "WorkspaceService" + ] + } + }, "/apis/v1beta1/{namespace}/workspaces/{uid}/status": { "put": { "operationId": "UpdateWorkspaceStatus", diff --git a/api/workspace.pb.go b/api/workspace.pb.go index c5b48ef..5fa4fbf 100644 --- a/api/workspace.pb.go +++ b/api/workspace.pb.go @@ -890,6 +890,61 @@ func (x *DeleteWorkspaceRequest) GetUid() string { return "" } +type RetryActionWorkspaceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` +} + +func (x *RetryActionWorkspaceRequest) Reset() { + *x = RetryActionWorkspaceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_workspace_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RetryActionWorkspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RetryActionWorkspaceRequest) ProtoMessage() {} + +func (x *RetryActionWorkspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_workspace_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RetryActionWorkspaceRequest.ProtoReflect.Descriptor instead. +func (*RetryActionWorkspaceRequest) Descriptor() ([]byte, []int) { + return file_workspace_proto_rawDescGZIP(), []int{13} +} + +func (x *RetryActionWorkspaceRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *RetryActionWorkspaceRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + var File_workspace_proto protoreflect.FileDescriptor var file_workspace_proto_rawDesc = []byte{ @@ -1012,71 +1067,85 @@ var file_workspace_proto_rawDesc = []byte{ 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 0x64, 0x32, 0x86, 0x08, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x0f, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2c, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x6c, 0x0a, - 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, - 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x75, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x61, - 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x1a, - 0x31, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x3a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x2a, 0x2f, 0x61, 0x70, + 0x03, 0x75, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x69, 0x64, 0x32, 0x97, 0x09, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, + 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x6c, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, + 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x75, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x7e, 0x0a, - 0x0e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x73, 0x12, 0x95, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x1a, 0x31, + 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x3a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x2a, 0x2f, 0x61, 0x70, 0x69, + 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x7e, 0x0a, 0x0e, + 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x30, 0x2f, 0x61, 0x70, 0x69, + 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, + 0x0f, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x1a, 0x31, 0x2f, + 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, + 0x12, 0x7a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, + 0x2a, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x8e, 0x01, 0x0a, + 0x18, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x65, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x12, 0x81, 0x01, - 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x1a, 0x31, - 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6d, - 0x65, 0x12, 0x7a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2c, 0x2a, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x62, 0x06, 0x70, + 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } @@ -1092,7 +1161,7 @@ func file_workspace_proto_rawDescGZIP() []byte { return file_workspace_proto_rawDescData } -var file_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_workspace_proto_goTypes = []interface{}{ (*Workspace)(nil), // 0: api.Workspace (*WorkspaceStatus)(nil), // 1: api.WorkspaceStatus @@ -1107,23 +1176,24 @@ var file_workspace_proto_goTypes = []interface{}{ (*PauseWorkspaceRequest)(nil), // 10: api.PauseWorkspaceRequest (*ResumeWorkspaceRequest)(nil), // 11: api.ResumeWorkspaceRequest (*DeleteWorkspaceRequest)(nil), // 12: api.DeleteWorkspaceRequest - (*Parameter)(nil), // 13: api.Parameter - (*WorkspaceTemplate)(nil), // 14: api.WorkspaceTemplate - (*KeyValue)(nil), // 15: api.KeyValue - (*empty.Empty)(nil), // 16: google.protobuf.Empty + (*RetryActionWorkspaceRequest)(nil), // 13: api.RetryActionWorkspaceRequest + (*Parameter)(nil), // 14: api.Parameter + (*WorkspaceTemplate)(nil), // 15: api.WorkspaceTemplate + (*KeyValue)(nil), // 16: api.KeyValue + (*empty.Empty)(nil), // 17: google.protobuf.Empty } var file_workspace_proto_depIdxs = []int32{ - 13, // 0: api.Workspace.parameters:type_name -> api.Parameter - 14, // 1: api.Workspace.workspaceTemplate:type_name -> api.WorkspaceTemplate + 14, // 0: api.Workspace.parameters:type_name -> api.Parameter + 15, // 1: api.Workspace.workspaceTemplate:type_name -> api.WorkspaceTemplate 1, // 2: api.Workspace.status:type_name -> api.WorkspaceStatus - 15, // 3: api.Workspace.labels:type_name -> api.KeyValue - 13, // 4: api.Workspace.templateParameters:type_name -> api.Parameter - 13, // 5: api.CreateWorkspaceBody.parameters:type_name -> api.Parameter - 15, // 6: api.CreateWorkspaceBody.labels:type_name -> api.KeyValue + 16, // 3: api.Workspace.labels:type_name -> api.KeyValue + 14, // 4: api.Workspace.templateParameters:type_name -> api.Parameter + 14, // 5: api.CreateWorkspaceBody.parameters:type_name -> api.Parameter + 16, // 6: api.CreateWorkspaceBody.labels:type_name -> api.KeyValue 2, // 7: api.CreateWorkspaceRequest.body:type_name -> api.CreateWorkspaceBody 1, // 8: api.UpdateWorkspaceStatusRequest.status:type_name -> api.WorkspaceStatus - 13, // 9: api.UpdateWorkspaceBody.parameters:type_name -> api.Parameter - 15, // 10: api.UpdateWorkspaceBody.labels:type_name -> api.KeyValue + 14, // 9: api.UpdateWorkspaceBody.parameters:type_name -> api.Parameter + 16, // 10: api.UpdateWorkspaceBody.labels:type_name -> api.KeyValue 6, // 11: api.UpdateWorkspaceRequest.body:type_name -> api.UpdateWorkspaceBody 0, // 12: api.ListWorkspaceResponse.workspaces:type_name -> api.Workspace 3, // 13: api.WorkspaceService.CreateWorkspace:input_type -> api.CreateWorkspaceRequest @@ -1134,16 +1204,18 @@ var file_workspace_proto_depIdxs = []int32{ 10, // 18: api.WorkspaceService.PauseWorkspace:input_type -> api.PauseWorkspaceRequest 11, // 19: api.WorkspaceService.ResumeWorkspace:input_type -> api.ResumeWorkspaceRequest 12, // 20: api.WorkspaceService.DeleteWorkspace:input_type -> api.DeleteWorkspaceRequest - 0, // 21: api.WorkspaceService.CreateWorkspace:output_type -> api.Workspace - 0, // 22: api.WorkspaceService.GetWorkspace:output_type -> api.Workspace - 9, // 23: api.WorkspaceService.ListWorkspaces:output_type -> api.ListWorkspaceResponse - 16, // 24: api.WorkspaceService.UpdateWorkspaceStatus:output_type -> google.protobuf.Empty - 16, // 25: api.WorkspaceService.UpdateWorkspace:output_type -> google.protobuf.Empty - 16, // 26: api.WorkspaceService.PauseWorkspace:output_type -> google.protobuf.Empty - 16, // 27: api.WorkspaceService.ResumeWorkspace:output_type -> google.protobuf.Empty - 16, // 28: api.WorkspaceService.DeleteWorkspace:output_type -> google.protobuf.Empty - 21, // [21:29] is the sub-list for method output_type - 13, // [13:21] is the sub-list for method input_type + 13, // 21: api.WorkspaceService.RetryLastWorkspaceAction:input_type -> api.RetryActionWorkspaceRequest + 0, // 22: api.WorkspaceService.CreateWorkspace:output_type -> api.Workspace + 0, // 23: api.WorkspaceService.GetWorkspace:output_type -> api.Workspace + 9, // 24: api.WorkspaceService.ListWorkspaces:output_type -> api.ListWorkspaceResponse + 17, // 25: api.WorkspaceService.UpdateWorkspaceStatus:output_type -> google.protobuf.Empty + 17, // 26: api.WorkspaceService.UpdateWorkspace:output_type -> google.protobuf.Empty + 17, // 27: api.WorkspaceService.PauseWorkspace:output_type -> google.protobuf.Empty + 17, // 28: api.WorkspaceService.ResumeWorkspace:output_type -> google.protobuf.Empty + 17, // 29: api.WorkspaceService.DeleteWorkspace:output_type -> google.protobuf.Empty + 17, // 30: api.WorkspaceService.RetryLastWorkspaceAction:output_type -> google.protobuf.Empty + 22, // [22:31] is the sub-list for method output_type + 13, // [13:22] is the sub-list for method input_type 13, // [13:13] is the sub-list for extension type_name 13, // [13:13] is the sub-list for extension extendee 0, // [0:13] is the sub-list for field type_name @@ -1314,6 +1386,18 @@ func file_workspace_proto_init() { return nil } } + file_workspace_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RetryActionWorkspaceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1321,7 +1405,7 @@ func file_workspace_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_workspace_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 14, NumExtensions: 0, NumServices: 1, }, @@ -1355,6 +1439,7 @@ type WorkspaceServiceClient interface { PauseWorkspace(ctx context.Context, in *PauseWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) ResumeWorkspace(ctx context.Context, in *ResumeWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) DeleteWorkspace(ctx context.Context, in *DeleteWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) + RetryLastWorkspaceAction(ctx context.Context, in *RetryActionWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) } type workspaceServiceClient struct { @@ -1437,6 +1522,15 @@ func (c *workspaceServiceClient) DeleteWorkspace(ctx context.Context, in *Delete return out, nil } +func (c *workspaceServiceClient) RetryLastWorkspaceAction(ctx context.Context, in *RetryActionWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/api.WorkspaceService/RetryLastWorkspaceAction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // WorkspaceServiceServer is the server API for WorkspaceService service. type WorkspaceServiceServer interface { CreateWorkspace(context.Context, *CreateWorkspaceRequest) (*Workspace, error) @@ -1447,6 +1541,7 @@ type WorkspaceServiceServer interface { PauseWorkspace(context.Context, *PauseWorkspaceRequest) (*empty.Empty, error) ResumeWorkspace(context.Context, *ResumeWorkspaceRequest) (*empty.Empty, error) DeleteWorkspace(context.Context, *DeleteWorkspaceRequest) (*empty.Empty, error) + RetryLastWorkspaceAction(context.Context, *RetryActionWorkspaceRequest) (*empty.Empty, error) } // UnimplementedWorkspaceServiceServer can be embedded to have forward compatible implementations. @@ -1477,6 +1572,9 @@ func (*UnimplementedWorkspaceServiceServer) ResumeWorkspace(context.Context, *Re func (*UnimplementedWorkspaceServiceServer) DeleteWorkspace(context.Context, *DeleteWorkspaceRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteWorkspace not implemented") } +func (*UnimplementedWorkspaceServiceServer) RetryLastWorkspaceAction(context.Context, *RetryActionWorkspaceRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RetryLastWorkspaceAction not implemented") +} func RegisterWorkspaceServiceServer(s *grpc.Server, srv WorkspaceServiceServer) { s.RegisterService(&_WorkspaceService_serviceDesc, srv) @@ -1626,6 +1724,24 @@ func _WorkspaceService_DeleteWorkspace_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _WorkspaceService_RetryLastWorkspaceAction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RetryActionWorkspaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkspaceServiceServer).RetryLastWorkspaceAction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.WorkspaceService/RetryLastWorkspaceAction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkspaceServiceServer).RetryLastWorkspaceAction(ctx, req.(*RetryActionWorkspaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _WorkspaceService_serviceDesc = grpc.ServiceDesc{ ServiceName: "api.WorkspaceService", HandlerType: (*WorkspaceServiceServer)(nil), @@ -1662,6 +1778,10 @@ var _WorkspaceService_serviceDesc = grpc.ServiceDesc{ MethodName: "DeleteWorkspace", Handler: _WorkspaceService_DeleteWorkspace_Handler, }, + { + MethodName: "RetryLastWorkspaceAction", + Handler: _WorkspaceService_RetryLastWorkspaceAction_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "workspace.proto", diff --git a/api/workspace.pb.gw.go b/api/workspace.pb.gw.go index 575ec8a..1b02629 100644 --- a/api/workspace.pb.gw.go +++ b/api/workspace.pb.gw.go @@ -658,6 +658,82 @@ func local_request_WorkspaceService_DeleteWorkspace_0(ctx context.Context, marsh } +func request_WorkspaceService_RetryLastWorkspaceAction_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RetryActionWorkspaceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["namespace"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") + } + + protoReq.Namespace, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) + } + + val, ok = pathParams["uid"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uid") + } + + protoReq.Uid, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uid", err) + } + + msg, err := client.RetryLastWorkspaceAction(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WorkspaceService_RetryLastWorkspaceAction_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RetryActionWorkspaceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["namespace"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") + } + + protoReq.Namespace, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) + } + + val, ok = pathParams["uid"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uid") + } + + protoReq.Uid, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uid", err) + } + + msg, err := server.RetryLastWorkspaceAction(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterWorkspaceServiceHandlerServer registers the http handlers for service WorkspaceService to "mux". // UnaryRPC :call WorkspaceServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -823,6 +899,26 @@ func RegisterWorkspaceServiceHandlerServer(ctx context.Context, mux *runtime.Ser }) + mux.Handle("PUT", pattern_WorkspaceService_RetryLastWorkspaceAction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkspaceService_RetryLastWorkspaceAction_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WorkspaceService_RetryLastWorkspaceAction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1024,6 +1120,26 @@ func RegisterWorkspaceServiceHandlerClient(ctx context.Context, mux *runtime.Ser }) + mux.Handle("PUT", pattern_WorkspaceService_RetryLastWorkspaceAction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkspaceService_RetryLastWorkspaceAction_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WorkspaceService_RetryLastWorkspaceAction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1043,6 +1159,8 @@ var ( pattern_WorkspaceService_ResumeWorkspace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "workspaces", "uid", "resume"}, "", runtime.AssumeColonVerbOpt(true))) pattern_WorkspaceService_DeleteWorkspace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"apis", "v1beta1", "namespace", "workspaces", "uid"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WorkspaceService_RetryLastWorkspaceAction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "workspaces", "uid", "retry"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1061,4 +1179,6 @@ var ( forward_WorkspaceService_ResumeWorkspace_0 = runtime.ForwardResponseMessage forward_WorkspaceService_DeleteWorkspace_0 = runtime.ForwardResponseMessage + + forward_WorkspaceService_RetryLastWorkspaceAction_0 = runtime.ForwardResponseMessage ) diff --git a/api/workspace.proto b/api/workspace.proto index ebcfa9f..021fa0f 100644 --- a/api/workspace.proto +++ b/api/workspace.proto @@ -59,6 +59,12 @@ service WorkspaceService { delete: "/apis/v1beta1/{namespace}/workspaces/{uid}" }; } + + rpc RetryLastWorkspaceAction (RetryActionWorkspaceRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + put: "/apis/v1beta1/{namespace}/workspaces/{uid}/retry" + }; + } } message Workspace { @@ -144,4 +150,9 @@ message ResumeWorkspaceRequest { message DeleteWorkspaceRequest { string namespace = 1; string uid = 2; +} + +message RetryActionWorkspaceRequest { + string namespace = 1; + string uid = 2; } \ No newline at end of file diff --git a/pkg/util/router/api.go b/pkg/util/router/api.go new file mode 100644 index 0000000..5608282 --- /dev/null +++ b/pkg/util/router/api.go @@ -0,0 +1,36 @@ +package router + +import "fmt" + +// API provides methods to generate urls for the API +type API interface { + UpdateWorkspaceStatus(namespace, uid string) string +} + +// api is a basic implementation of router.API +type api struct { + protocol string + fqdn string +} + +// UpdateWorkspaceStatus generates a url to update the status of a workspace +func (a *api) UpdateWorkspaceStatus(namespace, uid string) string { + // /apis/v1beta1/{namespace}/workspaces/{uid}/status + return fmt.Sprintf("%v%v/apis/v1beta1/%v/workspaces/%v/status", a.protocol, a.fqdn, namespace, uid) +} + +// NewAPIRouter creates a new api router used to generate urls for the api +func NewAPIRouter(protocol, fqdn string) (API, error) { + return &api{ + protocol: protocol, + fqdn: fqdn, + }, nil +} + +// NewRelativeAPIRouter creates an api router that does relative routes, with no protocol or fqdn +func NewRelativeAPIRouter() (API, error) { + return &api{ + protocol: "", + fqdn: "", + }, nil +} diff --git a/pkg/util/router/router.go b/pkg/util/router/router.go index 30c6dd6..ac6bf68 100644 --- a/pkg/util/router/router.go +++ b/pkg/util/router/router.go @@ -10,7 +10,7 @@ type Web interface { WorkflowExecution(namespace, uid string) string } -// web is a basic implementation of WebRouter +// web is a basic implementation of router.Web type web struct { protocol string fqdn string @@ -18,7 +18,7 @@ type web struct { // WorkflowExecution generates a url to view a specific workflow func (w *web) WorkflowExecution(namespace, uid string) string { - // ://workflows/ + // //workflows/ return fmt.Sprintf("%v%v/%v/workflows/%v", w.protocol, w.fqdn, namespace, uid) } @@ -29,3 +29,11 @@ func NewWebRouter(protocol, fqdn string) (Web, error) { fqdn: fqdn, }, nil } + +// NewRelativeWebRouter creates a web router that does relative routes, with no protocol or fqdn +func NewRelativeWebRouter() (Web, error) { + return &web{ + protocol: "", + fqdn: "", + }, nil +} diff --git a/pkg/workspace.go b/pkg/workspace.go index 6ee39de..f39496b 100644 --- a/pkg/workspace.go +++ b/pkg/workspace.go @@ -43,20 +43,16 @@ func workspaceStatusToFieldMap(status *WorkspaceStatus) sq.Eq { case WorkspaceLaunching: fieldMap["paused_at"] = pq.NullTime{} fieldMap["started_at"] = time.Now().UTC() - break case WorkspacePausing: fieldMap["started_at"] = pq.NullTime{} fieldMap["paused_at"] = time.Now().UTC() - break case WorkspaceUpdating: fieldMap["paused_at"] = pq.NullTime{} fieldMap["updated_at"] = time.Now().UTC() - break case WorkspaceTerminating: fieldMap["started_at"] = pq.NullTime{} fieldMap["paused_at"] = pq.NullTime{} fieldMap["terminated_at"] = time.Now().UTC() - break } return fieldMap @@ -66,6 +62,13 @@ func workspaceStatusToFieldMap(status *WorkspaceStatus) sq.Eq { func updateWorkspaceStatusBuilder(namespace, uid string, status *WorkspaceStatus) sq.UpdateBuilder { fieldMap := workspaceStatusToFieldMap(status) + log.WithFields(log.Fields{ + "Namespace": namespace, + "Workspace": uid, + "Final Phase": fieldMap["phase"], + }).Info("Updating workspace status") + + // Failed, Error, Succeeded ub := sb.Update("workspaces"). SetMap(fieldMap). Where(sq.And{ @@ -215,17 +218,99 @@ func (c *Client) createWorkspace(namespace string, parameters []byte, workspace return workspace, nil } -// CreateWorkspace creates a workspace by triggering the corresponding workflow -func (c *Client) CreateWorkspace(namespace string, workspace *Workspace) (*Workspace, error) { - config, err := c.GetSystemConfig() +// startWorkspace starts a workspace and related resources. It assumes a DB record already exists +// The following are required on the workspace: +// WorkspaceTemplate.WorkflowTemplate.UID +// WorkspaceTemplate.WorkflowTemplate.Version +func (c *Client) startWorkspace(namespace string, parameters []byte, workspace *Workspace) (*Workspace, error) { + if workspace == nil { + return nil, fmt.Errorf("workspace is nil") + } + if workspace.WorkspaceTemplate == nil { + return nil, fmt.Errorf("workspace.WorkspaceTemplate is nil") + } + if workspace.WorkspaceTemplate.WorkflowTemplate == nil { + return nil, fmt.Errorf("workspace.WorkspaceTemplate.WorkflowTemplate is nil") + } + + systemConfig, err := c.GetSystemConfig() if err != nil { return nil, err } + workflowTemplate, err := c.GetWorkflowTemplate(namespace, workspace.WorkspaceTemplate.WorkflowTemplate.UID, workspace.WorkspaceTemplate.WorkflowTemplate.Version) + if err != nil { + log.WithFields(log.Fields{ + "Namespace": namespace, + "Workspace": workspace, + "Error": err.Error(), + }).Error("Error with getting workflow template.") + return nil, util.NewUserError(codes.NotFound, "Error with getting workflow template.") + } + + runtimeParameters, err := generateRuntimeParameters(systemConfig) + if err != nil { + return nil, err + } + + runtimeParametersMap := make(map[string]*string) + for _, p := range runtimeParameters { + runtimeParametersMap[p.Name] = p.Value + } + + argoTemplate := workflowTemplate.ArgoWorkflowTemplate + for i, p := range argoTemplate.Spec.Arguments.Parameters { + value := runtimeParametersMap[p.Name] + if value != nil { + argoTemplate.Spec.Arguments.Parameters[i].Value = value + } + } + + _, err = c.CreateWorkflowExecution(namespace, &WorkflowExecution{ + Parameters: workspace.Parameters, + }, workflowTemplate) + if err != nil { + return nil, err + } + + _, err = sb.Update("workspaces"). + SetMap(sq.Eq{ + "phase": WorkspaceLaunching, + "started_at": time.Now().UTC(), + }). + Where(sq.Eq{"id": workspace.ID}). + RunWith(c.DB). + Exec() + if err != nil { + if strings.Contains(err.Error(), "invalid input syntax for type json") { + return nil, util.NewUserError(codes.InvalidArgument, err.Error()) + } + + return nil, util.NewUserError(codes.Unknown, err.Error()) + } + + return workspace, nil +} + +// CreateWorkspace creates a workspace by triggering the corresponding workflow +func (c *Client) CreateWorkspace(namespace string, workspace *Workspace) (*Workspace, error) { if err := workspace.GenerateUID(workspace.Name); err != nil { return nil, err } + existingWorkspace, err := c.GetWorkspace(namespace, workspace.UID) + if err != nil { + return nil, err + } + if existingWorkspace != nil { + return nil, util.NewUserError(codes.AlreadyExists, "Workspace already exists.") + } + + config, err := c.GetSystemConfig() + if err != nil { + return nil, err + } + parameters, err := json.Marshal(workspace.Parameters) if err != nil { return nil, err @@ -245,12 +330,55 @@ func (c *Client) CreateWorkspace(namespace string, workspace *Workspace) (*Works return nil, fmt.Errorf("sys-host parameter not found") } - existingWorkspace, err := c.GetWorkspace(namespace, workspace.UID) + // Validate workspace fields + valid, err := govalidator.ValidateStruct(workspace) + if err != nil || !valid { + return nil, util.NewUserError(codes.InvalidArgument, err.Error()) + } + + workspaceTemplate, err := c.GetWorkspaceTemplate(namespace, workspace.WorkspaceTemplate.UID, workspace.WorkspaceTemplate.Version) + if err != nil || workspaceTemplate == nil { + return nil, util.NewUserError(codes.NotFound, "Workspace template not found.") + } + workspace.WorkspaceTemplate = workspaceTemplate + + workspace, err = c.createWorkspace(namespace, parameters, workspace) if err != nil { return nil, err } - if existingWorkspace != nil { - return nil, util.NewUserError(codes.AlreadyExists, "Workspace already exists.") + + return workspace, nil +} + +// StartWorkspace starts a workspace +func (c *Client) StartWorkspace(namespace string, workspace *Workspace) (*Workspace, error) { + // If already started and not failed, return an error + if workspace.ID != 0 && workspace.Status.Phase != WorkspaceFailedToLaunch { + return workspace, fmt.Errorf("unable to start a workspace with phase %v", workspace.Status.Phase) + } + + config, err := c.GetSystemConfig() + if err != nil { + return nil, err + } + + parameters, err := json.Marshal(workspace.Parameters) + if err != nil { + return nil, err + } + + err = injectWorkspaceSystemParameters(namespace, workspace, "create", "apply", config) + if err != nil { + return nil, err + } + workspace.Parameters = append(workspace.Parameters, Parameter{ + Name: "sys-uid", + Value: ptr.String(workspace.UID), + }) + + sysHost := workspace.GetParameterValue("sys-host") + if sysHost == nil { + return nil, fmt.Errorf("sys-host parameter not found") } // Validate workspace fields @@ -265,7 +393,7 @@ func (c *Client) CreateWorkspace(namespace string, workspace *Workspace) (*Works } workspace.WorkspaceTemplate = workspaceTemplate - workspace, err = c.createWorkspace(namespace, parameters, workspace) + workspace, err = c.startWorkspace(namespace, parameters, workspace) if err != nil { return nil, err } @@ -312,6 +440,30 @@ func (c *Client) GetWorkspace(namespace, uid string) (workspace *Workspace, err // UpdateWorkspaceStatus updates workspace status and times based on phase func (c *Client) UpdateWorkspaceStatus(namespace, uid string, status *WorkspaceStatus) (err error) { + // A succeeded status is passed in when a DAG succeeds. We don't need to do anything in this case. + if status.Phase == "Succeeded" { + return nil + } + + if status.Phase == "Failed" || status.Phase == "Error" { + workspace, err := c.GetWorkspace(namespace, uid) + if err != nil { + return err + } + + if workspace.Status.Phase == WorkspaceLaunching && workspace.Status.PausedAt == nil { + status.Phase = WorkspaceFailedToLaunch + } else if workspace.Status.Phase == WorkspaceLaunching && workspace.Status.PausedAt != nil { + status.Phase = WorkspaceFailedToResume + } else if workspace.Status.Phase == WorkspacePausing { + status.Phase = WorkspaceFailedToPause + } else if workspace.Status.Phase == WorkspaceTerminating { + status.Phase = WorkspaceFailedToTerminate + } else if workspace.Status.Phase == WorkspaceUpdating { + status.Phase = WorkspaceFailedToUpdate + } + } + result, err := updateWorkspaceStatusBuilder(namespace, uid, status). RunWith(c.DB). Exec() diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index 20d9d91..4f65008 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -12,6 +12,7 @@ import ( "github.com/onepanelio/core/pkg/util/env" "github.com/onepanelio/core/pkg/util/pagination" "github.com/onepanelio/core/pkg/util/ptr" + "github.com/onepanelio/core/pkg/util/router" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" networking "istio.io/api/networking/v1alpha3" @@ -468,6 +469,17 @@ metadata: name: {{inputs.parameters.sys-pvc-name}}-{{workflow.parameters.sys-uid}}-0 ` templates := []wfv1.Template{ + { + Name: "handleExit", + DAG: &wfv1.DAGTemplate{ + Tasks: []wfv1.DAGTask{ + { + Name: "exit-handler", + Template: "sys-update-workspace-status", + }, + }, + }, + }, { Name: "workspace", DAG: &wfv1.DAGTemplate{ @@ -648,16 +660,36 @@ metadata: }, }, } - // Add curl template - curlPath := fmt.Sprintf("/apis/v1beta1/{{workflow.namespace}}/workspaces/{{workflow.parameters.sys-uid}}/status") + + webRouter, err := router.NewRelativeAPIRouter() + if err != nil { + return "", err + } + curlUpdateWorkspaceStatusPath := webRouter.UpdateWorkspaceStatus("{{workflow.namespace}}", "{{workflow.parameters.sys-uid}}") status := map[string]interface{}{ - "phase": "{{inputs.parameters.sys-workspace-phase}}", + "phase": "{{workflow.status}}", } statusBytes, err := json.Marshal(status) if err != nil { return } - inputs := wfv1.Inputs{ + inputs := wfv1.Inputs{} + curlUpdateWorkspaceNodeTemplate, err := getCURLNodeTemplate("sys-update-workspace-status", http.MethodPut, curlUpdateWorkspaceStatusPath, string(statusBytes), inputs) + if err != nil { + return + } + templates = append(templates, *curlUpdateWorkspaceNodeTemplate) + + // Add curl template + curlPath := fmt.Sprintf("/apis/v1beta1/{{workflow.namespace}}/workspaces/{{workflow.parameters.sys-uid}}/status") + status = map[string]interface{}{ + "phase": "{{inputs.parameters.sys-workspace-phase}}", + } + statusBytes, err = json.Marshal(status) + if err != nil { + return + } + inputs = wfv1.Inputs{ Parameters: []wfv1.Parameter{ {Name: "sys-workspace-phase"}, }, @@ -683,6 +715,7 @@ metadata: workflowTemplateSpec := map[string]interface{}{ "arguments": spec.Arguments, "entrypoint": "workspace", + "onExit": "handleExit", "templates": templates, } diff --git a/pkg/workspace_types.go b/pkg/workspace_types.go index 6ad81d9..36e9d3b 100644 --- a/pkg/workspace_types.go +++ b/pkg/workspace_types.go @@ -15,13 +15,18 @@ type WorkspacePhase string // Workspace phases const ( - WorkspaceLaunching WorkspacePhase = "Launching" - WorkspaceRunning WorkspacePhase = "Running" - WorkspaceUpdating WorkspacePhase = "Updating" - WorkspacePausing WorkspacePhase = "Pausing" - WorkspacePaused WorkspacePhase = "Paused" - WorkspaceTerminating WorkspacePhase = "Terminating" - WorkspaceTerminated WorkspacePhase = "Terminated" + WorkspaceLaunching WorkspacePhase = "Launching" + WorkspaceRunning WorkspacePhase = "Running" + WorkspaceUpdating WorkspacePhase = "Updating" + WorkspacePausing WorkspacePhase = "Pausing" + WorkspacePaused WorkspacePhase = "Paused" + WorkspaceTerminating WorkspacePhase = "Terminating" + WorkspaceTerminated WorkspacePhase = "Terminated" + WorkspaceFailedToPause WorkspacePhase = "Failed to pause" + WorkspaceFailedToResume WorkspacePhase = "Failed to resume" + WorkspaceFailedToTerminate WorkspacePhase = "Failed to terminate" + WorkspaceFailedToLaunch WorkspacePhase = "Failed to launch" + WorkspaceFailedToUpdate WorkspacePhase = "Failed to upgrade" ) type WorkspaceStatus struct { diff --git a/server/workflow_server.go b/server/workflow_server.go index 2826ec0..f36aae5 100644 --- a/server/workflow_server.go +++ b/server/workflow_server.go @@ -178,6 +178,9 @@ func (s *WorkflowServer) GetWorkflowExecution(ctx context.Context, req *api.GetW if err != nil { return nil, err } + if wf == nil { + return nil, util.NewUserError(codes.NotFound, "Workflow not found") + } wf.Namespace = req.Namespace diff --git a/server/workspace_server.go b/server/workspace_server.go index daa0a62..2a2bd44 100644 --- a/server/workspace_server.go +++ b/server/workspace_server.go @@ -177,6 +177,7 @@ func (s *WorkspaceServer) UpdateWorkspaceStatus(ctx context.Context, req *api.Up status := &v1.WorkspaceStatus{ Phase: v1.WorkspacePhase(req.Status.Phase), } + err = client.UpdateWorkspaceStatus(req.Namespace, req.Uid, status) return &empty.Empty{}, err @@ -276,3 +277,64 @@ func (s *WorkspaceServer) DeleteWorkspace(ctx context.Context, req *api.DeleteWo return &empty.Empty{}, err } + +// RetryLastWorkspaceAction will attempt the last action on the workspace again. +func (s *WorkspaceServer) RetryLastWorkspaceAction(ctx context.Context, req *api.RetryActionWorkspaceRequest) (*empty.Empty, error) { + client := getClient(ctx) + + workspace, err := client.GetWorkspace(req.Namespace, req.Uid) + if err != nil { + return nil, err + } + if workspace == nil { + return nil, util.NewUserError(codes.NotFound, "workspace not found") + } + + verb := "" + switch workspace.Status.Phase { + case v1.WorkspaceFailedToLaunch: + verb = "create" + case v1.WorkspaceFailedToPause: + verb = "update" + case v1.WorkspaceFailedToResume: + verb = "update" + case v1.WorkspaceFailedToTerminate: + verb = "delete" + case v1.WorkspaceFailedToUpdate: + verb = "update" + default: + return nil, util.NewUserError(codes.InvalidArgument, "Workspace is not in a failed state") + } + + allowed, err := auth.IsAuthorized(client, req.Namespace, verb, "onepanel.io", "workspaces", req.Uid) + if err != nil || !allowed { + return &empty.Empty{}, err + } + + switch workspace.Status.Phase { + case v1.WorkspaceFailedToLaunch: + if _, err := client.StartWorkspace(req.Namespace, workspace); err != nil { + return nil, err + } + case v1.WorkspaceFailedToPause: + if err := client.PauseWorkspace(req.Namespace, workspace.UID); err != nil { + return nil, err + } + case v1.WorkspaceFailedToResume: + if err := client.ResumeWorkspace(req.Namespace, workspace.UID); err != nil { + return nil, err + } + case v1.WorkspaceFailedToTerminate: + if err := client.DeleteWorkspace(req.Namespace, workspace.UID); err != nil { + return nil, err + } + case v1.WorkspaceFailedToUpdate: + if err := client.UpdateWorkspace(req.Namespace, workspace.UID, workspace.Parameters); err != nil { + return nil, err + } + default: + return nil, util.NewUserError(codes.InvalidArgument, "Workspace is not in a failed state") + } + + return &empty.Empty{}, err +}