github.com/kubernetes-incubator/kube-aws@v0.16.4/filereader/texttemplate/texttemplate.go (about)

     1  package texttemplate
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"regexp"
     9  	"strings"
    10  	"text/template"
    11  
    12  	"github.com/Masterminds/semver"
    13  	"github.com/Masterminds/sprig"
    14  	"github.com/kubernetes-incubator/kube-aws/fingerprint"
    15  	"github.com/kubernetes-incubator/kube-aws/logger"
    16  	"github.com/kubernetes-incubator/kube-aws/tmpl"
    17  )
    18  
    19  func ParseFile(filename string, funcs template.FuncMap) (*template.Template, error) {
    20  	raw, err := ioutil.ReadFile(filename)
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  
    25  	return Parse(filename, string(raw), funcs)
    26  }
    27  
    28  var funcs2 = template.FuncMap{
    29  	"checkSizeLessThan": func(size int, content string) (string, error) {
    30  		if len(content) >= size {
    31  			return "", fmt.Errorf("Content length exceeds maximum size %d", size)
    32  		}
    33  		return content, nil
    34  	},
    35  	"toJSON": func(v interface{}) (string, error) {
    36  		data, err := json.Marshal(v)
    37  		return string(data), err
    38  	},
    39  	"execTemplate": func(name string, ctx interface{}) (string, error) {
    40  		panic("[bug] Stub 'execTemplate' was not replaced")
    41  	},
    42  	"insertTemplateFile": func(name string, ctx interface{}) (string, error) {
    43  		panic("[bug] Stub 'insertTemplateFile' was not replaced")
    44  	},
    45  	"fingerprint": func(data string) string {
    46  		return fingerprint.SHA256(data)
    47  	},
    48  	"toLabel": func(data string) string {
    49  		reg := regexp.MustCompile("[^a-z0-9A-Z_.-]")
    50  		return reg.ReplaceAllString(data, "_")
    51  	},
    52  	"EbsOptimized": func(instanceType string) bool {
    53  		// Amazon instance series that do not support EBS optimize
    54  		nonSupportedSeries := map[string]bool{"t1": true, "t2": true}
    55  		// Amazon instance types that do not support EBS optimize
    56  		nonSupportedTypes := map[string]bool{
    57  			"c1.medium": true,
    58  			"c3.large":  true, "c3.8xlarge": true,
    59  			"cc2.8xlarge": true,
    60  			"cr1.8xlarge": true,
    61  			"g2.8xlarge":  true,
    62  			"i2.8xlarge":  true,
    63  			"m1.small":    true, "m1.medium": true,
    64  			"m2.xlarge": true,
    65  			"m3.medium": true, "m3.large": true,
    66  			"r3.large": true, "r3.8xlarge": true}
    67  		series := strings.Split(instanceType, ".")
    68  
    69  		return !nonSupportedSeries[series[0]] && !nonSupportedTypes[instanceType]
    70  	},
    71  	"checkVersion": func(constraint string, versionToCheck string) (bool, error) {
    72  		c, err := semver.NewConstraint(constraint)
    73  		if err != nil {
    74  			return false, err
    75  		}
    76  		v, err := semver.NewVersion(versionToCheck)
    77  		if err != nil {
    78  			return false, err
    79  		}
    80  		return c.Check(v), nil
    81  	},
    82  }
    83  
    84  func Parse(name string, raw string, funcs template.FuncMap) (*template.Template, error) {
    85  	t, err := template.New(name).Option("missingkey=error").Funcs(sprig.HermeticTxtFuncMap()).Funcs(tmpl.New().CreateFuncMap()).Funcs(funcs).Funcs(funcs2).Parse(raw)
    86  	if err == nil {
    87  		t = t.Funcs(template.FuncMap{
    88  			"execTemplate": func(name string, ctx interface{}) (string, error) {
    89  				b := bytes.Buffer{}
    90  				err := t.ExecuteTemplate(&b, name, ctx)
    91  				return b.String(), err
    92  			},
    93  			"insertTemplateFile": func(path string, ctx interface{}) (string, error) {
    94  				return GetString(path, ctx)
    95  			},
    96  		})
    97  	}
    98  	return t, err
    99  }
   100  
   101  func GetBytesBuffer(filename string, data interface{}) (*bytes.Buffer, error) {
   102  	logger.Debugf("Rendering filename %s with following data: \n%+v", filename, data)
   103  	tmpl, err := ParseFile(filename, nil)
   104  	if err != nil {
   105  		return nil, err
   106  	}
   107  
   108  	var buff bytes.Buffer
   109  	if err := tmpl.Execute(&buff, data); err != nil {
   110  		return nil, err
   111  	}
   112  	return &buff, nil
   113  }
   114  
   115  func GetString(filename string, data interface{}) (string, error) {
   116  	buf, err := GetBytesBuffer(filename, data)
   117  
   118  	if err != nil {
   119  		return "", err
   120  	}
   121  
   122  	return buf.String(), nil
   123  }