github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/surveyutils/schema_template.go (about) 1 package surveyutils 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "path/filepath" 7 "strings" 8 "text/template" 9 10 "github.com/jenkins-x/jx-logging/pkg/log" 11 "github.com/olli-ai/jx/v2/pkg/config" 12 "github.com/olli-ai/jx/v2/pkg/helm" 13 "github.com/olli-ai/jx/v2/pkg/util" 14 "k8s.io/helm/pkg/chartutil" 15 16 "github.com/pkg/errors" 17 ) 18 19 // TemplateSchemaFile if there is a template for the schema file then evaluate it and write the schema file 20 func TemplateSchemaFile(schemaFileName string, requirements *config.RequirementsConfig) error { 21 templateFile := strings.TrimSuffix(schemaFileName, ".schema.json") + ".tmpl.schema.json" 22 exists, err := util.FileExists(templateFile) 23 if err != nil { 24 return err 25 } 26 if !exists { 27 return nil 28 } 29 data, err := ReadSchemaTemplate(templateFile, requirements) 30 if err != nil { 31 return errors.Wrapf(err, "failed to render schema template %s", templateFile) 32 } 33 err = ioutil.WriteFile(schemaFileName, data, util.DefaultWritePermissions) 34 if err != nil { 35 return errors.Wrapf(err, "failed to save schema file %s generated from template %s", schemaFileName, templateFile) 36 } 37 log.Logger().Infof("generated schema file %s from template %s\n", util.ColorInfo(schemaFileName), util.ColorInfo(templateFile)) 38 return nil 39 } 40 41 func validateRequirements(requirements *config.RequirementsConfig) { 42 if requirements.Cluster.GitKind == "" { 43 requirements.Cluster.GitKind = "github" 44 } 45 if requirements.Cluster.GitServer == "" { 46 switch requirements.Cluster.GitKind { 47 case "bitbucketcloud": 48 requirements.Cluster.GitServer = "https://bitbucket.org" 49 case "github": 50 requirements.Cluster.GitServer = "https://github.com" 51 case "gitlab": 52 requirements.Cluster.GitServer = "https://gitlab.com" 53 } 54 } 55 } 56 57 // readSchemaTemplate evaluates the given go template file and returns the output data 58 func ReadSchemaTemplate(templateFile string, requirements *config.RequirementsConfig) ([]byte, error) { 59 _, name := filepath.Split(templateFile) 60 funcMap := helm.NewFunctionMap() 61 tmpl, err := template.New(name).Option("missingkey=error").Funcs(funcMap).ParseFiles(templateFile) 62 if err != nil { 63 return nil, errors.Wrapf(err, "failed to parse schema template: %s", templateFile) 64 } 65 66 validateRequirements(requirements) 67 68 requirementsMap, err := requirements.ToMap() 69 if err != nil { 70 return nil, errors.Wrapf(err, "failed turn requirements into a map: %v", requirements) 71 } 72 73 templateData := map[string]interface{}{ 74 "GitKind": requirements.Cluster.GitKind, 75 "GitServer": requirements.Cluster.GitServer, 76 "GithubApp": requirements.GithubApp != nil && requirements.GithubApp.Enabled, 77 "Requirements": chartutil.Values(requirementsMap), 78 "Environments": chartutil.Values(requirements.EnvironmentMap()), 79 } 80 var buf bytes.Buffer 81 err = tmpl.Execute(&buf, templateData) 82 if err != nil { 83 return nil, errors.Wrapf(err, "failed to execute schema template: %s", templateFile) 84 } 85 data := buf.Bytes() 86 return data, nil 87 }