-
Notifications
You must be signed in to change notification settings - Fork 50
/
requirements_values.go
106 lines (94 loc) · 4 KB
/
requirements_values.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
package reqvalues
import (
"io/ioutil"
"path/filepath"
jxcore "github.com/jenkins-x/jx-api/v4/pkg/apis/core/v4beta1"
"github.com/jenkins-x/jx-helpers/v3/pkg/files"
"github.com/jenkins-x/jx-helpers/v3/pkg/maps"
"github.com/jenkins-x/jx-helpers/v3/pkg/termcolor"
"github.com/jenkins-x/jx-helpers/v3/pkg/yamls"
"github.com/jenkins-x/jx-logging/v3/pkg/log"
"github.com/pkg/errors"
"sigs.k8s.io/yaml"
)
const (
// RequirementsValuesFileName is the name of the helm values.yaml configuration file for common Jenkins X values
// such as cluster information, environments and ingress
RequirementsValuesFileName = "jx-values.yaml"
)
var jxValuesComment = `# NOTE this file is autogenerated - DO NOT EDIT!
#
# This file is created from the jx-requirements.yml and jx-global-values.yaml files.
# For more information see: https://jenkins-x.io/v3/develop/apps/#using-requirements-in-charts
`
type HelmfileConditional struct {
Enabled bool `json:"enabled"`
}
// RequirementsValues contains the logical installation requirements in the `jx-requirements.yml` file as helm values
type RequirementsValues struct {
// RequirementsConfig contains the logical installation requirements
RequirementsConfig *jxcore.RequirementsConfig `json:"jxRequirements,omitempty"`
IngressExternalDNSCondition *HelmfileConditional `json:"jxRequirementsIngressExternalDNS,omitempty"`
IngressTLSCondition *HelmfileConditional `json:"jxRequirementsIngressTLS,omitempty"`
KuberhealthyCondition *HelmfileConditional `json:"jxRequirementsKuberhealthy,omitempty"`
TLSCheckCondition *HelmfileConditional `json:"jxRequirementsTLSCheck,omitempty"`
VaultCondition *HelmfileConditional `json:"jxRequirementsVault,omitempty"`
// JX map[string]interface{} `json:"jx,omitempty"`
}
// SaveRequirementsValuesFile saves the requirements yaml file for use with helmfile / helm 3
func SaveRequirementsValuesFile(c *jxcore.RequirementsConfig, dir, fileName string) error {
// lets initialise an empty struct to handle backwards compatibility
if c.Ingress.TLS == nil {
c.Ingress.TLS = &jxcore.TLSConfig{}
}
jxGlobals, err := loadJXGlobals(dir)
if err != nil {
return errors.Wrapf(err, "failed to load global helm values files")
}
y := &RequirementsValues{
RequirementsConfig: c,
IngressExternalDNSCondition: &HelmfileConditional{Enabled: c.Ingress.ExternalDNS},
IngressTLSCondition: &HelmfileConditional{Enabled: c.Ingress.TLS.Enabled},
KuberhealthyCondition: &HelmfileConditional{Enabled: c.Kuberhealthy},
TLSCheckCondition: &HelmfileConditional{Enabled: c.Kuberhealthy && c.Ingress.TLS.Enabled},
VaultCondition: &HelmfileConditional{Enabled: c.SecretStorage == jxcore.SecretStorageTypeVault},
}
global, err := yaml.Marshal(jxGlobals)
if err != nil {
return errors.Wrap(err, "failed to marshal to YAML")
}
data, err := yaml.Marshal(y)
if err != nil {
return errors.Wrap(err, "failed to marshal to YAML")
}
text := jxValuesComment + string(global) + string(data)
err = ioutil.WriteFile(fileName, []byte(text), files.DefaultFileWritePermissions)
if err != nil {
return errors.Wrapf(err, "failed to save file %s", fileName)
}
log.Logger().Debugf("generated helm YAML file from jx requirements at %s", termcolor.ColorInfo(fileName))
return nil
}
func loadJXGlobals(dir string) (map[string]interface{}, error) {
answer := map[string]interface{}{}
fileNames := []string{
filepath.Join(dir, "versionStream", "src", "fake-secrets.yaml.gotmpl"),
filepath.Join(dir, "imagePullSecrets.yaml"),
filepath.Join(dir, "jx-global-values.yaml"),
}
for _, f := range fileNames {
m := map[string]interface{}{}
exists, err := files.FileExists(f)
if err != nil {
return nil, errors.Wrapf(err, "failed to check if file exists %s", f)
}
if exists {
err := yamls.LoadFile(f, &m)
if err != nil {
return nil, errors.Wrapf(err, "failed to load file %s", f)
}
maps.CombineMapTrees(answer, m)
}
}
return answer, nil
}