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 }