argo-cd

Форк
0
154 строки · 4.0 Кб
1
package main
2

3
import (
4
	"encoding/json"
5
	"fmt"
6
	"os"
7
	"os/exec"
8
	"strings"
9

10
	"github.com/argoproj/argo-cd/v2/pkg/apis/application"
11

12
	"github.com/argoproj/gitops-engine/pkg/utils/kube"
13
	extensionsobj "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
14
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
15
	"sigs.k8s.io/yaml"
16
)
17

18
var (
19
	kindToCRDPath = map[string]string{
20
		application.ApplicationFullName:    "manifests/crds/application-crd.yaml",
21
		application.AppProjectFullName:     "manifests/crds/appproject-crd.yaml",
22
		application.ApplicationSetFullName: "manifests/crds/applicationset-crd.yaml",
23
	}
24
)
25

26
func getCustomResourceDefinitions() map[string]*extensionsobj.CustomResourceDefinition {
27
	crdYamlBytes, err := exec.Command(
28
		"controller-gen",
29
		"paths=./pkg/apis/application/...",
30
		"crd:trivialVersions=true",
31
		"crd:crdVersions=v1",
32
		"output:crd:stdout",
33
	).Output()
34
	checkErr(err)
35

36
	// clean up stuff left by controller-gen
37
	deleteFile("config/webhook/manifests.yaml")
38
	deleteFile("config/webhook")
39
	deleteFile("config/argoproj.io_applications.yaml")
40
	deleteFile("config/argoproj.io_appprojects.yaml")
41
	deleteFile("config/argoproj.io_applicationsets.yaml")
42
	deleteFile("config")
43

44
	objs, err := kube.SplitYAML(crdYamlBytes)
45
	checkErr(err)
46
	crds := make(map[string]*extensionsobj.CustomResourceDefinition)
47
	for i := range objs {
48
		un := objs[i]
49

50
		// We need to completely remove validation of problematic fields such as creationTimestamp,
51
		// which get marshalled to `null`, but are typed as as a `string` during Open API validation
52
		removeValidation(un, "metadata.creationTimestamp")
53
		// remove status validation for AppProject CRD as workaround for https://github.com/argoproj/argo-cd/issues/4158
54
		if un.GetName() == "appprojects.argoproj.io" {
55
			removeValidation(un, "status")
56
		}
57

58
		crd := toCRD(un, un.GetName() == "applicationsets.argoproj.io")
59
		crd.Labels = map[string]string{
60
			"app.kubernetes.io/name":    crd.Name,
61
			"app.kubernetes.io/part-of": "argocd",
62
		}
63
		delete(crd.Annotations, "controller-gen.kubebuilder.io/version")
64
		crd.Spec.Scope = "Namespaced"
65
		crds[crd.Name] = crd
66
	}
67
	return crds
68
}
69

70
func deleteFile(path string) {
71
	if _, err := os.Stat(path); os.IsNotExist(err) {
72
		return
73
	}
74
	checkErr(os.Remove(path))
75
}
76

77
func removeValidation(un *unstructured.Unstructured, path string) {
78
	schemaPath := []string{"spec", "versions[*]", "schema", "openAPIV3Schema"}
79
	for _, part := range strings.Split(path, ".") {
80
		schemaPath = append(schemaPath, "properties", part)
81
	}
82
	unstructured.RemoveNestedField(un.Object, schemaPath...)
83
}
84

85
func toCRD(un *unstructured.Unstructured, removeDesc bool) *extensionsobj.CustomResourceDefinition {
86
	if removeDesc {
87
		removeDescription(un.Object)
88
	}
89
	unBytes, err := json.Marshal(un)
90
	checkErr(err)
91

92
	var crd extensionsobj.CustomResourceDefinition
93
	err = json.Unmarshal(unBytes, &crd)
94
	checkErr(err)
95

96
	return &crd
97
}
98

99
func removeDescription(v interface{}) {
100
	switch v := v.(type) {
101
	case []interface{}:
102
		for _, v := range v {
103
			removeDescription(v)
104
		}
105
	case map[string]interface{}:
106
		if _, ok := v["description"]; ok {
107
			_, ok := v["description"].(string)
108
			if ok {
109
				delete(v, "description")
110
			}
111
		}
112
		for _, v := range v {
113
			removeDescription(v)
114
		}
115
	}
116
}
117

118
func checkErr(err error) {
119
	if err != nil {
120
		panic(err)
121
	}
122
}
123

124
func main() {
125
	crdsapp := getCustomResourceDefinitions()
126
	for kind, path := range kindToCRDPath {
127
		crd := crdsapp[kind]
128
		if crd == nil {
129
			panic(fmt.Sprintf("CRD of kind %s was not generated", kind))
130
		}
131
		writeCRDintoFile(crd, path)
132
	}
133
}
134

135
func writeCRDintoFile(crd *extensionsobj.CustomResourceDefinition, path string) {
136
	jsonBytes, err := json.Marshal(crd)
137
	checkErr(err)
138

139
	var r unstructured.Unstructured
140
	err = json.Unmarshal(jsonBytes, &r.Object)
141
	checkErr(err)
142

143
	// clean up crd yaml before marshalling
144
	unstructured.RemoveNestedField(r.Object, "status")
145
	unstructured.RemoveNestedField(r.Object, "metadata", "creationTimestamp")
146
	jsonBytes, err = json.MarshalIndent(r.Object, "", "    ")
147
	checkErr(err)
148

149
	yamlBytes, err := yaml.JSONToYAML(jsonBytes)
150
	checkErr(err)
151

152
	err = os.WriteFile(path, yamlBytes, 0644)
153
	checkErr(err)
154
}
155

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.