/
manifest.go
66 lines (54 loc) · 1.78 KB
/
manifest.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package distro
import (
"bytes"
"github.com/Masterminds/sprig/v3"
"html/template"
"strings"
"gopkg.in/yaml.v3"
)
func ParseManifest(contents []byte) (m *Manifest, err error) {
if err := yaml.Unmarshal(contents, &m); err != nil {
return nil, err
}
return m, nil
}
type Manifest struct {
Version int `json:"version" yaml:"version" default:"2"`
Name string `json:"name,omitempty" yaml:"name,omitempty"`
Base string `json:"base_dir" yaml:"base_dir" default:"."`
Modes []Mode `json:"modes" yaml:"modes"`
Saltstack Saltstack `json:"saltstack,omitempty" yaml:"saltstack,omitempty"`
SupportedOS []SupportedOS `json:"supported_os,omitempty" yaml:"supported_os,omitempty"`
}
type Mode struct {
Name string `json:"name" yaml:"name"`
State string `json:"state" yaml:"state"`
Deprecated bool `json:"deprecated" yaml:"deprecated,omitempty"`
Replacement string `json:"replacement" yaml:"replacement,omitempty"`
Default bool `json:"default" yaml:"default,omitempty"`
}
type SupportedOS struct {
ID string `yaml:"id"`
Release string `yaml:"release,omitempty"`
Codename string `yaml:"codename,omitempty"`
}
type Saltstack struct {
Pillars map[string]string `json:"pillars,omitempty" yaml:"pillars,omitempty"`
}
func (m *Manifest) Render(data interface{}) error {
for name, val := range m.Saltstack.Pillars {
if strings.HasSuffix(name, "_template") {
tmpl, err := template.New("pillar_template").Funcs(sprig.FuncMap()).Parse(val)
if err != nil {
return err
}
var content bytes.Buffer
if err := tmpl.Execute(&content, data); err != nil {
return err
}
m.Saltstack.Pillars[strings.TrimSuffix(name, "_template")] = content.String()
delete(m.Saltstack.Pillars, name)
}
}
return nil
}