From 371c50cbe5c117c18e31f8db222dab64af7ddf97 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Sat, 19 Dec 2020 20:52:01 -0800 Subject: [PATCH 01/37] feat: updated API with method to generate workflow template manifest. This will perform any modifications needed to replace types with runtime data, etc. An example is select.nodepool. This value should set the options to the currently available node types. --- api/api.swagger.json | 45 ++ api/gen/workflow_template.pb.go | 722 +++++++++++++++------------ api/gen/workflow_template.pb.gw.go | 135 +++++ api/gen/workflow_template_grpc.pb.go | 38 ++ api/proto/workflow_template.proto | 14 + 5 files changed, 643 insertions(+), 311 deletions(-) diff --git a/api/api.swagger.json b/api/api.swagger.json index 5a66f014..e1ac9edd 100644 --- a/api/api.swagger.json +++ b/api/api.swagger.json @@ -1894,6 +1894,51 @@ ] } }, + "/apis/v1beta1/{namespace}/workflow_templates/{uid}/generate": { + "post": { + "summary": "Get the generated WorkflowTemplate, applying any modifications based on the content", + "operationId": "GenerateWorkflowTemplate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/WorkflowTemplate" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/google.rpc.Status" + } + } + }, + "parameters": [ + { + "name": "namespace", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "uid", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/WorkflowTemplate" + } + } + ], + "tags": [ + "WorkflowTemplateService" + ] + } + }, "/apis/v1beta1/{namespace}/workflow_templates/{uid}/versions": { "get": { "operationId": "ListWorkflowTemplateVersions", diff --git a/api/gen/workflow_template.pb.go b/api/gen/workflow_template.pb.go index 7321f16d..8d656748 100644 --- a/api/gen/workflow_template.pb.go +++ b/api/gen/workflow_template.pb.go @@ -26,6 +26,69 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 +type GenerateWorkflowTemplateRequest 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"` + WorkflowTemplate *WorkflowTemplate `protobuf:"bytes,3,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` +} + +func (x *GenerateWorkflowTemplateRequest) Reset() { + *x = GenerateWorkflowTemplateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_workflow_template_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenerateWorkflowTemplateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenerateWorkflowTemplateRequest) ProtoMessage() {} + +func (x *GenerateWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { + mi := &file_workflow_template_proto_msgTypes[0] + 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 GenerateWorkflowTemplateRequest.ProtoReflect.Descriptor instead. +func (*GenerateWorkflowTemplateRequest) Descriptor() ([]byte, []int) { + return file_workflow_template_proto_rawDescGZIP(), []int{0} +} + +func (x *GenerateWorkflowTemplateRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GenerateWorkflowTemplateRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *GenerateWorkflowTemplateRequest) GetWorkflowTemplate() *WorkflowTemplate { + if x != nil { + return x.WorkflowTemplate + } + return nil +} + type CreateWorkflowTemplateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -38,7 +101,7 @@ type CreateWorkflowTemplateRequest struct { func (x *CreateWorkflowTemplateRequest) Reset() { *x = CreateWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[0] + mi := &file_workflow_template_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -51,7 +114,7 @@ func (x *CreateWorkflowTemplateRequest) String() string { func (*CreateWorkflowTemplateRequest) ProtoMessage() {} func (x *CreateWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[0] + mi := &file_workflow_template_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -64,7 +127,7 @@ func (x *CreateWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*CreateWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{0} + return file_workflow_template_proto_rawDescGZIP(), []int{1} } func (x *CreateWorkflowTemplateRequest) GetNamespace() string { @@ -93,7 +156,7 @@ type UpdateWorkflowTemplateVersionRequest struct { func (x *UpdateWorkflowTemplateVersionRequest) Reset() { *x = UpdateWorkflowTemplateVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[1] + mi := &file_workflow_template_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -106,7 +169,7 @@ func (x *UpdateWorkflowTemplateVersionRequest) String() string { func (*UpdateWorkflowTemplateVersionRequest) ProtoMessage() {} func (x *UpdateWorkflowTemplateVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[1] + mi := &file_workflow_template_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -119,7 +182,7 @@ func (x *UpdateWorkflowTemplateVersionRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use UpdateWorkflowTemplateVersionRequest.ProtoReflect.Descriptor instead. func (*UpdateWorkflowTemplateVersionRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{1} + return file_workflow_template_proto_rawDescGZIP(), []int{2} } func (x *UpdateWorkflowTemplateVersionRequest) GetNamespace() string { @@ -149,7 +212,7 @@ type GetWorkflowTemplateRequest struct { func (x *GetWorkflowTemplateRequest) Reset() { *x = GetWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[2] + mi := &file_workflow_template_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -162,7 +225,7 @@ func (x *GetWorkflowTemplateRequest) String() string { func (*GetWorkflowTemplateRequest) ProtoMessage() {} func (x *GetWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[2] + mi := &file_workflow_template_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -175,7 +238,7 @@ func (x *GetWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{2} + return file_workflow_template_proto_rawDescGZIP(), []int{3} } func (x *GetWorkflowTemplateRequest) GetNamespace() string { @@ -213,7 +276,7 @@ type CloneWorkflowTemplateRequest struct { func (x *CloneWorkflowTemplateRequest) Reset() { *x = CloneWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[3] + mi := &file_workflow_template_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -226,7 +289,7 @@ func (x *CloneWorkflowTemplateRequest) String() string { func (*CloneWorkflowTemplateRequest) ProtoMessage() {} func (x *CloneWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[3] + mi := &file_workflow_template_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -239,7 +302,7 @@ func (x *CloneWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CloneWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*CloneWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{3} + return file_workflow_template_proto_rawDescGZIP(), []int{4} } func (x *CloneWorkflowTemplateRequest) GetNamespace() string { @@ -282,7 +345,7 @@ type ListWorkflowTemplateVersionsRequest struct { func (x *ListWorkflowTemplateVersionsRequest) Reset() { *x = ListWorkflowTemplateVersionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[4] + mi := &file_workflow_template_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -295,7 +358,7 @@ func (x *ListWorkflowTemplateVersionsRequest) String() string { func (*ListWorkflowTemplateVersionsRequest) ProtoMessage() {} func (x *ListWorkflowTemplateVersionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[4] + mi := &file_workflow_template_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -308,7 +371,7 @@ func (x *ListWorkflowTemplateVersionsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ListWorkflowTemplateVersionsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplateVersionsRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{4} + return file_workflow_template_proto_rawDescGZIP(), []int{5} } func (x *ListWorkflowTemplateVersionsRequest) GetNamespace() string { @@ -337,7 +400,7 @@ type ListWorkflowTemplateVersionsResponse struct { func (x *ListWorkflowTemplateVersionsResponse) Reset() { *x = ListWorkflowTemplateVersionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[5] + mi := &file_workflow_template_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -350,7 +413,7 @@ func (x *ListWorkflowTemplateVersionsResponse) String() string { func (*ListWorkflowTemplateVersionsResponse) ProtoMessage() {} func (x *ListWorkflowTemplateVersionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[5] + mi := &file_workflow_template_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -363,7 +426,7 @@ func (x *ListWorkflowTemplateVersionsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ListWorkflowTemplateVersionsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplateVersionsResponse) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{5} + return file_workflow_template_proto_rawDescGZIP(), []int{6} } func (x *ListWorkflowTemplateVersionsResponse) GetCount() int32 { @@ -394,7 +457,7 @@ type ListWorkflowTemplatesRequest struct { func (x *ListWorkflowTemplatesRequest) Reset() { *x = ListWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[6] + mi := &file_workflow_template_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -407,7 +470,7 @@ func (x *ListWorkflowTemplatesRequest) String() string { func (*ListWorkflowTemplatesRequest) ProtoMessage() {} func (x *ListWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[6] + mi := &file_workflow_template_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -420,7 +483,7 @@ func (x *ListWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{6} + return file_workflow_template_proto_rawDescGZIP(), []int{7} } func (x *ListWorkflowTemplatesRequest) GetNamespace() string { @@ -467,7 +530,7 @@ type ListWorkflowTemplatesResponse struct { func (x *ListWorkflowTemplatesResponse) Reset() { *x = ListWorkflowTemplatesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[7] + mi := &file_workflow_template_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -480,7 +543,7 @@ func (x *ListWorkflowTemplatesResponse) String() string { func (*ListWorkflowTemplatesResponse) ProtoMessage() {} func (x *ListWorkflowTemplatesResponse) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[7] + mi := &file_workflow_template_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -493,7 +556,7 @@ func (x *ListWorkflowTemplatesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowTemplatesResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplatesResponse) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{7} + return file_workflow_template_proto_rawDescGZIP(), []int{8} } func (x *ListWorkflowTemplatesResponse) GetCount() int32 { @@ -550,7 +613,7 @@ type ArchiveWorkflowTemplateRequest struct { func (x *ArchiveWorkflowTemplateRequest) Reset() { *x = ArchiveWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[8] + mi := &file_workflow_template_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -563,7 +626,7 @@ func (x *ArchiveWorkflowTemplateRequest) String() string { func (*ArchiveWorkflowTemplateRequest) ProtoMessage() {} func (x *ArchiveWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[8] + mi := &file_workflow_template_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -576,7 +639,7 @@ func (x *ArchiveWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*ArchiveWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{8} + return file_workflow_template_proto_rawDescGZIP(), []int{9} } func (x *ArchiveWorkflowTemplateRequest) GetNamespace() string { @@ -604,7 +667,7 @@ type ArchiveWorkflowTemplateResponse struct { func (x *ArchiveWorkflowTemplateResponse) Reset() { *x = ArchiveWorkflowTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[9] + mi := &file_workflow_template_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -617,7 +680,7 @@ func (x *ArchiveWorkflowTemplateResponse) String() string { func (*ArchiveWorkflowTemplateResponse) ProtoMessage() {} func (x *ArchiveWorkflowTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[9] + mi := &file_workflow_template_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -630,7 +693,7 @@ func (x *ArchiveWorkflowTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveWorkflowTemplateResponse.ProtoReflect.Descriptor instead. func (*ArchiveWorkflowTemplateResponse) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{9} + return file_workflow_template_proto_rawDescGZIP(), []int{10} } func (x *ArchiveWorkflowTemplateResponse) GetWorkflowTemplate() *WorkflowTemplate { @@ -656,7 +719,7 @@ type WorkflowExecutionStatisticReport struct { func (x *WorkflowExecutionStatisticReport) Reset() { *x = WorkflowExecutionStatisticReport{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[10] + mi := &file_workflow_template_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -669,7 +732,7 @@ func (x *WorkflowExecutionStatisticReport) String() string { func (*WorkflowExecutionStatisticReport) ProtoMessage() {} func (x *WorkflowExecutionStatisticReport) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[10] + mi := &file_workflow_template_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -682,7 +745,7 @@ func (x *WorkflowExecutionStatisticReport) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowExecutionStatisticReport.ProtoReflect.Descriptor instead. func (*WorkflowExecutionStatisticReport) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{10} + return file_workflow_template_proto_rawDescGZIP(), []int{11} } func (x *WorkflowExecutionStatisticReport) GetTotal() int32 { @@ -738,7 +801,7 @@ type CronWorkflowStatisticsReport struct { func (x *CronWorkflowStatisticsReport) Reset() { *x = CronWorkflowStatisticsReport{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[11] + mi := &file_workflow_template_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -751,7 +814,7 @@ func (x *CronWorkflowStatisticsReport) String() string { func (*CronWorkflowStatisticsReport) ProtoMessage() {} func (x *CronWorkflowStatisticsReport) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[11] + mi := &file_workflow_template_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -764,7 +827,7 @@ func (x *CronWorkflowStatisticsReport) ProtoReflect() protoreflect.Message { // Deprecated: Use CronWorkflowStatisticsReport.ProtoReflect.Descriptor instead. func (*CronWorkflowStatisticsReport) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{11} + return file_workflow_template_proto_rawDescGZIP(), []int{12} } func (x *CronWorkflowStatisticsReport) GetTotal() int32 { @@ -797,7 +860,7 @@ type WorkflowTemplate struct { func (x *WorkflowTemplate) Reset() { *x = WorkflowTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[12] + mi := &file_workflow_template_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -810,7 +873,7 @@ func (x *WorkflowTemplate) String() string { func (*WorkflowTemplate) ProtoMessage() {} func (x *WorkflowTemplate) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[12] + mi := &file_workflow_template_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -823,7 +886,7 @@ func (x *WorkflowTemplate) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplate.ProtoReflect.Descriptor instead. func (*WorkflowTemplate) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{12} + return file_workflow_template_proto_rawDescGZIP(), []int{13} } func (x *WorkflowTemplate) GetCreatedAt() string { @@ -930,7 +993,7 @@ type GetWorkflowTemplateLabelsRequest struct { func (x *GetWorkflowTemplateLabelsRequest) Reset() { *x = GetWorkflowTemplateLabelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[13] + mi := &file_workflow_template_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -943,7 +1006,7 @@ func (x *GetWorkflowTemplateLabelsRequest) String() string { func (*GetWorkflowTemplateLabelsRequest) ProtoMessage() {} func (x *GetWorkflowTemplateLabelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[13] + mi := &file_workflow_template_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -956,7 +1019,7 @@ func (x *GetWorkflowTemplateLabelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplateLabelsRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplateLabelsRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{13} + return file_workflow_template_proto_rawDescGZIP(), []int{14} } func (x *GetWorkflowTemplateLabelsRequest) GetNamespace() string { @@ -988,227 +1051,248 @@ var file_workflow_template_proto_rawDesc = []byte{ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 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, 0x12, 0x41, 0x0a, 0x10, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x80, + 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x41, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x22, 0x87, 0x01, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 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, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x24, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 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, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x1c, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x55, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 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, 0x22, 0x81, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, + 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 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, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x22, 0xf6, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x1e, + 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x22, 0x64, + 0x0a, 0x1f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x1c, - 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 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, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x23, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 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, 0x22, 0x81, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 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, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0xf6, 0x01, 0x0a, - 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, - 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x1e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x22, 0x64, 0x0a, 0x1f, 0x41, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x01, - 0x0a, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x22, 0x34, 0x0a, 0x1c, - 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x22, 0xd9, 0x03, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, - 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, - 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, - 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x64, 0x22, 0x34, 0x0a, 0x1c, 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, - 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x6e, - 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xbb, - 0x0a, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x22, 0x2c, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xc2, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x60, 0x22, 0x4c, 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, 0x66, 0x6c, 0x6f, - 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x69, - 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xd3, 0x01, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x83, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7d, 0x12, 0x32, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x5a, 0x47, 0x12, 0x45, 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, 0x66, 0x6c, 0x6f, 0x77, - 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, - 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3d, 0x12, 0x3b, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, - 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, - 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0xe9, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x95, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x8e, 0x01, 0x12, 0x3f, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xd9, 0x03, 0x0a, 0x10, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, + 0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x09, 0x63, 0x72, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x6e, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xec, 0x0b, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0xae, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x55, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x4f, 0x22, 0x3b, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x5a, 0x4b, 0x12, 0x49, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x17, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, - 0x1a, 0x3a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, + 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, + 0x22, 0x2c, 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, - 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, - 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x42, 0x24, 0x5a, 0x22, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x6e, 0x65, 0x70, 0x61, - 0x6e, 0x65, 0x6c, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, - 0x65, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0xc2, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x60, 0x22, 0x4c, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xd3, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x83, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7d, 0x12, 0x32, + 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, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, + 0x64, 0x7d, 0x5a, 0x47, 0x12, 0x45, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x1c, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, + 0x2c, 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, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0xe9, 0x01, + 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, + 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x22, 0x95, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x8e, 0x01, 0x12, 0x3f, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, + 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5a, 0x4b, 0x12, 0x49, + 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, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, + 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x17, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, + 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x1a, 0x3a, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x76, 0x65, 0x42, 0x24, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x69, 0x6f, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1223,54 +1307,58 @@ func file_workflow_template_proto_rawDescGZIP() []byte { return file_workflow_template_proto_rawDescData } -var file_workflow_template_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_workflow_template_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_workflow_template_proto_goTypes = []interface{}{ - (*CreateWorkflowTemplateRequest)(nil), // 0: api.CreateWorkflowTemplateRequest - (*UpdateWorkflowTemplateVersionRequest)(nil), // 1: api.UpdateWorkflowTemplateVersionRequest - (*GetWorkflowTemplateRequest)(nil), // 2: api.GetWorkflowTemplateRequest - (*CloneWorkflowTemplateRequest)(nil), // 3: api.CloneWorkflowTemplateRequest - (*ListWorkflowTemplateVersionsRequest)(nil), // 4: api.ListWorkflowTemplateVersionsRequest - (*ListWorkflowTemplateVersionsResponse)(nil), // 5: api.ListWorkflowTemplateVersionsResponse - (*ListWorkflowTemplatesRequest)(nil), // 6: api.ListWorkflowTemplatesRequest - (*ListWorkflowTemplatesResponse)(nil), // 7: api.ListWorkflowTemplatesResponse - (*ArchiveWorkflowTemplateRequest)(nil), // 8: api.ArchiveWorkflowTemplateRequest - (*ArchiveWorkflowTemplateResponse)(nil), // 9: api.ArchiveWorkflowTemplateResponse - (*WorkflowExecutionStatisticReport)(nil), // 10: api.WorkflowExecutionStatisticReport - (*CronWorkflowStatisticsReport)(nil), // 11: api.CronWorkflowStatisticsReport - (*WorkflowTemplate)(nil), // 12: api.WorkflowTemplate - (*GetWorkflowTemplateLabelsRequest)(nil), // 13: api.GetWorkflowTemplateLabelsRequest - (*KeyValue)(nil), // 14: api.KeyValue - (*Parameter)(nil), // 15: api.Parameter + (*GenerateWorkflowTemplateRequest)(nil), // 0: api.GenerateWorkflowTemplateRequest + (*CreateWorkflowTemplateRequest)(nil), // 1: api.CreateWorkflowTemplateRequest + (*UpdateWorkflowTemplateVersionRequest)(nil), // 2: api.UpdateWorkflowTemplateVersionRequest + (*GetWorkflowTemplateRequest)(nil), // 3: api.GetWorkflowTemplateRequest + (*CloneWorkflowTemplateRequest)(nil), // 4: api.CloneWorkflowTemplateRequest + (*ListWorkflowTemplateVersionsRequest)(nil), // 5: api.ListWorkflowTemplateVersionsRequest + (*ListWorkflowTemplateVersionsResponse)(nil), // 6: api.ListWorkflowTemplateVersionsResponse + (*ListWorkflowTemplatesRequest)(nil), // 7: api.ListWorkflowTemplatesRequest + (*ListWorkflowTemplatesResponse)(nil), // 8: api.ListWorkflowTemplatesResponse + (*ArchiveWorkflowTemplateRequest)(nil), // 9: api.ArchiveWorkflowTemplateRequest + (*ArchiveWorkflowTemplateResponse)(nil), // 10: api.ArchiveWorkflowTemplateResponse + (*WorkflowExecutionStatisticReport)(nil), // 11: api.WorkflowExecutionStatisticReport + (*CronWorkflowStatisticsReport)(nil), // 12: api.CronWorkflowStatisticsReport + (*WorkflowTemplate)(nil), // 13: api.WorkflowTemplate + (*GetWorkflowTemplateLabelsRequest)(nil), // 14: api.GetWorkflowTemplateLabelsRequest + (*KeyValue)(nil), // 15: api.KeyValue + (*Parameter)(nil), // 16: api.Parameter } var file_workflow_template_proto_depIdxs = []int32{ - 12, // 0: api.CreateWorkflowTemplateRequest.workflowTemplate:type_name -> api.WorkflowTemplate - 12, // 1: api.UpdateWorkflowTemplateVersionRequest.workflowTemplate:type_name -> api.WorkflowTemplate - 12, // 2: api.ListWorkflowTemplateVersionsResponse.workflowTemplates:type_name -> api.WorkflowTemplate - 12, // 3: api.ListWorkflowTemplatesResponse.workflowTemplates:type_name -> api.WorkflowTemplate - 12, // 4: api.ArchiveWorkflowTemplateResponse.workflowTemplate:type_name -> api.WorkflowTemplate - 14, // 5: api.WorkflowTemplate.labels:type_name -> api.KeyValue - 10, // 6: api.WorkflowTemplate.stats:type_name -> api.WorkflowExecutionStatisticReport - 11, // 7: api.WorkflowTemplate.cronStats:type_name -> api.CronWorkflowStatisticsReport - 15, // 8: api.WorkflowTemplate.parameters:type_name -> api.Parameter - 0, // 9: api.WorkflowTemplateService.CreateWorkflowTemplate:input_type -> api.CreateWorkflowTemplateRequest - 0, // 10: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:input_type -> api.CreateWorkflowTemplateRequest - 2, // 11: api.WorkflowTemplateService.GetWorkflowTemplate:input_type -> api.GetWorkflowTemplateRequest - 4, // 12: api.WorkflowTemplateService.ListWorkflowTemplateVersions:input_type -> api.ListWorkflowTemplateVersionsRequest - 6, // 13: api.WorkflowTemplateService.ListWorkflowTemplates:input_type -> api.ListWorkflowTemplatesRequest - 3, // 14: api.WorkflowTemplateService.CloneWorkflowTemplate:input_type -> api.CloneWorkflowTemplateRequest - 8, // 15: api.WorkflowTemplateService.ArchiveWorkflowTemplate:input_type -> api.ArchiveWorkflowTemplateRequest - 12, // 16: api.WorkflowTemplateService.CreateWorkflowTemplate:output_type -> api.WorkflowTemplate - 12, // 17: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:output_type -> api.WorkflowTemplate - 12, // 18: api.WorkflowTemplateService.GetWorkflowTemplate:output_type -> api.WorkflowTemplate - 5, // 19: api.WorkflowTemplateService.ListWorkflowTemplateVersions:output_type -> api.ListWorkflowTemplateVersionsResponse - 7, // 20: api.WorkflowTemplateService.ListWorkflowTemplates:output_type -> api.ListWorkflowTemplatesResponse - 12, // 21: api.WorkflowTemplateService.CloneWorkflowTemplate:output_type -> api.WorkflowTemplate - 9, // 22: api.WorkflowTemplateService.ArchiveWorkflowTemplate:output_type -> api.ArchiveWorkflowTemplateResponse - 16, // [16:23] is the sub-list for method output_type - 9, // [9:16] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 13, // 0: api.GenerateWorkflowTemplateRequest.workflowTemplate:type_name -> api.WorkflowTemplate + 13, // 1: api.CreateWorkflowTemplateRequest.workflowTemplate:type_name -> api.WorkflowTemplate + 13, // 2: api.UpdateWorkflowTemplateVersionRequest.workflowTemplate:type_name -> api.WorkflowTemplate + 13, // 3: api.ListWorkflowTemplateVersionsResponse.workflowTemplates:type_name -> api.WorkflowTemplate + 13, // 4: api.ListWorkflowTemplatesResponse.workflowTemplates:type_name -> api.WorkflowTemplate + 13, // 5: api.ArchiveWorkflowTemplateResponse.workflowTemplate:type_name -> api.WorkflowTemplate + 15, // 6: api.WorkflowTemplate.labels:type_name -> api.KeyValue + 11, // 7: api.WorkflowTemplate.stats:type_name -> api.WorkflowExecutionStatisticReport + 12, // 8: api.WorkflowTemplate.cronStats:type_name -> api.CronWorkflowStatisticsReport + 16, // 9: api.WorkflowTemplate.parameters:type_name -> api.Parameter + 0, // 10: api.WorkflowTemplateService.GenerateWorkflowTemplate:input_type -> api.GenerateWorkflowTemplateRequest + 1, // 11: api.WorkflowTemplateService.CreateWorkflowTemplate:input_type -> api.CreateWorkflowTemplateRequest + 1, // 12: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:input_type -> api.CreateWorkflowTemplateRequest + 3, // 13: api.WorkflowTemplateService.GetWorkflowTemplate:input_type -> api.GetWorkflowTemplateRequest + 5, // 14: api.WorkflowTemplateService.ListWorkflowTemplateVersions:input_type -> api.ListWorkflowTemplateVersionsRequest + 7, // 15: api.WorkflowTemplateService.ListWorkflowTemplates:input_type -> api.ListWorkflowTemplatesRequest + 4, // 16: api.WorkflowTemplateService.CloneWorkflowTemplate:input_type -> api.CloneWorkflowTemplateRequest + 9, // 17: api.WorkflowTemplateService.ArchiveWorkflowTemplate:input_type -> api.ArchiveWorkflowTemplateRequest + 13, // 18: api.WorkflowTemplateService.GenerateWorkflowTemplate:output_type -> api.WorkflowTemplate + 13, // 19: api.WorkflowTemplateService.CreateWorkflowTemplate:output_type -> api.WorkflowTemplate + 13, // 20: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:output_type -> api.WorkflowTemplate + 13, // 21: api.WorkflowTemplateService.GetWorkflowTemplate:output_type -> api.WorkflowTemplate + 6, // 22: api.WorkflowTemplateService.ListWorkflowTemplateVersions:output_type -> api.ListWorkflowTemplateVersionsResponse + 8, // 23: api.WorkflowTemplateService.ListWorkflowTemplates:output_type -> api.ListWorkflowTemplatesResponse + 13, // 24: api.WorkflowTemplateService.CloneWorkflowTemplate:output_type -> api.WorkflowTemplate + 10, // 25: api.WorkflowTemplateService.ArchiveWorkflowTemplate:output_type -> api.ArchiveWorkflowTemplateResponse + 18, // [18:26] is the sub-list for method output_type + 10, // [10:18] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_workflow_template_proto_init() } @@ -1282,7 +1370,7 @@ func file_workflow_template_proto_init() { file_common_proto_init() if !protoimpl.UnsafeEnabled { file_workflow_template_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkflowTemplateRequest); i { + switch v := v.(*GenerateWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1294,7 +1382,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkflowTemplateVersionRequest); i { + switch v := v.(*CreateWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1306,7 +1394,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplateRequest); i { + switch v := v.(*UpdateWorkflowTemplateVersionRequest); i { case 0: return &v.state case 1: @@ -1318,7 +1406,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloneWorkflowTemplateRequest); i { + switch v := v.(*GetWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1330,7 +1418,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplateVersionsRequest); i { + switch v := v.(*CloneWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1342,7 +1430,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplateVersionsResponse); i { + switch v := v.(*ListWorkflowTemplateVersionsRequest); i { case 0: return &v.state case 1: @@ -1354,7 +1442,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplatesRequest); i { + switch v := v.(*ListWorkflowTemplateVersionsResponse); i { case 0: return &v.state case 1: @@ -1366,7 +1454,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplatesResponse); i { + switch v := v.(*ListWorkflowTemplatesRequest); i { case 0: return &v.state case 1: @@ -1378,7 +1466,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveWorkflowTemplateRequest); i { + switch v := v.(*ListWorkflowTemplatesResponse); i { case 0: return &v.state case 1: @@ -1390,7 +1478,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveWorkflowTemplateResponse); i { + switch v := v.(*ArchiveWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1402,7 +1490,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowExecutionStatisticReport); i { + switch v := v.(*ArchiveWorkflowTemplateResponse); i { case 0: return &v.state case 1: @@ -1414,7 +1502,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CronWorkflowStatisticsReport); i { + switch v := v.(*WorkflowExecutionStatisticReport); i { case 0: return &v.state case 1: @@ -1426,7 +1514,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplate); i { + switch v := v.(*CronWorkflowStatisticsReport); i { case 0: return &v.state case 1: @@ -1438,6 +1526,18 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkflowTemplate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_workflow_template_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplateLabelsRequest); i { case 0: return &v.state @@ -1456,7 +1556,7 @@ func file_workflow_template_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_workflow_template_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 15, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/workflow_template.pb.gw.go b/api/gen/workflow_template.pb.gw.go index ea015434..7e6f6382 100644 --- a/api/gen/workflow_template.pb.gw.go +++ b/api/gen/workflow_template.pb.gw.go @@ -31,6 +31,94 @@ var _ = runtime.String var _ = utilities.NewDoubleArray var _ = metadata.Join +func request_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowTemplateServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GenerateWorkflowTemplateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.WorkflowTemplate); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + 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.GenerateWorkflowTemplate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowTemplateServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GenerateWorkflowTemplateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.WorkflowTemplate); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + 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.GenerateWorkflowTemplate(ctx, &protoReq) + return msg, metadata, err + +} + func request_WorkflowTemplateService_CreateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowTemplateServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CreateWorkflowTemplateRequest var metadata runtime.ServerMetadata @@ -811,6 +899,29 @@ func local_request_WorkflowTemplateService_ArchiveWorkflowTemplate_0(ctx context // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterWorkflowTemplateServiceHandlerFromEndpoint instead. func RegisterWorkflowTemplateServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WorkflowTemplateServiceServer) error { + mux.Handle("POST", pattern_WorkflowTemplateService_GenerateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/api.WorkflowTemplateService/GenerateWorkflowTemplate") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkflowTemplateService_GenerateWorkflowTemplate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_WorkflowTemplateService_CreateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1059,6 +1170,26 @@ func RegisterWorkflowTemplateServiceHandler(ctx context.Context, mux *runtime.Se // "WorkflowTemplateServiceClient" to call the correct interceptors. func RegisterWorkflowTemplateServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WorkflowTemplateServiceClient) error { + mux.Handle("POST", pattern_WorkflowTemplateService_GenerateWorkflowTemplate_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, "/api.WorkflowTemplateService/GenerateWorkflowTemplate") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkflowTemplateService_GenerateWorkflowTemplate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_WorkflowTemplateService_CreateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1243,6 +1374,8 @@ func RegisterWorkflowTemplateServiceHandlerClient(ctx context.Context, mux *runt } var ( + pattern_WorkflowTemplateService_GenerateWorkflowTemplate_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", "workflow_templates", "uid", "generate"}, "")) + pattern_WorkflowTemplateService_CreateWorkflowTemplate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workflow_templates"}, "")) pattern_WorkflowTemplateService_CreateWorkflowTemplateVersion_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", "workflow_templates", "workflowTemplate.uid", "versions"}, "")) @@ -1263,6 +1396,8 @@ var ( ) var ( + forward_WorkflowTemplateService_GenerateWorkflowTemplate_0 = runtime.ForwardResponseMessage + forward_WorkflowTemplateService_CreateWorkflowTemplate_0 = runtime.ForwardResponseMessage forward_WorkflowTemplateService_CreateWorkflowTemplateVersion_0 = runtime.ForwardResponseMessage diff --git a/api/gen/workflow_template_grpc.pb.go b/api/gen/workflow_template_grpc.pb.go index acea4528..db3914e4 100644 --- a/api/gen/workflow_template_grpc.pb.go +++ b/api/gen/workflow_template_grpc.pb.go @@ -17,6 +17,8 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type WorkflowTemplateServiceClient interface { + // Get the generated WorkflowTemplate, applying any modifications based on the content + GenerateWorkflowTemplate(ctx context.Context, in *GenerateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) CreateWorkflowTemplate(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) CreateWorkflowTemplateVersion(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) GetWorkflowTemplate(ctx context.Context, in *GetWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) @@ -34,6 +36,15 @@ func NewWorkflowTemplateServiceClient(cc grpc.ClientConnInterface) WorkflowTempl return &workflowTemplateServiceClient{cc} } +func (c *workflowTemplateServiceClient) GenerateWorkflowTemplate(ctx context.Context, in *GenerateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) { + out := new(WorkflowTemplate) + err := c.cc.Invoke(ctx, "/api.WorkflowTemplateService/GenerateWorkflowTemplate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *workflowTemplateServiceClient) CreateWorkflowTemplate(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) { out := new(WorkflowTemplate) err := c.cc.Invoke(ctx, "/api.WorkflowTemplateService/CreateWorkflowTemplate", in, out, opts...) @@ -101,6 +112,8 @@ func (c *workflowTemplateServiceClient) ArchiveWorkflowTemplate(ctx context.Cont // All implementations must embed UnimplementedWorkflowTemplateServiceServer // for forward compatibility type WorkflowTemplateServiceServer interface { + // Get the generated WorkflowTemplate, applying any modifications based on the content + GenerateWorkflowTemplate(context.Context, *GenerateWorkflowTemplateRequest) (*WorkflowTemplate, error) CreateWorkflowTemplate(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) CreateWorkflowTemplateVersion(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) GetWorkflowTemplate(context.Context, *GetWorkflowTemplateRequest) (*WorkflowTemplate, error) @@ -115,6 +128,9 @@ type WorkflowTemplateServiceServer interface { type UnimplementedWorkflowTemplateServiceServer struct { } +func (UnimplementedWorkflowTemplateServiceServer) GenerateWorkflowTemplate(context.Context, *GenerateWorkflowTemplateRequest) (*WorkflowTemplate, error) { + return nil, status.Errorf(codes.Unimplemented, "method GenerateWorkflowTemplate not implemented") +} func (UnimplementedWorkflowTemplateServiceServer) CreateWorkflowTemplate(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateWorkflowTemplate not implemented") } @@ -150,6 +166,24 @@ func RegisterWorkflowTemplateServiceServer(s grpc.ServiceRegistrar, srv Workflow s.RegisterService(&_WorkflowTemplateService_serviceDesc, srv) } +func _WorkflowTemplateService_GenerateWorkflowTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GenerateWorkflowTemplateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkflowTemplateServiceServer).GenerateWorkflowTemplate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.WorkflowTemplateService/GenerateWorkflowTemplate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkflowTemplateServiceServer).GenerateWorkflowTemplate(ctx, req.(*GenerateWorkflowTemplateRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _WorkflowTemplateService_CreateWorkflowTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateWorkflowTemplateRequest) if err := dec(in); err != nil { @@ -280,6 +314,10 @@ var _WorkflowTemplateService_serviceDesc = grpc.ServiceDesc{ ServiceName: "api.WorkflowTemplateService", HandlerType: (*WorkflowTemplateServiceServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "GenerateWorkflowTemplate", + Handler: _WorkflowTemplateService_GenerateWorkflowTemplate_Handler, + }, { MethodName: "CreateWorkflowTemplate", Handler: _WorkflowTemplateService_CreateWorkflowTemplate_Handler, diff --git a/api/proto/workflow_template.proto b/api/proto/workflow_template.proto index 7fe91e0b..d7da43c4 100644 --- a/api/proto/workflow_template.proto +++ b/api/proto/workflow_template.proto @@ -8,6 +8,14 @@ import "label.proto"; import "common.proto"; service WorkflowTemplateService { + // Get the generated WorkflowTemplate, applying any modifications based on the content + rpc GenerateWorkflowTemplate (GenerateWorkflowTemplateRequest) returns (WorkflowTemplate) { + option (google.api.http) = { + post: "/apis/v1beta1/{namespace}/workflow_templates/{uid}/generate" + body: "workflowTemplate" + }; + } + rpc CreateWorkflowTemplate (CreateWorkflowTemplateRequest) returns (WorkflowTemplate) { option (google.api.http) = { post: "/apis/v1beta1/{namespace}/workflow_templates" @@ -59,6 +67,12 @@ service WorkflowTemplateService { } } +message GenerateWorkflowTemplateRequest { + string namespace = 1; + string uid = 2; + WorkflowTemplate workflowTemplate = 3; +} + message CreateWorkflowTemplateRequest { string namespace = 1; WorkflowTemplate workflowTemplate = 2; From 182664c9432ff8720877ac8818530800c883e055 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Sat, 19 Dec 2020 20:52:52 -0800 Subject: [PATCH 02/37] feat: add workflow template and updated workspace template parameter logic to replace select.nodepool values with runtime values. --- pkg/workflow_template.go | 96 +++++++++++++++++++++++++++++ pkg/workspace_template.go | 6 ++ server/workflow_template_server.go | 28 +++++++++ server/workspace_template_server.go | 3 +- 4 files changed, 131 insertions(+), 2 deletions(-) diff --git a/pkg/workflow_template.go b/pkg/workflow_template.go index fd163414..3700b715 100644 --- a/pkg/workflow_template.go +++ b/pkg/workflow_template.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/onepanelio/core/pkg/util/ptr" "github.com/onepanelio/core/pkg/util/request" pagination "github.com/onepanelio/core/pkg/util/request/pagination" "strconv" @@ -32,6 +33,38 @@ func (wt *WorkflowTemplateFilter) GetLabels() []*Label { return wt.Labels } +// replaceSysNodePoolOptions replaces a select.nodepool parameter with the nodePool options in the systemConfig +// and returns the new parameters with the change. +func (c *Client) replaceSysNodePoolOptions(parameters []Parameter) (result []Parameter, err error) { + nodePoolOptions, err := c.systemConfig.NodePoolOptions() + if err != nil { + return result, err + } + + nodePoolParameterOptions := make([]*ParameterOption, 0) + for _, option := range nodePoolOptions { + nodePoolParameterOptions = append(nodePoolParameterOptions, &ParameterOption{ + Name: option.Name, + Value: option.Value, + }) + } + + for i := range parameters { + param := parameters[i] + if param.Type == "select.nodepool" { + param.Options = nodePoolParameterOptions + + if param.Value != nil && *param.Value == "default" { + param.Value = ptr.String(param.Options[0].Value) + } + } + + result = append(result, param) + } + + return +} + func applyWorkflowTemplateFilter(sb sq.SelectBuilder, request *request.Request) (sq.SelectBuilder, error) { if !request.HasFilter() { return sb, nil @@ -390,6 +423,30 @@ func (c *Client) getWorkflowTemplate(namespace, uid string, version int64) (work } workflowTemplate.Parameters = wtv.Parameters + + nodePoolOptions, err := c.systemConfig.NodePoolOptions() + if err != nil { + return nil, err + } + nodePoolParameterOptions := make([]*ParameterOption, 0) + for _, option := range nodePoolOptions { + nodePoolParameterOptions = append(nodePoolParameterOptions, &ParameterOption{ + Name: option.Name, + Value: option.Value, + }) + } + + for i := range workflowTemplate.Parameters { + param := &workflowTemplate.Parameters[i] + if param.Type == "select.nodepool" { + param.Options = nodePoolParameterOptions + + if param.Value != nil && *param.Value == "default" { + param.Value = ptr.String(param.Options[0].Value) + } + } + } + return workflowTemplate, nil } @@ -1061,3 +1118,42 @@ func (c *Client) GetWorkflowTemplateLabels(namespace, name, prefix string, versi return } + +// GenerateWorkflowTemplate replaces any special parameters with runtime values +func (c *Client) GenerateWorkflowTemplateManifest(manifest string) (string, error) { + manifestObject := make(map[string]interface{}) + if err := yaml.Unmarshal([]byte(manifest), &manifestObject); err != nil { + return "", util.NewUserError(codes.InvalidArgument, "Invalid yaml") + } + + argumentsRaw := manifestObject["arguments"] + arguments, ok := argumentsRaw.(map[string]interface{}) + if !ok { + return "", fmt.Errorf("unable to parse arguments") + } + + jsonParameters, err := json.Marshal(arguments["parameters"]) + if err != nil { + return "", err + } + + parameters := make([]Parameter, 0) + if err := json.Unmarshal(jsonParameters, ¶meters); err != nil { + return "", err + } + + parameters, err = c.replaceSysNodePoolOptions(parameters) + if err != nil { + return "", err + } + + arguments["parameters"] = parameters + manifestObject["arguments"] = arguments + + finalManifest, err := yaml.Marshal(manifestObject) + if err != nil { + return "", err + } + + return string(finalManifest), err +} diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index bcea6d78..06cbad48 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -945,6 +945,12 @@ func (c *Client) generateWorkspaceTemplateWorkflowTemplate(workspaceTemplate *Wo return nil, util.NewUserError(codes.InvalidArgument, err.Error()) } + modifiedParameters, err := c.replaceSysNodePoolOptions(workspaceSpec.Arguments.Parameters) + if err != nil { + return nil, err + } + workspaceSpec.Arguments.Parameters = modifiedParameters + if err = generateArguments(workspaceSpec, config); err != nil { return nil, err } diff --git a/server/workflow_template_server.go b/server/workflow_template_server.go index 4f39e1c9..69c62193 100644 --- a/server/workflow_template_server.go +++ b/server/workflow_template_server.go @@ -47,6 +47,34 @@ func apiWorkflowTemplate(wft *v1.WorkflowTemplate) *api.WorkflowTemplate { return res } +// GenerateWorkflowTemplate generates a workflow template, applying any modifications based on the content of the manifest +func (s *WorkflowTemplateServer) GenerateWorkflowTemplate(ctx context.Context, req *api.GenerateWorkflowTemplateRequest) (*api.WorkflowTemplate, error) { + client := getClient(ctx) + allowed, err := auth.IsAuthorized(client, req.Namespace, "get", "argoproj.io", "workflowtemplates", "") + if err != nil || !allowed { + return nil, err + } + + if req.WorkflowTemplate.Manifest == "" { + return &api.WorkflowTemplate{ + Manifest: "", + }, nil + } + + finalManifest, err := client.GenerateWorkflowTemplateManifest(req.WorkflowTemplate.Manifest) + if err != nil { + return &api.WorkflowTemplate{ + Manifest: "", + }, err + } + + workflowTemplate := &v1.WorkflowTemplate{ + Manifest: finalManifest, + } + + return apiWorkflowTemplate(workflowTemplate), nil +} + // CreateWorkflowTemplate creates a workflow template and the initial version func (s *WorkflowTemplateServer) CreateWorkflowTemplate(ctx context.Context, req *api.CreateWorkflowTemplateRequest) (*api.WorkflowTemplate, error) { client := getClient(ctx) diff --git a/server/workspace_template_server.go b/server/workspace_template_server.go index d391042c..6f1f0b8a 100644 --- a/server/workspace_template_server.go +++ b/server/workspace_template_server.go @@ -61,8 +61,7 @@ func (s WorkspaceTemplateServer) GenerateWorkspaceTemplateWorkflowTemplate(ctx c Manifest: req.WorkspaceTemplate.Manifest, } workflowTemplate, err := client.GenerateWorkspaceTemplateWorkflowTemplate(workspaceTemplate) - - if workflowTemplate == nil { + if err != nil || workflowTemplate == nil { return &api.WorkflowTemplate{ Manifest: "", }, err From 7e94686efe9d461aca5d6b15736ccbe5cc829c63 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 09:10:15 -0800 Subject: [PATCH 03/37] feat: update templates to add node pool argument (WIP) --- db/go/20201221194344_pytorch_update.go | 35 ++++++++ ...nn_update_parameters_to_select_nodepool.go | 38 +++++++++ ...1223062947_tf_training_update_node_pool.go | 38 +++++++++ db/go/db.go | 69 ++++++++++++--- db/go/util.go | 3 +- ...0201208155115.yaml => 20201221195937.yaml} | 40 +++------ db/yaml/pytorch_training/20200605090509.yaml | 75 ++++++++++++++++ db/yaml/pytorch_training/20201221194344.yaml | 83 ++++++++++++++++++ db/yaml/tf_training/20201223062947.yaml | 85 +++++++++++++++++++ db/yaml/tf_training/README.md | 1 + pkg/client.go | 15 ++++ pkg/workspace_template.go | 8 +- 12 files changed, 445 insertions(+), 45 deletions(-) create mode 100644 db/go/20201221194344_pytorch_update.go create mode 100644 db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go create mode 100644 db/go/20201223062947_tf_training_update_node_pool.go rename db/yaml/maskrcnn/{20201208155115.yaml => 20201221195937.yaml} (87%) create mode 100644 db/yaml/pytorch_training/20200605090509.yaml create mode 100644 db/yaml/pytorch_training/20201221194344.yaml create mode 100644 db/yaml/tf_training/20201223062947.yaml create mode 100644 db/yaml/tf_training/README.md diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go new file mode 100644 index 00000000..9a34ce7e --- /dev/null +++ b/db/go/20201221194344_pytorch_update.go @@ -0,0 +1,35 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201221194344() { + if _, ok := initializedMigrations[20201221194344]; !ok { + goose.AddMigration(Up20201221194344, Down20201221194344) + initializedMigrations[20201221194344] = true + } +} + +func Up20201221194344(tx *sql.Tx) error { + return updateWorkflowTemplateManifest( + filepath.Join("pytorch_training", "20201221194344.yaml"), + pytorchMnistWorkflowTemplateName, + map[string]string{ + "created-by": "system", + }, + ) +} + +func Down20201221194344(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("pytorch_training", "20200605090509.yaml"), + pytorchMnistWorkflowTemplateName, + map[string]string{ + "created-by": "system", + }, + ) +} diff --git a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go new file mode 100644 index 00000000..3e09923c --- /dev/null +++ b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go @@ -0,0 +1,38 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201221195937() { + if _, ok := initializedMigrations[20201221195937]; !ok { + goose.AddMigration(Up20201221195937, Down20201221195937) + initializedMigrations[20201221195937] = true + } +} + +func Up20201221195937(tx *sql.Tx) error { + // This code is executed when the migration is applied. + return updateWorkflowTemplateManifest( + filepath.Join("maskrcnn", "20201221195937.yaml"), + maskRCNNWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} + +func Down20201221195937(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("maskrcnn", "20201208155115.yaml"), + maskRCNNWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go new file mode 100644 index 00000000..b2093b7a --- /dev/null +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -0,0 +1,38 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201223062947() { + if _, ok := initializedMigrations[20201223062947]; !ok { + goose.AddMigration(Up20201223062947, Down20201223062947) + initializedMigrations[20201223062947] = true + } +} + +func Up20201223062947(tx *sql.Tx) error { + // This code is executed when the migration is applied. + return updateWorkflowTemplateManifest( + filepath.Join("tf_training", "20201223062947.yaml"), + tensorflowWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} + +func Down20201223062947(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("tf_training", "20201223062947.yaml"), + tensorflowWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} diff --git a/db/go/db.go b/db/go/db.go index 570bdd97..eda13777 100644 --- a/db/go/db.go +++ b/db/go/db.go @@ -2,6 +2,7 @@ package migration import ( "errors" + "fmt" sq "github.com/Masterminds/squirrel" "github.com/jmoiron/sqlx" v1 "github.com/onepanelio/core/pkg" @@ -78,6 +79,9 @@ func Initialize() { initialize20201209124226() initialize20201211161117() initialize20201214133458() + initialize20201221194344() + initialize20201221195937() + initialize20201223062947() if err := client.DB.Close(); err != nil { log.Printf("[error] closing db %v", err) @@ -123,30 +127,73 @@ func getRanSQLMigrations(client *v1.Client) (map[uint64]bool, error) { // ReplaceArtifactRepositoryType will look for {{.ArtifactRepositoryType}} in the migration and replace it based on config. func ReplaceArtifactRepositoryType(client *v1.Client, namespace *v1.Namespace, workflowTemplate *v1.WorkflowTemplate, workspaceTemplate *v1.WorkspaceTemplate) error { - artifactRepositoryType := "s3" - nsConfig, err := client.GetNamespaceConfig(namespace.Name) + artifactRepositoryType, err := client.GetArtifactRepositoryType(namespace.Name) if err != nil { return err } - if nsConfig.ArtifactRepository.GCS != nil { - artifactRepositoryType = "gcs" + + replaceMap := map[string]string{ + "{{.ArtifactRepositoryType}}": artifactRepositoryType, } + if workflowTemplate == nil && workspaceTemplate == nil { + return errors.New("workflow and workspace template cannot both be nil") + } if workflowTemplate != nil { - workflowTemplate.Manifest = strings.NewReplacer( - "{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workflowTemplate.Manifest) + workflowTemplate.Manifest = ReplaceMapValues(workflowTemplate.Manifest, replaceMap) } if workspaceTemplate != nil { - workspaceTemplate.Manifest = strings.NewReplacer( - "{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workspaceTemplate.Manifest) - } - if workflowTemplate == nil && workspaceTemplate == nil { - return errors.New("workflow and workspace template cannot be nil") + workspaceTemplate.Manifest = ReplaceMapValues(workspaceTemplate.Manifest, replaceMap) } return nil } +// ReplaceMapValues will replace strings that are keys in the input map with their values +// the result is returned +func ReplaceMapValues(value string, replaceMap map[string]string) string { + replacePairs := make([]string, 0) + + for key, value := range replaceMap { + replacePairs = append(replacePairs, key) + replacePairs = append(replacePairs, value) + } + + return strings.NewReplacer(replacePairs...). + Replace(value) +} + +// ReplaceRuntimeVariablesInManifest will replace any values that are runtime variables +// with the values currently present in the configuration for a given namespace. +// the result is returned +func ReplaceRuntimeVariablesInManifest(client *v1.Client, namespace string, manifest string) (string, error) { + artifactRepositoryType, err := client.GetArtifactRepositoryType(namespace) + if err != nil { + return manifest, err + } + + sysConfig, err := client.GetSystemConfig() + if err != nil { + return manifest, err + } + + nodePoolOptions, err := sysConfig.NodePoolOptions() + if err != nil { + return manifest, err + } + + if len(nodePoolOptions) == 0 { + return manifest, fmt.Errorf("no node pool options in the configuration") + } + + replaceMap := map[string]string{ + "{{.ArtifactRepositoryType}}": artifactRepositoryType, + "{{.DefaultNodePoolOption}}": nodePoolOptions[0].Value, + } + + return ReplaceMapValues(manifest, replaceMap), nil +} + // readDataFile returns the contents of a file in the db/data/{path} directory // path can indicate subdirectories like cvat/20201016170415.yaml func readDataFile(path string) (string, error) { diff --git a/db/go/util.go b/db/go/util.go index b3cd56fd..57831862 100644 --- a/db/go/util.go +++ b/db/go/util.go @@ -81,10 +81,11 @@ func updateWorkflowTemplateManifest(filename, templateName string, labels map[st Labels: labels, } - err = ReplaceArtifactRepositoryType(client, namespace, workflowTemplate, nil) + workflowTemplate.Manifest, err = ReplaceRuntimeVariablesInManifest(client, namespace.Name, workflowTemplate.Manifest) if err != nil { return err } + if _, err := client.CreateWorkflowTemplateVersion(namespace.Name, workflowTemplate); err != nil { return err } diff --git a/db/yaml/maskrcnn/20201208155115.yaml b/db/yaml/maskrcnn/20201221195937.yaml similarity index 87% rename from db/yaml/maskrcnn/20201208155115.yaml rename to db/yaml/maskrcnn/20201221195937.yaml index 053b6378..34b9234e 100644 --- a/db/yaml/maskrcnn/20201208155115.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -11,13 +11,13 @@ arguments: value: annotation-dump/sample_dataset hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. displayName: Dataset path - visibility: private + visibility: internal - name: cvat-output-path value: workflow-data/output/sample_output hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. displayName: Workflow output path - visibility: private + visibility: internal - name: cvat-finetune-checkpoint value: '' @@ -29,7 +29,7 @@ arguments: displayName: Number of classes hint: Number of classes (i.e in CVAT taks) + 1 for background value: '81' - visibility: private + visibility: internal - name: hyperparameters displayName: Hyperparameters @@ -60,21 +60,13 @@ arguments: - displayName: Node pool hint: Name of node pool or group to run this workflow task - type: select.select + type: select.nodepool visibility: public name: sys-node-pool - value: Standard_D4s_v3 + value: {{.DefaultNodePoolOption}} required: true - options: - - name: 'CPU: 2, RAM: 8GB' - value: Standard_D2s_v3 - - name: 'CPU: 4, RAM: 16GB' - value: Standard_D4s_v3 - - name: 'GPU: 1xK80, CPU: 6, RAM: 56GB' - value: Standard_NC6 templates: - - name: main - dag: + - dag: tasks: - name: train-model template: tensorflow @@ -90,8 +82,8 @@ templates: # - train-model # name: notify-in-slack # template: slack-notify-success - - name: tensorflow - container: + name: main + - container: args: - | apt-get update \ @@ -124,34 +116,24 @@ templates: workingDir: /mnt/src nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [sh, -c] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: ["tensorboard --logdir /mnt/output/"] - ports: - - containerPort: 6006 - name: tensorboard inputs: artifacts: - name: data path: /mnt/data/datasets/ - {{.ArtifactRepositoryType}}: + s3: key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' - git: repo: '{{workflow.parameters.source}}' revision: "no-boto" name: src path: /mnt/src + name: tensorflow outputs: artifacts: - name: model optional: true path: /mnt/output - {{.ArtifactRepositoryType}}: + s3: key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' # Uncomment the lines below if you want to send Slack notifications #- container: diff --git a/db/yaml/pytorch_training/20200605090509.yaml b/db/yaml/pytorch_training/20200605090509.yaml new file mode 100644 index 00000000..8172a5ec --- /dev/null +++ b/db/yaml/pytorch_training/20200605090509.yaml @@ -0,0 +1,75 @@ +entrypoint: main +arguments: + parameters: + - name: source + value: https://github.com/onepanelio/pytorch-examples.git + - name: command + value: "python mnist/main.py --epochs=1" +volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi + - metadata: + name: output + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi +templates: + - name: main + dag: + tasks: + - name: train-model + template: pytorch + # Uncomment section below to send metrics to Slack + # - name: notify-in-slack + # dependencies: [train-model] + # template: slack-notify-success + # arguments: + # parameters: + # - name: status + # value: "{{tasks.train-model.status}}" + # artifacts: + # - name: metrics + # from: "{{tasks.train-model.outputs.artifacts.sys-metrics}}" + - name: pytorch + inputs: + artifacts: + - name: src + path: /mnt/src + git: + repo: "{{workflow.parameters.source}}" + outputs: + artifacts: + - name: model + path: /mnt/output + optional: true + archive: + none: {} + container: + image: pytorch/pytorch:latest + command: [sh,-c] + args: ["{{workflow.parameters.command}}"] + workingDir: /mnt/src + volumeMounts: + - name: data + mountPath: /mnt/data + - name: output + mountPath: /mnt/output + - name: slack-notify-success + container: + image: technosophos/slack-notify + command: [sh,-c] + args: ['SLACK_USERNAME=Worker SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify'] + inputs: + parameters: + - name: status + artifacts: + - name: metrics + path: /tmp/metrics.json + optional: true \ No newline at end of file diff --git a/db/yaml/pytorch_training/20201221194344.yaml b/db/yaml/pytorch_training/20201221194344.yaml new file mode 100644 index 00000000..5d208745 --- /dev/null +++ b/db/yaml/pytorch_training/20201221194344.yaml @@ -0,0 +1,83 @@ +entrypoint: main +arguments: + parameters: + - name: source + value: https://github.com/onepanelio/pytorch-examples.git + - name: command + value: "python mnist/main.py --epochs=1" + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.nodepool + name: sys-node-pool + value: {{.DefaultNodePoolOption}} + visibility: public + required: true +volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi + - metadata: + name: output + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi +templates: + - name: main + dag: + tasks: + - name: train-model + template: pytorch + # Uncomment the lines below if you want to send Slack notifications + # - name: notify-in-slack + # dependencies: [train-model] + # template: slack-notify-success + # arguments: + # parameters: + # - name: status + # value: "{{tasks.train-model.status}}" + # artifacts: + # - name: metrics + # from: "{{tasks.train-model.outputs.artifacts.sys-metrics}}" + - name: pytorch + inputs: + artifacts: + - name: src + path: /mnt/src + git: + repo: "{{workflow.parameters.source}}" + outputs: + artifacts: + - name: model + path: /mnt/output + optional: true + archive: + none: {} + container: + image: pytorch/pytorch:latest + command: [sh,-c] + args: ["{{workflow.parameters.command}}"] + workingDir: /mnt/src + volumeMounts: + - name: data + mountPath: /mnt/data + - name: output + mountPath: /mnt/output +# Uncomment the lines below if you want to send Slack notifications +# - name: slack-notify-success +# container: +# image: technosophos/slack-notify +# command: [sh,-c] +# args: ['SLACK_USERNAME=Worker SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify'] +# inputs: +# parameters: +# - name: status +# artifacts: +# - name: metrics +# path: /tmp/metrics.json +# optional: true diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tf_training/20201223062947.yaml new file mode 100644 index 00000000..16a73110 --- /dev/null +++ b/db/yaml/tf_training/20201223062947.yaml @@ -0,0 +1,85 @@ +arguments: + parameters: + - name: epochs + value: '10' + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.nodepool + name: sys-node-pool + value: {{.DefaultNodePoolOption}} + visibility: public + required: true +entrypoint: main +templates: + - name: main + dag: + tasks: + - name: train-model + template: tf-dense + - name: tf-dense + script: + image: tensorflow/tensorflow:2.3.0 + command: + - python + - '-u' + source: | + import tensorflow as tf + import datetime + + mnist = tf.keras.datasets.mnist + + (x_train, y_train),(x_test, y_test) = mnist.load_data() + x_train, x_test = x_train / 255.0, x_test / 255.0 + + def create_model(): + return tf.keras.models.Sequential([ + tf.keras.layers.Flatten(input_shape=(28, 28)), + tf.keras.layers.Dense(512, activation='relu'), + tf.keras.layers.Dropout(0.2), + tf.keras.layers.Dense(10, activation='softmax') + ]) + + model = create_model() + model.compile(optimizer='adam', + loss='sparse_categorical_crossentropy', + metrics=['accuracy']) + + # Write logs to /mnt/output + log_dir = "/mnt/output/logs/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1) + + history = model.fit(x=x_train, + y=y_train, + epochs={{workflow.parameters.epochs}}, + validation_data=(x_test, y_test), + callbacks=[tensorboard_callback]) + volumeMounts: + # TensorBoard sidecar will automatically mount this volume + - name: output + mountPath: /mnt/output + + sidecars: + - name: tensorboard + image: 'tensorflow/tensorflow:2.3.0' + command: + - sh + - '-c' + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: + # Read logs from /mnt/output - this directory is auto-mounted from volumeMounts + - tensorboard --logdir /mnt/output/ + ports: + - containerPort: 6006 + name: tensorboard + +volumeClaimTemplates: + # Provision a volume that can be shared between main container and TensorBoard side car + - metadata: + name: output + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi diff --git a/db/yaml/tf_training/README.md b/db/yaml/tf_training/README.md new file mode 100644 index 00000000..a7ea0257 --- /dev/null +++ b/db/yaml/tf_training/README.md @@ -0,0 +1 @@ +See https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file diff --git a/pkg/client.go b/pkg/client.go index ab411ed7..1bd324b4 100644 --- a/pkg/client.go +++ b/pkg/client.go @@ -152,6 +152,21 @@ func (c *Client) GetWebRouter() (router.Web, error) { return webRouter, err } +// GetArtifactRepositoryType returns the configured artifact repository type for the given namespace. +// possible return values are: "s3", "gcs" +func (c *Client) GetArtifactRepositoryType(namespace string) (string, error) { + artifactRepositoryType := "s3" + nsConfig, err := c.GetNamespaceConfig(namespace) + if err != nil { + return "", err + } + if nsConfig.ArtifactRepository.GCS != nil { + artifactRepositoryType = "gcs" + } + + return artifactRepositoryType, nil +} + // getKubernetesTimeout returns the timeout for kubernetes requests. // It uses the KUBERNETES_TIMEOUT environment variable and defaults to 60 seconds if not found or an error occurs // parsing the set timeout. diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index 06cbad48..5005f15e 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -184,9 +184,6 @@ func generateRuntimeParameters(config SystemConfig) (parameters []Parameter, err if err != nil { return nil, err } - if len(nodePoolOptions) == 0 { - return nil, fmt.Errorf("no node pool options in config") - } var options []*ParameterOption for _, option := range nodePoolOptions { options = append(options, &ParameterOption{ @@ -194,6 +191,9 @@ func generateRuntimeParameters(config SystemConfig) (parameters []Parameter, err Value: option.Value, }) } + if len(options) == 0 { + return nil, fmt.Errorf("no node pool options in config") + } parameters = append(parameters, Parameter{ Name: "sys-node-pool-label", @@ -204,7 +204,7 @@ func generateRuntimeParameters(config SystemConfig) (parameters []Parameter, err parameters = append(parameters, Parameter{ Name: "sys-node-pool", Value: ptr.String(options[0].Value), - Type: "select.select", + Type: "select.nodepool", Options: options, DisplayName: ptr.String("Node pool"), Hint: ptr.String("Name of node pool or group"), From c46f16356b4ce9a01972960315e637cf97c9e20d Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 13:03:31 -0800 Subject: [PATCH 04/37] feat: update other workflows with new node pool information. --- db/go/20201223202929_tfod_update_node_pool.go | 38 ++++ db/go/db.go | 1 + db/yaml/maskrcnn/20201221195937.yaml | 11 + db/yaml/pytorch_training/20201221194344.yaml | 6 +- db/yaml/tf_training/README.md | 2 +- db/yaml/tfod/20201223202929.yaml | 212 ++++++++++++++++++ db/yaml/tfod/README.md | 1 + 7 files changed, 267 insertions(+), 4 deletions(-) create mode 100644 db/go/20201223202929_tfod_update_node_pool.go create mode 100644 db/yaml/tfod/20201223202929.yaml create mode 100644 db/yaml/tfod/README.md diff --git a/db/go/20201223202929_tfod_update_node_pool.go b/db/go/20201223202929_tfod_update_node_pool.go new file mode 100644 index 00000000..e0ff7357 --- /dev/null +++ b/db/go/20201223202929_tfod_update_node_pool.go @@ -0,0 +1,38 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201223202929() { + if _, ok := initializedMigrations[20201223202929]; !ok { + goose.AddMigration(Up20201223202929, Down20201223202929) + initializedMigrations[20201223202929] = true + } +} + +func Up20201223202929(tx *sql.Tx) error { + // This code is executed when the migration is applied. + return updateWorkflowTemplateManifest( + filepath.Join("tfod", "20201223202929.yaml"), + tensorflowObjectDetectionWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} + +func Down20201223202929(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("tfod", "20201208155115.yaml"), + tensorflowObjectDetectionWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} diff --git a/db/go/db.go b/db/go/db.go index eda13777..ce8591cc 100644 --- a/db/go/db.go +++ b/db/go/db.go @@ -82,6 +82,7 @@ func Initialize() { initialize20201221194344() initialize20201221195937() initialize20201223062947() + initialize20201223202929() if err := client.DB.Close(); err != nil { log.Printf("[error] closing db %v", err) diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/maskrcnn/20201221195937.yaml index 34b9234e..138f09e3 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -116,6 +116,17 @@ templates: workingDir: /mnt/src nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard inputs: artifacts: - name: data diff --git a/db/yaml/pytorch_training/20201221194344.yaml b/db/yaml/pytorch_training/20201221194344.yaml index 5d208745..65465c9a 100644 --- a/db/yaml/pytorch_training/20201221194344.yaml +++ b/db/yaml/pytorch_training/20201221194344.yaml @@ -57,11 +57,11 @@ templates: path: /mnt/output optional: true archive: - none: {} + none: { } container: image: pytorch/pytorch:latest - command: [sh,-c] - args: ["{{workflow.parameters.command}}"] + command: [ sh,-c ] + args: [ "{{workflow.parameters.command}}" ] workingDir: /mnt/src volumeMounts: - name: data diff --git a/db/yaml/tf_training/README.md b/db/yaml/tf_training/README.md index a7ea0257..bc1f964e 100644 --- a/db/yaml/tf_training/README.md +++ b/db/yaml/tf_training/README.md @@ -1 +1 @@ -See https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file +https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file diff --git a/db/yaml/tfod/20201223202929.yaml b/db/yaml/tfod/20201223202929.yaml new file mode 100644 index 00000000..a4ba5b5c --- /dev/null +++ b/db/yaml/tfod/20201223202929.yaml @@ -0,0 +1,212 @@ +arguments: + parameters: + - name: source + value: https://github.com/tensorflow/models.git + displayName: Model source code + type: hidden + visibility: private + + - name: trainingsource + value: https://github.com/onepanelio/templates.git + type: hidden + visibility: private + + - name: revision + value: v1.13.0 + type: hidden + visibility: private + + - name: cvat-annotation-path + value: annotation-dump/sample_dataset + displayName: Dataset path + hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. + visibility: internal + + - name: cvat-output-path + value: workflow-data/output/sample_output + hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. + displayName: Workflow output path + visibility: internal + + - name: cvat-model + value: frcnn-res50-coco + displayName: Model + hint: TF Detection API's model to use for training. + type: select.select + visibility: public + options: + - name: 'Faster RCNN-ResNet 101-COCO' + value: frcnn-res101-coco + - name: 'Faster RCNN-ResNet 101-Low Proposal-COCO' + value: frcnn-res101-low + - name: 'Faster RCNN-ResNet 50-COCO' + value: frcnn-res50-coco + - name: 'Faster RCNN-NAS-COCO' + value: frcnn-nas-coco + - name: 'SSD MobileNet V1-COCO' + value: ssd-mobilenet-v1-coco2 + - name: 'SSD MobileNet V2-COCO' + value: ssd-mobilenet-v2-coco + - name: 'SSDLite MobileNet-COCO' + value: ssdlite-mobilenet-coco + + - name: hyperparameters + value: |- + num-steps=10000 + displayName: Hyperparameters + visibility: public + type: textarea.textarea + hint: "Please refer to our documentation for more information on parameters. Number of classes will be automatically populated if you had 'sys-num-classes' parameter in a workflow." + + - name: cvat-finetune-checkpoint + value: '' + hint: Select the last fine-tune checkpoint for this model. It may take up to 5 minutes for a recent checkpoint show here. Leave empty if this is the first time you're training this model. + displayName: Checkpoint path + visibility: public + + - name: cvat-num-classes + value: '81' + hint: Number of classes + displayName: Number of classes + visibility: internal + + - name: tf-image + value: tensorflow/tensorflow:1.13.1-py3 + type: select.select + displayName: Select TensorFlow image + visibility: public + hint: Select the GPU image if you are running on a GPU node pool + options: + - name: 'TensorFlow 1.13.1 CPU Image' + value: 'tensorflow/tensorflow:1.13.1-py3' + - name: 'TensorFlow 1.13.1 GPU Image' + value: 'tensorflow/tensorflow:1.13.1-gpu-py3' + + - name: dump-format + value: cvat_tfrecord + visibility: public + + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.nodepool + name: sys-node-pool + value: {{.DefaultNodePoolOption}} + visibility: public + required: true + +entrypoint: main +templates: + - dag: + tasks: + - name: train-model + template: tensorflow + # Uncomment the lines below if you want to send Slack notifications + # - arguments: + # artifacts: + # - from: '{{tasks.train-model.outputs.artifacts.sys-metrics}}' + # name: metrics + # parameters: + # - name: status + # value: '{{tasks.train-model.status}}' + # dependencies: + # - train-model + # name: notify-in-slack + # template: slack-notify-success + name: main + - container: + args: + - | + apt-get update && \ + apt-get install -y python3-pip git wget unzip libglib2.0-0 libsm6 libxext6 libxrender-dev && \ + pip install pillow lxml Cython contextlib2 jupyter matplotlib numpy scipy boto3 pycocotools pyyaml google-cloud-storage test-generator && \ + cd /mnt/src/tf/research && \ + export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim && \ + mkdir -p /mnt/src/protoc && \ + wget -P /mnt/src/protoc https://github.com/protocolbuffers/protobuf/releases/download/v3.10.1/protoc-3.10.1-linux-x86_64.zip && \ + cd /mnt/src/protoc/ && \ + unzip protoc-3.10.1-linux-x86_64.zip && \ + cd /mnt/src/tf/research/ && \ + /mnt/src/protoc/bin/protoc object_detection/protos/*.proto --python_out=. && \ + cd /mnt/src/train/workflows/tf-object-detection-training && \ + python train.py \ + --extras="{{workflow.parameters.hyperparameters}}" \ + --model="{{workflow.parameters.cvat-model}}" \ + --num_classes="{{workflow.parameters.cvat-num-classes}}" \ + --sys_finetune_checkpoint={{workflow.parameters.cvat-finetune-checkpoint}} + command: + - sh + - -c + image: '{{workflow.parameters.tf-image}}' + volumeMounts: + - mountPath: /mnt/data + name: data + - mountPath: /mnt/output + name: output + workingDir: /mnt/src + nodeSelector: + beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' + inputs: + artifacts: + - name: data + path: /mnt/data/datasets/ + s3: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' + - name: models + path: /mnt/data/models/ + optional: true + s3: + key: '{{workflow.parameters.cvat-finetune-checkpoint}}' + - git: + repo: '{{workflow.parameters.source}}' + revision: '{{workflow.parameters.revision}}' + name: src + path: /mnt/src/tf + - git: + repo: '{{workflow.parameters.trainingsource}}' + name: tsrc + path: /mnt/src/train + name: tensorflow + outputs: + artifacts: + - name: model + optional: true + path: /mnt/output + s3: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' +# Uncomment the lines below if you want to send Slack notifications +#- container: +# args: +# - SLACK_USERNAME=Onepanel SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" +# SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd +# SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify +# command: +# - sh +# - -c +# image: technosophos/slack-notify +# inputs: +# artifacts: +# - name: metrics +# optional: true +# path: /tmp/metrics.json +# parameters: +# - name: status +# name: slack-notify-success +volumeClaimTemplates: + - metadata: + creationTimestamp: null + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi + - metadata: + creationTimestamp: null + name: output + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi diff --git a/db/yaml/tfod/README.md b/db/yaml/tfod/README.md new file mode 100644 index 00000000..a79ec33f --- /dev/null +++ b/db/yaml/tfod/README.md @@ -0,0 +1 @@ +https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml \ No newline at end of file From 2759d1ae6888bc6256203d4c6a0679e584edf709 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 13:19:21 -0800 Subject: [PATCH 05/37] chore: update documentation for migration methods --- db/go/20201221194344_pytorch_update.go | 2 ++ ...01221195937_maskrcnn_update_parameters_to_select_nodepool.go | 2 ++ db/go/20201223062947_tf_training_update_node_pool.go | 2 ++ db/go/20201223202929_tfod_update_node_pool.go | 2 ++ 4 files changed, 8 insertions(+) diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go index 9a34ce7e..ed24ce4a 100644 --- a/db/go/20201221194344_pytorch_update.go +++ b/db/go/20201221194344_pytorch_update.go @@ -13,6 +13,7 @@ func initialize20201221194344() { } } +// Up20201221194344 updates pytorch_training with the sys.nodepool changes func Up20201221194344(tx *sql.Tx) error { return updateWorkflowTemplateManifest( filepath.Join("pytorch_training", "20201221194344.yaml"), @@ -23,6 +24,7 @@ func Up20201221194344(tx *sql.Tx) error { ) } +// Down20201221194344 undoes the sys-nodepool changes func Down20201221194344(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( diff --git a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go index 3e09923c..b0351dca 100644 --- a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go +++ b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go @@ -13,6 +13,7 @@ func initialize20201221195937() { } } +// Up20201221195937 updates maskrcnn with sys.nodepool changes func Up20201221195937(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( @@ -25,6 +26,7 @@ func Up20201221195937(tx *sql.Tx) error { ) } +// Down20201221195937 undoes the sys.nodepool changes func Down20201221195937(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go index b2093b7a..f7844ed6 100644 --- a/db/go/20201223062947_tf_training_update_node_pool.go +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -13,6 +13,7 @@ func initialize20201223062947() { } } +// Up20201223062947 updates tf_training with sys.nodepool changes func Up20201223062947(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( @@ -25,6 +26,7 @@ func Up20201223062947(tx *sql.Tx) error { ) } +// Down20201223062947 undoes sys.nodepool changes func Down20201223062947(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( diff --git a/db/go/20201223202929_tfod_update_node_pool.go b/db/go/20201223202929_tfod_update_node_pool.go index e0ff7357..f2dd7730 100644 --- a/db/go/20201223202929_tfod_update_node_pool.go +++ b/db/go/20201223202929_tfod_update_node_pool.go @@ -13,6 +13,7 @@ func initialize20201223202929() { } } +// Up20201223202929 updates tfod with sys.nodepool func Up20201223202929(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( @@ -25,6 +26,7 @@ func Up20201223202929(tx *sql.Tx) error { ) } +// Down20201223202929 undoes the sys.nodepool changes func Down20201223202929(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( From 720f64213dc3e6d2eaf597db4eb11dd48cbd1003 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 14:21:23 -0800 Subject: [PATCH 06/37] chore: code cleanup for codacy --- pkg/workflow_template.go | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/pkg/workflow_template.go b/pkg/workflow_template.go index 3700b715..6ae694ae 100644 --- a/pkg/workflow_template.go +++ b/pkg/workflow_template.go @@ -422,30 +422,10 @@ func (c *Client) getWorkflowTemplate(namespace, uid string, version int64) (work return workflowTemplate, err } - workflowTemplate.Parameters = wtv.Parameters - - nodePoolOptions, err := c.systemConfig.NodePoolOptions() + workflowTemplate.Parameters, err = c.replaceSysNodePoolOptions(wtv.Parameters) if err != nil { return nil, err } - nodePoolParameterOptions := make([]*ParameterOption, 0) - for _, option := range nodePoolOptions { - nodePoolParameterOptions = append(nodePoolParameterOptions, &ParameterOption{ - Name: option.Name, - Value: option.Value, - }) - } - - for i := range workflowTemplate.Parameters { - param := &workflowTemplate.Parameters[i] - if param.Type == "select.nodepool" { - param.Options = nodePoolParameterOptions - - if param.Value != nil && *param.Value == "default" { - param.Value = ptr.String(param.Options[0].Value) - } - } - } return workflowTemplate, nil } @@ -1119,7 +1099,7 @@ func (c *Client) GetWorkflowTemplateLabels(namespace, name, prefix string, versi return } -// GenerateWorkflowTemplate replaces any special parameters with runtime values +// GenerateWorkflowTemplateManifest replaces any special parameters with runtime values func (c *Client) GenerateWorkflowTemplateManifest(manifest string) (string, error) { manifestObject := make(map[string]interface{}) if err := yaml.Unmarshal([]byte(manifest), &manifestObject); err != nil { From 6a3b21ad119de1cad11b0d9af7bfd019c1d62afc Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 12:06:41 -0800 Subject: [PATCH 07/37] fix: incorrect indentation of sidecars in migration --- db/yaml/maskrcnn/20201221195937.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/maskrcnn/20201221195937.yaml index 138f09e3..13e6b969 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -116,17 +116,17 @@ templates: workingDir: /mnt/src nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [ sh, -c ] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: [ "tensorboard --logdir /mnt/output/" ] - ports: - - containerPort: 6006 - name: tensorboard + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard inputs: artifacts: - name: data From dc660e0b2fcdda4c5e9e1f7ee1bfbeea2142eb0b Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 12:09:56 -0800 Subject: [PATCH 08/37] fix: added nodeSelector to tf training migration --- db/yaml/tf_training/20201223062947.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tf_training/20201223062947.yaml index 16a73110..a8363ba3 100644 --- a/db/yaml/tf_training/20201223062947.yaml +++ b/db/yaml/tf_training/20201223062947.yaml @@ -58,6 +58,8 @@ templates: - name: output mountPath: /mnt/output + nodeSelector: + beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' sidecars: - name: tensorboard image: 'tensorflow/tensorflow:2.3.0' From c02c8b59bb1424ae3b04b5562edc37f9a4711184 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 13:32:36 -0800 Subject: [PATCH 09/37] fix: add back removed migration and move source to be in template instead of README --- db/yaml/maskrcnn/20201208155115.yaml | 192 ++++++++++++++++++++++++ db/yaml/maskrcnn/20201221195937.yaml | 1 + db/yaml/tf_training/20201223062947.yaml | 1 + db/yaml/tf_training/README.md | 1 - db/yaml/tfod/README.md | 1 - 5 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 db/yaml/maskrcnn/20201208155115.yaml delete mode 100644 db/yaml/tf_training/README.md delete mode 100644 db/yaml/tfod/README.md diff --git a/db/yaml/maskrcnn/20201208155115.yaml b/db/yaml/maskrcnn/20201208155115.yaml new file mode 100644 index 00000000..1a81a222 --- /dev/null +++ b/db/yaml/maskrcnn/20201208155115.yaml @@ -0,0 +1,192 @@ +entrypoint: main +arguments: + parameters: + - name: source + value: https://github.com/onepanelio/Mask_RCNN.git + displayName: Model source code + type: hidden + visibility: private + + - name: cvat-annotation-path + value: annotation-dump/sample_dataset + hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. + displayName: Dataset path + visibility: private + + - name: cvat-output-path + value: workflow-data/output/sample_output + hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. + displayName: Workflow output path + visibility: private + + - name: cvat-finetune-checkpoint + value: '' + hint: Select the last fine-tune checkpoint for this model. It may take up to 5 minutes for a recent checkpoint show here. Leave empty if this is the first time you're training this model. + displayName: Checkpoint path + visibility: public + + - name: cvat-num-classes + displayName: Number of classes + hint: Number of classes (i.e in CVAT taks) + 1 for background + value: '81' + visibility: private + + - name: hyperparameters + displayName: Hyperparameters + visibility: public + type: textarea.textarea + value: |- + stage-1-epochs=1 # Epochs for network heads + stage-2-epochs=2 # Epochs for finetune layers + stage-3-epochs=3 # Epochs for all layers + hint: "Please refer to our documentation for more information on parameters. Number of classes will be automatically populated if you had 'sys-num-classes' parameter in a workflow." + + - name: dump-format + value: cvat_coco + displayName: CVAT dump format + visibility: public + + - name: tf-image + visibility: public + value: tensorflow/tensorflow:1.13.1-py3 + type: select.select + displayName: Select TensorFlow image + hint: Select the GPU image if you are running on a GPU node pool + options: + - name: 'TensorFlow 1.13.1 CPU Image' + value: 'tensorflow/tensorflow:1.13.1-py3' + - name: 'TensorFlow 1.13.1 GPU Image' + value: 'tensorflow/tensorflow:1.13.1-gpu-py3' + + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.select + visibility: public + name: sys-node-pool + value: Standard_D4s_v3 + required: true + options: + - name: 'CPU: 2, RAM: 8GB' + value: Standard_D2s_v3 + - name: 'CPU: 4, RAM: 16GB' + value: Standard_D4s_v3 + - name: 'GPU: 1xK80, CPU: 6, RAM: 56GB' + value: Standard_NC6 +templates: + - name: main + dag: + tasks: + - name: train-model + template: tensorflow + # Uncomment the lines below if you want to send Slack notifications + # - arguments: + # artifacts: + # - from: '{{tasks.train-model.outputs.artifacts.sys-metrics}}' + # name: metrics + # parameters: + # - name: status + # value: '{{tasks.train-model.status}}' + # dependencies: + # - train-model + # name: notify-in-slack + # template: slack-notify-success + - name: tensorflow + container: + args: + - | + apt-get update \ + && apt-get install -y git wget libglib2.0-0 libsm6 libxext6 libxrender-dev \ + && pip install -r requirements.txt \ + && pip install boto3 pyyaml google-cloud-storage \ + && git clone https://github.com/waleedka/coco \ + && cd coco/PythonAPI \ + && python setup.py build_ext install \ + && rm -rf build \ + && cd ../../ \ + && wget https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5 \ + && python setup.py install && ls \ + && python samples/coco/cvat.py train --dataset=/mnt/data/datasets \ + --model=workflow_maskrcnn \ + --extras="{{workflow.parameters.hyperparameters}}" \ + --ref_model_path="{{workflow.parameters.cvat-finetune-checkpoint}}" \ + --num_classes="{{workflow.parameters.cvat-num-classes}}" \ + && cd /mnt/src/ \ + && python prepare_dataset.py /mnt/data/datasets/annotations/instances_default.json + command: + - sh + - -c + image: '{{workflow.parameters.tf-image}}' + volumeMounts: + - mountPath: /mnt/data + name: data + - mountPath: /mnt/output + name: output + workingDir: /mnt/src + nodeSelector: + beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [sh, -c] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: ["tensorboard --logdir /mnt/output/"] + ports: + - containerPort: 6006 + name: tensorboard + inputs: + artifacts: + - name: data + path: /mnt/data/datasets/ + {{.ArtifactRepositoryType}}: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' + - git: + repo: '{{workflow.parameters.source}}' + revision: "no-boto" + name: src + path: /mnt/src + outputs: + artifacts: + - name: model + optional: true + path: /mnt/output + {{.ArtifactRepositoryType}}: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' +# Uncomment the lines below if you want to send Slack notifications +#- container: +# args: +# - SLACK_USERNAME=Onepanel SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" +# SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd +# SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify +# command: +# - sh +# - -c +# image: technosophos/slack-notify +# inputs: +# artifacts: +# - name: metrics +# optional: true +# path: /tmp/metrics.json +# parameters: +# - name: status +# name: slack-notify-success +volumeClaimTemplates: + - metadata: + creationTimestamp: null + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi + - metadata: + creationTimestamp: null + name: output + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi \ No newline at end of file diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/maskrcnn/20201221195937.yaml index 13e6b969..16a38759 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml entrypoint: main arguments: parameters: diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tf_training/20201223062947.yaml index a8363ba3..769df736 100644 --- a/db/yaml/tf_training/20201223062947.yaml +++ b/db/yaml/tf_training/20201223062947.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml arguments: parameters: - name: epochs diff --git a/db/yaml/tf_training/README.md b/db/yaml/tf_training/README.md deleted file mode 100644 index bc1f964e..00000000 --- a/db/yaml/tf_training/README.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file diff --git a/db/yaml/tfod/README.md b/db/yaml/tfod/README.md deleted file mode 100644 index a79ec33f..00000000 --- a/db/yaml/tfod/README.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml \ No newline at end of file From 4fd7a2c5a8ff42b2508e75e9085ee413c5062c1e Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 14:14:11 -0800 Subject: [PATCH 10/37] chore: updated tf_training to be tensorflow-mnist-training to better match onepanel templates repo --- db/go/20201209124226_update_tensorflow_training.go | 4 ++-- db/go/20201223062947_tf_training_update_node_pool.go | 6 +++--- .../20200605090535.yaml | 1 + .../20201209124226.yaml | 1 + .../20201223062947.yaml | 0 5 files changed, 7 insertions(+), 5 deletions(-) rename db/yaml/{tf_training => tensorflow-mnist-training}/20200605090535.yaml (93%) rename db/yaml/{tf_training => tensorflow-mnist-training}/20201209124226.yaml (94%) rename db/yaml/{tf_training => tensorflow-mnist-training}/20201223062947.yaml (100%) diff --git a/db/go/20201209124226_update_tensorflow_training.go b/db/go/20201209124226_update_tensorflow_training.go index 433b6b5a..b2199fba 100644 --- a/db/go/20201209124226_update_tensorflow_training.go +++ b/db/go/20201209124226_update_tensorflow_training.go @@ -17,7 +17,7 @@ func initialize20201209124226() { func Up20201209124226(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20201209124226.yaml"), + filepath.Join("tensorflow-mnist-training", "20201209124226.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", @@ -29,7 +29,7 @@ func Up20201209124226(tx *sql.Tx) error { func Down20201209124226(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20200605090535.yaml"), + filepath.Join("tensorflow-mnist-training", "20200605090535.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go index f7844ed6..db2d3fc1 100644 --- a/db/go/20201223062947_tf_training_update_node_pool.go +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -13,11 +13,11 @@ func initialize20201223062947() { } } -// Up20201223062947 updates tf_training with sys.nodepool changes +// Up20201223062947 updates tensorflow-mnist-training with sys.nodepool changes func Up20201223062947(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20201223062947.yaml"), + filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201223062947(tx *sql.Tx) error { func Down20201223062947(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20201223062947.yaml"), + filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/yaml/tf_training/20200605090535.yaml b/db/yaml/tensorflow-mnist-training/20200605090535.yaml similarity index 93% rename from db/yaml/tf_training/20200605090535.yaml rename to db/yaml/tensorflow-mnist-training/20200605090535.yaml index c5ea0bc8..8ac9c56e 100644 --- a/db/yaml/tf_training/20200605090535.yaml +++ b/db/yaml/tensorflow-mnist-training/20200605090535.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml entrypoint: main arguments: parameters: diff --git a/db/yaml/tf_training/20201209124226.yaml b/db/yaml/tensorflow-mnist-training/20201209124226.yaml similarity index 94% rename from db/yaml/tf_training/20201209124226.yaml rename to db/yaml/tensorflow-mnist-training/20201209124226.yaml index 6ccd88d0..eb14b9ac 100644 --- a/db/yaml/tf_training/20201209124226.yaml +++ b/db/yaml/tensorflow-mnist-training/20201209124226.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml arguments: parameters: - name: epochs diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tensorflow-mnist-training/20201223062947.yaml similarity index 100% rename from db/yaml/tf_training/20201223062947.yaml rename to db/yaml/tensorflow-mnist-training/20201223062947.yaml From 75765e5ab45d0a63de84dc7e720e17dcd2a41443 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 17:48:26 -0800 Subject: [PATCH 11/37] fix: separated workflow templates and workspace templates for yaml resources for migrations. Also updated migration yamls to the latest based on templates repo. --- db/go/20201016170415_update_cvat.go | 2 +- ...01028145442_update_jupyter_lab_template.go | 2 +- .../20201028145443_update_vscode_template.go | 4 +-- ...sorboard_env_var_to_jupyterlab_template.go | 4 +-- .../20201102104048_update_cvat_reduce_vols.go | 4 +-- ...20201113094916_update_cvat_onepanel_sdk.go | 4 +-- db/go/20201115133046_update_cvat_env_vars.go | 4 +-- .../20201115134934_add_tensorboard_to_tfod.go | 2 +- ...01115145814_add_tensorboard_to_maskrcnn.go | 2 +- db/go/20201130130433_update_tfod_path.go | 4 +-- ...55115_replace_tty_with_env_var_for_tfod.go | 6 ++--- ...5_replace_tty_with_env_var_for_maskrcnn.go | 4 +-- ...201209124226_update_tensorflow_training.go | 4 +-- db/go/20201211161117_fix_resources_gke.go | 4 +-- db/go/20201214133458_fix_jupyterlab_gpu.go | 4 +-- db/go/20201221194344_pytorch_update.go | 4 +-- ...nn_update_parameters_to_select_nodepool.go | 4 +-- ...1223062947_tf_training_update_node_pool.go | 4 +-- db/go/20201223202929_tfod_update_node_pool.go | 6 ++--- .../maskrcnn-training}/20201115145814.yaml | 0 .../maskrcnn-training}/20201208155115.yaml | 0 .../maskrcnn-training}/20201221195937.yaml | 25 ++++++++++--------- .../20200605090509.yaml | 0 .../20201221194344.yaml | 7 +++--- .../20200605090535.yaml | 0 .../20201209124226.yaml | 0 .../20201223062947.yaml | 0 .../20201115134934.yaml | 0 .../20201130130433.yaml | 0 .../20201208155115.yaml | 0 .../20201223202929.yaml | 1 + .../{ => workspaces}/cvat/20201016170415.yaml | 0 .../{ => workspaces}/cvat/20201102104048.yaml | 0 .../{ => workspaces}/cvat/20201113094916.yaml | 0 .../{ => workspaces}/cvat/20201115133046.yaml | 0 .../{ => workspaces}/cvat/20201211161117.yaml | 0 .../jupyterlab/20200929153931.yaml | 0 .../jupyterlab/20201028145442.yaml | 0 .../jupyterlab/20201031165106.yaml | 0 .../jupyterlab/20201214133458.yaml | 0 .../vscode/20200929144301.yaml | 0 .../vscode/20201028145443.yaml | 0 42 files changed, 54 insertions(+), 51 deletions(-) rename db/yaml/{maskrcnn => workflows/maskrcnn-training}/20201115145814.yaml (100%) rename db/yaml/{maskrcnn => workflows/maskrcnn-training}/20201208155115.yaml (100%) rename db/yaml/{maskrcnn => workflows/maskrcnn-training}/20201221195937.yaml (94%) rename db/yaml/{pytorch_training => workflows/pytorch-mnist-training}/20200605090509.yaml (100%) rename db/yaml/{pytorch_training => workflows/pytorch-mnist-training}/20201221194344.yaml (92%) rename db/yaml/{ => workflows}/tensorflow-mnist-training/20200605090535.yaml (100%) rename db/yaml/{ => workflows}/tensorflow-mnist-training/20201209124226.yaml (100%) rename db/yaml/{ => workflows}/tensorflow-mnist-training/20201223062947.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201115134934.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201130130433.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201208155115.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201223202929.yaml (98%) rename db/yaml/{ => workspaces}/cvat/20201016170415.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201102104048.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201113094916.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201115133046.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201211161117.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20200929153931.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20201028145442.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20201031165106.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20201214133458.yaml (100%) rename db/yaml/{ => workspaces}/vscode/20200929144301.yaml (100%) rename db/yaml/{ => workspaces}/vscode/20201028145443.yaml (100%) diff --git a/db/go/20201016170415_update_cvat.go b/db/go/20201016170415_update_cvat.go index 019da105..10fbb109 100644 --- a/db/go/20201016170415_update_cvat.go +++ b/db/go/20201016170415_update_cvat.go @@ -17,7 +17,7 @@ func initialize20201016170415() { func Up20201016170415(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201016170415.yaml"), + filepath.Join("workspaces", "cvat", "20201016170415.yaml"), cvatTemplateName) } diff --git a/db/go/20201028145442_update_jupyter_lab_template.go b/db/go/20201028145442_update_jupyter_lab_template.go index 40e9cba0..c28ad411 100644 --- a/db/go/20201028145442_update_jupyter_lab_template.go +++ b/db/go/20201028145442_update_jupyter_lab_template.go @@ -18,7 +18,7 @@ func initialize20201028145442() { func Up20201028145442(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201028145442.yaml"), + filepath.Join("workspaces", "20201028145442.yaml"), jupyterLabTemplateName) } diff --git a/db/go/20201028145443_update_vscode_template.go b/db/go/20201028145443_update_vscode_template.go index 47ab5291..c7730515 100644 --- a/db/go/20201028145443_update_vscode_template.go +++ b/db/go/20201028145443_update_vscode_template.go @@ -20,7 +20,7 @@ func initialize20201028145443() { func Up20201028145443(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("vscode", "20201028145443.yaml"), + filepath.Join("workspaces", "vscode", "20201028145443.yaml"), vscodeWorkspaceTemplateName) } @@ -28,6 +28,6 @@ func Up20201028145443(tx *sql.Tx) error { func Down20201028145443(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("vscode", "20201028145443.yaml"), + filepath.Join("workspaces", "vscode", "20201028145443.yaml"), vscodeWorkspaceTemplateName) } diff --git a/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go b/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go index 3ce39770..1f62726e 100644 --- a/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go +++ b/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go @@ -18,7 +18,7 @@ func initialize20201031165106() { func Up20201031165106(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201031165106.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201031165106.yaml"), jupyterLabTemplateName) } @@ -26,6 +26,6 @@ func Up20201031165106(tx *sql.Tx) error { func Down20201031165106(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201028145442.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201028145442.yaml"), jupyterLabTemplateName) } diff --git a/db/go/20201102104048_update_cvat_reduce_vols.go b/db/go/20201102104048_update_cvat_reduce_vols.go index 8e1ce255..4d7ab58d 100644 --- a/db/go/20201102104048_update_cvat_reduce_vols.go +++ b/db/go/20201102104048_update_cvat_reduce_vols.go @@ -19,7 +19,7 @@ func initialize20201102104048() { func Up20201102104048(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201102104048.yaml"), + filepath.Join("workspaces", "cvat", "20201102104048.yaml"), cvatTemplateName) } @@ -27,6 +27,6 @@ func Up20201102104048(tx *sql.Tx) error { func Down20201102104048(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201016170415.yaml"), + filepath.Join("workspaces", "cvat", "20201016170415.yaml"), cvatTemplateName) } diff --git a/db/go/20201113094916_update_cvat_onepanel_sdk.go b/db/go/20201113094916_update_cvat_onepanel_sdk.go index e08baa3c..23bc9df1 100644 --- a/db/go/20201113094916_update_cvat_onepanel_sdk.go +++ b/db/go/20201113094916_update_cvat_onepanel_sdk.go @@ -18,7 +18,7 @@ func initialize20201113094916() { func Up20201113094916(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201113094916.yaml"), + filepath.Join("workspaces", "cvat", "20201113094916.yaml"), cvatTemplateName) } @@ -26,6 +26,6 @@ func Up20201113094916(tx *sql.Tx) error { func Down20201113094916(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201102104048.yaml"), + filepath.Join("workspaces", "cvat", "20201102104048.yaml"), cvatTemplateName) } diff --git a/db/go/20201115133046_update_cvat_env_vars.go b/db/go/20201115133046_update_cvat_env_vars.go index 5cc5034c..4d410ea1 100644 --- a/db/go/20201115133046_update_cvat_env_vars.go +++ b/db/go/20201115133046_update_cvat_env_vars.go @@ -17,7 +17,7 @@ func initialize20201115133046() { func Up20201115133046(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201115133046.yaml"), + filepath.Join("workspaces", "cvat", "20201115133046.yaml"), cvatTemplateName) } @@ -25,6 +25,6 @@ func Up20201115133046(tx *sql.Tx) error { func Down20201115133046(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201113094916"), + filepath.Join("workspaces", "cvat", "20201113094916"), cvatTemplateName) } diff --git a/db/go/20201115134934_add_tensorboard_to_tfod.go b/db/go/20201115134934_add_tensorboard_to_tfod.go index 69ddcbc0..065b3d18 100644 --- a/db/go/20201115134934_add_tensorboard_to_tfod.go +++ b/db/go/20201115134934_add_tensorboard_to_tfod.go @@ -17,7 +17,7 @@ func initialize20201115134934() { func Up20201115134934(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201115134934.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201115134934.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201115145814_add_tensorboard_to_maskrcnn.go b/db/go/20201115145814_add_tensorboard_to_maskrcnn.go index 62b6070e..c9efc38d 100644 --- a/db/go/20201115145814_add_tensorboard_to_maskrcnn.go +++ b/db/go/20201115145814_add_tensorboard_to_maskrcnn.go @@ -17,7 +17,7 @@ func initialize20201115145814() { func Up20201115145814(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201115145814.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201115145814.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201130130433_update_tfod_path.go b/db/go/20201130130433_update_tfod_path.go index 2e4cad44..8789f120 100644 --- a/db/go/20201130130433_update_tfod_path.go +++ b/db/go/20201130130433_update_tfod_path.go @@ -17,7 +17,7 @@ func initialize20201130130433() { func Up20201130130433(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201130130433.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201130130433.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", @@ -29,7 +29,7 @@ func Up20201130130433(tx *sql.Tx) error { func Down20201130130433(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201115134934.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201115134934.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go b/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go index defea30f..9e76c89d 100644 --- a/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go +++ b/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go @@ -13,11 +13,11 @@ func initialize20201208155115() { } } -// Up20201208155115 update the tfod workflow template to replace tty with an environment variable +// Up20201208155115 update the tf-object-detection-training workflow template to replace tty with an environment variable func Up20201208155115(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201208155115.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201208155115.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", @@ -29,7 +29,7 @@ func Up20201208155115(tx *sql.Tx) error { func Down20201208155115(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201130130433.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201130130433.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go b/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go index bb6f4646..ad0305a6 100644 --- a/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go +++ b/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go @@ -17,7 +17,7 @@ func initialize20201208155805() { func Up20201208155805(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201208155115.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201208155115.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "used-by": "cvat", @@ -29,7 +29,7 @@ func Up20201208155805(tx *sql.Tx) error { func Down20201208155805(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201115145814.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201115145814.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201209124226_update_tensorflow_training.go b/db/go/20201209124226_update_tensorflow_training.go index b2199fba..48179435 100644 --- a/db/go/20201209124226_update_tensorflow_training.go +++ b/db/go/20201209124226_update_tensorflow_training.go @@ -17,7 +17,7 @@ func initialize20201209124226() { func Up20201209124226(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20201209124226.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20201209124226.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", @@ -29,7 +29,7 @@ func Up20201209124226(tx *sql.Tx) error { func Down20201209124226(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20200605090535.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20200605090535.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", diff --git a/db/go/20201211161117_fix_resources_gke.go b/db/go/20201211161117_fix_resources_gke.go index 88da5576..cd09ad38 100644 --- a/db/go/20201211161117_fix_resources_gke.go +++ b/db/go/20201211161117_fix_resources_gke.go @@ -17,7 +17,7 @@ func initialize20201211161117() { func Up20201211161117(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201211161117.yaml"), + filepath.Join("workspaces", "cvat", "20201211161117.yaml"), cvatTemplateName) } @@ -25,6 +25,6 @@ func Up20201211161117(tx *sql.Tx) error { func Down20201211161117(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201115133046.yaml"), + filepath.Join("workspaces", "cvat", "20201115133046.yaml"), cvatTemplateName) } diff --git a/db/go/20201214133458_fix_jupyterlab_gpu.go b/db/go/20201214133458_fix_jupyterlab_gpu.go index 78535d8c..3b9430da 100644 --- a/db/go/20201214133458_fix_jupyterlab_gpu.go +++ b/db/go/20201214133458_fix_jupyterlab_gpu.go @@ -17,7 +17,7 @@ func initialize20201214133458() { func Up20201214133458(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201214133458.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201214133458.yaml"), jupyterLabTemplateName) } @@ -25,6 +25,6 @@ func Up20201214133458(tx *sql.Tx) error { func Down20201214133458(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201031165106.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201031165106.yaml"), jupyterLabTemplateName) } diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go index ed24ce4a..34d6b524 100644 --- a/db/go/20201221194344_pytorch_update.go +++ b/db/go/20201221194344_pytorch_update.go @@ -16,7 +16,7 @@ func initialize20201221194344() { // Up20201221194344 updates pytorch_training with the sys.nodepool changes func Up20201221194344(tx *sql.Tx) error { return updateWorkflowTemplateManifest( - filepath.Join("pytorch_training", "20201221194344.yaml"), + filepath.Join("workflows", "pytorch_training", "20201221194344.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -28,7 +28,7 @@ func Up20201221194344(tx *sql.Tx) error { func Down20201221194344(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("pytorch_training", "20200605090509.yaml"), + filepath.Join("workflows", "pytorch_training", "20200605090509.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go index b0351dca..91227fc2 100644 --- a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go +++ b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go @@ -17,7 +17,7 @@ func initialize20201221195937() { func Up20201221195937(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201221195937.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201221195937.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201221195937(tx *sql.Tx) error { func Down20201221195937(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201208155115.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201208155115.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go index db2d3fc1..4e9dc4af 100644 --- a/db/go/20201223062947_tf_training_update_node_pool.go +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -17,7 +17,7 @@ func initialize20201223062947() { func Up20201223062947(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201223062947(tx *sql.Tx) error { func Down20201223062947(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/go/20201223202929_tfod_update_node_pool.go b/db/go/20201223202929_tfod_update_node_pool.go index f2dd7730..1ba4f9ef 100644 --- a/db/go/20201223202929_tfod_update_node_pool.go +++ b/db/go/20201223202929_tfod_update_node_pool.go @@ -13,11 +13,11 @@ func initialize20201223202929() { } } -// Up20201223202929 updates tfod with sys.nodepool +// Up20201223202929 updates tf-object-detection-training with sys.nodepool func Up20201223202929(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201223202929.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201223202929.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201223202929(tx *sql.Tx) error { func Down20201223202929(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201208155115.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201208155115.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/yaml/maskrcnn/20201115145814.yaml b/db/yaml/workflows/maskrcnn-training/20201115145814.yaml similarity index 100% rename from db/yaml/maskrcnn/20201115145814.yaml rename to db/yaml/workflows/maskrcnn-training/20201115145814.yaml diff --git a/db/yaml/maskrcnn/20201208155115.yaml b/db/yaml/workflows/maskrcnn-training/20201208155115.yaml similarity index 100% rename from db/yaml/maskrcnn/20201208155115.yaml rename to db/yaml/workflows/maskrcnn-training/20201208155115.yaml diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml similarity index 94% rename from db/yaml/maskrcnn/20201221195937.yaml rename to db/yaml/workflows/maskrcnn-training/20201221195937.yaml index 16a38759..8bbb461f 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml @@ -1,5 +1,4 @@ # source: https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml -entrypoint: main arguments: parameters: - name: source @@ -66,6 +65,8 @@ arguments: name: sys-node-pool value: {{.DefaultNodePoolOption}} required: true + +entrypoint: main templates: - dag: tasks: @@ -115,19 +116,19 @@ templates: - mountPath: /mnt/output name: output workingDir: /mnt/src + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [ sh, -c ] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: [ "tensorboard --logdir /mnt/output/" ] - ports: - - containerPort: 6006 - name: tensorboard inputs: artifacts: - name: data diff --git a/db/yaml/pytorch_training/20200605090509.yaml b/db/yaml/workflows/pytorch-mnist-training/20200605090509.yaml similarity index 100% rename from db/yaml/pytorch_training/20200605090509.yaml rename to db/yaml/workflows/pytorch-mnist-training/20200605090509.yaml diff --git a/db/yaml/pytorch_training/20201221194344.yaml b/db/yaml/workflows/pytorch-mnist-training/20201221194344.yaml similarity index 92% rename from db/yaml/pytorch_training/20201221194344.yaml rename to db/yaml/workflows/pytorch-mnist-training/20201221194344.yaml index 65465c9a..b3ed796b 100644 --- a/db/yaml/pytorch_training/20201221194344.yaml +++ b/db/yaml/workflows/pytorch-mnist-training/20201221194344.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/pytorch-mnist-training/template.yaml entrypoint: main arguments: parameters: @@ -57,11 +58,11 @@ templates: path: /mnt/output optional: true archive: - none: { } + none: {} container: image: pytorch/pytorch:latest - command: [ sh,-c ] - args: [ "{{workflow.parameters.command}}" ] + command: [sh,-c] + args: ["{{workflow.parameters.command}}"] workingDir: /mnt/src volumeMounts: - name: data diff --git a/db/yaml/tensorflow-mnist-training/20200605090535.yaml b/db/yaml/workflows/tensorflow-mnist-training/20200605090535.yaml similarity index 100% rename from db/yaml/tensorflow-mnist-training/20200605090535.yaml rename to db/yaml/workflows/tensorflow-mnist-training/20200605090535.yaml diff --git a/db/yaml/tensorflow-mnist-training/20201209124226.yaml b/db/yaml/workflows/tensorflow-mnist-training/20201209124226.yaml similarity index 100% rename from db/yaml/tensorflow-mnist-training/20201209124226.yaml rename to db/yaml/workflows/tensorflow-mnist-training/20201209124226.yaml diff --git a/db/yaml/tensorflow-mnist-training/20201223062947.yaml b/db/yaml/workflows/tensorflow-mnist-training/20201223062947.yaml similarity index 100% rename from db/yaml/tensorflow-mnist-training/20201223062947.yaml rename to db/yaml/workflows/tensorflow-mnist-training/20201223062947.yaml diff --git a/db/yaml/tfod/20201115134934.yaml b/db/yaml/workflows/tf-object-detection-training/20201115134934.yaml similarity index 100% rename from db/yaml/tfod/20201115134934.yaml rename to db/yaml/workflows/tf-object-detection-training/20201115134934.yaml diff --git a/db/yaml/tfod/20201130130433.yaml b/db/yaml/workflows/tf-object-detection-training/20201130130433.yaml similarity index 100% rename from db/yaml/tfod/20201130130433.yaml rename to db/yaml/workflows/tf-object-detection-training/20201130130433.yaml diff --git a/db/yaml/tfod/20201208155115.yaml b/db/yaml/workflows/tf-object-detection-training/20201208155115.yaml similarity index 100% rename from db/yaml/tfod/20201208155115.yaml rename to db/yaml/workflows/tf-object-detection-training/20201208155115.yaml diff --git a/db/yaml/tfod/20201223202929.yaml b/db/yaml/workflows/tf-object-detection-training/20201223202929.yaml similarity index 98% rename from db/yaml/tfod/20201223202929.yaml rename to db/yaml/workflows/tf-object-detection-training/20201223202929.yaml index a4ba5b5c..cbd7d698 100644 --- a/db/yaml/tfod/20201223202929.yaml +++ b/db/yaml/workflows/tf-object-detection-training/20201223202929.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tf-object-detection-training/template.yaml arguments: parameters: - name: source diff --git a/db/yaml/cvat/20201016170415.yaml b/db/yaml/workspaces/cvat/20201016170415.yaml similarity index 100% rename from db/yaml/cvat/20201016170415.yaml rename to db/yaml/workspaces/cvat/20201016170415.yaml diff --git a/db/yaml/cvat/20201102104048.yaml b/db/yaml/workspaces/cvat/20201102104048.yaml similarity index 100% rename from db/yaml/cvat/20201102104048.yaml rename to db/yaml/workspaces/cvat/20201102104048.yaml diff --git a/db/yaml/cvat/20201113094916.yaml b/db/yaml/workspaces/cvat/20201113094916.yaml similarity index 100% rename from db/yaml/cvat/20201113094916.yaml rename to db/yaml/workspaces/cvat/20201113094916.yaml diff --git a/db/yaml/cvat/20201115133046.yaml b/db/yaml/workspaces/cvat/20201115133046.yaml similarity index 100% rename from db/yaml/cvat/20201115133046.yaml rename to db/yaml/workspaces/cvat/20201115133046.yaml diff --git a/db/yaml/cvat/20201211161117.yaml b/db/yaml/workspaces/cvat/20201211161117.yaml similarity index 100% rename from db/yaml/cvat/20201211161117.yaml rename to db/yaml/workspaces/cvat/20201211161117.yaml diff --git a/db/yaml/jupyterlab/20200929153931.yaml b/db/yaml/workspaces/jupyterlab/20200929153931.yaml similarity index 100% rename from db/yaml/jupyterlab/20200929153931.yaml rename to db/yaml/workspaces/jupyterlab/20200929153931.yaml diff --git a/db/yaml/jupyterlab/20201028145442.yaml b/db/yaml/workspaces/jupyterlab/20201028145442.yaml similarity index 100% rename from db/yaml/jupyterlab/20201028145442.yaml rename to db/yaml/workspaces/jupyterlab/20201028145442.yaml diff --git a/db/yaml/jupyterlab/20201031165106.yaml b/db/yaml/workspaces/jupyterlab/20201031165106.yaml similarity index 100% rename from db/yaml/jupyterlab/20201031165106.yaml rename to db/yaml/workspaces/jupyterlab/20201031165106.yaml diff --git a/db/yaml/jupyterlab/20201214133458.yaml b/db/yaml/workspaces/jupyterlab/20201214133458.yaml similarity index 100% rename from db/yaml/jupyterlab/20201214133458.yaml rename to db/yaml/workspaces/jupyterlab/20201214133458.yaml diff --git a/db/yaml/vscode/20200929144301.yaml b/db/yaml/workspaces/vscode/20200929144301.yaml similarity index 100% rename from db/yaml/vscode/20200929144301.yaml rename to db/yaml/workspaces/vscode/20200929144301.yaml diff --git a/db/yaml/vscode/20201028145443.yaml b/db/yaml/workspaces/vscode/20201028145443.yaml similarity index 100% rename from db/yaml/vscode/20201028145443.yaml rename to db/yaml/workspaces/vscode/20201028145443.yaml From cbf420054493c0a25d45b8b92124fc674c4f7b84 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 17:49:28 -0800 Subject: [PATCH 12/37] fix: migration path issue for jupyterlab --- db/go/20201028145442_update_jupyter_lab_template.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/go/20201028145442_update_jupyter_lab_template.go b/db/go/20201028145442_update_jupyter_lab_template.go index c28ad411..99f1ab7e 100644 --- a/db/go/20201028145442_update_jupyter_lab_template.go +++ b/db/go/20201028145442_update_jupyter_lab_template.go @@ -18,7 +18,7 @@ func initialize20201028145442() { func Up20201028145442(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("workspaces", "20201028145442.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201028145442.yaml"), jupyterLabTemplateName) } From 99f8ebe25d399e9ae9a56bf01f229b2aa1ff609a Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:01:55 -0800 Subject: [PATCH 13/37] fix: issue where workspaceSpec.arguments could be nil --- pkg/workspace_template.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index 5005f15e..ba176433 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -945,11 +945,13 @@ func (c *Client) generateWorkspaceTemplateWorkflowTemplate(workspaceTemplate *Wo return nil, util.NewUserError(codes.InvalidArgument, err.Error()) } - modifiedParameters, err := c.replaceSysNodePoolOptions(workspaceSpec.Arguments.Parameters) - if err != nil { - return nil, err + if workspaceSpec.Arguments != nil { + modifiedParameters, err := c.replaceSysNodePoolOptions(workspaceSpec.Arguments.Parameters) + if err != nil { + return nil, err + } + workspaceSpec.Arguments.Parameters = modifiedParameters } - workspaceSpec.Arguments.Parameters = modifiedParameters if err = generateArguments(workspaceSpec, config); err != nil { return nil, err From 03460eaeff4bd500c6b7279a921c0829969139e6 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:10:44 -0800 Subject: [PATCH 14/37] fix: key indentation in maskrcnn-training migration yaml --- db/yaml/workflows/maskrcnn-training/20201208155115.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/yaml/workflows/maskrcnn-training/20201208155115.yaml b/db/yaml/workflows/maskrcnn-training/20201208155115.yaml index 1a81a222..053b6378 100644 --- a/db/yaml/workflows/maskrcnn-training/20201208155115.yaml +++ b/db/yaml/workflows/maskrcnn-training/20201208155115.yaml @@ -140,7 +140,7 @@ templates: - name: data path: /mnt/data/datasets/ {{.ArtifactRepositoryType}}: - key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' - git: repo: '{{workflow.parameters.source}}' revision: "no-boto" @@ -152,7 +152,7 @@ templates: optional: true path: /mnt/output {{.ArtifactRepositoryType}}: - key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' # Uncomment the lines below if you want to send Slack notifications #- container: # args: From 2a6b57bfb97136b2c018409097f777c56377667a Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:11:01 -0800 Subject: [PATCH 15/37] fix: wrong migration file name --- db/go/20201221194344_pytorch_update.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go index 34d6b524..63b3cb14 100644 --- a/db/go/20201221194344_pytorch_update.go +++ b/db/go/20201221194344_pytorch_update.go @@ -16,7 +16,7 @@ func initialize20201221194344() { // Up20201221194344 updates pytorch_training with the sys.nodepool changes func Up20201221194344(tx *sql.Tx) error { return updateWorkflowTemplateManifest( - filepath.Join("workflows", "pytorch_training", "20201221194344.yaml"), + filepath.Join("workflows", "pytorch-mnist-training", "20201221194344.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -28,7 +28,7 @@ func Up20201221194344(tx *sql.Tx) error { func Down20201221194344(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("workflows", "pytorch_training", "20200605090509.yaml"), + filepath.Join("workflows", "pytorch-mnist-training", "20200605090509.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", From 2784798c9e1bb0c982f1382651c5a47174d467d9 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:22:42 -0800 Subject: [PATCH 16/37] fix: wrong indentation for sidecars in maskrcnn training --- .../maskrcnn-training/20201221195937.yaml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/db/yaml/workflows/maskrcnn-training/20201221195937.yaml b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml index 8bbb461f..c2fcacc5 100644 --- a/db/yaml/workflows/maskrcnn-training/20201221195937.yaml +++ b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml @@ -116,17 +116,17 @@ templates: - mountPath: /mnt/output name: output workingDir: /mnt/src - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [ sh, -c ] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: [ "tensorboard --logdir /mnt/output/" ] - ports: - - containerPort: 6006 - name: tensorboard + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' inputs: From 72e7cb41e7b1932f7a8826fe7c067284add6f8f1 Mon Sep 17 00:00:00 2001 From: Rush Tehrani Date: Mon, 14 Dec 2020 14:30:00 -0800 Subject: [PATCH 17/37] remove extra space --- db/yaml/workspaces/jupyterlab/20201214133458.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/yaml/workspaces/jupyterlab/20201214133458.yaml b/db/yaml/workspaces/jupyterlab/20201214133458.yaml index 44277f12..c01ab4db 100644 --- a/db/yaml/workspaces/jupyterlab/20201214133458.yaml +++ b/db/yaml/workspaces/jupyterlab/20201214133458.yaml @@ -2,7 +2,7 @@ containers: - name: jupyterlab image: onepanel/jupyterlab:1.0.1 - command: ["/bin/bash", "-c", "pip install onepanel-sdk && start.sh LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64 jupyter lab --LabApp.token='' --LabApp.allow_remote_access=True --LabApp.allow_origin=\"*\" --LabApp.disable_check_xsrf=True --LabApp.trust_xheaders=True --LabApp.base_url=/ --LabApp.tornado_settings='{\"headers\":{\"Content-Security-Policy\":\"frame-ancestors * \'self\'\"}}' --notebook-dir='/data' --allow-root"] + command: ["/bin/bash", "-c", "pip install onepanel-sdk && start.sh LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64 jupyter lab --LabApp.token='' --LabApp.allow_remote_access=True --LabApp.allow_origin=\"*\" --LabApp.disable_check_xsrf=True --LabApp.trust_xheaders=True --LabApp.base_url=/ --LabApp.tornado_settings='{\"headers\":{\"Content-Security-Policy\":\"frame-ancestors * \'self\'\"}}' --notebook-dir='/data' --allow-root"] env: - name: tornado value: "'{'headers':{'Content-Security-Policy':\"frame-ancestors\ *\ \'self'\"}}'" @@ -76,4 +76,4 @@ routes: # - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify # command: # - sh -# - -c \ No newline at end of file +# - -c From 70d75f8f751eaa1307989678f2596866e5b90305 Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Wed, 16 Dec 2020 11:16:19 -0800 Subject: [PATCH 18/37] set jupyterlab workingDir to data --- db/yaml/workspaces/jupyterlab/20201214133458.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/db/yaml/workspaces/jupyterlab/20201214133458.yaml b/db/yaml/workspaces/jupyterlab/20201214133458.yaml index c01ab4db..0af3dfb0 100644 --- a/db/yaml/workspaces/jupyterlab/20201214133458.yaml +++ b/db/yaml/workspaces/jupyterlab/20201214133458.yaml @@ -3,6 +3,7 @@ containers: - name: jupyterlab image: onepanel/jupyterlab:1.0.1 command: ["/bin/bash", "-c", "pip install onepanel-sdk && start.sh LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64 jupyter lab --LabApp.token='' --LabApp.allow_remote_access=True --LabApp.allow_origin=\"*\" --LabApp.disable_check_xsrf=True --LabApp.trust_xheaders=True --LabApp.base_url=/ --LabApp.tornado_settings='{\"headers\":{\"Content-Security-Policy\":\"frame-ancestors * \'self\'\"}}' --notebook-dir='/data' --allow-root"] + workingDir: /data env: - name: tornado value: "'{'headers':{'Content-Security-Policy':\"frame-ancestors\ *\ \'self'\"}}'" From 33aa79f03b112c22f6a226644f578aaee73f5308 Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Wed, 23 Dec 2020 13:17:22 -0800 Subject: [PATCH 19/37] update README --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 5061ec56..cd77d99f 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,7 @@ Onepanel can be found on [LF AI Landscape](http://landscape.lfai.foundation/sele ## Online demo We have created an [online demo environment](https://onepanel.typeform.com/to/kQfDX5Vf?product=github) so that you can quickly try Onepanel. -Note that this is a shared demo environment with the following restrictions: - -- Data is reset every few hours -- One type of node pool (machine type) with a limit of 5 concurrent nodes -- Certain actions may be restricted +Note that this is a **shared**, **read only** demo environment. ## Quick start See [quick start guide](https://docs.onepanel.ai/docs/getting-started/quickstart) to get started with the platform of your choice. From a1d6a151cd0fec35850c8b3002ce1570dbcb403a Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Wed, 23 Dec 2020 13:21:13 -0800 Subject: [PATCH 20/37] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd77d99f..691a73d7 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Onepanel can be found on [LF AI Landscape](http://landscape.lfai.foundation/sele ## Online demo We have created an [online demo environment](https://onepanel.typeform.com/to/kQfDX5Vf?product=github) so that you can quickly try Onepanel. -Note that this is a **shared**, **read only** demo environment. +**Note:** This is a shared, read only demo environment that is reset every few hours. ## Quick start See [quick start guide](https://docs.onepanel.ai/docs/getting-started/quickstart) to get started with the platform of your choice. From c93e7a526c63103f2f6a85918a335eea09d2b466 Mon Sep 17 00:00:00 2001 From: Rush Tehrani Date: Wed, 23 Dec 2020 16:20:34 -0800 Subject: [PATCH 21/37] chore: Fix manifests repo link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 691a73d7..c579b6f2 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Onepanel is modular and consists of the following repositories: [Backend](https://github.com/onepanelio/core/) (this repository) - Code base for backend (Go)\ [Frontend](https://github.com/onepanelio/core-ui/) - Code base for frontend (Angular + TypeScript)\ [CLI](https://github.com/onepanelio/cli/) - Code base for installation and management CLI (Go)\ -[Manifests](https://github.com/onepanelio/core-ui/) - Kustomize manifests used by installation and management CLI (YAML)\ +[Manifests](https://github.com/onepanelio/manifests/) - Kustomize manifests used by installation and management CLI (YAML)\ [Python SDK](https://github.com/onepanelio/python-sdk/) - Python SDK code and documentation (Python)\ [Templates](https://github.com/onepanelio/templates) - Various Workspace, Workflow, Task and Sidecar Templates\ [Documentation](https://github.com/onepanelio/core-docs/) - The repository for documentation site\ From b2bf62d9323efba0dd4f8fde26cdd016f2cdc049 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Sat, 19 Dec 2020 20:52:01 -0800 Subject: [PATCH 22/37] feat: updated API with method to generate workflow template manifest. This will perform any modifications needed to replace types with runtime data, etc. An example is select.nodepool. This value should set the options to the currently available node types. --- api/api.swagger.json | 45 ++ api/gen/workflow_template.pb.go | 722 +++++++++++++++------------ api/gen/workflow_template.pb.gw.go | 135 +++++ api/gen/workflow_template_grpc.pb.go | 38 ++ api/proto/workflow_template.proto | 14 + 5 files changed, 643 insertions(+), 311 deletions(-) diff --git a/api/api.swagger.json b/api/api.swagger.json index 5a66f014..e1ac9edd 100644 --- a/api/api.swagger.json +++ b/api/api.swagger.json @@ -1894,6 +1894,51 @@ ] } }, + "/apis/v1beta1/{namespace}/workflow_templates/{uid}/generate": { + "post": { + "summary": "Get the generated WorkflowTemplate, applying any modifications based on the content", + "operationId": "GenerateWorkflowTemplate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/WorkflowTemplate" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/google.rpc.Status" + } + } + }, + "parameters": [ + { + "name": "namespace", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "uid", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/WorkflowTemplate" + } + } + ], + "tags": [ + "WorkflowTemplateService" + ] + } + }, "/apis/v1beta1/{namespace}/workflow_templates/{uid}/versions": { "get": { "operationId": "ListWorkflowTemplateVersions", diff --git a/api/gen/workflow_template.pb.go b/api/gen/workflow_template.pb.go index 7321f16d..8d656748 100644 --- a/api/gen/workflow_template.pb.go +++ b/api/gen/workflow_template.pb.go @@ -26,6 +26,69 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 +type GenerateWorkflowTemplateRequest 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"` + WorkflowTemplate *WorkflowTemplate `protobuf:"bytes,3,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` +} + +func (x *GenerateWorkflowTemplateRequest) Reset() { + *x = GenerateWorkflowTemplateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_workflow_template_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenerateWorkflowTemplateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenerateWorkflowTemplateRequest) ProtoMessage() {} + +func (x *GenerateWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { + mi := &file_workflow_template_proto_msgTypes[0] + 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 GenerateWorkflowTemplateRequest.ProtoReflect.Descriptor instead. +func (*GenerateWorkflowTemplateRequest) Descriptor() ([]byte, []int) { + return file_workflow_template_proto_rawDescGZIP(), []int{0} +} + +func (x *GenerateWorkflowTemplateRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GenerateWorkflowTemplateRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *GenerateWorkflowTemplateRequest) GetWorkflowTemplate() *WorkflowTemplate { + if x != nil { + return x.WorkflowTemplate + } + return nil +} + type CreateWorkflowTemplateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -38,7 +101,7 @@ type CreateWorkflowTemplateRequest struct { func (x *CreateWorkflowTemplateRequest) Reset() { *x = CreateWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[0] + mi := &file_workflow_template_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -51,7 +114,7 @@ func (x *CreateWorkflowTemplateRequest) String() string { func (*CreateWorkflowTemplateRequest) ProtoMessage() {} func (x *CreateWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[0] + mi := &file_workflow_template_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -64,7 +127,7 @@ func (x *CreateWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*CreateWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{0} + return file_workflow_template_proto_rawDescGZIP(), []int{1} } func (x *CreateWorkflowTemplateRequest) GetNamespace() string { @@ -93,7 +156,7 @@ type UpdateWorkflowTemplateVersionRequest struct { func (x *UpdateWorkflowTemplateVersionRequest) Reset() { *x = UpdateWorkflowTemplateVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[1] + mi := &file_workflow_template_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -106,7 +169,7 @@ func (x *UpdateWorkflowTemplateVersionRequest) String() string { func (*UpdateWorkflowTemplateVersionRequest) ProtoMessage() {} func (x *UpdateWorkflowTemplateVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[1] + mi := &file_workflow_template_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -119,7 +182,7 @@ func (x *UpdateWorkflowTemplateVersionRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use UpdateWorkflowTemplateVersionRequest.ProtoReflect.Descriptor instead. func (*UpdateWorkflowTemplateVersionRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{1} + return file_workflow_template_proto_rawDescGZIP(), []int{2} } func (x *UpdateWorkflowTemplateVersionRequest) GetNamespace() string { @@ -149,7 +212,7 @@ type GetWorkflowTemplateRequest struct { func (x *GetWorkflowTemplateRequest) Reset() { *x = GetWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[2] + mi := &file_workflow_template_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -162,7 +225,7 @@ func (x *GetWorkflowTemplateRequest) String() string { func (*GetWorkflowTemplateRequest) ProtoMessage() {} func (x *GetWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[2] + mi := &file_workflow_template_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -175,7 +238,7 @@ func (x *GetWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{2} + return file_workflow_template_proto_rawDescGZIP(), []int{3} } func (x *GetWorkflowTemplateRequest) GetNamespace() string { @@ -213,7 +276,7 @@ type CloneWorkflowTemplateRequest struct { func (x *CloneWorkflowTemplateRequest) Reset() { *x = CloneWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[3] + mi := &file_workflow_template_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -226,7 +289,7 @@ func (x *CloneWorkflowTemplateRequest) String() string { func (*CloneWorkflowTemplateRequest) ProtoMessage() {} func (x *CloneWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[3] + mi := &file_workflow_template_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -239,7 +302,7 @@ func (x *CloneWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CloneWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*CloneWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{3} + return file_workflow_template_proto_rawDescGZIP(), []int{4} } func (x *CloneWorkflowTemplateRequest) GetNamespace() string { @@ -282,7 +345,7 @@ type ListWorkflowTemplateVersionsRequest struct { func (x *ListWorkflowTemplateVersionsRequest) Reset() { *x = ListWorkflowTemplateVersionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[4] + mi := &file_workflow_template_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -295,7 +358,7 @@ func (x *ListWorkflowTemplateVersionsRequest) String() string { func (*ListWorkflowTemplateVersionsRequest) ProtoMessage() {} func (x *ListWorkflowTemplateVersionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[4] + mi := &file_workflow_template_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -308,7 +371,7 @@ func (x *ListWorkflowTemplateVersionsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ListWorkflowTemplateVersionsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplateVersionsRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{4} + return file_workflow_template_proto_rawDescGZIP(), []int{5} } func (x *ListWorkflowTemplateVersionsRequest) GetNamespace() string { @@ -337,7 +400,7 @@ type ListWorkflowTemplateVersionsResponse struct { func (x *ListWorkflowTemplateVersionsResponse) Reset() { *x = ListWorkflowTemplateVersionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[5] + mi := &file_workflow_template_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -350,7 +413,7 @@ func (x *ListWorkflowTemplateVersionsResponse) String() string { func (*ListWorkflowTemplateVersionsResponse) ProtoMessage() {} func (x *ListWorkflowTemplateVersionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[5] + mi := &file_workflow_template_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -363,7 +426,7 @@ func (x *ListWorkflowTemplateVersionsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ListWorkflowTemplateVersionsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplateVersionsResponse) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{5} + return file_workflow_template_proto_rawDescGZIP(), []int{6} } func (x *ListWorkflowTemplateVersionsResponse) GetCount() int32 { @@ -394,7 +457,7 @@ type ListWorkflowTemplatesRequest struct { func (x *ListWorkflowTemplatesRequest) Reset() { *x = ListWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[6] + mi := &file_workflow_template_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -407,7 +470,7 @@ func (x *ListWorkflowTemplatesRequest) String() string { func (*ListWorkflowTemplatesRequest) ProtoMessage() {} func (x *ListWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[6] + mi := &file_workflow_template_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -420,7 +483,7 @@ func (x *ListWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{6} + return file_workflow_template_proto_rawDescGZIP(), []int{7} } func (x *ListWorkflowTemplatesRequest) GetNamespace() string { @@ -467,7 +530,7 @@ type ListWorkflowTemplatesResponse struct { func (x *ListWorkflowTemplatesResponse) Reset() { *x = ListWorkflowTemplatesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[7] + mi := &file_workflow_template_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -480,7 +543,7 @@ func (x *ListWorkflowTemplatesResponse) String() string { func (*ListWorkflowTemplatesResponse) ProtoMessage() {} func (x *ListWorkflowTemplatesResponse) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[7] + mi := &file_workflow_template_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -493,7 +556,7 @@ func (x *ListWorkflowTemplatesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowTemplatesResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowTemplatesResponse) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{7} + return file_workflow_template_proto_rawDescGZIP(), []int{8} } func (x *ListWorkflowTemplatesResponse) GetCount() int32 { @@ -550,7 +613,7 @@ type ArchiveWorkflowTemplateRequest struct { func (x *ArchiveWorkflowTemplateRequest) Reset() { *x = ArchiveWorkflowTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[8] + mi := &file_workflow_template_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -563,7 +626,7 @@ func (x *ArchiveWorkflowTemplateRequest) String() string { func (*ArchiveWorkflowTemplateRequest) ProtoMessage() {} func (x *ArchiveWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[8] + mi := &file_workflow_template_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -576,7 +639,7 @@ func (x *ArchiveWorkflowTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveWorkflowTemplateRequest.ProtoReflect.Descriptor instead. func (*ArchiveWorkflowTemplateRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{8} + return file_workflow_template_proto_rawDescGZIP(), []int{9} } func (x *ArchiveWorkflowTemplateRequest) GetNamespace() string { @@ -604,7 +667,7 @@ type ArchiveWorkflowTemplateResponse struct { func (x *ArchiveWorkflowTemplateResponse) Reset() { *x = ArchiveWorkflowTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[9] + mi := &file_workflow_template_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -617,7 +680,7 @@ func (x *ArchiveWorkflowTemplateResponse) String() string { func (*ArchiveWorkflowTemplateResponse) ProtoMessage() {} func (x *ArchiveWorkflowTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[9] + mi := &file_workflow_template_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -630,7 +693,7 @@ func (x *ArchiveWorkflowTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveWorkflowTemplateResponse.ProtoReflect.Descriptor instead. func (*ArchiveWorkflowTemplateResponse) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{9} + return file_workflow_template_proto_rawDescGZIP(), []int{10} } func (x *ArchiveWorkflowTemplateResponse) GetWorkflowTemplate() *WorkflowTemplate { @@ -656,7 +719,7 @@ type WorkflowExecutionStatisticReport struct { func (x *WorkflowExecutionStatisticReport) Reset() { *x = WorkflowExecutionStatisticReport{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[10] + mi := &file_workflow_template_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -669,7 +732,7 @@ func (x *WorkflowExecutionStatisticReport) String() string { func (*WorkflowExecutionStatisticReport) ProtoMessage() {} func (x *WorkflowExecutionStatisticReport) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[10] + mi := &file_workflow_template_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -682,7 +745,7 @@ func (x *WorkflowExecutionStatisticReport) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowExecutionStatisticReport.ProtoReflect.Descriptor instead. func (*WorkflowExecutionStatisticReport) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{10} + return file_workflow_template_proto_rawDescGZIP(), []int{11} } func (x *WorkflowExecutionStatisticReport) GetTotal() int32 { @@ -738,7 +801,7 @@ type CronWorkflowStatisticsReport struct { func (x *CronWorkflowStatisticsReport) Reset() { *x = CronWorkflowStatisticsReport{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[11] + mi := &file_workflow_template_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -751,7 +814,7 @@ func (x *CronWorkflowStatisticsReport) String() string { func (*CronWorkflowStatisticsReport) ProtoMessage() {} func (x *CronWorkflowStatisticsReport) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[11] + mi := &file_workflow_template_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -764,7 +827,7 @@ func (x *CronWorkflowStatisticsReport) ProtoReflect() protoreflect.Message { // Deprecated: Use CronWorkflowStatisticsReport.ProtoReflect.Descriptor instead. func (*CronWorkflowStatisticsReport) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{11} + return file_workflow_template_proto_rawDescGZIP(), []int{12} } func (x *CronWorkflowStatisticsReport) GetTotal() int32 { @@ -797,7 +860,7 @@ type WorkflowTemplate struct { func (x *WorkflowTemplate) Reset() { *x = WorkflowTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[12] + mi := &file_workflow_template_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -810,7 +873,7 @@ func (x *WorkflowTemplate) String() string { func (*WorkflowTemplate) ProtoMessage() {} func (x *WorkflowTemplate) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[12] + mi := &file_workflow_template_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -823,7 +886,7 @@ func (x *WorkflowTemplate) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplate.ProtoReflect.Descriptor instead. func (*WorkflowTemplate) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{12} + return file_workflow_template_proto_rawDescGZIP(), []int{13} } func (x *WorkflowTemplate) GetCreatedAt() string { @@ -930,7 +993,7 @@ type GetWorkflowTemplateLabelsRequest struct { func (x *GetWorkflowTemplateLabelsRequest) Reset() { *x = GetWorkflowTemplateLabelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_workflow_template_proto_msgTypes[13] + mi := &file_workflow_template_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -943,7 +1006,7 @@ func (x *GetWorkflowTemplateLabelsRequest) String() string { func (*GetWorkflowTemplateLabelsRequest) ProtoMessage() {} func (x *GetWorkflowTemplateLabelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_workflow_template_proto_msgTypes[13] + mi := &file_workflow_template_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -956,7 +1019,7 @@ func (x *GetWorkflowTemplateLabelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplateLabelsRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplateLabelsRequest) Descriptor() ([]byte, []int) { - return file_workflow_template_proto_rawDescGZIP(), []int{13} + return file_workflow_template_proto_rawDescGZIP(), []int{14} } func (x *GetWorkflowTemplateLabelsRequest) GetNamespace() string { @@ -988,227 +1051,248 @@ var file_workflow_template_proto_rawDesc = []byte{ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 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, 0x12, 0x41, 0x0a, 0x10, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x80, + 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x41, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x22, 0x87, 0x01, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 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, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x24, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 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, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x1c, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x55, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 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, 0x22, 0x81, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, + 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 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, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x22, 0xf6, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x1e, + 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x22, 0x64, + 0x0a, 0x1f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x1c, - 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 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, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x23, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 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, 0x22, 0x81, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 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, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0xf6, 0x01, 0x0a, - 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, - 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x1e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x22, 0x64, 0x0a, 0x1f, 0x41, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x01, - 0x0a, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x22, 0x34, 0x0a, 0x1c, - 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x22, 0xd9, 0x03, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, - 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, - 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, - 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x64, 0x22, 0x34, 0x0a, 0x1c, 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, - 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x6e, - 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xbb, - 0x0a, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x22, 0x2c, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xc2, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x60, 0x22, 0x4c, 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, 0x66, 0x6c, 0x6f, - 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x69, - 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xd3, 0x01, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x83, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7d, 0x12, 0x32, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x5a, 0x47, 0x12, 0x45, 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, 0x66, 0x6c, 0x6f, 0x77, - 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, - 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3d, 0x12, 0x3b, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, - 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, - 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0xe9, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x95, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x8e, 0x01, 0x12, 0x3f, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xd9, 0x03, 0x0a, 0x10, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, + 0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x09, 0x63, 0x72, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x6e, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xec, 0x0b, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0xae, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x55, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x4f, 0x22, 0x3b, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x5a, 0x4b, 0x12, 0x49, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x17, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, - 0x1a, 0x3a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, + 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, + 0x22, 0x2c, 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, - 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, - 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x42, 0x24, 0x5a, 0x22, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x6e, 0x65, 0x70, 0x61, - 0x6e, 0x65, 0x6c, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, - 0x65, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0xc2, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x60, 0x22, 0x4c, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xd3, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x83, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7d, 0x12, 0x32, + 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, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, + 0x64, 0x7d, 0x5a, 0x47, 0x12, 0x45, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x1c, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, + 0x2c, 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, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0xe9, 0x01, + 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, + 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x22, 0x95, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x8e, 0x01, 0x12, 0x3f, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, + 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5a, 0x4b, 0x12, 0x49, + 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, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, + 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x17, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, + 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x1a, 0x3a, 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, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x76, 0x65, 0x42, 0x24, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x69, 0x6f, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1223,54 +1307,58 @@ func file_workflow_template_proto_rawDescGZIP() []byte { return file_workflow_template_proto_rawDescData } -var file_workflow_template_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_workflow_template_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_workflow_template_proto_goTypes = []interface{}{ - (*CreateWorkflowTemplateRequest)(nil), // 0: api.CreateWorkflowTemplateRequest - (*UpdateWorkflowTemplateVersionRequest)(nil), // 1: api.UpdateWorkflowTemplateVersionRequest - (*GetWorkflowTemplateRequest)(nil), // 2: api.GetWorkflowTemplateRequest - (*CloneWorkflowTemplateRequest)(nil), // 3: api.CloneWorkflowTemplateRequest - (*ListWorkflowTemplateVersionsRequest)(nil), // 4: api.ListWorkflowTemplateVersionsRequest - (*ListWorkflowTemplateVersionsResponse)(nil), // 5: api.ListWorkflowTemplateVersionsResponse - (*ListWorkflowTemplatesRequest)(nil), // 6: api.ListWorkflowTemplatesRequest - (*ListWorkflowTemplatesResponse)(nil), // 7: api.ListWorkflowTemplatesResponse - (*ArchiveWorkflowTemplateRequest)(nil), // 8: api.ArchiveWorkflowTemplateRequest - (*ArchiveWorkflowTemplateResponse)(nil), // 9: api.ArchiveWorkflowTemplateResponse - (*WorkflowExecutionStatisticReport)(nil), // 10: api.WorkflowExecutionStatisticReport - (*CronWorkflowStatisticsReport)(nil), // 11: api.CronWorkflowStatisticsReport - (*WorkflowTemplate)(nil), // 12: api.WorkflowTemplate - (*GetWorkflowTemplateLabelsRequest)(nil), // 13: api.GetWorkflowTemplateLabelsRequest - (*KeyValue)(nil), // 14: api.KeyValue - (*Parameter)(nil), // 15: api.Parameter + (*GenerateWorkflowTemplateRequest)(nil), // 0: api.GenerateWorkflowTemplateRequest + (*CreateWorkflowTemplateRequest)(nil), // 1: api.CreateWorkflowTemplateRequest + (*UpdateWorkflowTemplateVersionRequest)(nil), // 2: api.UpdateWorkflowTemplateVersionRequest + (*GetWorkflowTemplateRequest)(nil), // 3: api.GetWorkflowTemplateRequest + (*CloneWorkflowTemplateRequest)(nil), // 4: api.CloneWorkflowTemplateRequest + (*ListWorkflowTemplateVersionsRequest)(nil), // 5: api.ListWorkflowTemplateVersionsRequest + (*ListWorkflowTemplateVersionsResponse)(nil), // 6: api.ListWorkflowTemplateVersionsResponse + (*ListWorkflowTemplatesRequest)(nil), // 7: api.ListWorkflowTemplatesRequest + (*ListWorkflowTemplatesResponse)(nil), // 8: api.ListWorkflowTemplatesResponse + (*ArchiveWorkflowTemplateRequest)(nil), // 9: api.ArchiveWorkflowTemplateRequest + (*ArchiveWorkflowTemplateResponse)(nil), // 10: api.ArchiveWorkflowTemplateResponse + (*WorkflowExecutionStatisticReport)(nil), // 11: api.WorkflowExecutionStatisticReport + (*CronWorkflowStatisticsReport)(nil), // 12: api.CronWorkflowStatisticsReport + (*WorkflowTemplate)(nil), // 13: api.WorkflowTemplate + (*GetWorkflowTemplateLabelsRequest)(nil), // 14: api.GetWorkflowTemplateLabelsRequest + (*KeyValue)(nil), // 15: api.KeyValue + (*Parameter)(nil), // 16: api.Parameter } var file_workflow_template_proto_depIdxs = []int32{ - 12, // 0: api.CreateWorkflowTemplateRequest.workflowTemplate:type_name -> api.WorkflowTemplate - 12, // 1: api.UpdateWorkflowTemplateVersionRequest.workflowTemplate:type_name -> api.WorkflowTemplate - 12, // 2: api.ListWorkflowTemplateVersionsResponse.workflowTemplates:type_name -> api.WorkflowTemplate - 12, // 3: api.ListWorkflowTemplatesResponse.workflowTemplates:type_name -> api.WorkflowTemplate - 12, // 4: api.ArchiveWorkflowTemplateResponse.workflowTemplate:type_name -> api.WorkflowTemplate - 14, // 5: api.WorkflowTemplate.labels:type_name -> api.KeyValue - 10, // 6: api.WorkflowTemplate.stats:type_name -> api.WorkflowExecutionStatisticReport - 11, // 7: api.WorkflowTemplate.cronStats:type_name -> api.CronWorkflowStatisticsReport - 15, // 8: api.WorkflowTemplate.parameters:type_name -> api.Parameter - 0, // 9: api.WorkflowTemplateService.CreateWorkflowTemplate:input_type -> api.CreateWorkflowTemplateRequest - 0, // 10: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:input_type -> api.CreateWorkflowTemplateRequest - 2, // 11: api.WorkflowTemplateService.GetWorkflowTemplate:input_type -> api.GetWorkflowTemplateRequest - 4, // 12: api.WorkflowTemplateService.ListWorkflowTemplateVersions:input_type -> api.ListWorkflowTemplateVersionsRequest - 6, // 13: api.WorkflowTemplateService.ListWorkflowTemplates:input_type -> api.ListWorkflowTemplatesRequest - 3, // 14: api.WorkflowTemplateService.CloneWorkflowTemplate:input_type -> api.CloneWorkflowTemplateRequest - 8, // 15: api.WorkflowTemplateService.ArchiveWorkflowTemplate:input_type -> api.ArchiveWorkflowTemplateRequest - 12, // 16: api.WorkflowTemplateService.CreateWorkflowTemplate:output_type -> api.WorkflowTemplate - 12, // 17: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:output_type -> api.WorkflowTemplate - 12, // 18: api.WorkflowTemplateService.GetWorkflowTemplate:output_type -> api.WorkflowTemplate - 5, // 19: api.WorkflowTemplateService.ListWorkflowTemplateVersions:output_type -> api.ListWorkflowTemplateVersionsResponse - 7, // 20: api.WorkflowTemplateService.ListWorkflowTemplates:output_type -> api.ListWorkflowTemplatesResponse - 12, // 21: api.WorkflowTemplateService.CloneWorkflowTemplate:output_type -> api.WorkflowTemplate - 9, // 22: api.WorkflowTemplateService.ArchiveWorkflowTemplate:output_type -> api.ArchiveWorkflowTemplateResponse - 16, // [16:23] is the sub-list for method output_type - 9, // [9:16] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 13, // 0: api.GenerateWorkflowTemplateRequest.workflowTemplate:type_name -> api.WorkflowTemplate + 13, // 1: api.CreateWorkflowTemplateRequest.workflowTemplate:type_name -> api.WorkflowTemplate + 13, // 2: api.UpdateWorkflowTemplateVersionRequest.workflowTemplate:type_name -> api.WorkflowTemplate + 13, // 3: api.ListWorkflowTemplateVersionsResponse.workflowTemplates:type_name -> api.WorkflowTemplate + 13, // 4: api.ListWorkflowTemplatesResponse.workflowTemplates:type_name -> api.WorkflowTemplate + 13, // 5: api.ArchiveWorkflowTemplateResponse.workflowTemplate:type_name -> api.WorkflowTemplate + 15, // 6: api.WorkflowTemplate.labels:type_name -> api.KeyValue + 11, // 7: api.WorkflowTemplate.stats:type_name -> api.WorkflowExecutionStatisticReport + 12, // 8: api.WorkflowTemplate.cronStats:type_name -> api.CronWorkflowStatisticsReport + 16, // 9: api.WorkflowTemplate.parameters:type_name -> api.Parameter + 0, // 10: api.WorkflowTemplateService.GenerateWorkflowTemplate:input_type -> api.GenerateWorkflowTemplateRequest + 1, // 11: api.WorkflowTemplateService.CreateWorkflowTemplate:input_type -> api.CreateWorkflowTemplateRequest + 1, // 12: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:input_type -> api.CreateWorkflowTemplateRequest + 3, // 13: api.WorkflowTemplateService.GetWorkflowTemplate:input_type -> api.GetWorkflowTemplateRequest + 5, // 14: api.WorkflowTemplateService.ListWorkflowTemplateVersions:input_type -> api.ListWorkflowTemplateVersionsRequest + 7, // 15: api.WorkflowTemplateService.ListWorkflowTemplates:input_type -> api.ListWorkflowTemplatesRequest + 4, // 16: api.WorkflowTemplateService.CloneWorkflowTemplate:input_type -> api.CloneWorkflowTemplateRequest + 9, // 17: api.WorkflowTemplateService.ArchiveWorkflowTemplate:input_type -> api.ArchiveWorkflowTemplateRequest + 13, // 18: api.WorkflowTemplateService.GenerateWorkflowTemplate:output_type -> api.WorkflowTemplate + 13, // 19: api.WorkflowTemplateService.CreateWorkflowTemplate:output_type -> api.WorkflowTemplate + 13, // 20: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:output_type -> api.WorkflowTemplate + 13, // 21: api.WorkflowTemplateService.GetWorkflowTemplate:output_type -> api.WorkflowTemplate + 6, // 22: api.WorkflowTemplateService.ListWorkflowTemplateVersions:output_type -> api.ListWorkflowTemplateVersionsResponse + 8, // 23: api.WorkflowTemplateService.ListWorkflowTemplates:output_type -> api.ListWorkflowTemplatesResponse + 13, // 24: api.WorkflowTemplateService.CloneWorkflowTemplate:output_type -> api.WorkflowTemplate + 10, // 25: api.WorkflowTemplateService.ArchiveWorkflowTemplate:output_type -> api.ArchiveWorkflowTemplateResponse + 18, // [18:26] is the sub-list for method output_type + 10, // [10:18] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_workflow_template_proto_init() } @@ -1282,7 +1370,7 @@ func file_workflow_template_proto_init() { file_common_proto_init() if !protoimpl.UnsafeEnabled { file_workflow_template_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkflowTemplateRequest); i { + switch v := v.(*GenerateWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1294,7 +1382,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkflowTemplateVersionRequest); i { + switch v := v.(*CreateWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1306,7 +1394,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplateRequest); i { + switch v := v.(*UpdateWorkflowTemplateVersionRequest); i { case 0: return &v.state case 1: @@ -1318,7 +1406,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloneWorkflowTemplateRequest); i { + switch v := v.(*GetWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1330,7 +1418,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplateVersionsRequest); i { + switch v := v.(*CloneWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1342,7 +1430,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplateVersionsResponse); i { + switch v := v.(*ListWorkflowTemplateVersionsRequest); i { case 0: return &v.state case 1: @@ -1354,7 +1442,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplatesRequest); i { + switch v := v.(*ListWorkflowTemplateVersionsResponse); i { case 0: return &v.state case 1: @@ -1366,7 +1454,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowTemplatesResponse); i { + switch v := v.(*ListWorkflowTemplatesRequest); i { case 0: return &v.state case 1: @@ -1378,7 +1466,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveWorkflowTemplateRequest); i { + switch v := v.(*ListWorkflowTemplatesResponse); i { case 0: return &v.state case 1: @@ -1390,7 +1478,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveWorkflowTemplateResponse); i { + switch v := v.(*ArchiveWorkflowTemplateRequest); i { case 0: return &v.state case 1: @@ -1402,7 +1490,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowExecutionStatisticReport); i { + switch v := v.(*ArchiveWorkflowTemplateResponse); i { case 0: return &v.state case 1: @@ -1414,7 +1502,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CronWorkflowStatisticsReport); i { + switch v := v.(*WorkflowExecutionStatisticReport); i { case 0: return &v.state case 1: @@ -1426,7 +1514,7 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplate); i { + switch v := v.(*CronWorkflowStatisticsReport); i { case 0: return &v.state case 1: @@ -1438,6 +1526,18 @@ func file_workflow_template_proto_init() { } } file_workflow_template_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkflowTemplate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_workflow_template_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplateLabelsRequest); i { case 0: return &v.state @@ -1456,7 +1556,7 @@ func file_workflow_template_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_workflow_template_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 15, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/workflow_template.pb.gw.go b/api/gen/workflow_template.pb.gw.go index ea015434..7e6f6382 100644 --- a/api/gen/workflow_template.pb.gw.go +++ b/api/gen/workflow_template.pb.gw.go @@ -31,6 +31,94 @@ var _ = runtime.String var _ = utilities.NewDoubleArray var _ = metadata.Join +func request_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowTemplateServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GenerateWorkflowTemplateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.WorkflowTemplate); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + 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.GenerateWorkflowTemplate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowTemplateServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GenerateWorkflowTemplateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.WorkflowTemplate); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + 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.GenerateWorkflowTemplate(ctx, &protoReq) + return msg, metadata, err + +} + func request_WorkflowTemplateService_CreateWorkflowTemplate_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowTemplateServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CreateWorkflowTemplateRequest var metadata runtime.ServerMetadata @@ -811,6 +899,29 @@ func local_request_WorkflowTemplateService_ArchiveWorkflowTemplate_0(ctx context // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterWorkflowTemplateServiceHandlerFromEndpoint instead. func RegisterWorkflowTemplateServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WorkflowTemplateServiceServer) error { + mux.Handle("POST", pattern_WorkflowTemplateService_GenerateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/api.WorkflowTemplateService/GenerateWorkflowTemplate") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkflowTemplateService_GenerateWorkflowTemplate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_WorkflowTemplateService_CreateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1059,6 +1170,26 @@ func RegisterWorkflowTemplateServiceHandler(ctx context.Context, mux *runtime.Se // "WorkflowTemplateServiceClient" to call the correct interceptors. func RegisterWorkflowTemplateServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WorkflowTemplateServiceClient) error { + mux.Handle("POST", pattern_WorkflowTemplateService_GenerateWorkflowTemplate_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, "/api.WorkflowTemplateService/GenerateWorkflowTemplate") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkflowTemplateService_GenerateWorkflowTemplate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WorkflowTemplateService_GenerateWorkflowTemplate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_WorkflowTemplateService_CreateWorkflowTemplate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1243,6 +1374,8 @@ func RegisterWorkflowTemplateServiceHandlerClient(ctx context.Context, mux *runt } var ( + pattern_WorkflowTemplateService_GenerateWorkflowTemplate_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", "workflow_templates", "uid", "generate"}, "")) + pattern_WorkflowTemplateService_CreateWorkflowTemplate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workflow_templates"}, "")) pattern_WorkflowTemplateService_CreateWorkflowTemplateVersion_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", "workflow_templates", "workflowTemplate.uid", "versions"}, "")) @@ -1263,6 +1396,8 @@ var ( ) var ( + forward_WorkflowTemplateService_GenerateWorkflowTemplate_0 = runtime.ForwardResponseMessage + forward_WorkflowTemplateService_CreateWorkflowTemplate_0 = runtime.ForwardResponseMessage forward_WorkflowTemplateService_CreateWorkflowTemplateVersion_0 = runtime.ForwardResponseMessage diff --git a/api/gen/workflow_template_grpc.pb.go b/api/gen/workflow_template_grpc.pb.go index acea4528..db3914e4 100644 --- a/api/gen/workflow_template_grpc.pb.go +++ b/api/gen/workflow_template_grpc.pb.go @@ -17,6 +17,8 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type WorkflowTemplateServiceClient interface { + // Get the generated WorkflowTemplate, applying any modifications based on the content + GenerateWorkflowTemplate(ctx context.Context, in *GenerateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) CreateWorkflowTemplate(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) CreateWorkflowTemplateVersion(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) GetWorkflowTemplate(ctx context.Context, in *GetWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) @@ -34,6 +36,15 @@ func NewWorkflowTemplateServiceClient(cc grpc.ClientConnInterface) WorkflowTempl return &workflowTemplateServiceClient{cc} } +func (c *workflowTemplateServiceClient) GenerateWorkflowTemplate(ctx context.Context, in *GenerateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) { + out := new(WorkflowTemplate) + err := c.cc.Invoke(ctx, "/api.WorkflowTemplateService/GenerateWorkflowTemplate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *workflowTemplateServiceClient) CreateWorkflowTemplate(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) { out := new(WorkflowTemplate) err := c.cc.Invoke(ctx, "/api.WorkflowTemplateService/CreateWorkflowTemplate", in, out, opts...) @@ -101,6 +112,8 @@ func (c *workflowTemplateServiceClient) ArchiveWorkflowTemplate(ctx context.Cont // All implementations must embed UnimplementedWorkflowTemplateServiceServer // for forward compatibility type WorkflowTemplateServiceServer interface { + // Get the generated WorkflowTemplate, applying any modifications based on the content + GenerateWorkflowTemplate(context.Context, *GenerateWorkflowTemplateRequest) (*WorkflowTemplate, error) CreateWorkflowTemplate(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) CreateWorkflowTemplateVersion(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) GetWorkflowTemplate(context.Context, *GetWorkflowTemplateRequest) (*WorkflowTemplate, error) @@ -115,6 +128,9 @@ type WorkflowTemplateServiceServer interface { type UnimplementedWorkflowTemplateServiceServer struct { } +func (UnimplementedWorkflowTemplateServiceServer) GenerateWorkflowTemplate(context.Context, *GenerateWorkflowTemplateRequest) (*WorkflowTemplate, error) { + return nil, status.Errorf(codes.Unimplemented, "method GenerateWorkflowTemplate not implemented") +} func (UnimplementedWorkflowTemplateServiceServer) CreateWorkflowTemplate(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateWorkflowTemplate not implemented") } @@ -150,6 +166,24 @@ func RegisterWorkflowTemplateServiceServer(s grpc.ServiceRegistrar, srv Workflow s.RegisterService(&_WorkflowTemplateService_serviceDesc, srv) } +func _WorkflowTemplateService_GenerateWorkflowTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GenerateWorkflowTemplateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkflowTemplateServiceServer).GenerateWorkflowTemplate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.WorkflowTemplateService/GenerateWorkflowTemplate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkflowTemplateServiceServer).GenerateWorkflowTemplate(ctx, req.(*GenerateWorkflowTemplateRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _WorkflowTemplateService_CreateWorkflowTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateWorkflowTemplateRequest) if err := dec(in); err != nil { @@ -280,6 +314,10 @@ var _WorkflowTemplateService_serviceDesc = grpc.ServiceDesc{ ServiceName: "api.WorkflowTemplateService", HandlerType: (*WorkflowTemplateServiceServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "GenerateWorkflowTemplate", + Handler: _WorkflowTemplateService_GenerateWorkflowTemplate_Handler, + }, { MethodName: "CreateWorkflowTemplate", Handler: _WorkflowTemplateService_CreateWorkflowTemplate_Handler, diff --git a/api/proto/workflow_template.proto b/api/proto/workflow_template.proto index 7fe91e0b..d7da43c4 100644 --- a/api/proto/workflow_template.proto +++ b/api/proto/workflow_template.proto @@ -8,6 +8,14 @@ import "label.proto"; import "common.proto"; service WorkflowTemplateService { + // Get the generated WorkflowTemplate, applying any modifications based on the content + rpc GenerateWorkflowTemplate (GenerateWorkflowTemplateRequest) returns (WorkflowTemplate) { + option (google.api.http) = { + post: "/apis/v1beta1/{namespace}/workflow_templates/{uid}/generate" + body: "workflowTemplate" + }; + } + rpc CreateWorkflowTemplate (CreateWorkflowTemplateRequest) returns (WorkflowTemplate) { option (google.api.http) = { post: "/apis/v1beta1/{namespace}/workflow_templates" @@ -59,6 +67,12 @@ service WorkflowTemplateService { } } +message GenerateWorkflowTemplateRequest { + string namespace = 1; + string uid = 2; + WorkflowTemplate workflowTemplate = 3; +} + message CreateWorkflowTemplateRequest { string namespace = 1; WorkflowTemplate workflowTemplate = 2; From 5e7c5ba8889ae79454566de1410adb03f03cb6bf Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Sat, 19 Dec 2020 20:52:52 -0800 Subject: [PATCH 23/37] feat: add workflow template and updated workspace template parameter logic to replace select.nodepool values with runtime values. --- pkg/workflow_template.go | 96 +++++++++++++++++++++++++++++ pkg/workspace_template.go | 6 ++ server/workflow_template_server.go | 28 +++++++++ server/workspace_template_server.go | 3 +- 4 files changed, 131 insertions(+), 2 deletions(-) diff --git a/pkg/workflow_template.go b/pkg/workflow_template.go index fd163414..3700b715 100644 --- a/pkg/workflow_template.go +++ b/pkg/workflow_template.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/onepanelio/core/pkg/util/ptr" "github.com/onepanelio/core/pkg/util/request" pagination "github.com/onepanelio/core/pkg/util/request/pagination" "strconv" @@ -32,6 +33,38 @@ func (wt *WorkflowTemplateFilter) GetLabels() []*Label { return wt.Labels } +// replaceSysNodePoolOptions replaces a select.nodepool parameter with the nodePool options in the systemConfig +// and returns the new parameters with the change. +func (c *Client) replaceSysNodePoolOptions(parameters []Parameter) (result []Parameter, err error) { + nodePoolOptions, err := c.systemConfig.NodePoolOptions() + if err != nil { + return result, err + } + + nodePoolParameterOptions := make([]*ParameterOption, 0) + for _, option := range nodePoolOptions { + nodePoolParameterOptions = append(nodePoolParameterOptions, &ParameterOption{ + Name: option.Name, + Value: option.Value, + }) + } + + for i := range parameters { + param := parameters[i] + if param.Type == "select.nodepool" { + param.Options = nodePoolParameterOptions + + if param.Value != nil && *param.Value == "default" { + param.Value = ptr.String(param.Options[0].Value) + } + } + + result = append(result, param) + } + + return +} + func applyWorkflowTemplateFilter(sb sq.SelectBuilder, request *request.Request) (sq.SelectBuilder, error) { if !request.HasFilter() { return sb, nil @@ -390,6 +423,30 @@ func (c *Client) getWorkflowTemplate(namespace, uid string, version int64) (work } workflowTemplate.Parameters = wtv.Parameters + + nodePoolOptions, err := c.systemConfig.NodePoolOptions() + if err != nil { + return nil, err + } + nodePoolParameterOptions := make([]*ParameterOption, 0) + for _, option := range nodePoolOptions { + nodePoolParameterOptions = append(nodePoolParameterOptions, &ParameterOption{ + Name: option.Name, + Value: option.Value, + }) + } + + for i := range workflowTemplate.Parameters { + param := &workflowTemplate.Parameters[i] + if param.Type == "select.nodepool" { + param.Options = nodePoolParameterOptions + + if param.Value != nil && *param.Value == "default" { + param.Value = ptr.String(param.Options[0].Value) + } + } + } + return workflowTemplate, nil } @@ -1061,3 +1118,42 @@ func (c *Client) GetWorkflowTemplateLabels(namespace, name, prefix string, versi return } + +// GenerateWorkflowTemplate replaces any special parameters with runtime values +func (c *Client) GenerateWorkflowTemplateManifest(manifest string) (string, error) { + manifestObject := make(map[string]interface{}) + if err := yaml.Unmarshal([]byte(manifest), &manifestObject); err != nil { + return "", util.NewUserError(codes.InvalidArgument, "Invalid yaml") + } + + argumentsRaw := manifestObject["arguments"] + arguments, ok := argumentsRaw.(map[string]interface{}) + if !ok { + return "", fmt.Errorf("unable to parse arguments") + } + + jsonParameters, err := json.Marshal(arguments["parameters"]) + if err != nil { + return "", err + } + + parameters := make([]Parameter, 0) + if err := json.Unmarshal(jsonParameters, ¶meters); err != nil { + return "", err + } + + parameters, err = c.replaceSysNodePoolOptions(parameters) + if err != nil { + return "", err + } + + arguments["parameters"] = parameters + manifestObject["arguments"] = arguments + + finalManifest, err := yaml.Marshal(manifestObject) + if err != nil { + return "", err + } + + return string(finalManifest), err +} diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index bcea6d78..06cbad48 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -945,6 +945,12 @@ func (c *Client) generateWorkspaceTemplateWorkflowTemplate(workspaceTemplate *Wo return nil, util.NewUserError(codes.InvalidArgument, err.Error()) } + modifiedParameters, err := c.replaceSysNodePoolOptions(workspaceSpec.Arguments.Parameters) + if err != nil { + return nil, err + } + workspaceSpec.Arguments.Parameters = modifiedParameters + if err = generateArguments(workspaceSpec, config); err != nil { return nil, err } diff --git a/server/workflow_template_server.go b/server/workflow_template_server.go index 4f39e1c9..69c62193 100644 --- a/server/workflow_template_server.go +++ b/server/workflow_template_server.go @@ -47,6 +47,34 @@ func apiWorkflowTemplate(wft *v1.WorkflowTemplate) *api.WorkflowTemplate { return res } +// GenerateWorkflowTemplate generates a workflow template, applying any modifications based on the content of the manifest +func (s *WorkflowTemplateServer) GenerateWorkflowTemplate(ctx context.Context, req *api.GenerateWorkflowTemplateRequest) (*api.WorkflowTemplate, error) { + client := getClient(ctx) + allowed, err := auth.IsAuthorized(client, req.Namespace, "get", "argoproj.io", "workflowtemplates", "") + if err != nil || !allowed { + return nil, err + } + + if req.WorkflowTemplate.Manifest == "" { + return &api.WorkflowTemplate{ + Manifest: "", + }, nil + } + + finalManifest, err := client.GenerateWorkflowTemplateManifest(req.WorkflowTemplate.Manifest) + if err != nil { + return &api.WorkflowTemplate{ + Manifest: "", + }, err + } + + workflowTemplate := &v1.WorkflowTemplate{ + Manifest: finalManifest, + } + + return apiWorkflowTemplate(workflowTemplate), nil +} + // CreateWorkflowTemplate creates a workflow template and the initial version func (s *WorkflowTemplateServer) CreateWorkflowTemplate(ctx context.Context, req *api.CreateWorkflowTemplateRequest) (*api.WorkflowTemplate, error) { client := getClient(ctx) diff --git a/server/workspace_template_server.go b/server/workspace_template_server.go index d391042c..6f1f0b8a 100644 --- a/server/workspace_template_server.go +++ b/server/workspace_template_server.go @@ -61,8 +61,7 @@ func (s WorkspaceTemplateServer) GenerateWorkspaceTemplateWorkflowTemplate(ctx c Manifest: req.WorkspaceTemplate.Manifest, } workflowTemplate, err := client.GenerateWorkspaceTemplateWorkflowTemplate(workspaceTemplate) - - if workflowTemplate == nil { + if err != nil || workflowTemplate == nil { return &api.WorkflowTemplate{ Manifest: "", }, err From 96fde4e00572d07f9669a654feded3c720a946e3 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 09:10:15 -0800 Subject: [PATCH 24/37] feat: update templates to add node pool argument (WIP) --- db/go/20201221194344_pytorch_update.go | 35 ++++++++ ...nn_update_parameters_to_select_nodepool.go | 38 +++++++++ ...1223062947_tf_training_update_node_pool.go | 38 +++++++++ db/go/db.go | 69 ++++++++++++--- db/go/util.go | 3 +- ...0201208155115.yaml => 20201221195937.yaml} | 40 +++------ db/yaml/pytorch_training/20200605090509.yaml | 75 ++++++++++++++++ db/yaml/pytorch_training/20201221194344.yaml | 83 ++++++++++++++++++ db/yaml/tf_training/20201223062947.yaml | 85 +++++++++++++++++++ db/yaml/tf_training/README.md | 1 + pkg/client.go | 15 ++++ pkg/workspace_template.go | 8 +- 12 files changed, 445 insertions(+), 45 deletions(-) create mode 100644 db/go/20201221194344_pytorch_update.go create mode 100644 db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go create mode 100644 db/go/20201223062947_tf_training_update_node_pool.go rename db/yaml/maskrcnn/{20201208155115.yaml => 20201221195937.yaml} (87%) create mode 100644 db/yaml/pytorch_training/20200605090509.yaml create mode 100644 db/yaml/pytorch_training/20201221194344.yaml create mode 100644 db/yaml/tf_training/20201223062947.yaml create mode 100644 db/yaml/tf_training/README.md diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go new file mode 100644 index 00000000..9a34ce7e --- /dev/null +++ b/db/go/20201221194344_pytorch_update.go @@ -0,0 +1,35 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201221194344() { + if _, ok := initializedMigrations[20201221194344]; !ok { + goose.AddMigration(Up20201221194344, Down20201221194344) + initializedMigrations[20201221194344] = true + } +} + +func Up20201221194344(tx *sql.Tx) error { + return updateWorkflowTemplateManifest( + filepath.Join("pytorch_training", "20201221194344.yaml"), + pytorchMnistWorkflowTemplateName, + map[string]string{ + "created-by": "system", + }, + ) +} + +func Down20201221194344(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("pytorch_training", "20200605090509.yaml"), + pytorchMnistWorkflowTemplateName, + map[string]string{ + "created-by": "system", + }, + ) +} diff --git a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go new file mode 100644 index 00000000..3e09923c --- /dev/null +++ b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go @@ -0,0 +1,38 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201221195937() { + if _, ok := initializedMigrations[20201221195937]; !ok { + goose.AddMigration(Up20201221195937, Down20201221195937) + initializedMigrations[20201221195937] = true + } +} + +func Up20201221195937(tx *sql.Tx) error { + // This code is executed when the migration is applied. + return updateWorkflowTemplateManifest( + filepath.Join("maskrcnn", "20201221195937.yaml"), + maskRCNNWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} + +func Down20201221195937(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("maskrcnn", "20201208155115.yaml"), + maskRCNNWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go new file mode 100644 index 00000000..b2093b7a --- /dev/null +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -0,0 +1,38 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201223062947() { + if _, ok := initializedMigrations[20201223062947]; !ok { + goose.AddMigration(Up20201223062947, Down20201223062947) + initializedMigrations[20201223062947] = true + } +} + +func Up20201223062947(tx *sql.Tx) error { + // This code is executed when the migration is applied. + return updateWorkflowTemplateManifest( + filepath.Join("tf_training", "20201223062947.yaml"), + tensorflowWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} + +func Down20201223062947(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("tf_training", "20201223062947.yaml"), + tensorflowWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} diff --git a/db/go/db.go b/db/go/db.go index 570bdd97..eda13777 100644 --- a/db/go/db.go +++ b/db/go/db.go @@ -2,6 +2,7 @@ package migration import ( "errors" + "fmt" sq "github.com/Masterminds/squirrel" "github.com/jmoiron/sqlx" v1 "github.com/onepanelio/core/pkg" @@ -78,6 +79,9 @@ func Initialize() { initialize20201209124226() initialize20201211161117() initialize20201214133458() + initialize20201221194344() + initialize20201221195937() + initialize20201223062947() if err := client.DB.Close(); err != nil { log.Printf("[error] closing db %v", err) @@ -123,30 +127,73 @@ func getRanSQLMigrations(client *v1.Client) (map[uint64]bool, error) { // ReplaceArtifactRepositoryType will look for {{.ArtifactRepositoryType}} in the migration and replace it based on config. func ReplaceArtifactRepositoryType(client *v1.Client, namespace *v1.Namespace, workflowTemplate *v1.WorkflowTemplate, workspaceTemplate *v1.WorkspaceTemplate) error { - artifactRepositoryType := "s3" - nsConfig, err := client.GetNamespaceConfig(namespace.Name) + artifactRepositoryType, err := client.GetArtifactRepositoryType(namespace.Name) if err != nil { return err } - if nsConfig.ArtifactRepository.GCS != nil { - artifactRepositoryType = "gcs" + + replaceMap := map[string]string{ + "{{.ArtifactRepositoryType}}": artifactRepositoryType, } + if workflowTemplate == nil && workspaceTemplate == nil { + return errors.New("workflow and workspace template cannot both be nil") + } if workflowTemplate != nil { - workflowTemplate.Manifest = strings.NewReplacer( - "{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workflowTemplate.Manifest) + workflowTemplate.Manifest = ReplaceMapValues(workflowTemplate.Manifest, replaceMap) } if workspaceTemplate != nil { - workspaceTemplate.Manifest = strings.NewReplacer( - "{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workspaceTemplate.Manifest) - } - if workflowTemplate == nil && workspaceTemplate == nil { - return errors.New("workflow and workspace template cannot be nil") + workspaceTemplate.Manifest = ReplaceMapValues(workspaceTemplate.Manifest, replaceMap) } return nil } +// ReplaceMapValues will replace strings that are keys in the input map with their values +// the result is returned +func ReplaceMapValues(value string, replaceMap map[string]string) string { + replacePairs := make([]string, 0) + + for key, value := range replaceMap { + replacePairs = append(replacePairs, key) + replacePairs = append(replacePairs, value) + } + + return strings.NewReplacer(replacePairs...). + Replace(value) +} + +// ReplaceRuntimeVariablesInManifest will replace any values that are runtime variables +// with the values currently present in the configuration for a given namespace. +// the result is returned +func ReplaceRuntimeVariablesInManifest(client *v1.Client, namespace string, manifest string) (string, error) { + artifactRepositoryType, err := client.GetArtifactRepositoryType(namespace) + if err != nil { + return manifest, err + } + + sysConfig, err := client.GetSystemConfig() + if err != nil { + return manifest, err + } + + nodePoolOptions, err := sysConfig.NodePoolOptions() + if err != nil { + return manifest, err + } + + if len(nodePoolOptions) == 0 { + return manifest, fmt.Errorf("no node pool options in the configuration") + } + + replaceMap := map[string]string{ + "{{.ArtifactRepositoryType}}": artifactRepositoryType, + "{{.DefaultNodePoolOption}}": nodePoolOptions[0].Value, + } + + return ReplaceMapValues(manifest, replaceMap), nil +} + // readDataFile returns the contents of a file in the db/data/{path} directory // path can indicate subdirectories like cvat/20201016170415.yaml func readDataFile(path string) (string, error) { diff --git a/db/go/util.go b/db/go/util.go index b3cd56fd..57831862 100644 --- a/db/go/util.go +++ b/db/go/util.go @@ -81,10 +81,11 @@ func updateWorkflowTemplateManifest(filename, templateName string, labels map[st Labels: labels, } - err = ReplaceArtifactRepositoryType(client, namespace, workflowTemplate, nil) + workflowTemplate.Manifest, err = ReplaceRuntimeVariablesInManifest(client, namespace.Name, workflowTemplate.Manifest) if err != nil { return err } + if _, err := client.CreateWorkflowTemplateVersion(namespace.Name, workflowTemplate); err != nil { return err } diff --git a/db/yaml/maskrcnn/20201208155115.yaml b/db/yaml/maskrcnn/20201221195937.yaml similarity index 87% rename from db/yaml/maskrcnn/20201208155115.yaml rename to db/yaml/maskrcnn/20201221195937.yaml index 053b6378..34b9234e 100644 --- a/db/yaml/maskrcnn/20201208155115.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -11,13 +11,13 @@ arguments: value: annotation-dump/sample_dataset hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. displayName: Dataset path - visibility: private + visibility: internal - name: cvat-output-path value: workflow-data/output/sample_output hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. displayName: Workflow output path - visibility: private + visibility: internal - name: cvat-finetune-checkpoint value: '' @@ -29,7 +29,7 @@ arguments: displayName: Number of classes hint: Number of classes (i.e in CVAT taks) + 1 for background value: '81' - visibility: private + visibility: internal - name: hyperparameters displayName: Hyperparameters @@ -60,21 +60,13 @@ arguments: - displayName: Node pool hint: Name of node pool or group to run this workflow task - type: select.select + type: select.nodepool visibility: public name: sys-node-pool - value: Standard_D4s_v3 + value: {{.DefaultNodePoolOption}} required: true - options: - - name: 'CPU: 2, RAM: 8GB' - value: Standard_D2s_v3 - - name: 'CPU: 4, RAM: 16GB' - value: Standard_D4s_v3 - - name: 'GPU: 1xK80, CPU: 6, RAM: 56GB' - value: Standard_NC6 templates: - - name: main - dag: + - dag: tasks: - name: train-model template: tensorflow @@ -90,8 +82,8 @@ templates: # - train-model # name: notify-in-slack # template: slack-notify-success - - name: tensorflow - container: + name: main + - container: args: - | apt-get update \ @@ -124,34 +116,24 @@ templates: workingDir: /mnt/src nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [sh, -c] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: ["tensorboard --logdir /mnt/output/"] - ports: - - containerPort: 6006 - name: tensorboard inputs: artifacts: - name: data path: /mnt/data/datasets/ - {{.ArtifactRepositoryType}}: + s3: key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' - git: repo: '{{workflow.parameters.source}}' revision: "no-boto" name: src path: /mnt/src + name: tensorflow outputs: artifacts: - name: model optional: true path: /mnt/output - {{.ArtifactRepositoryType}}: + s3: key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' # Uncomment the lines below if you want to send Slack notifications #- container: diff --git a/db/yaml/pytorch_training/20200605090509.yaml b/db/yaml/pytorch_training/20200605090509.yaml new file mode 100644 index 00000000..8172a5ec --- /dev/null +++ b/db/yaml/pytorch_training/20200605090509.yaml @@ -0,0 +1,75 @@ +entrypoint: main +arguments: + parameters: + - name: source + value: https://github.com/onepanelio/pytorch-examples.git + - name: command + value: "python mnist/main.py --epochs=1" +volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi + - metadata: + name: output + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi +templates: + - name: main + dag: + tasks: + - name: train-model + template: pytorch + # Uncomment section below to send metrics to Slack + # - name: notify-in-slack + # dependencies: [train-model] + # template: slack-notify-success + # arguments: + # parameters: + # - name: status + # value: "{{tasks.train-model.status}}" + # artifacts: + # - name: metrics + # from: "{{tasks.train-model.outputs.artifacts.sys-metrics}}" + - name: pytorch + inputs: + artifacts: + - name: src + path: /mnt/src + git: + repo: "{{workflow.parameters.source}}" + outputs: + artifacts: + - name: model + path: /mnt/output + optional: true + archive: + none: {} + container: + image: pytorch/pytorch:latest + command: [sh,-c] + args: ["{{workflow.parameters.command}}"] + workingDir: /mnt/src + volumeMounts: + - name: data + mountPath: /mnt/data + - name: output + mountPath: /mnt/output + - name: slack-notify-success + container: + image: technosophos/slack-notify + command: [sh,-c] + args: ['SLACK_USERNAME=Worker SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify'] + inputs: + parameters: + - name: status + artifacts: + - name: metrics + path: /tmp/metrics.json + optional: true \ No newline at end of file diff --git a/db/yaml/pytorch_training/20201221194344.yaml b/db/yaml/pytorch_training/20201221194344.yaml new file mode 100644 index 00000000..5d208745 --- /dev/null +++ b/db/yaml/pytorch_training/20201221194344.yaml @@ -0,0 +1,83 @@ +entrypoint: main +arguments: + parameters: + - name: source + value: https://github.com/onepanelio/pytorch-examples.git + - name: command + value: "python mnist/main.py --epochs=1" + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.nodepool + name: sys-node-pool + value: {{.DefaultNodePoolOption}} + visibility: public + required: true +volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi + - metadata: + name: output + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi +templates: + - name: main + dag: + tasks: + - name: train-model + template: pytorch + # Uncomment the lines below if you want to send Slack notifications + # - name: notify-in-slack + # dependencies: [train-model] + # template: slack-notify-success + # arguments: + # parameters: + # - name: status + # value: "{{tasks.train-model.status}}" + # artifacts: + # - name: metrics + # from: "{{tasks.train-model.outputs.artifacts.sys-metrics}}" + - name: pytorch + inputs: + artifacts: + - name: src + path: /mnt/src + git: + repo: "{{workflow.parameters.source}}" + outputs: + artifacts: + - name: model + path: /mnt/output + optional: true + archive: + none: {} + container: + image: pytorch/pytorch:latest + command: [sh,-c] + args: ["{{workflow.parameters.command}}"] + workingDir: /mnt/src + volumeMounts: + - name: data + mountPath: /mnt/data + - name: output + mountPath: /mnt/output +# Uncomment the lines below if you want to send Slack notifications +# - name: slack-notify-success +# container: +# image: technosophos/slack-notify +# command: [sh,-c] +# args: ['SLACK_USERNAME=Worker SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify'] +# inputs: +# parameters: +# - name: status +# artifacts: +# - name: metrics +# path: /tmp/metrics.json +# optional: true diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tf_training/20201223062947.yaml new file mode 100644 index 00000000..16a73110 --- /dev/null +++ b/db/yaml/tf_training/20201223062947.yaml @@ -0,0 +1,85 @@ +arguments: + parameters: + - name: epochs + value: '10' + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.nodepool + name: sys-node-pool + value: {{.DefaultNodePoolOption}} + visibility: public + required: true +entrypoint: main +templates: + - name: main + dag: + tasks: + - name: train-model + template: tf-dense + - name: tf-dense + script: + image: tensorflow/tensorflow:2.3.0 + command: + - python + - '-u' + source: | + import tensorflow as tf + import datetime + + mnist = tf.keras.datasets.mnist + + (x_train, y_train),(x_test, y_test) = mnist.load_data() + x_train, x_test = x_train / 255.0, x_test / 255.0 + + def create_model(): + return tf.keras.models.Sequential([ + tf.keras.layers.Flatten(input_shape=(28, 28)), + tf.keras.layers.Dense(512, activation='relu'), + tf.keras.layers.Dropout(0.2), + tf.keras.layers.Dense(10, activation='softmax') + ]) + + model = create_model() + model.compile(optimizer='adam', + loss='sparse_categorical_crossentropy', + metrics=['accuracy']) + + # Write logs to /mnt/output + log_dir = "/mnt/output/logs/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1) + + history = model.fit(x=x_train, + y=y_train, + epochs={{workflow.parameters.epochs}}, + validation_data=(x_test, y_test), + callbacks=[tensorboard_callback]) + volumeMounts: + # TensorBoard sidecar will automatically mount this volume + - name: output + mountPath: /mnt/output + + sidecars: + - name: tensorboard + image: 'tensorflow/tensorflow:2.3.0' + command: + - sh + - '-c' + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: + # Read logs from /mnt/output - this directory is auto-mounted from volumeMounts + - tensorboard --logdir /mnt/output/ + ports: + - containerPort: 6006 + name: tensorboard + +volumeClaimTemplates: + # Provision a volume that can be shared between main container and TensorBoard side car + - metadata: + name: output + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi diff --git a/db/yaml/tf_training/README.md b/db/yaml/tf_training/README.md new file mode 100644 index 00000000..a7ea0257 --- /dev/null +++ b/db/yaml/tf_training/README.md @@ -0,0 +1 @@ +See https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file diff --git a/pkg/client.go b/pkg/client.go index ab411ed7..1bd324b4 100644 --- a/pkg/client.go +++ b/pkg/client.go @@ -152,6 +152,21 @@ func (c *Client) GetWebRouter() (router.Web, error) { return webRouter, err } +// GetArtifactRepositoryType returns the configured artifact repository type for the given namespace. +// possible return values are: "s3", "gcs" +func (c *Client) GetArtifactRepositoryType(namespace string) (string, error) { + artifactRepositoryType := "s3" + nsConfig, err := c.GetNamespaceConfig(namespace) + if err != nil { + return "", err + } + if nsConfig.ArtifactRepository.GCS != nil { + artifactRepositoryType = "gcs" + } + + return artifactRepositoryType, nil +} + // getKubernetesTimeout returns the timeout for kubernetes requests. // It uses the KUBERNETES_TIMEOUT environment variable and defaults to 60 seconds if not found or an error occurs // parsing the set timeout. diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index 06cbad48..5005f15e 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -184,9 +184,6 @@ func generateRuntimeParameters(config SystemConfig) (parameters []Parameter, err if err != nil { return nil, err } - if len(nodePoolOptions) == 0 { - return nil, fmt.Errorf("no node pool options in config") - } var options []*ParameterOption for _, option := range nodePoolOptions { options = append(options, &ParameterOption{ @@ -194,6 +191,9 @@ func generateRuntimeParameters(config SystemConfig) (parameters []Parameter, err Value: option.Value, }) } + if len(options) == 0 { + return nil, fmt.Errorf("no node pool options in config") + } parameters = append(parameters, Parameter{ Name: "sys-node-pool-label", @@ -204,7 +204,7 @@ func generateRuntimeParameters(config SystemConfig) (parameters []Parameter, err parameters = append(parameters, Parameter{ Name: "sys-node-pool", Value: ptr.String(options[0].Value), - Type: "select.select", + Type: "select.nodepool", Options: options, DisplayName: ptr.String("Node pool"), Hint: ptr.String("Name of node pool or group"), From 6739ffc2f995635fd1b74727ad16c1ac8a645c49 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 13:03:31 -0800 Subject: [PATCH 25/37] feat: update other workflows with new node pool information. --- db/go/20201223202929_tfod_update_node_pool.go | 38 ++++ db/go/db.go | 1 + db/yaml/maskrcnn/20201221195937.yaml | 11 + db/yaml/pytorch_training/20201221194344.yaml | 6 +- db/yaml/tf_training/README.md | 2 +- db/yaml/tfod/20201223202929.yaml | 212 ++++++++++++++++++ db/yaml/tfod/README.md | 1 + 7 files changed, 267 insertions(+), 4 deletions(-) create mode 100644 db/go/20201223202929_tfod_update_node_pool.go create mode 100644 db/yaml/tfod/20201223202929.yaml create mode 100644 db/yaml/tfod/README.md diff --git a/db/go/20201223202929_tfod_update_node_pool.go b/db/go/20201223202929_tfod_update_node_pool.go new file mode 100644 index 00000000..e0ff7357 --- /dev/null +++ b/db/go/20201223202929_tfod_update_node_pool.go @@ -0,0 +1,38 @@ +package migration + +import ( + "database/sql" + "github.com/pressly/goose" + "path/filepath" +) + +func initialize20201223202929() { + if _, ok := initializedMigrations[20201223202929]; !ok { + goose.AddMigration(Up20201223202929, Down20201223202929) + initializedMigrations[20201223202929] = true + } +} + +func Up20201223202929(tx *sql.Tx) error { + // This code is executed when the migration is applied. + return updateWorkflowTemplateManifest( + filepath.Join("tfod", "20201223202929.yaml"), + tensorflowObjectDetectionWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} + +func Down20201223202929(tx *sql.Tx) error { + // This code is executed when the migration is rolled back. + return updateWorkflowTemplateManifest( + filepath.Join("tfod", "20201208155115.yaml"), + tensorflowObjectDetectionWorkflowTemplateName, + map[string]string{ + "created-by": "system", + "used-by": "cvat", + }, + ) +} diff --git a/db/go/db.go b/db/go/db.go index eda13777..ce8591cc 100644 --- a/db/go/db.go +++ b/db/go/db.go @@ -82,6 +82,7 @@ func Initialize() { initialize20201221194344() initialize20201221195937() initialize20201223062947() + initialize20201223202929() if err := client.DB.Close(); err != nil { log.Printf("[error] closing db %v", err) diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/maskrcnn/20201221195937.yaml index 34b9234e..138f09e3 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -116,6 +116,17 @@ templates: workingDir: /mnt/src nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard inputs: artifacts: - name: data diff --git a/db/yaml/pytorch_training/20201221194344.yaml b/db/yaml/pytorch_training/20201221194344.yaml index 5d208745..65465c9a 100644 --- a/db/yaml/pytorch_training/20201221194344.yaml +++ b/db/yaml/pytorch_training/20201221194344.yaml @@ -57,11 +57,11 @@ templates: path: /mnt/output optional: true archive: - none: {} + none: { } container: image: pytorch/pytorch:latest - command: [sh,-c] - args: ["{{workflow.parameters.command}}"] + command: [ sh,-c ] + args: [ "{{workflow.parameters.command}}" ] workingDir: /mnt/src volumeMounts: - name: data diff --git a/db/yaml/tf_training/README.md b/db/yaml/tf_training/README.md index a7ea0257..bc1f964e 100644 --- a/db/yaml/tf_training/README.md +++ b/db/yaml/tf_training/README.md @@ -1 +1 @@ -See https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file +https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file diff --git a/db/yaml/tfod/20201223202929.yaml b/db/yaml/tfod/20201223202929.yaml new file mode 100644 index 00000000..a4ba5b5c --- /dev/null +++ b/db/yaml/tfod/20201223202929.yaml @@ -0,0 +1,212 @@ +arguments: + parameters: + - name: source + value: https://github.com/tensorflow/models.git + displayName: Model source code + type: hidden + visibility: private + + - name: trainingsource + value: https://github.com/onepanelio/templates.git + type: hidden + visibility: private + + - name: revision + value: v1.13.0 + type: hidden + visibility: private + + - name: cvat-annotation-path + value: annotation-dump/sample_dataset + displayName: Dataset path + hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. + visibility: internal + + - name: cvat-output-path + value: workflow-data/output/sample_output + hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. + displayName: Workflow output path + visibility: internal + + - name: cvat-model + value: frcnn-res50-coco + displayName: Model + hint: TF Detection API's model to use for training. + type: select.select + visibility: public + options: + - name: 'Faster RCNN-ResNet 101-COCO' + value: frcnn-res101-coco + - name: 'Faster RCNN-ResNet 101-Low Proposal-COCO' + value: frcnn-res101-low + - name: 'Faster RCNN-ResNet 50-COCO' + value: frcnn-res50-coco + - name: 'Faster RCNN-NAS-COCO' + value: frcnn-nas-coco + - name: 'SSD MobileNet V1-COCO' + value: ssd-mobilenet-v1-coco2 + - name: 'SSD MobileNet V2-COCO' + value: ssd-mobilenet-v2-coco + - name: 'SSDLite MobileNet-COCO' + value: ssdlite-mobilenet-coco + + - name: hyperparameters + value: |- + num-steps=10000 + displayName: Hyperparameters + visibility: public + type: textarea.textarea + hint: "Please refer to our documentation for more information on parameters. Number of classes will be automatically populated if you had 'sys-num-classes' parameter in a workflow." + + - name: cvat-finetune-checkpoint + value: '' + hint: Select the last fine-tune checkpoint for this model. It may take up to 5 minutes for a recent checkpoint show here. Leave empty if this is the first time you're training this model. + displayName: Checkpoint path + visibility: public + + - name: cvat-num-classes + value: '81' + hint: Number of classes + displayName: Number of classes + visibility: internal + + - name: tf-image + value: tensorflow/tensorflow:1.13.1-py3 + type: select.select + displayName: Select TensorFlow image + visibility: public + hint: Select the GPU image if you are running on a GPU node pool + options: + - name: 'TensorFlow 1.13.1 CPU Image' + value: 'tensorflow/tensorflow:1.13.1-py3' + - name: 'TensorFlow 1.13.1 GPU Image' + value: 'tensorflow/tensorflow:1.13.1-gpu-py3' + + - name: dump-format + value: cvat_tfrecord + visibility: public + + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.nodepool + name: sys-node-pool + value: {{.DefaultNodePoolOption}} + visibility: public + required: true + +entrypoint: main +templates: + - dag: + tasks: + - name: train-model + template: tensorflow + # Uncomment the lines below if you want to send Slack notifications + # - arguments: + # artifacts: + # - from: '{{tasks.train-model.outputs.artifacts.sys-metrics}}' + # name: metrics + # parameters: + # - name: status + # value: '{{tasks.train-model.status}}' + # dependencies: + # - train-model + # name: notify-in-slack + # template: slack-notify-success + name: main + - container: + args: + - | + apt-get update && \ + apt-get install -y python3-pip git wget unzip libglib2.0-0 libsm6 libxext6 libxrender-dev && \ + pip install pillow lxml Cython contextlib2 jupyter matplotlib numpy scipy boto3 pycocotools pyyaml google-cloud-storage test-generator && \ + cd /mnt/src/tf/research && \ + export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim && \ + mkdir -p /mnt/src/protoc && \ + wget -P /mnt/src/protoc https://github.com/protocolbuffers/protobuf/releases/download/v3.10.1/protoc-3.10.1-linux-x86_64.zip && \ + cd /mnt/src/protoc/ && \ + unzip protoc-3.10.1-linux-x86_64.zip && \ + cd /mnt/src/tf/research/ && \ + /mnt/src/protoc/bin/protoc object_detection/protos/*.proto --python_out=. && \ + cd /mnt/src/train/workflows/tf-object-detection-training && \ + python train.py \ + --extras="{{workflow.parameters.hyperparameters}}" \ + --model="{{workflow.parameters.cvat-model}}" \ + --num_classes="{{workflow.parameters.cvat-num-classes}}" \ + --sys_finetune_checkpoint={{workflow.parameters.cvat-finetune-checkpoint}} + command: + - sh + - -c + image: '{{workflow.parameters.tf-image}}' + volumeMounts: + - mountPath: /mnt/data + name: data + - mountPath: /mnt/output + name: output + workingDir: /mnt/src + nodeSelector: + beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' + inputs: + artifacts: + - name: data + path: /mnt/data/datasets/ + s3: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' + - name: models + path: /mnt/data/models/ + optional: true + s3: + key: '{{workflow.parameters.cvat-finetune-checkpoint}}' + - git: + repo: '{{workflow.parameters.source}}' + revision: '{{workflow.parameters.revision}}' + name: src + path: /mnt/src/tf + - git: + repo: '{{workflow.parameters.trainingsource}}' + name: tsrc + path: /mnt/src/train + name: tensorflow + outputs: + artifacts: + - name: model + optional: true + path: /mnt/output + s3: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' +# Uncomment the lines below if you want to send Slack notifications +#- container: +# args: +# - SLACK_USERNAME=Onepanel SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" +# SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd +# SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify +# command: +# - sh +# - -c +# image: technosophos/slack-notify +# inputs: +# artifacts: +# - name: metrics +# optional: true +# path: /tmp/metrics.json +# parameters: +# - name: status +# name: slack-notify-success +volumeClaimTemplates: + - metadata: + creationTimestamp: null + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi + - metadata: + creationTimestamp: null + name: output + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi diff --git a/db/yaml/tfod/README.md b/db/yaml/tfod/README.md new file mode 100644 index 00000000..a79ec33f --- /dev/null +++ b/db/yaml/tfod/README.md @@ -0,0 +1 @@ +https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml \ No newline at end of file From 153dd3ccd78e4753d2d7606841df221dff35efde Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 13:19:21 -0800 Subject: [PATCH 26/37] chore: update documentation for migration methods --- db/go/20201221194344_pytorch_update.go | 2 ++ ...01221195937_maskrcnn_update_parameters_to_select_nodepool.go | 2 ++ db/go/20201223062947_tf_training_update_node_pool.go | 2 ++ db/go/20201223202929_tfod_update_node_pool.go | 2 ++ 4 files changed, 8 insertions(+) diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go index 9a34ce7e..ed24ce4a 100644 --- a/db/go/20201221194344_pytorch_update.go +++ b/db/go/20201221194344_pytorch_update.go @@ -13,6 +13,7 @@ func initialize20201221194344() { } } +// Up20201221194344 updates pytorch_training with the sys.nodepool changes func Up20201221194344(tx *sql.Tx) error { return updateWorkflowTemplateManifest( filepath.Join("pytorch_training", "20201221194344.yaml"), @@ -23,6 +24,7 @@ func Up20201221194344(tx *sql.Tx) error { ) } +// Down20201221194344 undoes the sys-nodepool changes func Down20201221194344(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( diff --git a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go index 3e09923c..b0351dca 100644 --- a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go +++ b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go @@ -13,6 +13,7 @@ func initialize20201221195937() { } } +// Up20201221195937 updates maskrcnn with sys.nodepool changes func Up20201221195937(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( @@ -25,6 +26,7 @@ func Up20201221195937(tx *sql.Tx) error { ) } +// Down20201221195937 undoes the sys.nodepool changes func Down20201221195937(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go index b2093b7a..f7844ed6 100644 --- a/db/go/20201223062947_tf_training_update_node_pool.go +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -13,6 +13,7 @@ func initialize20201223062947() { } } +// Up20201223062947 updates tf_training with sys.nodepool changes func Up20201223062947(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( @@ -25,6 +26,7 @@ func Up20201223062947(tx *sql.Tx) error { ) } +// Down20201223062947 undoes sys.nodepool changes func Down20201223062947(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( diff --git a/db/go/20201223202929_tfod_update_node_pool.go b/db/go/20201223202929_tfod_update_node_pool.go index e0ff7357..f2dd7730 100644 --- a/db/go/20201223202929_tfod_update_node_pool.go +++ b/db/go/20201223202929_tfod_update_node_pool.go @@ -13,6 +13,7 @@ func initialize20201223202929() { } } +// Up20201223202929 updates tfod with sys.nodepool func Up20201223202929(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( @@ -25,6 +26,7 @@ func Up20201223202929(tx *sql.Tx) error { ) } +// Down20201223202929 undoes the sys.nodepool changes func Down20201223202929(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( From 45a9e988296a49845edba28507c1d12fc1efb208 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Wed, 23 Dec 2020 14:21:23 -0800 Subject: [PATCH 27/37] chore: code cleanup for codacy --- pkg/workflow_template.go | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/pkg/workflow_template.go b/pkg/workflow_template.go index 3700b715..6ae694ae 100644 --- a/pkg/workflow_template.go +++ b/pkg/workflow_template.go @@ -422,30 +422,10 @@ func (c *Client) getWorkflowTemplate(namespace, uid string, version int64) (work return workflowTemplate, err } - workflowTemplate.Parameters = wtv.Parameters - - nodePoolOptions, err := c.systemConfig.NodePoolOptions() + workflowTemplate.Parameters, err = c.replaceSysNodePoolOptions(wtv.Parameters) if err != nil { return nil, err } - nodePoolParameterOptions := make([]*ParameterOption, 0) - for _, option := range nodePoolOptions { - nodePoolParameterOptions = append(nodePoolParameterOptions, &ParameterOption{ - Name: option.Name, - Value: option.Value, - }) - } - - for i := range workflowTemplate.Parameters { - param := &workflowTemplate.Parameters[i] - if param.Type == "select.nodepool" { - param.Options = nodePoolParameterOptions - - if param.Value != nil && *param.Value == "default" { - param.Value = ptr.String(param.Options[0].Value) - } - } - } return workflowTemplate, nil } @@ -1119,7 +1099,7 @@ func (c *Client) GetWorkflowTemplateLabels(namespace, name, prefix string, versi return } -// GenerateWorkflowTemplate replaces any special parameters with runtime values +// GenerateWorkflowTemplateManifest replaces any special parameters with runtime values func (c *Client) GenerateWorkflowTemplateManifest(manifest string) (string, error) { manifestObject := make(map[string]interface{}) if err := yaml.Unmarshal([]byte(manifest), &manifestObject); err != nil { From 7e5906f46cd6cc8a25cd7103950fc206008b1309 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 12:06:41 -0800 Subject: [PATCH 28/37] fix: incorrect indentation of sidecars in migration --- db/yaml/maskrcnn/20201221195937.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/maskrcnn/20201221195937.yaml index 138f09e3..13e6b969 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -116,17 +116,17 @@ templates: workingDir: /mnt/src nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [ sh, -c ] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: [ "tensorboard --logdir /mnt/output/" ] - ports: - - containerPort: 6006 - name: tensorboard + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard inputs: artifacts: - name: data From 69e24887289dbc675d6cba5a8bf5f47191aa4a78 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 12:09:56 -0800 Subject: [PATCH 29/37] fix: added nodeSelector to tf training migration --- db/yaml/tf_training/20201223062947.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tf_training/20201223062947.yaml index 16a73110..a8363ba3 100644 --- a/db/yaml/tf_training/20201223062947.yaml +++ b/db/yaml/tf_training/20201223062947.yaml @@ -58,6 +58,8 @@ templates: - name: output mountPath: /mnt/output + nodeSelector: + beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' sidecars: - name: tensorboard image: 'tensorflow/tensorflow:2.3.0' From 4f7715034ea9fe5b5e264c8995735c3da7ba2d5a Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 13:32:36 -0800 Subject: [PATCH 30/37] fix: add back removed migration and move source to be in template instead of README --- db/yaml/maskrcnn/20201208155115.yaml | 192 ++++++++++++++++++++++++ db/yaml/maskrcnn/20201221195937.yaml | 1 + db/yaml/tf_training/20201223062947.yaml | 1 + db/yaml/tf_training/README.md | 1 - db/yaml/tfod/README.md | 1 - 5 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 db/yaml/maskrcnn/20201208155115.yaml delete mode 100644 db/yaml/tf_training/README.md delete mode 100644 db/yaml/tfod/README.md diff --git a/db/yaml/maskrcnn/20201208155115.yaml b/db/yaml/maskrcnn/20201208155115.yaml new file mode 100644 index 00000000..1a81a222 --- /dev/null +++ b/db/yaml/maskrcnn/20201208155115.yaml @@ -0,0 +1,192 @@ +entrypoint: main +arguments: + parameters: + - name: source + value: https://github.com/onepanelio/Mask_RCNN.git + displayName: Model source code + type: hidden + visibility: private + + - name: cvat-annotation-path + value: annotation-dump/sample_dataset + hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. + displayName: Dataset path + visibility: private + + - name: cvat-output-path + value: workflow-data/output/sample_output + hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. + displayName: Workflow output path + visibility: private + + - name: cvat-finetune-checkpoint + value: '' + hint: Select the last fine-tune checkpoint for this model. It may take up to 5 minutes for a recent checkpoint show here. Leave empty if this is the first time you're training this model. + displayName: Checkpoint path + visibility: public + + - name: cvat-num-classes + displayName: Number of classes + hint: Number of classes (i.e in CVAT taks) + 1 for background + value: '81' + visibility: private + + - name: hyperparameters + displayName: Hyperparameters + visibility: public + type: textarea.textarea + value: |- + stage-1-epochs=1 # Epochs for network heads + stage-2-epochs=2 # Epochs for finetune layers + stage-3-epochs=3 # Epochs for all layers + hint: "Please refer to our documentation for more information on parameters. Number of classes will be automatically populated if you had 'sys-num-classes' parameter in a workflow." + + - name: dump-format + value: cvat_coco + displayName: CVAT dump format + visibility: public + + - name: tf-image + visibility: public + value: tensorflow/tensorflow:1.13.1-py3 + type: select.select + displayName: Select TensorFlow image + hint: Select the GPU image if you are running on a GPU node pool + options: + - name: 'TensorFlow 1.13.1 CPU Image' + value: 'tensorflow/tensorflow:1.13.1-py3' + - name: 'TensorFlow 1.13.1 GPU Image' + value: 'tensorflow/tensorflow:1.13.1-gpu-py3' + + - displayName: Node pool + hint: Name of node pool or group to run this workflow task + type: select.select + visibility: public + name: sys-node-pool + value: Standard_D4s_v3 + required: true + options: + - name: 'CPU: 2, RAM: 8GB' + value: Standard_D2s_v3 + - name: 'CPU: 4, RAM: 16GB' + value: Standard_D4s_v3 + - name: 'GPU: 1xK80, CPU: 6, RAM: 56GB' + value: Standard_NC6 +templates: + - name: main + dag: + tasks: + - name: train-model + template: tensorflow + # Uncomment the lines below if you want to send Slack notifications + # - arguments: + # artifacts: + # - from: '{{tasks.train-model.outputs.artifacts.sys-metrics}}' + # name: metrics + # parameters: + # - name: status + # value: '{{tasks.train-model.status}}' + # dependencies: + # - train-model + # name: notify-in-slack + # template: slack-notify-success + - name: tensorflow + container: + args: + - | + apt-get update \ + && apt-get install -y git wget libglib2.0-0 libsm6 libxext6 libxrender-dev \ + && pip install -r requirements.txt \ + && pip install boto3 pyyaml google-cloud-storage \ + && git clone https://github.com/waleedka/coco \ + && cd coco/PythonAPI \ + && python setup.py build_ext install \ + && rm -rf build \ + && cd ../../ \ + && wget https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5 \ + && python setup.py install && ls \ + && python samples/coco/cvat.py train --dataset=/mnt/data/datasets \ + --model=workflow_maskrcnn \ + --extras="{{workflow.parameters.hyperparameters}}" \ + --ref_model_path="{{workflow.parameters.cvat-finetune-checkpoint}}" \ + --num_classes="{{workflow.parameters.cvat-num-classes}}" \ + && cd /mnt/src/ \ + && python prepare_dataset.py /mnt/data/datasets/annotations/instances_default.json + command: + - sh + - -c + image: '{{workflow.parameters.tf-image}}' + volumeMounts: + - mountPath: /mnt/data + name: data + - mountPath: /mnt/output + name: output + workingDir: /mnt/src + nodeSelector: + beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [sh, -c] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: ["tensorboard --logdir /mnt/output/"] + ports: + - containerPort: 6006 + name: tensorboard + inputs: + artifacts: + - name: data + path: /mnt/data/datasets/ + {{.ArtifactRepositoryType}}: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' + - git: + repo: '{{workflow.parameters.source}}' + revision: "no-boto" + name: src + path: /mnt/src + outputs: + artifacts: + - name: model + optional: true + path: /mnt/output + {{.ArtifactRepositoryType}}: + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' +# Uncomment the lines below if you want to send Slack notifications +#- container: +# args: +# - SLACK_USERNAME=Onepanel SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" +# SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd +# SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify +# command: +# - sh +# - -c +# image: technosophos/slack-notify +# inputs: +# artifacts: +# - name: metrics +# optional: true +# path: /tmp/metrics.json +# parameters: +# - name: status +# name: slack-notify-success +volumeClaimTemplates: + - metadata: + creationTimestamp: null + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi + - metadata: + creationTimestamp: null + name: output + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Gi \ No newline at end of file diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/maskrcnn/20201221195937.yaml index 13e6b969..16a38759 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/maskrcnn/20201221195937.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml entrypoint: main arguments: parameters: diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tf_training/20201223062947.yaml index a8363ba3..769df736 100644 --- a/db/yaml/tf_training/20201223062947.yaml +++ b/db/yaml/tf_training/20201223062947.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml arguments: parameters: - name: epochs diff --git a/db/yaml/tf_training/README.md b/db/yaml/tf_training/README.md deleted file mode 100644 index bc1f964e..00000000 --- a/db/yaml/tf_training/README.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml \ No newline at end of file diff --git a/db/yaml/tfod/README.md b/db/yaml/tfod/README.md deleted file mode 100644 index a79ec33f..00000000 --- a/db/yaml/tfod/README.md +++ /dev/null @@ -1 +0,0 @@ -https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml \ No newline at end of file From 7c273e20cf30d9f9b1af05aaa1d8d48abb4b0e32 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 14:14:11 -0800 Subject: [PATCH 31/37] chore: updated tf_training to be tensorflow-mnist-training to better match onepanel templates repo --- db/go/20201209124226_update_tensorflow_training.go | 4 ++-- db/go/20201223062947_tf_training_update_node_pool.go | 6 +++--- .../20200605090535.yaml | 1 + .../20201209124226.yaml | 1 + .../20201223062947.yaml | 0 5 files changed, 7 insertions(+), 5 deletions(-) rename db/yaml/{tf_training => tensorflow-mnist-training}/20200605090535.yaml (93%) rename db/yaml/{tf_training => tensorflow-mnist-training}/20201209124226.yaml (94%) rename db/yaml/{tf_training => tensorflow-mnist-training}/20201223062947.yaml (100%) diff --git a/db/go/20201209124226_update_tensorflow_training.go b/db/go/20201209124226_update_tensorflow_training.go index 433b6b5a..b2199fba 100644 --- a/db/go/20201209124226_update_tensorflow_training.go +++ b/db/go/20201209124226_update_tensorflow_training.go @@ -17,7 +17,7 @@ func initialize20201209124226() { func Up20201209124226(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20201209124226.yaml"), + filepath.Join("tensorflow-mnist-training", "20201209124226.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", @@ -29,7 +29,7 @@ func Up20201209124226(tx *sql.Tx) error { func Down20201209124226(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20200605090535.yaml"), + filepath.Join("tensorflow-mnist-training", "20200605090535.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go index f7844ed6..db2d3fc1 100644 --- a/db/go/20201223062947_tf_training_update_node_pool.go +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -13,11 +13,11 @@ func initialize20201223062947() { } } -// Up20201223062947 updates tf_training with sys.nodepool changes +// Up20201223062947 updates tensorflow-mnist-training with sys.nodepool changes func Up20201223062947(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20201223062947.yaml"), + filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201223062947(tx *sql.Tx) error { func Down20201223062947(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tf_training", "20201223062947.yaml"), + filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/yaml/tf_training/20200605090535.yaml b/db/yaml/tensorflow-mnist-training/20200605090535.yaml similarity index 93% rename from db/yaml/tf_training/20200605090535.yaml rename to db/yaml/tensorflow-mnist-training/20200605090535.yaml index c5ea0bc8..8ac9c56e 100644 --- a/db/yaml/tf_training/20200605090535.yaml +++ b/db/yaml/tensorflow-mnist-training/20200605090535.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml entrypoint: main arguments: parameters: diff --git a/db/yaml/tf_training/20201209124226.yaml b/db/yaml/tensorflow-mnist-training/20201209124226.yaml similarity index 94% rename from db/yaml/tf_training/20201209124226.yaml rename to db/yaml/tensorflow-mnist-training/20201209124226.yaml index 6ccd88d0..eb14b9ac 100644 --- a/db/yaml/tf_training/20201209124226.yaml +++ b/db/yaml/tensorflow-mnist-training/20201209124226.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tensorflow-mnist-training/template.yaml arguments: parameters: - name: epochs diff --git a/db/yaml/tf_training/20201223062947.yaml b/db/yaml/tensorflow-mnist-training/20201223062947.yaml similarity index 100% rename from db/yaml/tf_training/20201223062947.yaml rename to db/yaml/tensorflow-mnist-training/20201223062947.yaml From ca5f6027384b01fcd5b66df94390b9e023eddc57 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 17:48:26 -0800 Subject: [PATCH 32/37] fix: separated workflow templates and workspace templates for yaml resources for migrations. Also updated migration yamls to the latest based on templates repo. --- db/go/20201016170415_update_cvat.go | 2 +- ...01028145442_update_jupyter_lab_template.go | 2 +- .../20201028145443_update_vscode_template.go | 4 +-- ...sorboard_env_var_to_jupyterlab_template.go | 4 +-- .../20201102104048_update_cvat_reduce_vols.go | 4 +-- ...20201113094916_update_cvat_onepanel_sdk.go | 4 +-- db/go/20201115133046_update_cvat_env_vars.go | 4 +-- .../20201115134934_add_tensorboard_to_tfod.go | 2 +- ...01115145814_add_tensorboard_to_maskrcnn.go | 2 +- db/go/20201130130433_update_tfod_path.go | 4 +-- ...55115_replace_tty_with_env_var_for_tfod.go | 6 ++--- ...5_replace_tty_with_env_var_for_maskrcnn.go | 4 +-- ...201209124226_update_tensorflow_training.go | 4 +-- db/go/20201211161117_fix_resources_gke.go | 4 +-- db/go/20201214133458_fix_jupyterlab_gpu.go | 4 +-- db/go/20201221194344_pytorch_update.go | 4 +-- ...nn_update_parameters_to_select_nodepool.go | 4 +-- ...1223062947_tf_training_update_node_pool.go | 4 +-- db/go/20201223202929_tfod_update_node_pool.go | 6 ++--- .../maskrcnn-training}/20201115145814.yaml | 0 .../maskrcnn-training}/20201208155115.yaml | 0 .../maskrcnn-training}/20201221195937.yaml | 25 ++++++++++--------- .../20200605090509.yaml | 0 .../20201221194344.yaml | 7 +++--- .../20200605090535.yaml | 0 .../20201209124226.yaml | 0 .../20201223062947.yaml | 0 .../20201115134934.yaml | 0 .../20201130130433.yaml | 0 .../20201208155115.yaml | 0 .../20201223202929.yaml | 1 + .../{ => workspaces}/cvat/20201016170415.yaml | 0 .../{ => workspaces}/cvat/20201102104048.yaml | 0 .../{ => workspaces}/cvat/20201113094916.yaml | 0 .../{ => workspaces}/cvat/20201115133046.yaml | 0 .../{ => workspaces}/cvat/20201211161117.yaml | 0 .../jupyterlab/20200929153931.yaml | 0 .../jupyterlab/20201028145442.yaml | 0 .../jupyterlab/20201031165106.yaml | 0 .../jupyterlab/20201214133458.yaml | 0 .../vscode/20200929144301.yaml | 0 .../vscode/20201028145443.yaml | 0 42 files changed, 54 insertions(+), 51 deletions(-) rename db/yaml/{maskrcnn => workflows/maskrcnn-training}/20201115145814.yaml (100%) rename db/yaml/{maskrcnn => workflows/maskrcnn-training}/20201208155115.yaml (100%) rename db/yaml/{maskrcnn => workflows/maskrcnn-training}/20201221195937.yaml (94%) rename db/yaml/{pytorch_training => workflows/pytorch-mnist-training}/20200605090509.yaml (100%) rename db/yaml/{pytorch_training => workflows/pytorch-mnist-training}/20201221194344.yaml (92%) rename db/yaml/{ => workflows}/tensorflow-mnist-training/20200605090535.yaml (100%) rename db/yaml/{ => workflows}/tensorflow-mnist-training/20201209124226.yaml (100%) rename db/yaml/{ => workflows}/tensorflow-mnist-training/20201223062947.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201115134934.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201130130433.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201208155115.yaml (100%) rename db/yaml/{tfod => workflows/tf-object-detection-training}/20201223202929.yaml (98%) rename db/yaml/{ => workspaces}/cvat/20201016170415.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201102104048.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201113094916.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201115133046.yaml (100%) rename db/yaml/{ => workspaces}/cvat/20201211161117.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20200929153931.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20201028145442.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20201031165106.yaml (100%) rename db/yaml/{ => workspaces}/jupyterlab/20201214133458.yaml (100%) rename db/yaml/{ => workspaces}/vscode/20200929144301.yaml (100%) rename db/yaml/{ => workspaces}/vscode/20201028145443.yaml (100%) diff --git a/db/go/20201016170415_update_cvat.go b/db/go/20201016170415_update_cvat.go index 019da105..10fbb109 100644 --- a/db/go/20201016170415_update_cvat.go +++ b/db/go/20201016170415_update_cvat.go @@ -17,7 +17,7 @@ func initialize20201016170415() { func Up20201016170415(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201016170415.yaml"), + filepath.Join("workspaces", "cvat", "20201016170415.yaml"), cvatTemplateName) } diff --git a/db/go/20201028145442_update_jupyter_lab_template.go b/db/go/20201028145442_update_jupyter_lab_template.go index 40e9cba0..c28ad411 100644 --- a/db/go/20201028145442_update_jupyter_lab_template.go +++ b/db/go/20201028145442_update_jupyter_lab_template.go @@ -18,7 +18,7 @@ func initialize20201028145442() { func Up20201028145442(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201028145442.yaml"), + filepath.Join("workspaces", "20201028145442.yaml"), jupyterLabTemplateName) } diff --git a/db/go/20201028145443_update_vscode_template.go b/db/go/20201028145443_update_vscode_template.go index 47ab5291..c7730515 100644 --- a/db/go/20201028145443_update_vscode_template.go +++ b/db/go/20201028145443_update_vscode_template.go @@ -20,7 +20,7 @@ func initialize20201028145443() { func Up20201028145443(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("vscode", "20201028145443.yaml"), + filepath.Join("workspaces", "vscode", "20201028145443.yaml"), vscodeWorkspaceTemplateName) } @@ -28,6 +28,6 @@ func Up20201028145443(tx *sql.Tx) error { func Down20201028145443(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("vscode", "20201028145443.yaml"), + filepath.Join("workspaces", "vscode", "20201028145443.yaml"), vscodeWorkspaceTemplateName) } diff --git a/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go b/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go index 3ce39770..1f62726e 100644 --- a/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go +++ b/db/go/20201031165106_add_tensorboard_env_var_to_jupyterlab_template.go @@ -18,7 +18,7 @@ func initialize20201031165106() { func Up20201031165106(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201031165106.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201031165106.yaml"), jupyterLabTemplateName) } @@ -26,6 +26,6 @@ func Up20201031165106(tx *sql.Tx) error { func Down20201031165106(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201028145442.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201028145442.yaml"), jupyterLabTemplateName) } diff --git a/db/go/20201102104048_update_cvat_reduce_vols.go b/db/go/20201102104048_update_cvat_reduce_vols.go index 8e1ce255..4d7ab58d 100644 --- a/db/go/20201102104048_update_cvat_reduce_vols.go +++ b/db/go/20201102104048_update_cvat_reduce_vols.go @@ -19,7 +19,7 @@ func initialize20201102104048() { func Up20201102104048(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201102104048.yaml"), + filepath.Join("workspaces", "cvat", "20201102104048.yaml"), cvatTemplateName) } @@ -27,6 +27,6 @@ func Up20201102104048(tx *sql.Tx) error { func Down20201102104048(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201016170415.yaml"), + filepath.Join("workspaces", "cvat", "20201016170415.yaml"), cvatTemplateName) } diff --git a/db/go/20201113094916_update_cvat_onepanel_sdk.go b/db/go/20201113094916_update_cvat_onepanel_sdk.go index e08baa3c..23bc9df1 100644 --- a/db/go/20201113094916_update_cvat_onepanel_sdk.go +++ b/db/go/20201113094916_update_cvat_onepanel_sdk.go @@ -18,7 +18,7 @@ func initialize20201113094916() { func Up20201113094916(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201113094916.yaml"), + filepath.Join("workspaces", "cvat", "20201113094916.yaml"), cvatTemplateName) } @@ -26,6 +26,6 @@ func Up20201113094916(tx *sql.Tx) error { func Down20201113094916(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201102104048.yaml"), + filepath.Join("workspaces", "cvat", "20201102104048.yaml"), cvatTemplateName) } diff --git a/db/go/20201115133046_update_cvat_env_vars.go b/db/go/20201115133046_update_cvat_env_vars.go index 5cc5034c..4d410ea1 100644 --- a/db/go/20201115133046_update_cvat_env_vars.go +++ b/db/go/20201115133046_update_cvat_env_vars.go @@ -17,7 +17,7 @@ func initialize20201115133046() { func Up20201115133046(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201115133046.yaml"), + filepath.Join("workspaces", "cvat", "20201115133046.yaml"), cvatTemplateName) } @@ -25,6 +25,6 @@ func Up20201115133046(tx *sql.Tx) error { func Down20201115133046(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201113094916"), + filepath.Join("workspaces", "cvat", "20201113094916"), cvatTemplateName) } diff --git a/db/go/20201115134934_add_tensorboard_to_tfod.go b/db/go/20201115134934_add_tensorboard_to_tfod.go index 69ddcbc0..065b3d18 100644 --- a/db/go/20201115134934_add_tensorboard_to_tfod.go +++ b/db/go/20201115134934_add_tensorboard_to_tfod.go @@ -17,7 +17,7 @@ func initialize20201115134934() { func Up20201115134934(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201115134934.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201115134934.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201115145814_add_tensorboard_to_maskrcnn.go b/db/go/20201115145814_add_tensorboard_to_maskrcnn.go index 62b6070e..c9efc38d 100644 --- a/db/go/20201115145814_add_tensorboard_to_maskrcnn.go +++ b/db/go/20201115145814_add_tensorboard_to_maskrcnn.go @@ -17,7 +17,7 @@ func initialize20201115145814() { func Up20201115145814(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201115145814.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201115145814.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201130130433_update_tfod_path.go b/db/go/20201130130433_update_tfod_path.go index 2e4cad44..8789f120 100644 --- a/db/go/20201130130433_update_tfod_path.go +++ b/db/go/20201130130433_update_tfod_path.go @@ -17,7 +17,7 @@ func initialize20201130130433() { func Up20201130130433(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201130130433.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201130130433.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", @@ -29,7 +29,7 @@ func Up20201130130433(tx *sql.Tx) error { func Down20201130130433(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201115134934.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201115134934.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go b/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go index defea30f..9e76c89d 100644 --- a/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go +++ b/db/go/20201208155115_replace_tty_with_env_var_for_tfod.go @@ -13,11 +13,11 @@ func initialize20201208155115() { } } -// Up20201208155115 update the tfod workflow template to replace tty with an environment variable +// Up20201208155115 update the tf-object-detection-training workflow template to replace tty with an environment variable func Up20201208155115(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201208155115.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201208155115.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", @@ -29,7 +29,7 @@ func Up20201208155115(tx *sql.Tx) error { func Down20201208155115(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201130130433.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201130130433.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go b/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go index bb6f4646..ad0305a6 100644 --- a/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go +++ b/db/go/20201208155805_replace_tty_with_env_var_for_maskrcnn.go @@ -17,7 +17,7 @@ func initialize20201208155805() { func Up20201208155805(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201208155115.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201208155115.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "used-by": "cvat", @@ -29,7 +29,7 @@ func Up20201208155805(tx *sql.Tx) error { func Down20201208155805(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201115145814.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201115145814.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "used-by": "cvat", diff --git a/db/go/20201209124226_update_tensorflow_training.go b/db/go/20201209124226_update_tensorflow_training.go index b2199fba..48179435 100644 --- a/db/go/20201209124226_update_tensorflow_training.go +++ b/db/go/20201209124226_update_tensorflow_training.go @@ -17,7 +17,7 @@ func initialize20201209124226() { func Up20201209124226(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20201209124226.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20201209124226.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", @@ -29,7 +29,7 @@ func Up20201209124226(tx *sql.Tx) error { func Down20201209124226(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20200605090535.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20200605090535.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "framework": "tensorflow", diff --git a/db/go/20201211161117_fix_resources_gke.go b/db/go/20201211161117_fix_resources_gke.go index 88da5576..cd09ad38 100644 --- a/db/go/20201211161117_fix_resources_gke.go +++ b/db/go/20201211161117_fix_resources_gke.go @@ -17,7 +17,7 @@ func initialize20201211161117() { func Up20201211161117(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201211161117.yaml"), + filepath.Join("workspaces", "cvat", "20201211161117.yaml"), cvatTemplateName) } @@ -25,6 +25,6 @@ func Up20201211161117(tx *sql.Tx) error { func Down20201211161117(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("cvat", "20201115133046.yaml"), + filepath.Join("workspaces", "cvat", "20201115133046.yaml"), cvatTemplateName) } diff --git a/db/go/20201214133458_fix_jupyterlab_gpu.go b/db/go/20201214133458_fix_jupyterlab_gpu.go index 78535d8c..3b9430da 100644 --- a/db/go/20201214133458_fix_jupyterlab_gpu.go +++ b/db/go/20201214133458_fix_jupyterlab_gpu.go @@ -17,7 +17,7 @@ func initialize20201214133458() { func Up20201214133458(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201214133458.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201214133458.yaml"), jupyterLabTemplateName) } @@ -25,6 +25,6 @@ func Up20201214133458(tx *sql.Tx) error { func Down20201214133458(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkspaceTemplateManifest( - filepath.Join("jupyterlab", "20201031165106.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201031165106.yaml"), jupyterLabTemplateName) } diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go index ed24ce4a..34d6b524 100644 --- a/db/go/20201221194344_pytorch_update.go +++ b/db/go/20201221194344_pytorch_update.go @@ -16,7 +16,7 @@ func initialize20201221194344() { // Up20201221194344 updates pytorch_training with the sys.nodepool changes func Up20201221194344(tx *sql.Tx) error { return updateWorkflowTemplateManifest( - filepath.Join("pytorch_training", "20201221194344.yaml"), + filepath.Join("workflows", "pytorch_training", "20201221194344.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -28,7 +28,7 @@ func Up20201221194344(tx *sql.Tx) error { func Down20201221194344(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("pytorch_training", "20200605090509.yaml"), + filepath.Join("workflows", "pytorch_training", "20200605090509.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go index b0351dca..91227fc2 100644 --- a/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go +++ b/db/go/20201221195937_maskrcnn_update_parameters_to_select_nodepool.go @@ -17,7 +17,7 @@ func initialize20201221195937() { func Up20201221195937(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201221195937.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201221195937.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201221195937(tx *sql.Tx) error { func Down20201221195937(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("maskrcnn", "20201208155115.yaml"), + filepath.Join("workflows", "maskrcnn-training", "20201208155115.yaml"), maskRCNNWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/go/20201223062947_tf_training_update_node_pool.go b/db/go/20201223062947_tf_training_update_node_pool.go index db2d3fc1..4e9dc4af 100644 --- a/db/go/20201223062947_tf_training_update_node_pool.go +++ b/db/go/20201223062947_tf_training_update_node_pool.go @@ -17,7 +17,7 @@ func initialize20201223062947() { func Up20201223062947(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201223062947(tx *sql.Tx) error { func Down20201223062947(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tensorflow-mnist-training", "20201223062947.yaml"), + filepath.Join("workflows", "tensorflow-mnist-training", "20201223062947.yaml"), tensorflowWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/go/20201223202929_tfod_update_node_pool.go b/db/go/20201223202929_tfod_update_node_pool.go index f2dd7730..1ba4f9ef 100644 --- a/db/go/20201223202929_tfod_update_node_pool.go +++ b/db/go/20201223202929_tfod_update_node_pool.go @@ -13,11 +13,11 @@ func initialize20201223202929() { } } -// Up20201223202929 updates tfod with sys.nodepool +// Up20201223202929 updates tf-object-detection-training with sys.nodepool func Up20201223202929(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201223202929.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201223202929.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -30,7 +30,7 @@ func Up20201223202929(tx *sql.Tx) error { func Down20201223202929(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("tfod", "20201208155115.yaml"), + filepath.Join("workflows", "tf-object-detection-training", "20201208155115.yaml"), tensorflowObjectDetectionWorkflowTemplateName, map[string]string{ "created-by": "system", diff --git a/db/yaml/maskrcnn/20201115145814.yaml b/db/yaml/workflows/maskrcnn-training/20201115145814.yaml similarity index 100% rename from db/yaml/maskrcnn/20201115145814.yaml rename to db/yaml/workflows/maskrcnn-training/20201115145814.yaml diff --git a/db/yaml/maskrcnn/20201208155115.yaml b/db/yaml/workflows/maskrcnn-training/20201208155115.yaml similarity index 100% rename from db/yaml/maskrcnn/20201208155115.yaml rename to db/yaml/workflows/maskrcnn-training/20201208155115.yaml diff --git a/db/yaml/maskrcnn/20201221195937.yaml b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml similarity index 94% rename from db/yaml/maskrcnn/20201221195937.yaml rename to db/yaml/workflows/maskrcnn-training/20201221195937.yaml index 16a38759..8bbb461f 100644 --- a/db/yaml/maskrcnn/20201221195937.yaml +++ b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml @@ -1,5 +1,4 @@ # source: https://github.com/onepanelio/templates/blob/master/workflows/maskrcnn-training/template.yaml -entrypoint: main arguments: parameters: - name: source @@ -66,6 +65,8 @@ arguments: name: sys-node-pool value: {{.DefaultNodePoolOption}} required: true + +entrypoint: main templates: - dag: tasks: @@ -115,19 +116,19 @@ templates: - mountPath: /mnt/output name: output workingDir: /mnt/src + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [ sh, -c ] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: [ "tensorboard --logdir /mnt/output/" ] - ports: - - containerPort: 6006 - name: tensorboard inputs: artifacts: - name: data diff --git a/db/yaml/pytorch_training/20200605090509.yaml b/db/yaml/workflows/pytorch-mnist-training/20200605090509.yaml similarity index 100% rename from db/yaml/pytorch_training/20200605090509.yaml rename to db/yaml/workflows/pytorch-mnist-training/20200605090509.yaml diff --git a/db/yaml/pytorch_training/20201221194344.yaml b/db/yaml/workflows/pytorch-mnist-training/20201221194344.yaml similarity index 92% rename from db/yaml/pytorch_training/20201221194344.yaml rename to db/yaml/workflows/pytorch-mnist-training/20201221194344.yaml index 65465c9a..b3ed796b 100644 --- a/db/yaml/pytorch_training/20201221194344.yaml +++ b/db/yaml/workflows/pytorch-mnist-training/20201221194344.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/pytorch-mnist-training/template.yaml entrypoint: main arguments: parameters: @@ -57,11 +58,11 @@ templates: path: /mnt/output optional: true archive: - none: { } + none: {} container: image: pytorch/pytorch:latest - command: [ sh,-c ] - args: [ "{{workflow.parameters.command}}" ] + command: [sh,-c] + args: ["{{workflow.parameters.command}}"] workingDir: /mnt/src volumeMounts: - name: data diff --git a/db/yaml/tensorflow-mnist-training/20200605090535.yaml b/db/yaml/workflows/tensorflow-mnist-training/20200605090535.yaml similarity index 100% rename from db/yaml/tensorflow-mnist-training/20200605090535.yaml rename to db/yaml/workflows/tensorflow-mnist-training/20200605090535.yaml diff --git a/db/yaml/tensorflow-mnist-training/20201209124226.yaml b/db/yaml/workflows/tensorflow-mnist-training/20201209124226.yaml similarity index 100% rename from db/yaml/tensorflow-mnist-training/20201209124226.yaml rename to db/yaml/workflows/tensorflow-mnist-training/20201209124226.yaml diff --git a/db/yaml/tensorflow-mnist-training/20201223062947.yaml b/db/yaml/workflows/tensorflow-mnist-training/20201223062947.yaml similarity index 100% rename from db/yaml/tensorflow-mnist-training/20201223062947.yaml rename to db/yaml/workflows/tensorflow-mnist-training/20201223062947.yaml diff --git a/db/yaml/tfod/20201115134934.yaml b/db/yaml/workflows/tf-object-detection-training/20201115134934.yaml similarity index 100% rename from db/yaml/tfod/20201115134934.yaml rename to db/yaml/workflows/tf-object-detection-training/20201115134934.yaml diff --git a/db/yaml/tfod/20201130130433.yaml b/db/yaml/workflows/tf-object-detection-training/20201130130433.yaml similarity index 100% rename from db/yaml/tfod/20201130130433.yaml rename to db/yaml/workflows/tf-object-detection-training/20201130130433.yaml diff --git a/db/yaml/tfod/20201208155115.yaml b/db/yaml/workflows/tf-object-detection-training/20201208155115.yaml similarity index 100% rename from db/yaml/tfod/20201208155115.yaml rename to db/yaml/workflows/tf-object-detection-training/20201208155115.yaml diff --git a/db/yaml/tfod/20201223202929.yaml b/db/yaml/workflows/tf-object-detection-training/20201223202929.yaml similarity index 98% rename from db/yaml/tfod/20201223202929.yaml rename to db/yaml/workflows/tf-object-detection-training/20201223202929.yaml index a4ba5b5c..cbd7d698 100644 --- a/db/yaml/tfod/20201223202929.yaml +++ b/db/yaml/workflows/tf-object-detection-training/20201223202929.yaml @@ -1,3 +1,4 @@ +# source: https://github.com/onepanelio/templates/blob/master/workflows/tf-object-detection-training/template.yaml arguments: parameters: - name: source diff --git a/db/yaml/cvat/20201016170415.yaml b/db/yaml/workspaces/cvat/20201016170415.yaml similarity index 100% rename from db/yaml/cvat/20201016170415.yaml rename to db/yaml/workspaces/cvat/20201016170415.yaml diff --git a/db/yaml/cvat/20201102104048.yaml b/db/yaml/workspaces/cvat/20201102104048.yaml similarity index 100% rename from db/yaml/cvat/20201102104048.yaml rename to db/yaml/workspaces/cvat/20201102104048.yaml diff --git a/db/yaml/cvat/20201113094916.yaml b/db/yaml/workspaces/cvat/20201113094916.yaml similarity index 100% rename from db/yaml/cvat/20201113094916.yaml rename to db/yaml/workspaces/cvat/20201113094916.yaml diff --git a/db/yaml/cvat/20201115133046.yaml b/db/yaml/workspaces/cvat/20201115133046.yaml similarity index 100% rename from db/yaml/cvat/20201115133046.yaml rename to db/yaml/workspaces/cvat/20201115133046.yaml diff --git a/db/yaml/cvat/20201211161117.yaml b/db/yaml/workspaces/cvat/20201211161117.yaml similarity index 100% rename from db/yaml/cvat/20201211161117.yaml rename to db/yaml/workspaces/cvat/20201211161117.yaml diff --git a/db/yaml/jupyterlab/20200929153931.yaml b/db/yaml/workspaces/jupyterlab/20200929153931.yaml similarity index 100% rename from db/yaml/jupyterlab/20200929153931.yaml rename to db/yaml/workspaces/jupyterlab/20200929153931.yaml diff --git a/db/yaml/jupyterlab/20201028145442.yaml b/db/yaml/workspaces/jupyterlab/20201028145442.yaml similarity index 100% rename from db/yaml/jupyterlab/20201028145442.yaml rename to db/yaml/workspaces/jupyterlab/20201028145442.yaml diff --git a/db/yaml/jupyterlab/20201031165106.yaml b/db/yaml/workspaces/jupyterlab/20201031165106.yaml similarity index 100% rename from db/yaml/jupyterlab/20201031165106.yaml rename to db/yaml/workspaces/jupyterlab/20201031165106.yaml diff --git a/db/yaml/jupyterlab/20201214133458.yaml b/db/yaml/workspaces/jupyterlab/20201214133458.yaml similarity index 100% rename from db/yaml/jupyterlab/20201214133458.yaml rename to db/yaml/workspaces/jupyterlab/20201214133458.yaml diff --git a/db/yaml/vscode/20200929144301.yaml b/db/yaml/workspaces/vscode/20200929144301.yaml similarity index 100% rename from db/yaml/vscode/20200929144301.yaml rename to db/yaml/workspaces/vscode/20200929144301.yaml diff --git a/db/yaml/vscode/20201028145443.yaml b/db/yaml/workspaces/vscode/20201028145443.yaml similarity index 100% rename from db/yaml/vscode/20201028145443.yaml rename to db/yaml/workspaces/vscode/20201028145443.yaml From e24052d51fca4c16690933d5176f889601d4bdd9 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 17:49:28 -0800 Subject: [PATCH 33/37] fix: migration path issue for jupyterlab --- db/go/20201028145442_update_jupyter_lab_template.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/go/20201028145442_update_jupyter_lab_template.go b/db/go/20201028145442_update_jupyter_lab_template.go index c28ad411..99f1ab7e 100644 --- a/db/go/20201028145442_update_jupyter_lab_template.go +++ b/db/go/20201028145442_update_jupyter_lab_template.go @@ -18,7 +18,7 @@ func initialize20201028145442() { func Up20201028145442(tx *sql.Tx) error { // This code is executed when the migration is applied. return updateWorkspaceTemplateManifest( - filepath.Join("workspaces", "20201028145442.yaml"), + filepath.Join("workspaces", "jupyterlab", "20201028145442.yaml"), jupyterLabTemplateName) } From e738e07e5872788177d11eeef28b8b0596c6d02f Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:01:55 -0800 Subject: [PATCH 34/37] fix: issue where workspaceSpec.arguments could be nil --- pkg/workspace_template.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index 5005f15e..ba176433 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -945,11 +945,13 @@ func (c *Client) generateWorkspaceTemplateWorkflowTemplate(workspaceTemplate *Wo return nil, util.NewUserError(codes.InvalidArgument, err.Error()) } - modifiedParameters, err := c.replaceSysNodePoolOptions(workspaceSpec.Arguments.Parameters) - if err != nil { - return nil, err + if workspaceSpec.Arguments != nil { + modifiedParameters, err := c.replaceSysNodePoolOptions(workspaceSpec.Arguments.Parameters) + if err != nil { + return nil, err + } + workspaceSpec.Arguments.Parameters = modifiedParameters } - workspaceSpec.Arguments.Parameters = modifiedParameters if err = generateArguments(workspaceSpec, config); err != nil { return nil, err From f1aa8cc32bc1cdac27b67efcbb73842dc5a14240 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:10:44 -0800 Subject: [PATCH 35/37] fix: key indentation in maskrcnn-training migration yaml --- db/yaml/workflows/maskrcnn-training/20201208155115.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/yaml/workflows/maskrcnn-training/20201208155115.yaml b/db/yaml/workflows/maskrcnn-training/20201208155115.yaml index 1a81a222..053b6378 100644 --- a/db/yaml/workflows/maskrcnn-training/20201208155115.yaml +++ b/db/yaml/workflows/maskrcnn-training/20201208155115.yaml @@ -140,7 +140,7 @@ templates: - name: data path: /mnt/data/datasets/ {{.ArtifactRepositoryType}}: - key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' - git: repo: '{{workflow.parameters.source}}' revision: "no-boto" @@ -152,7 +152,7 @@ templates: optional: true path: /mnt/output {{.ArtifactRepositoryType}}: - key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' + key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' # Uncomment the lines below if you want to send Slack notifications #- container: # args: From 237988da86baf5a9e95b9fab92829896026d8f20 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:11:01 -0800 Subject: [PATCH 36/37] fix: wrong migration file name --- db/go/20201221194344_pytorch_update.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/go/20201221194344_pytorch_update.go b/db/go/20201221194344_pytorch_update.go index 34d6b524..63b3cb14 100644 --- a/db/go/20201221194344_pytorch_update.go +++ b/db/go/20201221194344_pytorch_update.go @@ -16,7 +16,7 @@ func initialize20201221194344() { // Up20201221194344 updates pytorch_training with the sys.nodepool changes func Up20201221194344(tx *sql.Tx) error { return updateWorkflowTemplateManifest( - filepath.Join("workflows", "pytorch_training", "20201221194344.yaml"), + filepath.Join("workflows", "pytorch-mnist-training", "20201221194344.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", @@ -28,7 +28,7 @@ func Up20201221194344(tx *sql.Tx) error { func Down20201221194344(tx *sql.Tx) error { // This code is executed when the migration is rolled back. return updateWorkflowTemplateManifest( - filepath.Join("workflows", "pytorch_training", "20200605090509.yaml"), + filepath.Join("workflows", "pytorch-mnist-training", "20200605090509.yaml"), pytorchMnistWorkflowTemplateName, map[string]string{ "created-by": "system", From ffd801a26200e93458e6e2144327566ed771f954 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Thu, 24 Dec 2020 18:22:42 -0800 Subject: [PATCH 37/37] fix: wrong indentation for sidecars in maskrcnn training --- .../maskrcnn-training/20201221195937.yaml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/db/yaml/workflows/maskrcnn-training/20201221195937.yaml b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml index 8bbb461f..c2fcacc5 100644 --- a/db/yaml/workflows/maskrcnn-training/20201221195937.yaml +++ b/db/yaml/workflows/maskrcnn-training/20201221195937.yaml @@ -116,17 +116,17 @@ templates: - mountPath: /mnt/output name: output workingDir: /mnt/src - sidecars: - - name: tensorboard - image: tensorflow/tensorflow:2.3.0 - command: [ sh, -c ] - env: - - name: ONEPANEL_INTERACTIVE_SIDECAR - value: 'true' - args: [ "tensorboard --logdir /mnt/output/" ] - ports: - - containerPort: 6006 - name: tensorboard + sidecars: + - name: tensorboard + image: tensorflow/tensorflow:2.3.0 + command: [ sh, -c ] + env: + - name: ONEPANEL_INTERACTIVE_SIDECAR + value: 'true' + args: [ "tensorboard --logdir /mnt/output/" ] + ports: + - containerPort: 6006 + name: tensorboard nodeSelector: beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' inputs: