github.com/kubeshop/testkube@v1.17.23/cmd/kubectl-testkube/commands/executors/create.go (about)

     1  package executors
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/kubeshop/testkube/cmd/kubectl-testkube/commands/common"
    10  	apiClient "github.com/kubeshop/testkube/pkg/api/v1/client"
    11  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    12  	"github.com/kubeshop/testkube/pkg/crd"
    13  	"github.com/kubeshop/testkube/pkg/ui"
    14  )
    15  
    16  func NewCreateExecutorCmd() *cobra.Command {
    17  	var (
    18  		types, command, executorArgs, imagePullSecretNames, features, contentTypes          []string
    19  		name, executorType, image, uri, jobTemplate, iconURI, docsURI, jobTemplateReference string
    20  		labels, tooltips                                                                    map[string]string
    21  		update, useDataDirAsWorkingDir                                                      bool
    22  	)
    23  
    24  	cmd := &cobra.Command{
    25  		Use:     "executor",
    26  		Aliases: []string{"exec", "ex"},
    27  		Short:   "Create new Executor",
    28  		Long:    `Create new Executor Custom Resource`,
    29  		Run: func(cmd *cobra.Command, args []string) {
    30  			crdOnly, err := strconv.ParseBool(cmd.Flag("crd-only").Value.String())
    31  			ui.ExitOnError("parsing flag value", err)
    32  
    33  			if name == "" {
    34  				ui.Failf("pass valid name (in '--name' flag)")
    35  			}
    36  
    37  			namespace := cmd.Flag("namespace").Value.String()
    38  			var client apiClient.Client
    39  			if !crdOnly {
    40  				client, namespace, err = common.GetClient(cmd)
    41  				ui.ExitOnError("getting client", err)
    42  
    43  				executor, _ := client.GetExecutor(name)
    44  				if name == executor.Name {
    45  					if cmd.Flag("update").Changed {
    46  						if !update {
    47  							ui.Failf("Executor with name '%s' already exists in namespace %s, ", executor.Name, namespace)
    48  						}
    49  					} else {
    50  						ok := ui.Confirm(fmt.Sprintf("Executor with name '%s' already exists in namespace %s, ", executor.Name, namespace) +
    51  							"do you want to overwrite it?")
    52  						if !ok {
    53  							ui.Failf("Executor creation was aborted")
    54  						}
    55  					}
    56  
    57  					options, err := NewUpdateExecutorOptionsFromFlags(cmd)
    58  					ui.ExitOnError("getting executor options", err)
    59  
    60  					_, err = client.UpdateExecutor(options)
    61  					ui.ExitOnError("updating executor "+name+" in namespace "+namespace, err)
    62  
    63  					ui.SuccessAndExit("Executor updated", name)
    64  				}
    65  			}
    66  
    67  			options, err := NewUpsertExecutorOptionsFromFlags(cmd)
    68  			ui.ExitOnError("getting executor options", err)
    69  
    70  			if !crdOnly {
    71  				_, err = client.CreateExecutor(options)
    72  				ui.ExitOnError("creating executor "+name+" in namespace "+namespace, err)
    73  
    74  				ui.Success("Executor created", name)
    75  			} else {
    76  				(*testkube.ExecutorUpsertRequest)(&options).QuoteExecutorTextFields()
    77  				data, err := crd.ExecuteTemplate(crd.TemplateExecutor, options)
    78  				ui.ExitOnError("executing crd template", err)
    79  
    80  				ui.Info(data)
    81  			}
    82  		},
    83  	}
    84  
    85  	cmd.Flags().StringVarP(&name, "name", "n", "", "unique executor name - mandatory")
    86  	cmd.Flags().StringArrayVarP(&types, "types", "t", []string{}, "test types handled by executor")
    87  	cmd.Flags().StringVar(&executorType, "executor-type", "job", "executor type, container or job (defaults to job)")
    88  
    89  	cmd.Flags().StringVarP(&uri, "uri", "u", "", "if resource need to be loaded from URI")
    90  	cmd.Flags().StringVar(&image, "image", "", "image used for executor")
    91  	cmd.Flags().StringArrayVar(&imagePullSecretNames, "image-pull-secrets", []string{}, "secret name used to pull the image in executor")
    92  	cmd.Flags().StringArrayVar(&command, "command", []string{}, "command passed to image in executor")
    93  	cmd.Flags().StringArrayVar(&executorArgs, "args", []string{}, "args passed to image in executor")
    94  	cmd.Flags().StringVarP(&jobTemplate, "job-template", "j", "", "if executor needs to be launched using custom job specification, then a path to template file should be provided")
    95  	cmd.Flags().StringVarP(&jobTemplateReference, "job-template-reference", "", "", "reference to job template for using with executor")
    96  	cmd.Flags().StringToStringVarP(&labels, "label", "l", nil, "label key value pair: --label key1=value1")
    97  	cmd.Flags().StringArrayVar(&features, "feature", []string{}, "feature provided by executor")
    98  	cmd.Flags().StringVarP(&iconURI, "icon-uri", "", "", "URI to executor icon")
    99  	cmd.Flags().StringVarP(&docsURI, "docs-uri", "", "", "URI to executor docs")
   100  	cmd.Flags().StringArrayVar(&contentTypes, "content-type", []string{}, "list of supported content types for executor")
   101  	cmd.Flags().StringToStringVarP(&tooltips, "tooltip", "", nil, "tooltip key value pair: --tooltip key1=value1")
   102  	cmd.Flags().BoolVar(&update, "update", false, "update, if executor already exists")
   103  	cmd.Flags().BoolVar(&useDataDirAsWorkingDir, "use-data-dir-as-working-dir", false, "use data dir as working dir for all tests")
   104  
   105  	return cmd
   106  }