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 }