github.com/kubeshop/testkube@v1.17.23/pkg/api/v1/client/testworkflow.go (about) 1 package client 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "net/url" 8 9 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 10 ) 11 12 // NewTestWorkflowClient creates new TestWorkflow client 13 func NewTestWorkflowClient( 14 testWorkflowTransport Transport[testkube.TestWorkflow], 15 testWorkflowWithExecutionTransport Transport[testkube.TestWorkflowWithExecution], 16 testWorkflowExecutionTransport Transport[testkube.TestWorkflowExecution], 17 testWorkflowExecutionsResultTransport Transport[testkube.TestWorkflowExecutionsResult], 18 artifactTransport Transport[testkube.Artifact], 19 ) TestWorkflowClient { 20 return TestWorkflowClient{ 21 testWorkflowTransport: testWorkflowTransport, 22 testWorkflowWithExecutionTransport: testWorkflowWithExecutionTransport, 23 testWorkflowExecutionTransport: testWorkflowExecutionTransport, 24 testWorkflowExecutionsResultTransport: testWorkflowExecutionsResultTransport, 25 artifactTransport: artifactTransport, 26 } 27 } 28 29 // TestWorkflowClient is a client for test workflows 30 type TestWorkflowClient struct { 31 testWorkflowTransport Transport[testkube.TestWorkflow] 32 testWorkflowWithExecutionTransport Transport[testkube.TestWorkflowWithExecution] 33 testWorkflowExecutionTransport Transport[testkube.TestWorkflowExecution] 34 testWorkflowExecutionsResultTransport Transport[testkube.TestWorkflowExecutionsResult] 35 artifactTransport Transport[testkube.Artifact] 36 } 37 38 // GetTestWorkflow returns single test workflow by id 39 func (c TestWorkflowClient) GetTestWorkflow(id string) (testkube.TestWorkflow, error) { 40 uri := c.testWorkflowTransport.GetURI("/test-workflows/%s", id) 41 return c.testWorkflowTransport.Execute(http.MethodGet, uri, nil, nil) 42 } 43 44 // GetTestWorkflowWithExecution returns single test workflow with execution by id 45 func (c TestWorkflowClient) GetTestWorkflowWithExecution(id string) (testkube.TestWorkflowWithExecution, error) { 46 uri := c.testWorkflowWithExecutionTransport.GetURI("/test-workflow-with-executions/%s", id) 47 return c.testWorkflowWithExecutionTransport.Execute(http.MethodGet, uri, nil, nil) 48 } 49 50 // ListTestWorkflows list all test workflows 51 func (c TestWorkflowClient) ListTestWorkflows(selector string) (testkube.TestWorkflows, error) { 52 uri := c.testWorkflowTransport.GetURI("/test-workflows") 53 params := map[string]string{"selector": selector} 54 return c.testWorkflowTransport.ExecuteMultiple(http.MethodGet, uri, nil, params) 55 } 56 57 // ListTestWorkflowWithExecutions list all test workflows with their latest executions 58 func (c TestWorkflowClient) ListTestWorkflowWithExecutions(selector string) (testkube.TestWorkflowWithExecutions, error) { 59 uri := c.testWorkflowWithExecutionTransport.GetURI("/test-workflow-with-executions") 60 params := map[string]string{"selector": selector} 61 return c.testWorkflowWithExecutionTransport.ExecuteMultiple(http.MethodGet, uri, nil, params) 62 } 63 64 // DeleteTestWorkflows deletes multiple test workflows by labels 65 func (c TestWorkflowClient) DeleteTestWorkflows(selector string) error { 66 uri := c.testWorkflowTransport.GetURI("/test-workflows") 67 return c.testWorkflowTransport.Delete(uri, selector, true) 68 } 69 70 // CreateTestWorkflow creates new TestWorkflow Custom Resource 71 func (c TestWorkflowClient) CreateTestWorkflow(workflow testkube.TestWorkflow) (result testkube.TestWorkflow, err error) { 72 uri := c.testWorkflowTransport.GetURI("/test-workflows") 73 74 body, err := json.Marshal(workflow) 75 if err != nil { 76 return result, err 77 } 78 79 return c.testWorkflowTransport.Execute(http.MethodPost, uri, body, nil) 80 } 81 82 // UpdateTestWorkflow updates TestWorkflow Custom Resource 83 func (c TestWorkflowClient) UpdateTestWorkflow(workflow testkube.TestWorkflow) (result testkube.TestWorkflow, err error) { 84 if workflow.Name == "" { 85 return result, fmt.Errorf("test workflow name '%s' is not valid", workflow.Name) 86 } 87 88 uri := c.testWorkflowTransport.GetURI("/test-workflows/%s", workflow.Name) 89 90 body, err := json.Marshal(workflow) 91 if err != nil { 92 return result, err 93 } 94 95 return c.testWorkflowTransport.Execute(http.MethodPut, uri, body, nil) 96 } 97 98 // DeleteTestWorkflow deletes single test by name 99 func (c TestWorkflowClient) DeleteTestWorkflow(name string) error { 100 if name == "" { 101 return fmt.Errorf("test workflow name '%s' is not valid", name) 102 } 103 104 uri := c.testWorkflowTransport.GetURI("/test-workflows/%s", name) 105 return c.testWorkflowTransport.Delete(uri, "", true) 106 } 107 108 // ExecuteTestWorkflow starts new TestWorkflow execution 109 func (c TestWorkflowClient) ExecuteTestWorkflow(name string, request testkube.TestWorkflowExecutionRequest) (result testkube.TestWorkflowExecution, err error) { 110 if name == "" { 111 return result, fmt.Errorf("test workflow name '%s' is not valid", name) 112 } 113 114 uri := c.testWorkflowExecutionTransport.GetURI("/test-workflows/%s/executions", name) 115 116 body, err := json.Marshal(request) 117 if err != nil { 118 return result, err 119 } 120 121 return c.testWorkflowExecutionTransport.Execute(http.MethodPost, uri, body, nil) 122 } 123 124 // GetTestWorkflowExecutionNotifications returns events stream from job pods, based on job pods logs 125 func (c TestWorkflowClient) GetTestWorkflowExecutionNotifications(id string) (notifications chan testkube.TestWorkflowExecutionNotification, err error) { 126 notifications = make(chan testkube.TestWorkflowExecutionNotification) 127 uri := c.testWorkflowTransport.GetURI("/test-workflow-executions/%s/notifications", id) 128 err = c.testWorkflowTransport.GetTestWorkflowExecutionNotifications(uri, notifications) 129 return notifications, err 130 } 131 132 // GetTestWorkflowExecution returns single test workflow execution by id 133 func (c TestWorkflowClient) GetTestWorkflowExecution(id string) (testkube.TestWorkflowExecution, error) { 134 uri := c.testWorkflowExecutionTransport.GetURI("/test-workflow-executions/%s", id) 135 return c.testWorkflowExecutionTransport.Execute(http.MethodGet, uri, nil, nil) 136 } 137 138 // ListTestWorkflowExecutions list test workflow executions for selected workflow 139 func (c TestWorkflowClient) ListTestWorkflowExecutions(id string, limit int, selector string) (testkube.TestWorkflowExecutionsResult, error) { 140 uri := c.testWorkflowExecutionsResultTransport.GetURI("/test-workflow-executions/") 141 if id != "" { 142 uri = c.testWorkflowExecutionsResultTransport.GetURI(fmt.Sprintf("/test-workflows/%s/executions", id)) 143 } 144 params := map[string]string{ 145 "selector": selector, 146 "pageSize": fmt.Sprintf("%d", limit), 147 } 148 return c.testWorkflowExecutionsResultTransport.Execute(http.MethodGet, uri, nil, params) 149 } 150 151 // AbortTestWorkflowExecution aborts selected execution 152 func (c TestWorkflowClient) AbortTestWorkflowExecution(workflow, id string) error { 153 uri := c.testWorkflowTransport.GetURI("/test-workflows/%s/executions/%s/abort", workflow, id) 154 return c.testWorkflowTransport.ExecuteMethod(http.MethodPost, uri, "", false) 155 } 156 157 // AbortTestWorkflowExecutions aborts all workflow executions 158 func (c TestWorkflowClient) AbortTestWorkflowExecutions(workflow string) error { 159 uri := c.testWorkflowTransport.GetURI("/test-workflows/%s/abort", workflow) 160 return c.testWorkflowTransport.ExecuteMethod(http.MethodPost, uri, "", false) 161 } 162 163 // GetTestWorkflowExecutionArtifacts returns execution artifacts 164 func (c TestWorkflowClient) GetTestWorkflowExecutionArtifacts(executionID string) (artifacts testkube.Artifacts, err error) { 165 uri := c.artifactTransport.GetURI("/test-workflow-executions/%s/artifacts", executionID) 166 return c.artifactTransport.ExecuteMultiple(http.MethodGet, uri, nil, nil) 167 } 168 169 // DownloadTestWorkflowArtifact downloads file 170 func (c TestWorkflowClient) DownloadTestWorkflowArtifact(executionID, fileName, destination string) (artifact string, err error) { 171 uri := c.testWorkflowExecutionTransport.GetURI("/test-workflow-executions/%s/artifacts/%s", executionID, url.QueryEscape(fileName)) 172 return c.testWorkflowExecutionTransport.GetFile(uri, fileName, destination, nil) 173 } 174 175 // DownloadTestWorkflowArtifactArchive downloads archive 176 func (c TestWorkflowClient) DownloadTestWorkflowArtifactArchive(executionID, destination string, masks []string) (archive string, err error) { 177 uri := c.testWorkflowExecutionTransport.GetURI("/test-workflow-executions/%s/artifact-archive", executionID) 178 return c.testWorkflowExecutionTransport.GetFile(uri, fmt.Sprintf("%s.tar.gz", executionID), destination, map[string][]string{"mask": masks}) 179 }