Skip to content

Commit 4bb8526

Browse files
committed
Add unit and e2e test cases for deprecating a CRD version
Fix some minor issues in test suite. Signed-off-by: Vu Dinh <[email protected]>
1 parent b873c79 commit 4bb8526

File tree

3 files changed

+398
-33
lines changed

3 files changed

+398
-33
lines changed

pkg/controller/operators/catalog/operator.go

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,16 +1217,14 @@ func (o *Operator) validateExistingCRs(gvr schema.GroupVersionResource, newCRD *
12171217
// The function may not always succeed as storedVersions requires at least one
12181218
// version. If there is only stored version, it won't be removed until a new
12191219
// stored version is added.
1220-
func removeDeprecatedStoredVersions(oldCRD *v1beta1ext.CustomResourceDefinition, newCRD *v1beta1ext.CustomResourceDefinition) *v1beta1ext.CustomResourceDefinition {
1220+
func removeDeprecatedStoredVersions(oldCRD *v1beta1ext.CustomResourceDefinition, newCRD *v1beta1ext.CustomResourceDefinition) []string {
12211221
// StoredVersions requires to have at least one version.
12221222
if len(oldCRD.Status.StoredVersions) <= 1 {
12231223
return nil
12241224
}
12251225

1226-
updatedCRD := oldCRD.DeepCopy()
1227-
1228-
newCRDVersions := getCRDVersionsMap(newCRD)
12291226
newStoredVersions := []string{}
1227+
newCRDVersions := getCRDVersionsMap(newCRD)
12301228
for _, v := range oldCRD.Status.StoredVersions {
12311229
_, ok := newCRDVersions[v]
12321230
if ok {
@@ -1237,8 +1235,7 @@ func removeDeprecatedStoredVersions(oldCRD *v1beta1ext.CustomResourceDefinition,
12371235
if len(newStoredVersions) < 1 {
12381236
return nil
12391237
} else {
1240-
updatedCRD.Status.StoredVersions = newStoredVersions
1241-
return updatedCRD
1238+
return newStoredVersions
12421239
}
12431240
}
12441241

@@ -1291,7 +1288,9 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
12911288
if k8serrors.IsAlreadyExists(err) {
12921289
currentCRD, _ := o.lister.APIExtensionsV1beta1().CustomResourceDefinitionLister().Get(crd.GetName())
12931290
// Compare 2 CRDs to see if it needs to be updatetd
1294-
if !reflect.DeepEqual(crd, *currentCRD) {
1291+
if !(reflect.DeepEqual(crd.Spec.Version, currentCRD.Spec.Version) &&
1292+
reflect.DeepEqual(crd.Spec.Versions, currentCRD.Spec.Versions) &&
1293+
reflect.DeepEqual(crd.Spec.Validation, currentCRD.Spec.Validation)) {
12951294
// Verify CRD ownership, only attempt to update if
12961295
// CRD has only one owner
12971296
// Example: provided=database.coreos.com/v1alpha1/EtcdCluster
@@ -1302,19 +1301,6 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
13021301
crd.SetResourceVersion(currentCRD.GetResourceVersion())
13031302
if len(matchedCSV) == 1 {
13041303
o.logger.Debugf("Found one owner for CRD %v", crd)
1305-
1306-
crdStatus := removeDeprecatedStoredVersions(currentCRD, &crd)
1307-
if crdStatus != nil {
1308-
_, err = o.opClient.ApiextensionsV1beta1Interface().ApiextensionsV1beta1().CustomResourceDefinitions().UpdateStatus(crdStatus)
1309-
if err != nil {
1310-
return errorwrap.Wrapf(err, "error updating CRD's status: %s", step.Resource.Name)
1311-
}
1312-
}
1313-
1314-
_, err = o.opClient.ApiextensionsV1beta1Interface().ApiextensionsV1beta1().CustomResourceDefinitions().Update(&crd)
1315-
if err != nil {
1316-
return errorwrap.Wrapf(err, "error updating CRD: %s", step.Resource.Name)
1317-
}
13181304
} else if len(matchedCSV) > 1 {
13191305
o.logger.Debugf("Found multiple owners for CRD %v", crd)
13201306

@@ -1326,19 +1312,21 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
13261312
if err = o.validateCustomResourceDefinition(currentCRD, &crd); err != nil {
13271313
return errorwrap.Wrapf(err, "error validating existing CRs agains new CRD's schema: %s", step.Resource.Name)
13281314
}
1329-
1330-
crdStatus := removeDeprecatedStoredVersions(currentCRD, &crd)
1331-
if crdStatus != nil {
1332-
_, err = o.opClient.ApiextensionsV1beta1Interface().ApiextensionsV1beta1().CustomResourceDefinitions().UpdateStatus(crdStatus)
1333-
if err != nil {
1334-
return errorwrap.Wrapf(err, "error updating CRD's status: %s", step.Resource.Name)
1335-
}
1336-
}
1337-
1338-
_, err = o.opClient.ApiextensionsV1beta1Interface().ApiextensionsV1beta1().CustomResourceDefinitions().Update(&crd)
1315+
}
1316+
// Remove deprecated version in CRD storedVersions
1317+
storeVersions := removeDeprecatedStoredVersions(currentCRD, &crd)
1318+
if storeVersions != nil {
1319+
currentCRD.Status.StoredVersions = storeVersions
1320+
resultCRD, err := o.opClient.ApiextensionsV1beta1Interface().ApiextensionsV1beta1().CustomResourceDefinitions().UpdateStatus(currentCRD)
13391321
if err != nil {
1340-
return errorwrap.Wrapf(err, "error update CRD: %s", step.Resource.Name)
1322+
return errorwrap.Wrapf(err, "error updating CRD's status: %s", step.Resource.Name)
13411323
}
1324+
crd.SetResourceVersion(resultCRD.GetResourceVersion())
1325+
}
1326+
// Update CRD to new version
1327+
_, err = o.opClient.ApiextensionsV1beta1Interface().ApiextensionsV1beta1().CustomResourceDefinitions().Update(&crd)
1328+
if err != nil {
1329+
return errorwrap.Wrapf(err, "error updating CRD: %s", step.Resource.Name)
13421330
}
13431331
}
13441332
// If it already existed, mark the step as Present.

pkg/controller/operators/catalog/operator_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,105 @@ func TestEnsureCRDVersions(t *testing.T) {
235235
}
236236
}
237237

238+
func TestRemoveDeprecatedStoredVersions(t *testing.T) {
239+
mainCRDPlural := "ins-main-test"
240+
241+
currentVersions := []v1beta1.CustomResourceDefinitionVersion{
242+
{
243+
Name: "v1alpha1",
244+
Served: true,
245+
Storage: false,
246+
},
247+
{
248+
Name: "v1alpha2",
249+
Served: true,
250+
Storage: true,
251+
},
252+
}
253+
254+
newVersions := []v1beta1.CustomResourceDefinitionVersion{
255+
{
256+
Name: "v1alpha2",
257+
Served: true,
258+
Storage: false,
259+
},
260+
{
261+
Name: "v1beta1",
262+
Served: true,
263+
Storage: true,
264+
},
265+
}
266+
267+
crdStatusStoredVersions := v1beta1.CustomResourceDefinitionStatus{
268+
StoredVersions: []string{},
269+
}
270+
271+
tests := []struct {
272+
name string
273+
oldCRD v1beta1.CustomResourceDefinition
274+
newCRD v1beta1.CustomResourceDefinition
275+
expectedResult []string
276+
}{
277+
{
278+
name: "only one stored version exists",
279+
oldCRD: func() v1beta1.CustomResourceDefinition {
280+
oldCRD := crd(mainCRDPlural)
281+
oldCRD.Spec.Version = ""
282+
oldCRD.Spec.Versions = currentVersions
283+
oldCRD.Status = crdStatusStoredVersions
284+
oldCRD.Status.StoredVersions = []string{"v1alpha1"}
285+
return oldCRD
286+
}(),
287+
newCRD: func() v1beta1.CustomResourceDefinition {
288+
newCRD := crd(mainCRDPlural)
289+
newCRD.Spec.Version = ""
290+
newCRD.Spec.Versions = newVersions
291+
return newCRD
292+
}(),
293+
expectedResult: nil,
294+
},
295+
{
296+
name: "multiple stored versions with one deprecated version",
297+
oldCRD: func() v1beta1.CustomResourceDefinition {
298+
oldCRD := crd(mainCRDPlural)
299+
oldCRD.Spec.Version = ""
300+
oldCRD.Spec.Versions = currentVersions
301+
oldCRD.Status.StoredVersions = []string{"v1alpha1", "v1alpha2"}
302+
return oldCRD
303+
}(),
304+
newCRD: func() v1beta1.CustomResourceDefinition {
305+
newCRD := crd(mainCRDPlural)
306+
newCRD.Spec.Version = ""
307+
newCRD.Spec.Versions = newVersions
308+
return newCRD
309+
}(),
310+
expectedResult: []string{"v1alpha2"},
311+
},
312+
{
313+
name: "multiple stored versions with all deprecated version",
314+
oldCRD: func() v1beta1.CustomResourceDefinition {
315+
oldCRD := crd(mainCRDPlural)
316+
oldCRD.Spec.Version = ""
317+
oldCRD.Spec.Versions = currentVersions
318+
oldCRD.Status.StoredVersions = []string{"v1alpha1", "v1alpha3"}
319+
return oldCRD
320+
}(),
321+
newCRD: func() v1beta1.CustomResourceDefinition {
322+
newCRD := crd(mainCRDPlural)
323+
newCRD.Spec.Version = ""
324+
newCRD.Spec.Versions = newVersions
325+
return newCRD
326+
}(),
327+
expectedResult: nil,
328+
},
329+
}
330+
331+
for _, tt := range tests {
332+
resultCRD := removeDeprecatedStoredVersions(&tt.oldCRD, &tt.newCRD)
333+
require.Equal(t, tt.expectedResult, resultCRD)
334+
}
335+
}
336+
238337
func TestExecutePlan(t *testing.T) {
239338
namespace := "ns"
240339

0 commit comments

Comments
 (0)