-
Notifications
You must be signed in to change notification settings - Fork 131
/
components.go
106 lines (88 loc) · 2.95 KB
/
components.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
// Copyright (c) 2020 Tigera, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"fmt"
"io/ioutil"
"os"
"text/template"
"gopkg.in/yaml.v2"
)
var defaultImages = map[string]string{
"calico/cni": "calico/cni",
"calico/dikastes": "calico/dikastes",
"calico/kube-controllers": "calico/kube-controllers",
"calico/node": "calico/node",
"calicoctl": "calico/ctl",
"flannel": "coreos/flannel",
"flexvol": "calico/pod2daemon-flexvol",
"typha": "calico/typha",
"eck-kibana": "tigera/kibana",
"guardian": "tigera/guardian",
"tigera-cni": "tigera/cni",
}
type Components map[string]*Component
type Component struct {
Version string `json:"version"`
Registry string `json:"registry"`
Digest string `json:"digest"`
Image string `json:"image"`
}
// GetComponents parses a versions.yml file, scrubs the data of known issues,
// and returns the data in a Components struct.
func GetComponents(versionsPath string) (Components, error) {
v, err := readComponents(versionsPath)
if err != nil {
return nil, fmt.Errorf("failed to read components: %v", err)
}
comps := make(Components)
// add known default images to any components that are missing them.
for key, component := range v {
if key == "calico" || key == "networking-calico" || key == "calico-private" || key == "cnx-manager-proxy" || key == "busybox" {
continue
}
if component.Image == "" {
image := defaultImages[key]
if image == "" {
return nil, fmt.Errorf("no image nor default image available for component '%s'. "+
"Either fill in the 'image' field or update this code with a defaultImage.", key)
}
component.Image = image
}
comps[key] = component
}
return comps, nil
}
// readComponents opens a versions.yml file and returns the components
// section in a Components struct.
func readComponents(versionsPath string) (Components, error) {
f, err := ioutil.ReadFile(versionsPath)
if err != nil {
return nil, err
}
c := struct {
Components Components
}{}
if err := yaml.Unmarshal(f, &c); err != nil {
return nil, err
}
return c.Components, nil
}
func render(tplFile string, vz Components) error {
t, err := template.ParseFiles(tplFile)
if err != nil {
return fmt.Errorf("failed to parse template file file: %v", err)
}
t.Option("missingkey=error")
return t.Execute(os.Stdout, vz)
}