Skip to content

Commit 9e036d5

Browse files
Simon Emmsroboquat
Simon Emms
authored andcommitted
[installer]: sort the kubernetes charts so correctly installed
This orders the kubernetes charts so that installation and upgrades happen in the correct order
1 parent 20dfc64 commit 9e036d5

File tree

5 files changed

+115
-104
lines changed

5 files changed

+115
-104
lines changed

installer/cmd/render.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,33 @@ A config file is required which can be generated with the init command.`,
8585
return fmt.Errorf("unsupported installation kind: %s", cfg.Kind)
8686
}
8787

88-
objs, err := common.CompositeRenderFunc(renderable, components.CommonObjects)(ctx)
89-
if err != nil {
90-
return err
91-
}
92-
93-
charts, err := common.CompositeHelmFunc(helmCharts, components.CommonHelmDependencies)(ctx)
88+
objs, err := common.CompositeRenderFunc(components.CommonObjects, renderable)(ctx)
9489
if err != nil {
9590
return err
9691
}
9792

93+
k8s := make([]string, 0)
9894
for _, o := range objs {
9995
fc, err := yaml.Marshal(o)
10096
if err != nil {
10197
return err
10298
}
10399

104-
fmt.Printf("---\n%s\n", string(fc))
100+
k8s = append(k8s, fmt.Sprintf("---\n%s\n", string(fc)))
101+
}
102+
103+
charts, err := common.CompositeHelmFunc(components.CommonHelmDependencies, helmCharts)(ctx)
104+
if err != nil {
105+
return err
106+
}
107+
k8s = append(k8s, charts...)
108+
109+
sortedCharts, err := common.DependencySortingRenderFunc(k8s)
110+
if err != nil {
111+
return err
105112
}
106113

107-
for _, c := range charts {
114+
for _, c := range sortedCharts {
108115
fmt.Printf("---\n%s\n", c)
109116
}
110117

installer/pkg/common/render.go

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
package common
66

77
import (
8-
"sort"
9-
108
"github.com/gitpod-io/gitpod/installer/pkg/config/v1"
119
"github.com/gitpod-io/gitpod/installer/pkg/config/versions"
1210

@@ -52,31 +50,6 @@ func CompositeHelmFunc(f ...HelmFunc) HelmFunc {
5250
}
5351
}
5452

55-
var kubernetesObjOrder = map[string]int{
56-
TypeMetaClusterRole.GetObjectKind().GroupVersionKind().String(): -100,
57-
TypeMetaServiceAccount.GetObjectKind().GroupVersionKind().String(): -90,
58-
TypeMetaDaemonset.GetObjectKind().GroupVersionKind().String(): 0,
59-
TypeMetaPod.GetObjectKind().GroupVersionKind().String(): 10,
60-
}
61-
62-
func DependencySortingRenderFunc(f RenderFunc) RenderFunc {
63-
return func(ctx *RenderContext) ([]runtime.Object, error) {
64-
objs, err := f(ctx)
65-
if err != nil {
66-
return nil, err
67-
}
68-
69-
sort.Slice(objs, func(i, j int) bool {
70-
scoreI := kubernetesObjOrder[objs[i].GetObjectKind().GroupVersionKind().String()]
71-
scoreJ := kubernetesObjOrder[objs[j].GetObjectKind().GroupVersionKind().String()]
72-
73-
return scoreI < scoreJ
74-
})
75-
76-
return objs, nil
77-
}
78-
}
79-
8053
type GeneratedValues struct {
8154
StorageAccessKey string
8255
StorageSecretKey string

installer/pkg/common/render_test.go

Lines changed: 0 additions & 64 deletions
This file was deleted.

installer/pkg/common/sorter.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License-AGPL.txt in the project root for license information.
4+
5+
package common
6+
7+
import (
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"regexp"
10+
"sigs.k8s.io/yaml"
11+
"sort"
12+
)
13+
14+
// Those occurring earlier in the list get installed before those occurring later in the list.
15+
// Based on Helm's list, with our CRDs added in
16+
17+
var sortOrder = []string{
18+
"Namespace",
19+
"NetworkPolicy",
20+
"ResourceQuota",
21+
"Issuer", // added
22+
"Certificate", // added
23+
"LimitRange",
24+
"PodSecurityPolicy",
25+
"PodDisruptionBudget",
26+
"ServiceAccount",
27+
"Secret",
28+
"SecretList",
29+
"ConfigMap",
30+
"StorageClass",
31+
"PersistentVolume",
32+
"PersistentVolumeClaim",
33+
"CustomResourceDefinition",
34+
"ClusterRole",
35+
"ClusterRoleList",
36+
"ClusterRoleBinding",
37+
"ClusterRoleBindingList",
38+
"Role",
39+
"RoleList",
40+
"RoleBinding",
41+
"RoleBindingList",
42+
"Service",
43+
"DaemonSet",
44+
"Pod",
45+
"ReplicationController",
46+
"ReplicaSet",
47+
"StatefulSet", // moved above Deployment
48+
"Deployment",
49+
"HorizontalPodAutoscaler",
50+
"Job",
51+
"CronJob",
52+
"Ingress",
53+
"APIService",
54+
}
55+
56+
type k8sChart struct {
57+
metav1.TypeMeta `json:",inline"`
58+
Content string
59+
}
60+
61+
func DependencySortingRenderFunc(charts []string) ([]string, error) {
62+
sortData := make([]k8sChart, 0)
63+
64+
for _, o := range charts {
65+
// Assume multi-document YAML
66+
re := regexp.MustCompile("(^|\n)---")
67+
items := re.Split(o, -1)
68+
69+
for _, p := range items {
70+
var v k8sChart
71+
err := yaml.Unmarshal([]byte(p), &v)
72+
if err != nil {
73+
return nil, err
74+
}
75+
76+
v.Content = p
77+
sortData = append(sortData, v)
78+
}
79+
}
80+
81+
sortMap := map[string]int{}
82+
for k, v := range sortOrder {
83+
sortMap[v] = k
84+
}
85+
86+
sort.Slice(sortData, func(i, j int) bool {
87+
scoreI := sortMap[sortData[i].Kind]
88+
scoreJ := sortMap[sortData[j].Kind]
89+
90+
return scoreI < scoreJ
91+
})
92+
93+
out := make([]string, 0)
94+
for _, d := range sortData {
95+
out = append(out, d.Content)
96+
}
97+
98+
return out, nil
99+
}

installer/pkg/helm/helm.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,6 @@ func ImportTemplate(chart *charts.Chart, templateCfg TemplateConfig, pkgConfig P
167167
}
168168
}
169169

170-
return append(templates, []string{
171-
fmt.Sprintf("# %s Helm chart", settings.Config.Name),
172-
rel.Manifest, // This already starts with "---" - consider stripping this out
173-
fmt.Sprintf("# End of %s chart", settings.Config.Name),
174-
}...), nil
170+
return append(templates, rel.Manifest), nil
175171
}
176172
}

0 commit comments

Comments
 (0)