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  }