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 }