@@ -12,8 +12,10 @@ import (
12
12
"helm.sh/helm/v3/pkg/release"
13
13
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
14
14
apiextensionsv1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
15
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
15
16
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16
17
"k8s.io/apimachinery/pkg/runtime"
18
+ "k8s.io/apimachinery/pkg/runtime/schema"
17
19
18
20
"github.com/operator-framework/operator-controller/internal/rukpak/preflights/crdupgradesafety"
19
21
"github.com/operator-framework/operator-controller/internal/rukpak/util"
@@ -71,8 +73,140 @@ func getManifestString(t *testing.T, crdFile string) string {
71
73
// TestInstall exists only for completeness as Install() is currently a no-op. It can be used as
72
74
// a template for real tests in the future if the func is implemented.
73
75
func TestInstall (t * testing.T ) {
74
- preflight := newMockPreflight (nil , nil , nil )
75
- require .Nil (t , preflight .Install (context .Background (), nil ))
76
+ tests := []struct {
77
+ name string
78
+ oldCrdPath string
79
+ validator * kappcus.Validator
80
+ release * release.Release
81
+ wantErrMsgs []string
82
+ wantCrdGetErr error
83
+ }{
84
+ {
85
+ name : "nil release" ,
86
+ },
87
+ {
88
+ name : "release with no objects" ,
89
+ release : & release.Release {
90
+ Name : "test-release" ,
91
+ },
92
+ },
93
+ {
94
+ name : "release with invalid manifest" ,
95
+ release : & release.Release {
96
+ Name : "test-release" ,
97
+ Manifest : "abcd" ,
98
+ },
99
+ wantErrMsgs : []string {"json: cannot unmarshal string into Go value of type unstructured.detector" },
100
+ },
101
+ {
102
+ name : "release with no CRD objects" ,
103
+ release : & release.Release {
104
+ Name : "test-release" ,
105
+ Manifest : getManifestString (t , "no-crds.json" ),
106
+ },
107
+ },
108
+ {
109
+ name : "fail to get old crd other than not found error" ,
110
+ release : & release.Release {
111
+ Name : "test-release" ,
112
+ Manifest : getManifestString (t , "crd-valid-upgrade.json" ),
113
+ },
114
+ wantCrdGetErr : fmt .Errorf ("error!" ),
115
+ wantErrMsgs : []string {"error!" },
116
+ },
117
+ {
118
+ name : "fail to get old crd, not found error" ,
119
+ release : & release.Release {
120
+ Name : "test-release" ,
121
+ Manifest : getManifestString (t , "crd-valid-upgrade.json" ),
122
+ },
123
+ wantCrdGetErr : apierrors .NewNotFound (schema.GroupResource {Group : apiextensionsv1 .SchemeGroupVersion .Group , Resource : "customresourcedefinitions" }, "not found" ),
124
+ },
125
+ {
126
+ name : "invalid crd manifest file" ,
127
+ release : & release.Release {
128
+ Name : "test-release" ,
129
+ Manifest : getManifestString (t , "crd-invalid" ),
130
+ },
131
+ wantErrMsgs : []string {"json: cannot unmarshal" },
132
+ },
133
+ {
134
+ name : "custom validator" ,
135
+ oldCrdPath : "old-crd.json" ,
136
+ release : & release.Release {
137
+ Name : "test-release" ,
138
+ Manifest : getManifestString (t , "old-crd.json" ),
139
+ },
140
+ validator : & kappcus.Validator {
141
+ Validations : []kappcus.Validation {
142
+ kappcus .NewValidationFunc ("test" , func (old , new apiextensionsv1.CustomResourceDefinition ) error {
143
+ return fmt .Errorf ("custom validation error!!" )
144
+ }),
145
+ },
146
+ },
147
+ wantErrMsgs : []string {"custom validation error!!" },
148
+ },
149
+ {
150
+ name : "valid upgrade" ,
151
+ oldCrdPath : "old-crd.json" ,
152
+ release : & release.Release {
153
+ Name : "test-release" ,
154
+ Manifest : getManifestString (t , "crd-valid-upgrade.json" ),
155
+ },
156
+ },
157
+ {
158
+ name : "new crd validation failures (all except existing field removal)" ,
159
+ // Not really intended to test kapp validators, although it does anyway to a large extent.
160
+ // This test is primarily meant to ensure that we are actually using all of them.
161
+ oldCrdPath : "old-crd.json" ,
162
+ release : & release.Release {
163
+ Name : "test-release" ,
164
+ Manifest : getManifestString (t , "crd-invalid-upgrade.json" ),
165
+ },
166
+ wantErrMsgs : []string {
167
+ `"NoScopeChange"` ,
168
+ `"NoStoredVersionRemoved"` ,
169
+ `enums added` ,
170
+ `new required fields added` ,
171
+ `maximum constraint added when one did not exist previously` ,
172
+ `maximum items constraint added` ,
173
+ `maximum length constraint added` ,
174
+ `maximum properties constraint added` ,
175
+ `minimum constraint added when one did not exist previously` ,
176
+ `minimum items constraint added` ,
177
+ `minimum length constraint added` ,
178
+ `minimum properties constraint added` ,
179
+ `new value added as default` ,
180
+ },
181
+ },
182
+ {
183
+ name : "new crd validation failure for existing field removal" ,
184
+ // Separate test from above as this error will cause the validator to
185
+ // return early and skip some of the above validations.
186
+ oldCrdPath : "old-crd.json" ,
187
+ release : & release.Release {
188
+ Name : "test-release" ,
189
+ Manifest : getManifestString (t , "crd-field-removed.json" ),
190
+ },
191
+ wantErrMsgs : []string {
192
+ `"NoExistingFieldRemoved"` ,
193
+ },
194
+ },
195
+ }
196
+
197
+ for _ , tc := range tests {
198
+ t .Run (tc .name , func (t * testing.T ) {
199
+ preflight := newMockPreflight (getCrdFromManifestFile (t , tc .oldCrdPath ), tc .wantCrdGetErr , tc .validator )
200
+ err := preflight .Install (context .Background (), tc .release )
201
+ if len (tc .wantErrMsgs ) != 0 {
202
+ for _ , expectedErrMsg := range tc .wantErrMsgs {
203
+ require .ErrorContainsf (t , err , expectedErrMsg , "" )
204
+ }
205
+ } else {
206
+ require .NoError (t , err )
207
+ }
208
+ })
209
+ }
76
210
}
77
211
78
212
func TestUpgrade (t * testing.T ) {
@@ -109,14 +243,22 @@ func TestUpgrade(t *testing.T) {
109
243
},
110
244
},
111
245
{
112
- name : "fail to get old crd" ,
246
+ name : "fail to get old crd, other than not found error " ,
113
247
release : & release.Release {
114
248
Name : "test-release" ,
115
249
Manifest : getManifestString (t , "crd-valid-upgrade.json" ),
116
250
},
117
251
wantCrdGetErr : fmt .Errorf ("error!" ),
118
252
wantErrMsgs : []string {"error!" },
119
253
},
254
+ {
255
+ name : "fail to get old crd, not found error" ,
256
+ release : & release.Release {
257
+ Name : "test-release" ,
258
+ Manifest : getManifestString (t , "crd-valid-upgrade.json" ),
259
+ },
260
+ wantCrdGetErr : apierrors .NewNotFound (schema.GroupResource {Group : apiextensionsv1 .SchemeGroupVersion .Group , Resource : "customresourcedefinitions" }, "not found" ),
261
+ },
120
262
{
121
263
name : "invalid crd manifest file" ,
122
264
release : & release.Release {
0 commit comments