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  }