package client import ( "github.com/pkg/errors" "net/http" ) const ( createWorkflowTemplateRelativeUrl = "/api/v1/workflow-templates/{namespace}" deleteWorkflowTemplateRelativeUrl = "/api/v1/workflow-templates/{namespace}/{name}" updateWorkflowTemplateRelativeUrl = "/api/v1/workflow-templates/{namespace}/{name}" getWorkflowTemplatesInNamespaceRelativeUrl = "/api/v1/workflow-templates/{namespace}" getWorkflowTemplateRelativeUrl = "/api/v1/workflow-templates/{namespace}/{name}" lintWorkflowTemplateRelativeUrl = "/api/v1/workflow-templates/{namespace}/lint" ) // CreateWorkflowTemplate 创建工作流模板 // 参数: // namespace: 命名空间 // templateDefinition: map定义 // 返回值: // 错误 func (c *Client) CreateWorkflowTemplate(namespace string, templateDefinition map[string]any) error { responseMap := make(map[string]any) resp, err := c.restyClient.R(). SetHeader("Content-Type", "application/json"). SetAuthToken(c.token). SetPathParams(map[string]string{ "namespace": namespace, }). SetBody(map[string]any{ "namespace": namespace, "template": templateDefinition, }). SetResult(&responseMap). SetError(&responseMap). Post(createWorkflowTemplateRelativeUrl) if err != nil { return errors.New(err.Error()) } switch resp.StatusCode() { case http.StatusOK: return nil case http.StatusConflict: return errors.New("工作流模板已存在") default: message, ok := responseMap["message"] if !ok { return errors.Errorf("%v", resp.Status()) } return errors.Errorf("%v, %v", resp.Status(), message) } } // DeleteWorkflowTemplate 删除工作流模板 // 参数: // namespace: 命名空间 // name: 工作流模板名称 // 返回值: // 错误 func (c *Client) DeleteWorkflowTemplate(namespace string, name string) error { responseMap := make(map[string]any) resp, err := c.restyClient.R(). SetHeader("Content-Type", "application/json"). SetAuthToken(c.token). SetPathParams(map[string]string{ "namespace": namespace, "name": name, }). SetResult(&responseMap). SetError(&responseMap). Delete(deleteWorkflowTemplateRelativeUrl) if err != nil { return errors.New(err.Error()) } switch resp.StatusCode() { case http.StatusOK: return nil default: message, ok := responseMap["message"] if !ok { return errors.Errorf("%v", resp.Status()) } return errors.Errorf("%v, %v", resp.Status(), message) } } // UpdateWorkflowTemplate 更新工作流模板 // 参数: // namespace: 命名空间 // name: 工作流模板名称 // templateDefinition: map定义,注意:需要基于查询回来的map定义进行修改 // 返回值: // 错误 func (c *Client) UpdateWorkflowTemplate(namespace string, name string, templateDefinition map[string]any) error { responseMap := make(map[string]any) resp, err := c.restyClient.R(). SetHeader("Content-Type", "application/json"). SetAuthToken(c.token). SetPathParams(map[string]string{ "namespace": namespace, "name": name, }). SetBody(map[string]any{ "namespace": namespace, "name": name, "template": templateDefinition, }). SetResult(&responseMap). SetError(&responseMap). Put(updateWorkflowTemplateRelativeUrl) if err != nil { return errors.New(err.Error()) } switch resp.StatusCode() { case http.StatusOK: return nil default: message, ok := responseMap["message"] if !ok { return errors.Errorf("%v", resp.Status()) } return errors.Errorf("%v, %v", resp.Status(), message) } } // GetWorkflowTemplatesInNamespace 查询一个命名空间下的工作流模板 // 参数: // namespace: 命名空间 // 返回值: // 查询到的工作流模板定义 // 错误 func (c *Client) GetWorkflowTemplatesInNamespace(namespace string) ([]map[string]any, error) { responseMap := make(map[string]any) resp, err := c.restyClient.R(). SetHeader("Content-Type", "application/json"). SetAuthToken(c.token). SetPathParams(map[string]string{ "namespace": namespace, }). SetResult(&responseMap). SetError(&responseMap). Get(getWorkflowTemplatesInNamespaceRelativeUrl) if err != nil { return nil, errors.New(err.Error()) } switch resp.StatusCode() { case http.StatusOK: itemsValue, ok := responseMap["items"] if !ok { return nil, errors.New("没有获取到items参数") } items, ok := itemsValue.([]any) if !ok { return nil, errors.New("items不是slice") } templateDefinitions := make([]map[string]any, len(items)) for i, item := range items { templateDefinition, ok := item.(map[string]any) if !ok { return nil, errors.New("item无法转换为map[string]any") } templateDefinitions[i] = templateDefinition } return templateDefinitions, nil default: message, ok := responseMap["message"] if !ok { return nil, errors.Errorf("%v", resp.Status()) } return nil, errors.Errorf("%v, %v", resp.Status(), message) } } // GetWorkflowTemplate 查询具体的工作流模板 // 参数: // namespace: 命名空间 // name: 工作流模板名称 // 返回值: // 查询到的工作流模板定义 // 错误 func (c *Client) GetWorkflowTemplate(namespace string, name string) (map[string]any, error) { responseMap := make(map[string]any) resp, err := c.restyClient.R(). SetHeader("Content-Type", "application/json"). SetAuthToken(c.token). SetPathParams(map[string]string{ "namespace": namespace, "name": name, }). SetResult(&responseMap). SetError(&responseMap). Get(getWorkflowTemplateRelativeUrl) if err != nil { return nil, errors.New(err.Error()) } switch resp.StatusCode() { case http.StatusOK: return responseMap, nil default: message, ok := responseMap["message"] if !ok { return nil, errors.Errorf("%v", resp.Status()) } return nil, errors.Errorf("%v, %v", resp.Status(), message) } } // LintWorkflowTemplate 对工作流模板定义进行语法检查 // 参数: // namespace: 命名空间 // templateDefinition: map定义 // 返回值: // 错误 func (c *Client) LintWorkflowTemplate(namespace string, templateDefinition map[string]any) error { responseMap := make(map[string]any) resp, err := c.restyClient.R(). SetHeader("Content-Type", "application/json"). SetAuthToken(c.token). SetPathParams(map[string]string{ "namespace": namespace, }). SetBody(map[string]any{ "namespace": namespace, "template": templateDefinition, }). SetResult(&responseMap). SetError(&responseMap). Post(lintWorkflowTemplateRelativeUrl) if err != nil { return errors.New(err.Error()) } switch resp.StatusCode() { case http.StatusOK: return nil case http.StatusConflict: return errors.New("工作流模板已存在") default: message, ok := responseMap["message"] if !ok { return errors.Errorf("%v", resp.Status()) } return errors.Errorf("%v, %v", resp.Status(), message) } }