Skip to content

Commit 0f74d96

Browse files
authored
Merge pull request #19 from OpenSlides/feature/sorted-kind-apply
sort the stack files based on resource kind priority
2 parents bf07437 + f74b104 commit 0f74d96

2 files changed

Lines changed: 65 additions & 0 deletions

File tree

internal/constants/constants.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,41 @@ var MigrationStatsFields = []string{
215215
"fully_migrated_positions",
216216
"status",
217217
}
218+
219+
// getKindPriority returns the installation priority for a resource kind
220+
// Lower number = applied first (follows Helm 2.10 install order)
221+
func GetKindPriority(kind string) int {
222+
priorities := map[string]int{
223+
"Namespace": 0,
224+
"ResourceQuota": 1,
225+
"LimitRange": 2,
226+
"PodSecurityPolicy": 3,
227+
"Secret": 4,
228+
"ConfigMap": 5,
229+
"StorageClass": 6,
230+
"PersistentVolume": 7,
231+
"PersistentVolumeClaim": 8,
232+
"ServiceAccount": 9,
233+
"CustomResourceDefinition": 10,
234+
"ClusterRole": 11,
235+
"ClusterRoleBinding": 12,
236+
"Role": 13,
237+
"RoleBinding": 14,
238+
"Service": 15,
239+
"DaemonSet": 16,
240+
"Pod": 17,
241+
"ReplicationController": 18,
242+
"ReplicaSet": 19,
243+
"Deployment": 20,
244+
"StatefulSet": 21,
245+
"Job": 22,
246+
"CronJob": 23,
247+
"Ingress": 24,
248+
"APIService": 25,
249+
}
250+
251+
if priority, exists := priorities[kind]; exists {
252+
return priority
253+
}
254+
return 100
255+
}

internal/k8s/actions/apply.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
"fmt"
66
"os"
77
"path/filepath"
8+
"sort"
89

10+
"github.com/OpenSlides/openslides-cli/internal/constants"
911
"github.com/OpenSlides/openslides-cli/internal/k8s/client"
1012
"github.com/OpenSlides/openslides-cli/internal/logger"
1113
"github.com/OpenSlides/openslides-cli/internal/utils"
@@ -108,6 +110,7 @@ func applyDirectory(ctx context.Context, k8sClient *client.Client, dirPath strin
108110
return fmt.Errorf("reading directory: %w", err)
109111
}
110112

113+
var yamlFiles []os.DirEntry
111114
for _, file := range files {
112115
if file.IsDir() {
113116
continue
@@ -117,7 +120,16 @@ func applyDirectory(ctx context.Context, k8sClient *client.Client, dirPath strin
117120
logger.Debug("Skipping non-YAML file: %s", file.Name())
118121
continue
119122
}
123+
yamlFiles = append(yamlFiles, file)
124+
}
125+
126+
sort.Slice(yamlFiles, func(i, j int) bool {
127+
kindI := getKindFromFile(filepath.Join(dirPath, yamlFiles[i].Name()))
128+
kindJ := getKindFromFile(filepath.Join(dirPath, yamlFiles[j].Name()))
129+
return constants.GetKindPriority(kindI) < constants.GetKindPriority(kindJ)
130+
})
120131

132+
for _, file := range yamlFiles {
121133
manifestPath := filepath.Join(dirPath, file.Name())
122134
if _, err := applyManifest(ctx, k8sClient, manifestPath); err != nil {
123135
logger.Warn("Failed to apply %s: %v", file.Name(), err)
@@ -127,3 +139,18 @@ func applyDirectory(ctx context.Context, k8sClient *client.Client, dirPath strin
127139

128140
return nil
129141
}
142+
143+
// getKindFromFile reads the Kind field from a YAML file
144+
func getKindFromFile(path string) string {
145+
data, err := os.ReadFile(path)
146+
if err != nil {
147+
return ""
148+
}
149+
150+
var obj unstructured.Unstructured
151+
if err := yaml.Unmarshal(data, &obj); err != nil {
152+
return ""
153+
}
154+
155+
return obj.GetKind()
156+
}

0 commit comments

Comments
 (0)