1
2
3
4
5
6 package testutil
7
8 import (
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
13 "k8s.io/apimachinery/pkg/runtime"
14 "k8s.io/kubectl/pkg/scheme"
15 "sigs.k8s.io/cli-utils/pkg/object"
16 "sigs.k8s.io/cli-utils/pkg/object/dependson"
17 )
18
19
20
21 const OwningInventoryKey = "config.k8s.io/owning-inventory"
22
23 var codec = scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...)
24
25
26
27
28 func Unstructured(t *testing.T, manifest string, mutators ...Mutator) *unstructured.Unstructured {
29 u := &unstructured.Unstructured{}
30 err := runtime.DecodeInto(codec, []byte(manifest), u)
31 if !assert.NoError(t, err) {
32 t.FailNow()
33 }
34 return Mutate(u, mutators...)
35 }
36
37
38 func Mutate(u *unstructured.Unstructured, mutators ...Mutator) *unstructured.Unstructured {
39 for _, m := range mutators {
40 m.Mutate(u)
41 }
42 return u
43 }
44
45
46
47 type Mutator interface {
48 Mutate(u *unstructured.Unstructured)
49 }
50
51
52 func ToIdentifier(t *testing.T, manifest string) object.ObjMetadata {
53 obj := Unstructured(t, manifest)
54 return object.ObjMetadata{
55 GroupKind: obj.GetObjectKind().GroupVersionKind().GroupKind(),
56 Name: obj.GetName(),
57 Namespace: obj.GetNamespace(),
58 }
59 }
60
61
62
63 func AddOwningInv(t *testing.T, inv string) Mutator {
64 return addOwningInvMutator{
65 t: t,
66 inv: inv,
67 }
68 }
69
70
71
72
73 type addOwningInvMutator struct {
74 t *testing.T
75 inv string
76 }
77
78
79
80 func (a addOwningInvMutator) Mutate(u *unstructured.Unstructured) {
81 annos, found, err := unstructured.NestedStringMap(u.Object, "metadata", "annotations")
82 if !assert.NoError(a.t, err) {
83 a.t.FailNow()
84 }
85 if !found {
86 annos = make(map[string]string)
87 }
88 annos[OwningInventoryKey] = a.inv
89 err = unstructured.SetNestedStringMap(u.Object, annos, "metadata", "annotations")
90 if !assert.NoError(a.t, err) {
91 a.t.FailNow()
92 }
93 }
94
95
96
97 func DeleteOwningInv(t *testing.T, inv string) Mutator {
98 return deleteOwningInvMutator{
99 t: t,
100 inv: inv,
101 }
102 }
103
104
105
106
107 type deleteOwningInvMutator struct {
108 t *testing.T
109 inv string
110 }
111
112
113
114 func (a deleteOwningInvMutator) Mutate(u *unstructured.Unstructured) {
115 annos, found, err := unstructured.NestedStringMap(u.Object, "metadata", "annotations")
116 if !assert.NoError(a.t, err) {
117 a.t.FailNow()
118 }
119 if !found {
120 annos = make(map[string]string)
121 }
122 if !assert.Equal(a.t, a.inv, annos[OwningInventoryKey]) {
123 a.t.FailNow()
124 }
125 delete(annos, OwningInventoryKey)
126 if len(annos) > 0 {
127 err = unstructured.SetNestedStringMap(u.Object, annos, "metadata", "annotations")
128 if !assert.NoError(a.t, err) {
129 a.t.FailNow()
130 }
131 } else {
132 unstructured.RemoveNestedField(u.Object, "metadata", "annotations")
133 }
134 }
135
136
137
138
139
140 func AddDependsOn(t *testing.T, deps ...object.ObjMetadata) Mutator {
141 return dependsOnMutator{
142 t: t,
143 deps: dependson.DependencySet(deps),
144 }
145 }
146
147
148
149 type dependsOnMutator struct {
150 t *testing.T
151 deps dependson.DependencySet
152 }
153
154
155
156
157 func (d dependsOnMutator) Mutate(u *unstructured.Unstructured) {
158 err := dependson.WriteAnnotation(u, d.deps)
159 if !assert.NoError(d.t, err) {
160 d.t.FailNow()
161 }
162 }
163
View as plain text