github.com/kubeshop/testkube@v1.17.23/pkg/tcl/testworkflowstcl/testworkflowresolver/config.go (about) 1 // Copyright 2024 Testkube. 2 // 3 // Licensed as a Testkube Pro file under the Testkube Community 4 // License (the "License"); you may not use this file except in compliance with 5 // the License. You may obtain a copy of the License at 6 // 7 // https://github.com/kubeshop/testkube/blob/main/licenses/TCL.txt 8 9 package testworkflowresolver 10 11 import ( 12 "strconv" 13 14 "github.com/pkg/errors" 15 "k8s.io/apimachinery/pkg/util/intstr" 16 17 testworkflowsv1 "github.com/kubeshop/testkube-operator/api/testworkflows/v1" 18 "github.com/kubeshop/testkube/pkg/tcl/expressionstcl" 19 ) 20 21 var configFinalizer = expressionstcl.PrefixMachine("config.", expressionstcl.FinalizerFail) 22 23 func castParameter(value intstr.IntOrString, schema testworkflowsv1.ParameterSchema) (expressionstcl.Expression, error) { 24 v := value.StrVal 25 if value.Type == intstr.Int { 26 v = strconv.Itoa(int(value.IntVal)) 27 } 28 expr, err := expressionstcl.CompileTemplate(v) 29 if err != nil { 30 return nil, err 31 } 32 switch schema.Type { 33 case testworkflowsv1.ParameterTypeBoolean: 34 return expressionstcl.CastToBool(expr).Resolve() 35 case testworkflowsv1.ParameterTypeInteger: 36 return expressionstcl.CastToInt(expr).Resolve() 37 case testworkflowsv1.ParameterTypeNumber: 38 return expressionstcl.CastToFloat(expr).Resolve() 39 } 40 return expressionstcl.CastToString(expr).Resolve() 41 } 42 43 func createConfigMachine(cfg map[string]intstr.IntOrString, schema map[string]testworkflowsv1.ParameterSchema) (expressionstcl.Machine, error) { 44 machine := expressionstcl.NewMachine() 45 for k, v := range cfg { 46 expr, err := castParameter(v, schema[k]) 47 if err != nil { 48 return nil, errors.Wrap(err, "config."+k) 49 } 50 machine.Register("config."+k, expr) 51 } 52 for k := range schema { 53 if schema[k].Default != nil { 54 expr, err := castParameter(*schema[k].Default, schema[k]) 55 if err != nil { 56 return nil, errors.Wrap(err, "config."+k) 57 } 58 machine.Register("config."+k, expr) 59 } 60 } 61 return machine, nil 62 } 63 64 func ApplyWorkflowConfig(t *testworkflowsv1.TestWorkflow, cfg map[string]intstr.IntOrString) (*testworkflowsv1.TestWorkflow, error) { 65 if t == nil { 66 return t, nil 67 } 68 machine, err := createConfigMachine(cfg, t.Spec.Config) 69 if err != nil { 70 return nil, err 71 } 72 err = expressionstcl.Simplify(&t, machine, configFinalizer) 73 return t, err 74 } 75 76 func ApplyWorkflowTemplateConfig(t *testworkflowsv1.TestWorkflowTemplate, cfg map[string]intstr.IntOrString) (*testworkflowsv1.TestWorkflowTemplate, error) { 77 if t == nil { 78 return t, nil 79 } 80 machine, err := createConfigMachine(cfg, t.Spec.Config) 81 if err != nil { 82 return nil, err 83 } 84 err = expressionstcl.Simplify(&t, machine, configFinalizer) 85 return t, err 86 }