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 }