-
Notifications
You must be signed in to change notification settings - Fork 88
/
config.go
158 lines (133 loc) · 4.75 KB
/
config.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package kotsadmconfig
import (
"context"
"os"
"github.com/pkg/errors"
kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
kotsconfig "github.com/replicatedhq/kots/pkg/config"
"github.com/replicatedhq/kots/pkg/k8sutil"
"github.com/replicatedhq/kots/pkg/kotsutil"
"github.com/replicatedhq/kots/pkg/logger"
"github.com/replicatedhq/kots/pkg/persistence"
registrytypes "github.com/replicatedhq/kots/pkg/registry/types"
"github.com/replicatedhq/kots/pkg/template"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/scheme"
)
func IsRequiredItem(item kotsv1beta1.ConfigItem) bool {
if !item.Required {
return false
}
if item.Hidden || item.When == "false" {
return false
}
return true
}
func IsUnsetItem(item kotsv1beta1.ConfigItem) bool {
if item.Value.String() != "" {
return false
}
if item.Default.String() != "" {
return false
}
return true
}
func NeedsConfiguration(kotsKinds *kotsutil.KotsKinds, registrySettings registrytypes.RegistrySettings) (bool, error) {
configSpec, err := kotsKinds.Marshal("kots.io", "v1beta1", "Config")
if err != nil {
return false, errors.Wrap(err, "failed to marshal config spec")
}
if configSpec == "" {
return false, nil
}
configValuesSpec, err := kotsKinds.Marshal("kots.io", "v1beta1", "ConfigValues")
if err != nil {
return false, errors.Wrap(err, "failed to marshal configvalues spec")
}
licenseSpec, err := kotsKinds.Marshal("kots.io", "v1beta1", "License")
if err != nil {
return false, errors.Wrap(err, "failed to marshal license spec")
}
identityConfigSpec, err := kotsKinds.Marshal("kots.io", "v1beta1", "IdentityConfig")
if err != nil {
return false, errors.Wrap(err, "failed to marshal identityconfig spec")
}
localRegistry := template.LocalRegistry{
Host: registrySettings.Hostname,
Namespace: registrySettings.Namespace,
Username: registrySettings.Username,
Password: registrySettings.Password,
ReadOnly: registrySettings.IsReadOnly,
}
rendered, err := kotsconfig.TemplateConfig(logger.NewCLILogger(), configSpec, configValuesSpec, licenseSpec, identityConfigSpec, localRegistry)
if err != nil {
return false, errors.Wrap(err, "failed to template config")
}
decode := scheme.Codecs.UniversalDeserializer().Decode
decoded, gvk, err := decode([]byte(rendered), nil, nil)
if err != nil {
return false, errors.Wrap(err, "failed to decode config")
}
if gvk.Group != "kots.io" || gvk.Version != "v1beta1" || gvk.Kind != "Config" {
return false, errors.Errorf("unexpected gvk found in metadata: %s/%s/%s", gvk.Group, gvk.Version, gvk.Kind)
}
renderedConfig := decoded.(*kotsv1beta1.Config)
for _, group := range renderedConfig.Spec.Groups {
if group.When == "false" {
continue
}
for _, item := range group.Items {
if IsRequiredItem(item) && IsUnsetItem(item) {
return true, nil
}
}
}
return false, nil
}
// UpdateConfigValuesInDB it gets the config values from filesInDir and
// updates the app version config values in the db for the given sequence and app id
func UpdateConfigValuesInDB(filesInDir string, appID string, sequence int64) error {
kotsKinds, err := kotsutil.LoadKotsKindsFromPath(filesInDir)
if err != nil {
return errors.Wrap(err, "failed to read kots kinds")
}
configValues, err := kotsKinds.Marshal("kots.io", "v1beta1", "ConfigValues")
if err != nil {
return errors.Wrap(err, "failed to marshal configvalues spec")
}
db := persistence.MustGetPGSession()
query := `update app_version set config_values = $1 where app_id = $2 and sequence = $3`
_, err = db.Exec(query, configValues, appID, sequence)
if err != nil {
return errors.Wrap(err, "failed to update config values in db")
}
return nil
}
func ReadConfigValuesFromInClusterSecret() (string, error) {
log := logger.NewCLILogger()
clientset, err := k8sutil.GetClientset()
if err != nil {
return "", errors.Wrap(err, "failed to get k8s client set")
}
configValuesSecrets, err := clientset.CoreV1().Secrets(os.Getenv("POD_NAMESPACE")).List(context.TODO(), metav1.ListOptions{
LabelSelector: "kots.io/automation=configvalues",
})
if err != nil {
return "", errors.Wrap(err, "failed to list configvalues secrets")
}
// just get the first
for _, configValuesSecret := range configValuesSecrets.Items {
configValues, ok := configValuesSecret.Data["configvalues"]
if !ok {
log.Error(errors.Errorf("config values secret %q does not contain config values key", configValuesSecret.Name))
continue
}
// delete it, these are one time use secrets
err = clientset.CoreV1().Secrets(configValuesSecret.Namespace).Delete(context.TODO(), configValuesSecret.Name, metav1.DeleteOptions{})
if err != nil {
log.Error(errors.Errorf("error deleting config values secret: %v", err))
}
return string(configValues), nil
}
return "", nil
}