-
Notifications
You must be signed in to change notification settings - Fork 67
/
apply_resource.go
107 lines (83 loc) · 2.41 KB
/
apply_resource.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package e2e
import (
"bytes"
"context"
"os"
mmv1beta "github.com/mattermost/mattermost-operator/apis/mattermost/v1beta1"
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client"
)
func CreateFromFile(ctx context.Context, k8sClient client.Client, namespace, path string) (func(), error) {
content, err := os.ReadFile(path)
if err != nil {
return func() {}, errors.Wrap(err, "failed to read file content")
}
content = filterCommentsAndEmptyLines(content)
resources := bytes.Split(content, []byte("\n---"))
decoder, err := defaultDecoder()
if err != nil {
return func() {}, errors.Wrap(err, "failed to initialize decoder")
}
objects := []client.Object{}
for _, res := range resources {
if len(res) == 0 {
continue
}
runtimeObject, _, err := decoder.Decode(res, nil, nil)
if err != nil {
return func() {}, errors.Wrap(err, "failed to decode runtimeObject")
}
object, ok := runtimeObject.(client.Object)
if !ok {
return func() {}, errors.New("failed to get runtimeObject metadata")
}
object.SetNamespace(namespace)
err = k8sClient.Create(ctx, object)
if err != nil {
return func() {}, errors.Wrap(err, "failed to apply runtimeObject")
}
objects = append(objects, object)
}
cleanup := func() {
for _, obj := range objects {
_ = k8sClient.Delete(context.Background(), obj)
}
}
return cleanup, nil
}
func filterCommentsAndEmptyLines(fileContent []byte) []byte {
lines := bytes.Split(fileContent, []byte("\n"))
newLines := make([][]byte, 0, len(lines))
for _, l := range lines {
if !bytes.HasPrefix(l, []byte("#")) && len(bytes.TrimSpace(l)) != 0 {
newLines = append(newLines, l)
}
}
return bytes.Join(newLines, []byte("\n"))
}
func defaultScheme() (*runtime.Scheme, error) {
resourcesSchema := runtime.NewScheme()
var addToSchemes = []func(*runtime.Scheme) error{
scheme.AddToScheme,
mmv1beta.AddToScheme,
}
for _, f := range addToSchemes {
err := f(resourcesSchema)
if err != nil {
return nil, errors.Wrap(err, "failed to add types to schema")
}
}
return resourcesSchema, nil
}
func defaultDecoder() (runtime.Decoder, error) {
resourceScheme, err := defaultScheme()
if err != nil {
return nil, err
}
codecs := serializer.NewCodecFactory(resourceScheme)
decoder := codecs.UniversalDeserializer()
return decoder, nil
}