Skip to content

Commit 151f8d5

Browse files
Simon Emmsroboquat
Simon Emms
authored andcommitted
[installer]: validate the node labels by kind in config
1 parent 983b483 commit 151f8d5

File tree

4 files changed

+76
-45
lines changed

4 files changed

+76
-45
lines changed

install/installer/pkg/cluster/affinity.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,22 @@ const (
1313
AffinityLabelWorkspacesHeadless = "gitpod.io/workload_workspace_headless"
1414
)
1515

16-
var AffinityList = []string{
16+
var AffinityListMeta = []string{
1717
AffinityLabelMeta,
1818
AffinityLabelIDE,
19+
}
20+
21+
var AffinityListWorkspace = []string{
1922
AffinityLabelWorkspaceServices,
2023
AffinityLabelWorkspacesRegular,
2124
AffinityLabelWorkspacesHeadless,
2225
}
26+
27+
var AffinityList = func() []string {
28+
list := []string{}
29+
30+
list = append(list, AffinityListMeta...)
31+
list = append(list, AffinityListWorkspace...)
32+
33+
return list
34+
}()

install/installer/pkg/cluster/checks.go

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,40 +24,6 @@ const (
2424
kubernetesVersionConstraint = ">= 1.21.0-0"
2525
)
2626

27-
// checkAffinityLabels validates that the nodes have all the required affinity labels applied
28-
// It assumes all the values are `true`
29-
func checkAffinityLabels(ctx context.Context, config *rest.Config, namespace string) ([]ValidationError, error) {
30-
nodes, err := listNodesFromContext(ctx, config)
31-
if err != nil {
32-
return nil, err
33-
}
34-
35-
affinityList := map[string]bool{}
36-
for _, affinity := range AffinityList {
37-
affinityList[affinity] = false
38-
}
39-
40-
var res []ValidationError
41-
for _, node := range nodes {
42-
for k, v := range node.GetLabels() {
43-
if _, found := affinityList[k]; found {
44-
affinityList[k] = v == "true"
45-
}
46-
}
47-
}
48-
49-
// Check all the values in the map are `true`
50-
for k, v := range affinityList {
51-
if !v {
52-
res = append(res, ValidationError{
53-
Message: "Affinity label not found in cluster: " + k,
54-
Type: ValidationStatusError,
55-
})
56-
}
57-
}
58-
return res, nil
59-
}
60-
6127
// checkCertManagerInstalled checks that cert-manager is installed as a cluster dependency
6228
func checkCertManagerInstalled(ctx context.Context, config *rest.Config, namespace string) ([]ValidationError, error) {
6329
client, err := certmanager.NewForConfig(config)
@@ -91,7 +57,7 @@ func checkCertManagerInstalled(ctx context.Context, config *rest.Config, namespa
9157

9258
// checkContainerDRuntime checks that the nodes are running with the containerd runtime
9359
func checkContainerDRuntime(ctx context.Context, config *rest.Config, namespace string) ([]ValidationError, error) {
94-
nodes, err := listNodesFromContext(ctx, config)
60+
nodes, err := ListNodesFromContext(ctx, config)
9561
if err != nil {
9662
return nil, err
9763
}
@@ -139,7 +105,7 @@ func checkKubernetesVersion(ctx context.Context, config *rest.Config, namespace
139105
})
140106
}
141107

142-
nodes, err := listNodesFromContext(ctx, config)
108+
nodes, err := ListNodesFromContext(ctx, config)
143109
if err != nil {
144110
return nil, err
145111
}
@@ -263,7 +229,7 @@ func checkKernelVersion(ctx context.Context, config *rest.Config, namespace stri
263229
return nil, err
264230
}
265231

266-
nodes, err := listNodesFromContext(ctx, config)
232+
nodes, err := ListNodesFromContext(ctx, config)
267233
if err != nil {
268234
return nil, err
269235
}

install/installer/pkg/cluster/validation.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"encoding/json"
1010
"fmt"
11+
1112
corev1 "k8s.io/api/core/v1"
1213
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1314
"k8s.io/apimachinery/pkg/version"
@@ -65,11 +66,6 @@ var ClusterChecks = ValidationChecks{
6566
Description: "all cluster nodes run kubernetes version " + kubernetesVersionConstraint,
6667
Check: checkKubernetesVersion,
6768
},
68-
{
69-
Name: "affinity labels",
70-
Check: checkAffinityLabels,
71-
Description: "all required affinity node labels " + fmt.Sprint(AffinityList) + " are present in the cluster",
72-
},
7369
{
7470
Name: "cert-manager installed",
7571
Check: checkCertManagerInstalled,
@@ -100,7 +96,7 @@ func (checks ValidationChecks) Validate(ctx context.Context, config *rest.Config
10096
}
10197
ctx = context.WithValue(ctx, keyClientset, client)
10298

103-
list, err := listNodesFromContext(ctx, config)
99+
list, err := ListNodesFromContext(ctx, config)
104100
if err != nil {
105101
return nil, err
106102
}
@@ -147,7 +143,7 @@ const (
147143
keyClientset = "clientset"
148144
)
149145

150-
func listNodesFromContext(ctx context.Context, config *rest.Config) ([]corev1.Node, error) {
146+
func ListNodesFromContext(ctx context.Context, config *rest.Config) ([]corev1.Node, error) {
151147
client, err := clientsetFromContext(ctx, config)
152148
if err != nil {
153149
return nil, err

install/installer/pkg/config/v1/validation.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package config
66

77
import (
8+
"context"
89
"fmt"
910
"regexp"
1011

@@ -15,6 +16,7 @@ import (
1516

1617
"github.com/go-playground/validator/v10"
1718
corev1 "k8s.io/api/core/v1"
19+
"k8s.io/client-go/rest"
1820
)
1921

2022
var InstallationKindList = map[InstallationKind]struct{}{
@@ -121,6 +123,12 @@ func (v version) ClusterValidation(rcfg interface{}) cluster.ValidationChecks {
121123
var res cluster.ValidationChecks
122124
res = append(res, cluster.CheckSecret(cfg.Certificate.Name, cluster.CheckSecretRequiredData("tls.crt", "tls.key")))
123125

126+
res = append(res, cluster.ValidationCheck{
127+
Name: "affinity labels",
128+
Check: checkAffinityLabels(getAffinityListByKind(cfg.Kind)),
129+
Description: "all required affinity node labels " + fmt.Sprint(getAffinityListByKind(cfg.Kind)) + " are present in the cluster",
130+
})
131+
124132
if cfg.ObjectStorage.CloudStorage != nil {
125133
secretName := cfg.ObjectStorage.CloudStorage.ServiceAccount.Name
126134
res = append(res, cluster.CheckSecret(secretName, cluster.CheckSecretRequiredData("service-account.json")))
@@ -252,3 +260,52 @@ func (v version) ClusterValidation(rcfg interface{}) cluster.ValidationChecks {
252260

253261
return res
254262
}
263+
264+
// checkAffinityLabels validates that the nodes have all the required affinity labels applied
265+
// It assumes all the values are `true`
266+
func checkAffinityLabels(targetAffinityList []string) func(context.Context, *rest.Config, string) ([]cluster.ValidationError, error) {
267+
return func(ctx context.Context, config *rest.Config, namespace string) ([]cluster.ValidationError, error) {
268+
nodes, err := cluster.ListNodesFromContext(ctx, config)
269+
if err != nil {
270+
return nil, err
271+
}
272+
273+
affinityList := map[string]bool{}
274+
for _, affinity := range targetAffinityList {
275+
affinityList[affinity] = false
276+
}
277+
278+
var res []cluster.ValidationError
279+
for _, node := range nodes {
280+
for k, v := range node.GetLabels() {
281+
if _, found := affinityList[k]; found {
282+
affinityList[k] = v == "true"
283+
}
284+
}
285+
}
286+
287+
// Check all the values in the map are `true`
288+
for k, v := range affinityList {
289+
if !v {
290+
res = append(res, cluster.ValidationError{
291+
Message: "Affinity label not found in cluster: " + k,
292+
Type: cluster.ValidationStatusError,
293+
})
294+
}
295+
}
296+
return res, nil
297+
}
298+
}
299+
300+
func getAffinityListByKind(kind InstallationKind) []string {
301+
var affinityList []string
302+
switch kind {
303+
case InstallationMeta:
304+
affinityList = cluster.AffinityListMeta
305+
case InstallationWorkspace:
306+
affinityList = cluster.AffinityListWorkspace
307+
default:
308+
affinityList = cluster.AffinityList
309+
}
310+
return affinityList
311+
}

0 commit comments

Comments
 (0)