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  }