/
stack_template.go
73 lines (68 loc) · 2.59 KB
/
stack_template.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
67
68
69
70
71
72
73
package project
import (
"fmt"
"github.com/Masterminds/semver"
"github.com/apex/log"
"github.com/shalb/cluster.dev/pkg/config"
"github.com/shalb/cluster.dev/pkg/utils"
"gopkg.in/yaml.v3"
)
const stackTemplateObjKindKey = "StackTemplate"
type stackTemplate struct {
Name string `yaml:"name"`
Kind string `yaml:"kind"`
Units []map[string]interface{} `yaml:"units"`
Modules []map[string]interface{} `yaml:"modules,omitempty"`
ReqClientVersion string `yaml:"cliVersion"`
}
func NewStackTemplate(data []byte) (*stackTemplate, error) {
iTmpl := stackTemplate{}
err := yaml.Unmarshal(data, &iTmpl)
if err != nil {
return nil, fmt.Errorf("unmarshal template data: %v", utils.ResolveYamlError(data, err))
}
if len(iTmpl.Units) < 1 {
if len(iTmpl.Modules) < 1 {
return nil, fmt.Errorf("parsing template: template must contain at least one unit")
}
iTmpl.Units = iTmpl.Modules
iTmpl.Modules = nil
log.Warnf("'modules' key is deprecated and will be removed in future releases. Use 'units' instead")
}
if iTmpl.Name == "" {
return nil, fmt.Errorf("parsing template: template must contain 'name' field")
}
if iTmpl.Kind != stackTemplateObjKindKey {
if iTmpl.Kind != "InfraTemplate" {
return nil, fmt.Errorf("parsing template: unknown template object kind or kind is not set: '%v'", iTmpl.Kind)
}
log.Warnf("'InfraTemplate' kind is deprecated and will be removed in future releases. Use 'StackTemplate' instead")
}
if iTmpl.ReqClientVersion != "" {
log.Debug("Checking client version...")
reqVerConstraints, err := semver.NewConstraint(iTmpl.ReqClientVersion)
if err != nil {
return nil, fmt.Errorf("parsing template: can't parse required client version: %v", iTmpl.ReqClientVersion)
}
ver, err := semver.NewVersion(config.Global.Version)
if err != nil {
// Invalid current cli version. Maybe test revision.
return nil, fmt.Errorf("parsing template: can't parse client version: %v", iTmpl.ReqClientVersion)
}
ok, messages := reqVerConstraints.Validate(ver)
errReasons := ""
if !ok {
if len(messages) > 1 {
for _, msg := range messages {
errReasons += fmt.Sprintf("cdev version: %v\n", msg)
}
} else {
errReasons = messages[0].Error()
}
return nil, fmt.Errorf("cdev template version validation error: template: '%v', cli: '%v', req: '%v', message: '%v'", iTmpl.Name, ver, iTmpl.ReqClientVersion, errReasons)
}
log.Debugf("Version validated: stack: %v cli: %v, req: %v", iTmpl.Name, ver, iTmpl.ReqClientVersion)
}
// i.TemplateSrc = src
return &iTmpl, nil
}