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  }