func executeTemplate(rootTemplte *template.Template, templateName string, machine datasource.Machine, hostAddr string) (string, error) { template := rootTemplte.Lookup(templateName) if template == nil { return "", fmt.Errorf("template with name=%s wasn't found for root=%s", templateName, rootTemplte) } buf := new(bytes.Buffer) template.Funcs(map[string]interface{}{ "V": func(key string) string { flag, err := machine.GetFlag(key) if err != nil { // TODO excepts Not-Found logging.Log(templatesDebugTag, "Error while getting flag key=%s for machine=%s: %s", key, machine.Name(), err) return "" } return flag }, "b64": func(text string) string { return base64.StdEncoding.EncodeToString([]byte(text)) }, "b64template": func(templateName string) string { text, err := executeTemplate(rootTemplte, templateName, machine, hostAddr) if err != nil { logging.Log(templatesDebugTag, "Error while b64template for templateName=%s machine=%s: %s", templateName, machine.Name(), err) return "" } return base64.StdEncoding.EncodeToString([]byte(text)) }, }) ip, _ := machine.IP() data := struct { Mac string IP string Hostname string Domain string HostAddr string }{ machine.Mac().String(), ip.String(), machine.Name(), machine.Domain(), hostAddr, } err := template.ExecuteTemplate(buf, templateName, &data) if err != nil { return "", err } str := buf.String() str = strings.Trim(str, "\n") return str, nil }
func executeTemplate(rootTemplte *template.Template, templateName string, ds datasource.DataSource, machineInterface datasource.MachineInterface, webServerAddr string) (string, error) { template := rootTemplte.Lookup(templateName) if template == nil { return "", fmt.Errorf("template with name=%s wasn't found for root=%v", templateName, rootTemplte) } mac := machineInterface.Mac().String() buf := new(bytes.Buffer) template.Funcs(map[string]interface{}{ "V": func(key string) string { value, err := machineInterface.GetVariable(key) if err != nil { log.WithField("where", "templating.executeTemplate").WithError(err).Warn( "error while GetVariable") } return value }, "b64": func(text string) string { return base64.StdEncoding.EncodeToString([]byte(text)) }, "b64template": func(templateName string) string { text, err := executeTemplate(rootTemplte, templateName, ds, machineInterface, webServerAddr) if err != nil { log.WithField("where", "templating.executeTemplate").WithError(err).Warnf( "error while executeTemplate(templateName=%s machine=%s)", templateName, mac) return "" } return base64.StdEncoding.EncodeToString([]byte(text)) }, }) etcdMembers, _ := ds.EtcdMembers() machine, err := machineInterface.Machine(false, nil) if err != nil { return "", err } data := struct { Mac string IP string Hostname string Domain string WebServerAddr string EtcdEndpoints string }{ mac, machine.IP.String(), machineInterface.Hostname(), ds.ClusterName(), webServerAddr, etcdMembers, } err = template.ExecuteTemplate(buf, templateName, &data) if err != nil { return "", err } str := buf.String() str = strings.Trim(str, "\n") return str, nil }