github.com/kubeshop/testkube@v1.17.23/cmd/kubectl-testkube/commands/executors/common.go (about) 1 package executors 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/spf13/cobra" 8 9 apiClient "github.com/kubeshop/testkube/pkg/api/v1/client" 10 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 11 "github.com/kubeshop/testkube/pkg/ui" 12 ) 13 14 // NewUpsertExecutorOptionsFromFlags creates upsert executor options from command flags 15 func NewUpsertExecutorOptionsFromFlags(cmd *cobra.Command) (options apiClient.UpsertExecutorOptions, err error) { 16 name := cmd.Flag("name").Value.String() 17 types, err := cmd.Flags().GetStringArray("types") 18 if err != nil { 19 return options, err 20 } 21 22 executorType := cmd.Flag("executor-type").Value.String() 23 uri := cmd.Flag("uri").Value.String() 24 image := cmd.Flag("image").Value.String() 25 command, err := cmd.Flags().GetStringArray("command") 26 if err != nil { 27 return options, err 28 } 29 30 executorArgs, err := cmd.Flags().GetStringArray("args") 31 if err != nil { 32 return options, err 33 } 34 35 jobTemplateReference := cmd.Flag("job-template-reference").Value.String() 36 jobTemplate := cmd.Flag("job-template").Value.String() 37 jobTemplateContent := "" 38 if jobTemplate != "" { 39 b, err := os.ReadFile(jobTemplate) 40 ui.ExitOnError("reading job template", err) 41 jobTemplateContent = string(b) 42 } 43 44 imagePullSecretNames, err := cmd.Flags().GetStringArray("image-pull-secrets") 45 if err != nil { 46 return options, err 47 } 48 49 var imageSecrets []testkube.LocalObjectReference 50 for _, secretName := range imagePullSecretNames { 51 imageSecrets = append(imageSecrets, testkube.LocalObjectReference{Name: secretName}) 52 } 53 54 labels, err := cmd.Flags().GetStringToString("label") 55 if err != nil { 56 return options, err 57 } 58 59 features, err := cmd.Flags().GetStringArray("feature") 60 if err != nil { 61 return options, err 62 } 63 64 tooltips, err := cmd.Flags().GetStringToString("tooltip") 65 if err != nil { 66 return options, err 67 } 68 69 contentTypes, err := cmd.Flags().GetStringArray("content-type") 70 if err != nil { 71 return options, err 72 } 73 74 iconURI := cmd.Flag("icon-uri").Value.String() 75 docsURI := cmd.Flag("docs-uri").Value.String() 76 useDataDirAsWorkingDir, err := cmd.Flags().GetBool("use-data-dir-as-working-dir") 77 if err != nil { 78 return options, err 79 } 80 81 var meta *testkube.ExecutorMeta 82 if iconURI != "" || docsURI != "" || len(tooltips) != 0 { 83 meta = &testkube.ExecutorMeta{ 84 IconURI: iconURI, 85 DocsURI: docsURI, 86 Tooltips: tooltips, 87 } 88 } 89 90 options = apiClient.UpsertExecutorOptions{ 91 Name: name, 92 Types: types, 93 ExecutorType: executorType, 94 Image: image, 95 ImagePullSecrets: imageSecrets, 96 Command: command, 97 Args: executorArgs, 98 Uri: uri, 99 ContentTypes: contentTypes, 100 JobTemplate: jobTemplateContent, 101 JobTemplateReference: jobTemplateReference, 102 Features: features, 103 Labels: labels, 104 Meta: meta, 105 UseDataDirAsWorkingDir: useDataDirAsWorkingDir, 106 } 107 108 return options, nil 109 } 110 111 // NewUpsertExecutorOptionsFromFlags creates update executor options fom command flags 112 func NewUpdateExecutorOptionsFromFlags(cmd *cobra.Command) (options apiClient.UpdateExecutorOptions, err error) { 113 var fields = []struct { 114 name string 115 destination **string 116 }{ 117 { 118 "name", 119 &options.Name, 120 }, 121 { 122 "executor-type", 123 &options.ExecutorType, 124 }, 125 { 126 "uri", 127 &options.Uri, 128 }, 129 { 130 "image", 131 &options.Image, 132 }, 133 { 134 "job-template-reference", 135 &options.JobTemplateReference, 136 }, 137 } 138 139 for _, field := range fields { 140 if cmd.Flag(field.name).Changed { 141 value := cmd.Flag(field.name).Value.String() 142 *field.destination = &value 143 } 144 } 145 146 var slices = []struct { 147 name string 148 destination **[]string 149 }{ 150 { 151 "types", 152 &options.Types, 153 }, 154 { 155 "command", 156 &options.Command, 157 }, 158 { 159 "args", 160 &options.Args, 161 }, 162 { 163 "feature", 164 &options.Features, 165 }, 166 { 167 "content-type", 168 &options.ContentTypes, 169 }, 170 } 171 172 for _, slice := range slices { 173 if cmd.Flag(slice.name).Changed { 174 value, err := cmd.Flags().GetStringArray(slice.name) 175 if err != nil { 176 return options, err 177 } 178 179 *slice.destination = &value 180 } 181 } 182 183 if cmd.Flag("job-template").Changed { 184 jobTemplate := cmd.Flag("job-template").Value.String() 185 b, err := os.ReadFile(jobTemplate) 186 if err != nil { 187 return options, fmt.Errorf("reading job template %w", err) 188 } 189 190 value := string(b) 191 options.JobTemplate = &value 192 } 193 194 if cmd.Flag("image-pull-secrets").Changed { 195 imagePullSecretNames, err := cmd.Flags().GetStringArray("image-pull-secrets") 196 if err != nil { 197 return options, err 198 } 199 200 var imageSecrets []testkube.LocalObjectReference 201 for _, secretName := range imagePullSecretNames { 202 imageSecrets = append(imageSecrets, testkube.LocalObjectReference{Name: secretName}) 203 } 204 205 options.ImagePullSecrets = &imageSecrets 206 } 207 208 if cmd.Flag("label").Changed { 209 labels, err := cmd.Flags().GetStringToString("label") 210 if err != nil { 211 return options, err 212 } 213 214 options.Labels = &labels 215 } 216 217 if cmd.Flag("icon-uri").Changed || cmd.Flag("docs-uri").Changed || cmd.Flag("tooltip").Changed { 218 meta := &testkube.ExecutorMetaUpdate{} 219 if cmd.Flag("icon-uri").Changed { 220 value := cmd.Flag("icon-uri").Value.String() 221 meta.IconURI = &value 222 } 223 224 if cmd.Flag("docs-uri").Changed { 225 value := cmd.Flag("docs-uri").Value.String() 226 meta.DocsURI = &value 227 } 228 229 if cmd.Flag("tooltip").Changed { 230 tooltips, err := cmd.Flags().GetStringToString("tooltip") 231 if err != nil { 232 return options, err 233 } 234 235 meta.Tooltips = &tooltips 236 } 237 238 options.Meta = &meta 239 } 240 241 if cmd.Flag("use-data-dir-as-working-dir").Changed { 242 value, err := cmd.Flags().GetBool("use-data-dir-as-working-dir") 243 if err != nil { 244 return options, err 245 } 246 247 options.UseDataDirAsWorkingDir = &value 248 } 249 250 return options, nil 251 }