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 }