github.com/kubeshop/testkube@v1.17.23/pkg/mapper/executors/mapper.go (about)

     1  package executors
     2  
     3  import (
     4  	v1 "k8s.io/api/core/v1"
     5  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     6  
     7  	executorv1 "github.com/kubeshop/testkube-operator/api/executor/v1"
     8  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
     9  )
    10  
    11  // MapCRDToAPI maps Executor CRD to OpenAPI spec Executor
    12  func MapCRDToAPI(item executorv1.Executor) testkube.ExecutorUpsertRequest {
    13  	return testkube.ExecutorUpsertRequest{
    14  		Name:                   item.Name,
    15  		Namespace:              item.Namespace,
    16  		Labels:                 item.Labels,
    17  		ExecutorType:           string(item.Spec.ExecutorType),
    18  		Types:                  item.Spec.Types,
    19  		Uri:                    item.Spec.URI,
    20  		Image:                  item.Spec.Image,
    21  		ImagePullSecrets:       mapImagePullSecretsToAPI(item.Spec.ImagePullSecrets),
    22  		Command:                item.Spec.Command,
    23  		Args:                   item.Spec.Args,
    24  		JobTemplate:            item.Spec.JobTemplate,
    25  		JobTemplateReference:   item.Spec.JobTemplateReference,
    26  		Features:               MapFeaturesToAPI(item.Spec.Features),
    27  		ContentTypes:           MapContentTypesToAPI(item.Spec.ContentTypes),
    28  		Meta:                   MapMetaToAPI(item.Spec.Meta),
    29  		UseDataDirAsWorkingDir: item.Spec.UseDataDirAsWorkingDir,
    30  	}
    31  }
    32  
    33  // MapAPIToCRD maps OpenAPI spec ExecutorUpsertRequest to CRD Executor
    34  func MapAPIToCRD(request testkube.ExecutorUpsertRequest) executorv1.Executor {
    35  	return executorv1.Executor{
    36  		ObjectMeta: metav1.ObjectMeta{
    37  			Name:      request.Name,
    38  			Namespace: request.Namespace,
    39  			Labels:    request.Labels,
    40  		},
    41  		Spec: executorv1.ExecutorSpec{
    42  			ExecutorType:           executorv1.ExecutorType(request.ExecutorType),
    43  			Types:                  request.Types,
    44  			URI:                    request.Uri,
    45  			Image:                  request.Image,
    46  			ImagePullSecrets:       mapImagePullSecretsToCRD(request.ImagePullSecrets),
    47  			Command:                request.Command,
    48  			Args:                   request.Args,
    49  			JobTemplate:            request.JobTemplate,
    50  			JobTemplateReference:   request.JobTemplateReference,
    51  			Features:               MapFeaturesToCRD(request.Features),
    52  			ContentTypes:           MapContentTypesToCRD(request.ContentTypes),
    53  			Meta:                   MapMetaToCRD(request.Meta),
    54  			UseDataDirAsWorkingDir: request.UseDataDirAsWorkingDir,
    55  		},
    56  	}
    57  }
    58  
    59  // MapExecutorCRDToExecutorDetails maps CRD Executor to OpemAPI spec ExecutorDetails
    60  func MapExecutorCRDToExecutorDetails(item executorv1.Executor) testkube.ExecutorDetails {
    61  	return testkube.ExecutorDetails{
    62  		Name: item.Name,
    63  		Executor: &testkube.Executor{
    64  			ExecutorType:           string(item.Spec.ExecutorType),
    65  			Image:                  item.Spec.Image,
    66  			ImagePullSecrets:       mapImagePullSecretsToAPI(item.Spec.ImagePullSecrets),
    67  			Command:                item.Spec.Command,
    68  			Args:                   item.Spec.Args,
    69  			Types:                  item.Spec.Types,
    70  			Uri:                    item.Spec.URI,
    71  			JobTemplate:            item.Spec.JobTemplate,
    72  			JobTemplateReference:   item.Spec.JobTemplateReference,
    73  			Labels:                 item.Labels,
    74  			Features:               MapFeaturesToAPI(item.Spec.Features),
    75  			ContentTypes:           MapContentTypesToAPI(item.Spec.ContentTypes),
    76  			Meta:                   MapMetaToAPI(item.Spec.Meta),
    77  			UseDataDirAsWorkingDir: item.Spec.UseDataDirAsWorkingDir,
    78  		},
    79  	}
    80  }
    81  
    82  func mapImagePullSecretsToCRD(secrets []testkube.LocalObjectReference) []v1.LocalObjectReference {
    83  	var res []v1.LocalObjectReference
    84  	for _, secret := range secrets {
    85  		res = append(res, v1.LocalObjectReference{Name: secret.Name})
    86  	}
    87  	return res
    88  }
    89  
    90  func mapImagePullSecretsToAPI(secrets []v1.LocalObjectReference) []testkube.LocalObjectReference {
    91  	var res []testkube.LocalObjectReference
    92  	for _, secret := range secrets {
    93  		res = append(res, testkube.LocalObjectReference{Name: secret.Name})
    94  	}
    95  	return res
    96  }
    97  
    98  func MapFeaturesToCRD(features []string) (out []executorv1.Feature) {
    99  	for _, feature := range features {
   100  		out = append(out, executorv1.Feature(feature))
   101  	}
   102  	return out
   103  }
   104  
   105  func MapFeaturesToAPI(features []executorv1.Feature) (out []string) {
   106  	for _, feature := range features {
   107  		out = append(out, string(feature))
   108  	}
   109  	return out
   110  }
   111  
   112  func MapContentTypesToCRD(contentTypes []string) (out []executorv1.ScriptContentType) {
   113  	for _, contentType := range contentTypes {
   114  		out = append(out, executorv1.ScriptContentType(contentType))
   115  	}
   116  	return out
   117  }
   118  
   119  func MapMetaToCRD(meta *testkube.ExecutorMeta) *executorv1.ExecutorMeta {
   120  	if meta == nil {
   121  		return nil
   122  	}
   123  
   124  	return &executorv1.ExecutorMeta{
   125  		IconURI:  meta.IconURI,
   126  		DocsURI:  meta.DocsURI,
   127  		Tooltips: meta.Tooltips,
   128  	}
   129  }
   130  
   131  func MapContentTypesToAPI(contentTypes []executorv1.ScriptContentType) (out []string) {
   132  	for _, contentType := range contentTypes {
   133  		out = append(out, string(contentType))
   134  	}
   135  	return out
   136  }
   137  
   138  func MapMetaToAPI(meta *executorv1.ExecutorMeta) *testkube.ExecutorMeta {
   139  	if meta == nil {
   140  		return nil
   141  	}
   142  
   143  	return &testkube.ExecutorMeta{
   144  		IconURI:  meta.IconURI,
   145  		DocsURI:  meta.DocsURI,
   146  		Tooltips: meta.Tooltips,
   147  	}
   148  }
   149  
   150  // MapUpdateToSpec maps ExecutorUpdateRequest to Executor CRD spec
   151  func MapUpdateToSpec(request testkube.ExecutorUpdateRequest, executor *executorv1.Executor) *executorv1.Executor {
   152  	var fields = []struct {
   153  		source      *string
   154  		destination *string
   155  	}{
   156  		{
   157  			request.Name,
   158  			&executor.Name,
   159  		},
   160  		{
   161  			request.Namespace,
   162  			&executor.Namespace,
   163  		},
   164  		{
   165  			request.Image,
   166  			&executor.Spec.Image,
   167  		},
   168  		{
   169  			request.Uri,
   170  			&executor.Spec.URI,
   171  		},
   172  		{
   173  			request.JobTemplate,
   174  			&executor.Spec.JobTemplate,
   175  		},
   176  		{
   177  			request.JobTemplateReference,
   178  			&executor.Spec.JobTemplateReference,
   179  		},
   180  	}
   181  
   182  	for _, field := range fields {
   183  		if field.source != nil {
   184  			*field.destination = *field.source
   185  		}
   186  	}
   187  
   188  	if request.ExecutorType != nil {
   189  		executor.Spec.ExecutorType = executorv1.ExecutorType(*request.ExecutorType)
   190  	}
   191  
   192  	var slices = []struct {
   193  		source      *[]string
   194  		destination *[]string
   195  	}{
   196  		{
   197  			request.Command,
   198  			&executor.Spec.Command,
   199  		},
   200  		{
   201  			request.Args,
   202  			&executor.Spec.Args,
   203  		},
   204  		{
   205  			request.Types,
   206  			&executor.Spec.Types,
   207  		},
   208  	}
   209  
   210  	for _, slice := range slices {
   211  		if slice.source != nil {
   212  			*slice.destination = *slice.source
   213  		}
   214  	}
   215  
   216  	if request.Labels != nil {
   217  		executor.Labels = *request.Labels
   218  	}
   219  
   220  	if request.ImagePullSecrets != nil {
   221  		executor.Spec.ImagePullSecrets = mapImagePullSecretsToCRD(*request.ImagePullSecrets)
   222  	}
   223  
   224  	if request.Features != nil {
   225  		executor.Spec.Features = MapFeaturesToCRD(*request.Features)
   226  	}
   227  
   228  	if request.ContentTypes != nil {
   229  		executor.Spec.ContentTypes = MapContentTypesToCRD(*request.ContentTypes)
   230  	}
   231  
   232  	if request.Meta != nil {
   233  		if (*request.Meta) == nil {
   234  			executor.Spec.Meta = nil
   235  			return executor
   236  		}
   237  
   238  		if (*request.Meta).IsEmpty() {
   239  			executor.Spec.Meta = nil
   240  			return executor
   241  		}
   242  
   243  		if executor.Spec.Meta == nil {
   244  			executor.Spec.Meta = &executorv1.ExecutorMeta{}
   245  		}
   246  
   247  		if (*request.Meta).IconURI != nil {
   248  			executor.Spec.Meta.IconURI = *(*request.Meta).IconURI
   249  		}
   250  
   251  		if (*request.Meta).DocsURI != nil {
   252  			executor.Spec.Meta.DocsURI = *(*request.Meta).DocsURI
   253  		}
   254  
   255  		if (*request.Meta).Tooltips != nil {
   256  			executor.Spec.Meta.Tooltips = *(*request.Meta).Tooltips
   257  		}
   258  	}
   259  
   260  	if request.UseDataDirAsWorkingDir != nil {
   261  		executor.Spec.UseDataDirAsWorkingDir = *request.UseDataDirAsWorkingDir
   262  	}
   263  
   264  	return executor
   265  }
   266  
   267  // MapSpecToUpdate maps Executor CRD to ExecutorUpdate Request to spec
   268  func MapSpecToUpdate(executor *executorv1.Executor) (request testkube.ExecutorUpdateRequest) {
   269  	var fields = []struct {
   270  		source      *string
   271  		destination **string
   272  	}{
   273  		{
   274  			&executor.Name,
   275  			&request.Name,
   276  		},
   277  		{
   278  			&executor.Namespace,
   279  			&request.Namespace,
   280  		},
   281  		{
   282  			&executor.Spec.Image,
   283  			&request.Image,
   284  		},
   285  		{
   286  			&executor.Spec.URI,
   287  			&request.Uri,
   288  		},
   289  		{
   290  			&executor.Spec.JobTemplate,
   291  			&request.JobTemplate,
   292  		},
   293  		{
   294  			&executor.Spec.JobTemplateReference,
   295  			&request.JobTemplateReference,
   296  		},
   297  	}
   298  
   299  	for _, field := range fields {
   300  		*field.destination = field.source
   301  	}
   302  
   303  	request.ExecutorType = (*string)(&executor.Spec.ExecutorType)
   304  
   305  	var slices = []struct {
   306  		source      *[]string
   307  		destination **[]string
   308  	}{
   309  		{
   310  			&executor.Spec.Command,
   311  			&request.Command,
   312  		},
   313  		{
   314  			&executor.Spec.Args,
   315  			&request.Args,
   316  		},
   317  		{
   318  			&executor.Spec.Types,
   319  			&request.Types,
   320  		},
   321  	}
   322  
   323  	for _, slice := range slices {
   324  		*slice.destination = slice.source
   325  	}
   326  
   327  	request.Labels = &executor.Labels
   328  
   329  	imagePullSecrets := mapImagePullSecretsToAPI(executor.Spec.ImagePullSecrets)
   330  	request.ImagePullSecrets = &imagePullSecrets
   331  
   332  	features := MapFeaturesToAPI(executor.Spec.Features)
   333  	request.Features = &features
   334  
   335  	contentTypes := MapContentTypesToAPI(executor.Spec.ContentTypes)
   336  	request.ContentTypes = &contentTypes
   337  
   338  	if executor.Spec.Meta != nil {
   339  		executorMeta := &testkube.ExecutorMetaUpdate{
   340  			IconURI:  &executor.Spec.Meta.IconURI,
   341  			DocsURI:  &executor.Spec.Meta.DocsURI,
   342  			Tooltips: &executor.Spec.Meta.Tooltips,
   343  		}
   344  		request.Meta = &(executorMeta)
   345  	}
   346  
   347  	request.UseDataDirAsWorkingDir = &executor.Spec.UseDataDirAsWorkingDir
   348  
   349  	return request
   350  }
   351  
   352  func MapSlavesConfigsToCRD(slavesConfigs *testkube.SlavesMeta) *executorv1.SlavesMeta {
   353  	if slavesConfigs == nil {
   354  		return nil
   355  	}
   356  	return &executorv1.SlavesMeta{
   357  		Image: slavesConfigs.Image,
   358  	}
   359  }