@@ -3,12 +3,12 @@ package e2e_monitoring
3
3
import (
4
4
"context"
5
5
clocktesting "k8s.io/utils/clock/testing"
6
+ "os"
6
7
"testing"
7
8
"time"
8
9
9
10
"github.com/openshift/library-go/pkg/operator/events"
10
11
"github.com/openshift/library-go/pkg/operator/resource/resourceapply"
11
- "github.com/openshift/library-go/test/library"
12
12
monv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
13
13
"github.com/stretchr/testify/require"
14
14
"k8s.io/apimachinery/pkg/api/errors"
@@ -18,10 +18,45 @@ import (
18
18
"k8s.io/apimachinery/pkg/runtime/schema"
19
19
"k8s.io/apimachinery/pkg/util/intstr"
20
20
"k8s.io/client-go/dynamic"
21
+ "k8s.io/client-go/tools/clientcmd"
21
22
)
22
23
24
+ const (
25
+ noUpdate = iota
26
+ metadataUpdate
27
+ specAndMaybeMetadataUpdate
28
+ )
29
+
30
+ // didUpdate compares two unstructured resources and returns if the specified parts changed.
31
+ func didUpdate (old , new * unstructured.Unstructured ) (int , error ) {
32
+ oldResourceVersion , _ , err := unstructured .NestedString (old .Object , "metadata" , "resourceVersion" )
33
+ if err != nil {
34
+ return 0 , err
35
+ }
36
+ newResourceVersion , _ , err := unstructured .NestedString (new .Object , "metadata" , "resourceVersion" )
37
+ if err != nil {
38
+ return 0 , err
39
+ }
40
+ oldGeneration , _ , err := unstructured .NestedInt64 (old .Object , "metadata" , "generation" )
41
+ if err != nil {
42
+ return 0 , err
43
+ }
44
+ newGeneration , _ , err := unstructured .NestedInt64 (new .Object , "metadata" , "generation" )
45
+ if err != nil {
46
+ return 0 , err
47
+ }
48
+ if oldResourceVersion != newResourceVersion {
49
+ if oldGeneration != newGeneration {
50
+ return specAndMaybeMetadataUpdate , nil
51
+ }
52
+ return metadataUpdate , nil
53
+ }
54
+
55
+ return noUpdate , nil
56
+ }
57
+
23
58
func TestResourceVersionApplication (t * testing.T ) {
24
- config , err := library . NewClientConfigForTest ( )
59
+ config , err := clientcmd . BuildConfigFromFlags ( "" , os . Getenv ( "KUBECONFIG" ) )
25
60
require .NoError (t , err )
26
61
27
62
// Define the resource.
@@ -70,7 +105,8 @@ func TestResourceVersionApplication(t *testing.T) {
70
105
unstructuredResourceMap , err := runtime .DefaultUnstructuredConverter .ToUnstructured (& resource )
71
106
require .NoError (t , err )
72
107
unstructuredResource .SetUnstructuredContent (unstructuredResourceMap )
73
- gotUnstructured , didUpdate , err := resourceapply .ApplyUnstructuredResourceImproved (
108
+ oldUnstructuredResource := unstructuredResource .DeepCopy ()
109
+ gotUnstructuredResource , err := resourceapply .ApplyUnstructuredResourceImproved (
74
110
context .TODO (),
75
111
dynamicClient ,
76
112
recorder ,
@@ -83,15 +119,19 @@ func TestResourceVersionApplication(t *testing.T) {
83
119
if err != nil && ! errors .IsAlreadyExists (err ) {
84
120
t .Fatalf ("Failed to create resource: %v" , err )
85
121
}
86
- require .True (t , didUpdate )
122
+ expectation , err := didUpdate (oldUnstructuredResource , gotUnstructuredResource )
123
+ if err != nil {
124
+ t .Fatalf ("Failed to compare resources: %v" , err )
125
+ }
126
+ require .True (t , expectation != noUpdate )
87
127
88
128
// Update the resource version and the generation since we made a spec change.
89
- unstructuredResource .SetResourceVersion (gotUnstructured .GetResourceVersion ())
90
- unstructuredResource .SetGeneration (gotUnstructured .GetGeneration ())
91
- unstructuredResource .SetCreationTimestamp (gotUnstructured .GetCreationTimestamp ())
92
- unstructuredResource .SetUID (gotUnstructured .GetUID ())
93
- unstructuredResource .SetManagedFields (gotUnstructured .GetManagedFields ())
94
- require .Equal (t , unstructuredResource .UnstructuredContent (), gotUnstructured .UnstructuredContent ())
129
+ unstructuredResource .SetResourceVersion (gotUnstructuredResource .GetResourceVersion ())
130
+ unstructuredResource .SetGeneration (gotUnstructuredResource .GetGeneration ())
131
+ unstructuredResource .SetCreationTimestamp (gotUnstructuredResource .GetCreationTimestamp ())
132
+ unstructuredResource .SetUID (gotUnstructuredResource .GetUID ())
133
+ unstructuredResource .SetManagedFields (gotUnstructuredResource .GetManagedFields ())
134
+ require .Equal (t , unstructuredResource .UnstructuredContent (), gotUnstructuredResource .UnstructuredContent ())
95
135
96
136
// Compare the existing resource with the one we have.
97
137
existingResourceUnstructured , err := dynamicClient .Resource (gvr ).Namespace (resource .GetNamespace ()).Get (context .TODO (), resource .GetName (), metav1.GetOptions {})
@@ -103,7 +143,8 @@ func TestResourceVersionApplication(t *testing.T) {
103
143
unstructuredResourceMap , err = runtime .DefaultUnstructuredConverter .ToUnstructured (& resource )
104
144
require .NoError (t , err )
105
145
unstructuredResource .SetUnstructuredContent (unstructuredResourceMap )
106
- gotUnstructured , didUpdate , err = resourceapply .ApplyUnstructuredResourceImproved (
146
+ oldUnstructuredResource = gotUnstructuredResource .DeepCopy ()
147
+ gotUnstructuredResource , err = resourceapply .ApplyUnstructuredResourceImproved (
107
148
context .TODO (),
108
149
dynamicClient ,
109
150
recorder ,
@@ -116,23 +157,28 @@ func TestResourceVersionApplication(t *testing.T) {
116
157
if err != nil {
117
158
t .Fatalf ("Failed to update resource: %v" , err )
118
159
}
119
- require .True (t , didUpdate )
160
+ expectation , err = didUpdate (oldUnstructuredResource , gotUnstructuredResource )
161
+ if err != nil {
162
+ t .Fatalf ("Failed to compare resources: %v" , err )
163
+ }
164
+ require .True (t , expectation == specAndMaybeMetadataUpdate )
120
165
121
166
// Update the resource version and the generation since we made a spec change.
122
- unstructuredResource .SetResourceVersion (gotUnstructured .GetResourceVersion ())
123
- unstructuredResource .SetGeneration (gotUnstructured .GetGeneration ())
124
- unstructuredResource .SetCreationTimestamp (gotUnstructured .GetCreationTimestamp ())
125
- unstructuredResource .SetUID (gotUnstructured .GetUID ())
126
- unstructuredResource .SetManagedFields (gotUnstructured .GetManagedFields ())
127
- require .Equal (t , unstructuredResource .UnstructuredContent (), gotUnstructured .UnstructuredContent ())
167
+ unstructuredResource .SetResourceVersion (gotUnstructuredResource .GetResourceVersion ())
168
+ unstructuredResource .SetGeneration (gotUnstructuredResource .GetGeneration ())
169
+ unstructuredResource .SetCreationTimestamp (gotUnstructuredResource .GetCreationTimestamp ())
170
+ unstructuredResource .SetUID (gotUnstructuredResource .GetUID ())
171
+ unstructuredResource .SetManagedFields (gotUnstructuredResource .GetManagedFields ())
172
+ require .Equal (t , unstructuredResource .UnstructuredContent (), gotUnstructuredResource .UnstructuredContent ())
128
173
129
174
// Compare the existing resource with the one we have.
130
175
existingResourceUnstructured , err = dynamicClient .Resource (gvr ).Namespace (resource .GetNamespace ()).Get (context .TODO (), resource .GetName (), metav1.GetOptions {})
131
176
require .NoError (t , err )
132
177
require .Equal (t , unstructuredResource .UnstructuredContent (), existingResourceUnstructured .UnstructuredContent ())
133
178
134
179
// Update the resource without any changes, without specifying a resource version.
135
- gotUnstructured , didUpdate , err = resourceapply .ApplyUnstructuredResourceImproved (
180
+ oldUnstructuredResource = gotUnstructuredResource .DeepCopy ()
181
+ gotUnstructuredResource , err = resourceapply .ApplyUnstructuredResourceImproved (
136
182
context .TODO (),
137
183
dynamicClient ,
138
184
recorder ,
@@ -145,10 +191,14 @@ func TestResourceVersionApplication(t *testing.T) {
145
191
if err != nil {
146
192
t .Fatalf ("Failed to update resource: %v" , err )
147
193
}
148
- require .False (t , didUpdate )
194
+ expectation , err = didUpdate (oldUnstructuredResource , gotUnstructuredResource )
195
+ if err != nil {
196
+ t .Fatalf ("Failed to compare resources: %v" , err )
197
+ }
198
+ require .True (t , expectation == noUpdate )
149
199
150
200
// Do not update any fields as no change was made.
151
- require .Equal (t , unstructuredResource .UnstructuredContent (), gotUnstructured .UnstructuredContent ())
201
+ require .Equal (t , unstructuredResource .UnstructuredContent (), gotUnstructuredResource .UnstructuredContent ())
152
202
153
203
// Compare the existing resource with the one we have.
154
204
existingResourceUnstructured , err = dynamicClient .Resource (gvr ).Namespace (resource .GetNamespace ()).Get (context .TODO (), resource .GetName (), metav1.GetOptions {})
0 commit comments