Docker template generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

template_generator.go 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package main
  2. import (
  3. "go.uber.org/zap"
  4. "io/ioutil"
  5. "path"
  6. "sort"
  7. "strings"
  8. "text/template"
  9. )
  10. type Context struct {
  11. Containers map[string]Container
  12. Hostnames map[string]Hostname
  13. }
  14. type TemplateConfig struct {
  15. Source string
  16. Destination string
  17. }
  18. type Template struct {
  19. config TemplateConfig
  20. content string
  21. template *template.Template
  22. }
  23. type TemplateGenerator struct {
  24. logger *zap.SugaredLogger
  25. templates []*Template
  26. }
  27. var funcMap = template.FuncMap{
  28. "replace": func(from, to, input string) string { return strings.Replace(input, from, to, -1) },
  29. "split": func(sep, input string) []string { return strings.Split(input, sep) },
  30. "join": func(sep string, input []string) string { return strings.Join(input, sep) },
  31. "sortlines": func(input string) string {
  32. lines := strings.Split(input, "\n")
  33. sort.Strings(lines)
  34. return strings.Join(lines, "\n")
  35. },
  36. }
  37. func NewTemplateGenerator(logger *zap.SugaredLogger) *TemplateGenerator {
  38. return &TemplateGenerator{
  39. logger: logger,
  40. }
  41. }
  42. func (t *TemplateGenerator) AddTemplate(config TemplateConfig) {
  43. t.logger.Infof("Adding template from %s, writing to %s", config.Source, config.Destination)
  44. tmpl, err := template.New(path.Base(config.Source)).Funcs(funcMap).ParseFiles(config.Source)
  45. if err != nil {
  46. t.logger.Fatal("Unable to parse template", err)
  47. }
  48. buf, _ := ioutil.ReadFile(config.Destination)
  49. t.templates = append(t.templates, &Template{
  50. config: config,
  51. content: string(buf),
  52. template: tmpl,
  53. })
  54. }
  55. func (t *TemplateGenerator) Generate(context Context) {
  56. for _, tmpl := range t.templates {
  57. t.logger.Debugf("Checking for updates to %s", tmpl.config.Source)
  58. builder := &strings.Builder{}
  59. err := tmpl.template.Execute(builder, context)
  60. if err != nil {
  61. panic(err)
  62. }
  63. if tmpl.content != builder.String() {
  64. t.logger.Debugf("%s has been updated, writing to %s", tmpl.config.Source, tmpl.config.Destination)
  65. t.logger.Debug(builder.String())
  66. tmpl.content = builder.String()
  67. err = ioutil.WriteFile(tmpl.config.Destination, []byte(builder.String()), 0666)
  68. if err != nil {
  69. t.logger.Fatal("Unable to write template", err)
  70. }
  71. }
  72. }
  73. }