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

     1  package testexecutions
     2  
     3  import (
     4  	corev1 "k8s.io/api/core/v1"
     5  
     6  	testexecutionv1 "github.com/kubeshop/testkube-operator/api/testexecution/v1"
     7  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
     8  	mappertcl "github.com/kubeshop/testkube/pkg/tcl/mappertcl/testexecutions"
     9  )
    10  
    11  // MapCRDVariables maps variables between API and operator CRDs
    12  func MapCRDVariables(in map[string]testkube.Variable) map[string]testexecutionv1.Variable {
    13  	out := map[string]testexecutionv1.Variable{}
    14  	for k, v := range in {
    15  		variable := testexecutionv1.Variable{
    16  			Name:  v.Name,
    17  			Type_: string(*v.Type_),
    18  			Value: v.Value,
    19  		}
    20  
    21  		if v.SecretRef != nil {
    22  			variable.ValueFrom = corev1.EnvVarSource{
    23  				SecretKeyRef: &corev1.SecretKeySelector{
    24  					LocalObjectReference: corev1.LocalObjectReference{
    25  						Name: v.SecretRef.Name,
    26  					},
    27  					Key: v.SecretRef.Key,
    28  				},
    29  			}
    30  		}
    31  
    32  		if v.ConfigMapRef != nil {
    33  			variable.ValueFrom = corev1.EnvVarSource{
    34  				ConfigMapKeyRef: &corev1.ConfigMapKeySelector{
    35  					LocalObjectReference: corev1.LocalObjectReference{
    36  						Name: v.ConfigMapRef.Name,
    37  					},
    38  					Key: v.ConfigMapRef.Key,
    39  				},
    40  			}
    41  		}
    42  
    43  		out[k] = variable
    44  	}
    45  	return out
    46  }
    47  
    48  // MapContentToSpecContent maps TestContent OpenAPI spec to TestContent CRD spec
    49  func MapContentToSpecContent(content *testkube.TestContent) (specContent *testexecutionv1.TestContent) {
    50  	if content == nil {
    51  		return
    52  	}
    53  
    54  	var repository *testexecutionv1.Repository
    55  	if content.Repository != nil {
    56  		repository = &testexecutionv1.Repository{
    57  			Type_:             content.Repository.Type_,
    58  			Uri:               content.Repository.Uri,
    59  			Branch:            content.Repository.Branch,
    60  			Commit:            content.Repository.Commit,
    61  			Path:              content.Repository.Path,
    62  			WorkingDir:        content.Repository.WorkingDir,
    63  			CertificateSecret: content.Repository.CertificateSecret,
    64  			AuthType:          testexecutionv1.GitAuthType(content.Repository.AuthType),
    65  		}
    66  
    67  		if content.Repository.UsernameSecret != nil {
    68  			repository.UsernameSecret = &testexecutionv1.SecretRef{
    69  				Name: content.Repository.UsernameSecret.Name,
    70  				Key:  content.Repository.UsernameSecret.Key,
    71  			}
    72  		}
    73  
    74  		if content.Repository.TokenSecret != nil {
    75  			repository.TokenSecret = &testexecutionv1.SecretRef{
    76  				Name: content.Repository.TokenSecret.Name,
    77  				Key:  content.Repository.TokenSecret.Key,
    78  			}
    79  		}
    80  	}
    81  
    82  	return &testexecutionv1.TestContent{
    83  		Repository: repository,
    84  		Data:       content.Data,
    85  		Uri:        content.Uri,
    86  		Type_:      testexecutionv1.TestContentType(content.Type_),
    87  	}
    88  }
    89  
    90  // MapExecutionResultToCRD maps OpenAPI spec ExecutionResult to CRD ExecutionResult
    91  func MapExecutionResultToCRD(result *testkube.ExecutionResult) *testexecutionv1.ExecutionResult {
    92  	if result == nil {
    93  		return nil
    94  	}
    95  
    96  	var status *testexecutionv1.ExecutionStatus
    97  	if result.Status != nil {
    98  		value := testexecutionv1.ExecutionStatus(*result.Status)
    99  		status = &value
   100  	}
   101  
   102  	var steps []testexecutionv1.ExecutionStepResult
   103  	for _, step := range result.Steps {
   104  		var asserstions []testexecutionv1.AssertionResult
   105  		for _, asserstion := range step.AssertionResults {
   106  			asserstions = append(asserstions, testexecutionv1.AssertionResult{
   107  				Name:         asserstion.Name,
   108  				Status:       asserstion.Status,
   109  				ErrorMessage: asserstion.ErrorMessage,
   110  			})
   111  		}
   112  
   113  		steps = append(steps, testexecutionv1.ExecutionStepResult{
   114  			Name:             step.Name,
   115  			Duration:         step.Duration,
   116  			Status:           step.Status,
   117  			AssertionResults: asserstions,
   118  		})
   119  	}
   120  
   121  	var reports *testexecutionv1.ExecutionResultReports
   122  	if result.Reports != nil {
   123  		reports = &testexecutionv1.ExecutionResultReports{
   124  			Junit: result.Reports.Junit,
   125  		}
   126  	}
   127  
   128  	return &testexecutionv1.ExecutionResult{
   129  		Status:       status,
   130  		ErrorMessage: result.ErrorMessage,
   131  		Steps:        steps,
   132  		Reports:      reports,
   133  	}
   134  }
   135  
   136  // MapAPIToCRD maps OpenAPI spec Execution to CRD TestExecutionStatus
   137  func MapAPIToCRD(request *testkube.Execution, generation int64) testexecutionv1.TestExecutionStatus {
   138  	var artifactRequest *testexecutionv1.ArtifactRequest
   139  	if request.ArtifactRequest != nil {
   140  		artifactRequest = &testexecutionv1.ArtifactRequest{
   141  			StorageClassName:           request.ArtifactRequest.StorageClassName,
   142  			VolumeMountPath:            request.ArtifactRequest.VolumeMountPath,
   143  			Dirs:                       request.ArtifactRequest.Dirs,
   144  			Masks:                      request.ArtifactRequest.Masks,
   145  			StorageBucket:              request.ArtifactRequest.StorageBucket,
   146  			OmitFolderPerExecution:     request.ArtifactRequest.OmitFolderPerExecution,
   147  			SharedBetweenPods:          request.ArtifactRequest.SharedBetweenPods,
   148  			UseDefaultStorageClassName: request.ArtifactRequest.UseDefaultStorageClassName,
   149  		}
   150  	}
   151  
   152  	var runningContext *testexecutionv1.RunningContext
   153  	if request.RunningContext != nil {
   154  		runningContext = &testexecutionv1.RunningContext{
   155  			Type_:   testexecutionv1.RunningContextType(request.RunningContext.Type_),
   156  			Context: request.RunningContext.Context,
   157  		}
   158  	}
   159  
   160  	var podRequest *testexecutionv1.PodRequest
   161  	if request.SlavePodRequest != nil {
   162  		podRequest = &testexecutionv1.PodRequest{}
   163  		if request.SlavePodRequest.Resources != nil {
   164  			podRequest.Resources = &testexecutionv1.PodResourcesRequest{}
   165  			if request.SlavePodRequest.Resources.Requests != nil {
   166  				podRequest.Resources.Requests = &testexecutionv1.ResourceRequest{
   167  					Cpu:    request.SlavePodRequest.Resources.Requests.Cpu,
   168  					Memory: request.SlavePodRequest.Resources.Requests.Memory,
   169  				}
   170  			}
   171  
   172  			if request.SlavePodRequest.Resources.Limits != nil {
   173  				podRequest.Resources.Limits = &testexecutionv1.ResourceRequest{
   174  					Cpu:    request.SlavePodRequest.Resources.Limits.Cpu,
   175  					Memory: request.SlavePodRequest.Resources.Limits.Memory,
   176  				}
   177  			}
   178  		}
   179  
   180  		podRequest.PodTemplate = request.SlavePodRequest.PodTemplate
   181  		podRequest.PodTemplateReference = request.SlavePodRequest.PodTemplateReference
   182  	}
   183  
   184  	result := testexecutionv1.TestExecutionStatus{
   185  		Generation: generation,
   186  		LatestExecution: &testexecutionv1.Execution{
   187  			Id:                                 request.Id,
   188  			TestName:                           request.TestName,
   189  			TestSuiteName:                      request.TestSuiteName,
   190  			TestNamespace:                      request.TestNamespace,
   191  			TestType:                           request.TestType,
   192  			Name:                               request.Name,
   193  			Number:                             request.Number,
   194  			Envs:                               request.Envs,
   195  			Command:                            request.Command,
   196  			Args:                               request.Args,
   197  			ArgsMode:                           testexecutionv1.ArgsModeType(request.ArgsMode),
   198  			Variables:                          MapCRDVariables(request.Variables),
   199  			IsVariablesFileUploaded:            request.IsVariablesFileUploaded,
   200  			VariablesFile:                      request.VariablesFile,
   201  			TestSecretUUID:                     request.TestSecretUUID,
   202  			Content:                            MapContentToSpecContent(request.Content),
   203  			Duration:                           request.Duration,
   204  			DurationMs:                         request.DurationMs,
   205  			ExecutionResult:                    MapExecutionResultToCRD(request.ExecutionResult),
   206  			Labels:                             request.Labels,
   207  			Uploads:                            request.Uploads,
   208  			BucketName:                         request.BucketName,
   209  			ArtifactRequest:                    artifactRequest,
   210  			PreRunScript:                       request.PreRunScript,
   211  			PostRunScript:                      request.PostRunScript,
   212  			ExecutePostRunScriptBeforeScraping: request.ExecutePostRunScriptBeforeScraping,
   213  			SourceScripts:                      request.SourceScripts,
   214  			RunningContext:                     runningContext,
   215  			ContainerShell:                     request.ContainerShell,
   216  			SlavePodRequest:                    podRequest,
   217  		},
   218  	}
   219  
   220  	result.LatestExecution.StartTime.Time = request.StartTime
   221  	result.LatestExecution.EndTime.Time = request.EndTime
   222  
   223  	// Pro edition only (tcl protected code)
   224  	return *mappertcl.MapAPIToCRD(request, &result)
   225  }