github.com/kubeshop/testkube@v1.17.23/internal/template/parser.go (about)

     1  package parser
     2  
     3  import (
     4  	"encoding/base64"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/pkg/errors"
    10  
    11  	"github.com/kubeshop/testkube/internal/config"
    12  	"github.com/kubeshop/testkube/pkg/executor"
    13  	"github.com/kubeshop/testkube/pkg/log"
    14  	"github.com/kubeshop/testkube/pkg/utils"
    15  )
    16  
    17  func ParseJobTemplates(cfg *config.Config) (t executor.Templates, err error) {
    18  	t.Job, err = LoadConfigFromStringOrFile(
    19  		cfg.TestkubeTemplateJob,
    20  		cfg.TestkubeConfigDir,
    21  		"job-template.yml",
    22  		"job template",
    23  	)
    24  	if err != nil {
    25  		return t, err
    26  	}
    27  
    28  	t.Slave, err = LoadConfigFromStringOrFile(
    29  		cfg.TestkubeTemplateSlavePod,
    30  		cfg.TestkubeConfigDir,
    31  		"slave-pod-template.yml",
    32  		"slave pod template",
    33  	)
    34  	if err != nil {
    35  		return t, err
    36  	}
    37  
    38  	t.PVC, err = LoadConfigFromStringOrFile(
    39  		cfg.TestkubeContainerTemplatePVC,
    40  		cfg.TestkubeConfigDir,
    41  		"pvc-template.yml",
    42  		"pvc template",
    43  	)
    44  	if err != nil {
    45  		return t, err
    46  	}
    47  
    48  	return t, nil
    49  }
    50  
    51  func ParseContainerTemplates(cfg *config.Config) (t executor.Templates, err error) {
    52  	t.Job, err = LoadConfigFromStringOrFile(
    53  		cfg.TestkubeContainerTemplateJob,
    54  		cfg.TestkubeConfigDir,
    55  		"job-container-template.yml",
    56  		"job container template",
    57  	)
    58  	if err != nil {
    59  		return t, err
    60  	}
    61  
    62  	t.Scraper, err = LoadConfigFromStringOrFile(
    63  		cfg.TestkubeContainerTemplateScraper,
    64  		cfg.TestkubeConfigDir,
    65  		"job-scraper-template.yml",
    66  		"job scraper template",
    67  	)
    68  	if err != nil {
    69  		return t, err
    70  	}
    71  
    72  	t.PVC, err = LoadConfigFromStringOrFile(
    73  		cfg.TestkubeContainerTemplatePVC,
    74  		cfg.TestkubeConfigDir,
    75  		"pvc-template.yml",
    76  		"pvc template",
    77  	)
    78  	if err != nil {
    79  		return t, err
    80  	}
    81  
    82  	return t, nil
    83  }
    84  
    85  func LoadConfigFromStringOrFile(inputString, configDir, filename, configType string) (raw string, err error) {
    86  	var data []byte
    87  
    88  	if inputString != "" {
    89  		if utils.IsBase64Encoded(inputString) {
    90  			data, err = base64.StdEncoding.DecodeString(inputString)
    91  			if err != nil {
    92  				return "", errors.Wrapf(err, "error decoding %s from base64", configType)
    93  			}
    94  			raw = string(data)
    95  			log.DefaultLogger.Infof("parsed %s from base64 env var", configType)
    96  		} else {
    97  			raw = inputString
    98  			log.DefaultLogger.Infof("parsed %s from plain env var", configType)
    99  		}
   100  	} else if f, err := os.Open(filepath.Join(configDir, filename)); err == nil {
   101  		data, err = io.ReadAll(f)
   102  		if err != nil {
   103  			return "", errors.Wrapf(err, "error reading file %s from config dir %s", filename, configDir)
   104  		}
   105  		raw = string(data)
   106  		log.DefaultLogger.Infof("loaded %s from file %s", configType, filepath.Join(configDir, filename))
   107  	} else {
   108  		log.DefaultLogger.Infof("no %s config found", configType)
   109  	}
   110  
   111  	return raw, nil
   112  }