-
Notifications
You must be signed in to change notification settings - Fork 172
/
Copy pathspec.go
117 lines (94 loc) · 2.56 KB
/
spec.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package spec
import (
"encoding/json"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"github.com/pkg/errors"
"github.com/grafana/tanka/pkg/spec/v1alpha1"
)
// APIGroup is the prefix used for `kind`
const APIGroup = "tanka.dev"
// Specfile is the filename for the environment config
const Specfile = "spec.json"
// ParseDir parses the given environments `spec.json` into a `v1alpha1.Environment`
// object with the name set to the directories name
func ParseDir(baseDir, name string) (*v1alpha1.Environment, error) {
fi, err := os.Stat(baseDir)
if err != nil {
return nil, err
}
if !fi.IsDir() {
return nil, errors.New("baseDir is not an directory")
}
data, err := ioutil.ReadFile(filepath.Join(baseDir, Specfile))
if err != nil {
if os.IsNotExist(err) {
c := v1alpha1.New()
c.Metadata.Name = name
return c, ErrNoSpec{name}
}
return nil, err
}
c, err := Parse(data)
if c != nil {
// set the name field
c.Metadata.Name = name
}
return c, err
}
// Parse parses the json `data` into a `v1alpha1.Environment` object.
func Parse(data []byte) (*v1alpha1.Environment, error) {
config := v1alpha1.New()
if err := json.Unmarshal(data, config); err != nil {
return nil, errors.Wrap(err, "parsing spec.json")
}
if err := handleDeprecated(config, data); err != nil {
return config, err
}
// default apiServer URL to https
if !regexp.MustCompile("^.+://").MatchString(config.Spec.APIServer) {
config.Spec.APIServer = "https://" + config.Spec.APIServer
}
return config, nil
}
func handleDeprecated(c *v1alpha1.Environment, data []byte) error {
var errDepr ErrDeprecated
var msi map[string]interface{}
if err := json.Unmarshal(data, &msi); err != nil {
return err
}
// namespace -> spec.namespace
if n, ok := msi["namespace"]; ok && c.Spec.Namespace == "" {
n, ok := n.(string)
if !ok {
return ErrMistypedField{"namespace", n}
}
errDepr = append(errDepr, depreciation{"namespace", "spec.namespace"})
c.Spec.Namespace = n
}
// server -> spec.apiServer
if s, ok := msi["server"]; ok && c.Spec.APIServer == "" {
s, ok := s.(string)
if !ok {
return ErrMistypedField{"server", s}
}
errDepr = append(errDepr, depreciation{"server", "spec.apiServer"})
c.Spec.APIServer = s
}
// team -> metadata.labels.team
_, hasTeam := c.Metadata.Labels["team"]
if t, ok := msi["team"]; ok && !hasTeam {
t, ok := t.(string)
if !ok {
return ErrMistypedField{"team", t}
}
errDepr = append(errDepr, depreciation{"team", "metadata.labels.team"})
c.Metadata.Labels["team"] = t
}
if len(errDepr) != 0 {
return errDepr
}
return nil
}