1 package kustomization
2
3 import (
4 "bytes"
5 "fmt"
6
7 "sigs.k8s.io/kustomize/api/filters/filtersutil"
8 "sigs.k8s.io/kustomize/api/filters/fsslice"
9 "sigs.k8s.io/kustomize/api/filters/namespace"
10 "sigs.k8s.io/kustomize/api/filters/refvar"
11 "sigs.k8s.io/kustomize/api/filters/suffix"
12 "sigs.k8s.io/kustomize/api/types"
13 "sigs.k8s.io/kustomize/kyaml/kio"
14 "sigs.k8s.io/kustomize/kyaml/resid"
15 "sigs.k8s.io/kustomize/kyaml/yaml"
16
17 "edge-infra.dev/pkg/k8s/decoder"
18 "edge-infra.dev/pkg/k8s/unstructured"
19 )
20
21
22
23
24
25
26
27
28
29
30
31 func ProcessManifests(uid string, manifests []byte, namespace string) ([]*unstructured.Unstructured, error) {
32 buf := bytes.Buffer{}
33
34 filters := append(
35 processName(uid),
36 processNamespace(namespace),
37 )
38 filters = append(filters, processNamespaceVar(namespace)...)
39 filters = append(filters, processPriorityClass()...)
40
41 err := kio.Pipeline{
42 Inputs: []kio.Reader{&kio.ByteReader{Reader: bytes.NewReader(manifests)}},
43 Outputs: []kio.Writer{kio.ByteWriter{Writer: &buf}},
44 Filters: filters,
45 }.Execute()
46
47 if err != nil {
48 return nil, fmt.Errorf("failed to update manifests: %w", err)
49 }
50
51 return decoder.DecodeYAML(buf.Bytes())
52 }
53
54
55
56 func processNamespace(ns string) kio.Filter {
57 fss := types.FsSlice{
58 {
59 Path: "metadata/namespace",
60 CreateIfNotPresent: true,
61 },
62 }
63
64 return namespace.Filter{
65 Namespace: ns,
66 FsSlice: fss,
67 SetRoleBindingSubjects: namespace.AllServiceAccountSubjects,
68 }
69 }
70
71
72
73
74
75
76 func processName(uid string) []kio.Filter {
77 filters := []kio.Filter{}
78
79 fsSlice := types.FsSlice{
80 {
81 Path: "metadata/name",
82 Gvk: resid.Gvk{
83 Group: "rbac.authorization.k8s.io",
84 Version: "v1",
85 Kind: "ClusterRole",
86 },
87 },
88 {
89 Path: "metadata/name",
90 Gvk: resid.Gvk{
91 Group: "rbac.authorization.k8s.io",
92 Version: "v1",
93 Kind: "ClusterRoleBinding",
94 },
95 },
96
97
98 {
99 Path: "roleRef/name",
100 Gvk: resid.Gvk{
101 Group: "rbac.authorization.k8s.io",
102 Version: "v1",
103 Kind: "ClusterRoleBinding",
104 },
105 },
106 }
107
108 for _, fieldSpec := range fsSlice {
109 filters = append(filters, suffix.Filter{
110
111 Suffix: fmt.Sprintf("-%s", uid),
112 FieldSpec: fieldSpec,
113 })
114 }
115
116 return filters
117 }
118
119
120
121
122 func processNamespaceVar(ns string) []kio.Filter {
123 envVarName := "TEST_NAMESPACE"
124 return []kio.Filter{
125 refvar.Filter{
126 FieldSpec: types.FieldSpec{Path: "spec/template/spec/containers/env/value"},
127 MappingFunc: refvar.MakePrimitiveReplacer(map[string]int{}, map[string]interface{}{
128 envVarName: ns,
129 }),
130 },
131 refvar.Filter{
132 FieldSpec: types.FieldSpec{Path: "data"},
133 MappingFunc: refvar.MakePrimitiveReplacer(map[string]int{}, map[string]interface{}{
134 envVarName: ns,
135 }),
136 },
137 }
138 }
139
140
141
142
143 func processPriorityClass() []kio.Filter {
144 return []kio.Filter{kio.FilterAll(fsslice.Filter{
145 CreateKind: yaml.ScalarNode,
146 SetValue: filtersutil.SetScalar(""),
147 FsSlice: []types.FieldSpec{
148 {Path: "spec/template/spec/priorityClassName"},
149 },
150 })}
151 }
152
View as plain text