github.com/kubeshop/testkube@v1.17.23/pkg/crd/crd.go (about)

     1  package crd
     2  
     3  import (
     4  	"bytes"
     5  	"embed"
     6  	"fmt"
     7  	"text/template"
     8  
     9  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    10  )
    11  
    12  //go:embed templates
    13  var f embed.FS
    14  
    15  // Template is crd template type
    16  type Template string
    17  
    18  const (
    19  	// TemplateExecutor is executor crd template
    20  	TemplateExecutor Template = "executor"
    21  	// TemplateWebhook is webhook crd template
    22  	TemplateWebhook Template = "webhook"
    23  	// TemplateTest is test crd template
    24  	TemplateTest Template = "test"
    25  	// TemplateTestSuite is test suite crd template
    26  	TemplateTestSuite Template = "testsuite"
    27  	// TemplateTestTrigger is test trigger crd template
    28  	TemplateTestTrigger Template = "testtrigger"
    29  	// TemplateTestSource is test source crd template
    30  	TemplateTestSource Template = "testsource"
    31  	// TemplateTemplate is template crd template
    32  	TemplateTemplate Template = "template"
    33  )
    34  
    35  // Gettable is an interface of gettable objects
    36  type Gettable interface {
    37  	testkube.Test |
    38  		testkube.TestSuite |
    39  		testkube.Webhook |
    40  		testkube.TestUpsertRequest |
    41  		testkube.TestSuiteUpsertRequest |
    42  		testkube.ExecutorUpsertRequest |
    43  		testkube.WebhookCreateRequest |
    44  		testkube.TestTrigger |
    45  		testkube.TestTriggerUpsertRequest |
    46  		testkube.TestSource |
    47  		testkube.TestSourceUpsertRequest |
    48  		testkube.Template |
    49  		testkube.TemplateCreateRequest
    50  }
    51  
    52  // ExecuteTemplate executes crd template
    53  func ExecuteTemplate(tmpl Template, data any) (string, error) {
    54  	t, err := template.ParseFS(f, fmt.Sprintf("templates/%s.tmpl", tmpl))
    55  	if err != nil {
    56  		return "", err
    57  	}
    58  
    59  	buffer := bytes.NewBuffer([]byte{})
    60  	err = t.Execute(buffer, data)
    61  	return buffer.String(), err
    62  }
    63  
    64  // GenerateYAML generates CRDs yaml for Testkube models
    65  func GenerateYAML[G Gettable](tmpl Template, items []G) (string, error) {
    66  	data := ""
    67  	firstEntry := true
    68  	for _, item := range items {
    69  		result, err := ExecuteTemplate(tmpl, item)
    70  		if err != nil {
    71  			return "", fmt.Errorf("could not populate YAML template for %s: %w", tmpl, err)
    72  		}
    73  
    74  		if !firstEntry {
    75  			data += "\n---\n"
    76  		} else {
    77  			firstEntry = false
    78  		}
    79  
    80  		data += result
    81  	}
    82  
    83  	return data, nil
    84  }