@@ -1064,23 +1064,35 @@ func (o *Operator) ResolvePlan(plan *v1alpha1.InstallPlan) error {
1064
1064
return nil
1065
1065
}
1066
1066
1067
- // Ensure all existing versions are present in new CRD
1067
+ // Ensure all existing served versions are present in new CRD
1068
1068
func ensureCRDVersions (oldCRD * v1beta1ext.CustomResourceDefinition , newCRD * v1beta1ext.CustomResourceDefinition ) error {
1069
+ newCRDVersions := map [string ]struct {}{}
1070
+
1071
+ for _ , newVersion := range newCRD .Spec .Versions {
1072
+ newCRDVersions [newVersion .Name ] = struct {}{}
1073
+ }
1074
+ if newCRD .Spec .Version != "" {
1075
+ newCRDVersions [newCRD .Spec .Version ] = struct {}{}
1076
+ }
1077
+
1069
1078
for _ , oldVersion := range oldCRD .Spec .Versions {
1070
- var versionPresent bool
1071
- for _ , newVersion := range newCRD . Spec . Versions {
1072
- if oldVersion . Name == newVersion . Name {
1073
- versionPresent = true
1079
+ if oldVersion . Served {
1080
+ _ , ok := newCRDVersions [ oldVersion . Name ]
1081
+ if ! ok {
1082
+ return fmt . Errorf ( "New CRD (%s) must contain existing served versions (%s)" , oldCRD . Name , oldVersion . Name )
1074
1083
}
1075
1084
}
1076
- if ! versionPresent {
1077
- return fmt .Errorf ("not allowing CRD (%v) update with unincluded version %v" , newCRD .GetName (), oldVersion )
1085
+ }
1086
+ if oldCRD .Spec .Version != "" {
1087
+ _ , ok := newCRDVersions [oldCRD .Spec .Version ]
1088
+ if ! ok {
1089
+ return fmt .Errorf ("New CRD (%s) must contain existing version (%s)" , oldCRD .Name , oldCRD .Spec .Version )
1078
1090
}
1079
1091
}
1080
-
1081
1092
return nil
1082
1093
}
1083
1094
1095
+ // Validate all existing served versions against new CRD's validation (if changed)
1084
1096
func (o * Operator ) validateCustomResourceDefinition (oldCRD * v1beta1ext.CustomResourceDefinition , newCRD * v1beta1ext.CustomResourceDefinition ) error {
1085
1097
o .logger .Debugf ("Comparing %#v to %#v" , oldCRD .Spec .Validation , newCRD .Spec .Validation )
1086
1098
// If validation schema is unchanged, return right away
@@ -1091,11 +1103,13 @@ func (o *Operator) validateCustomResourceDefinition(oldCRD *v1beta1ext.CustomRes
1091
1103
if err := v1beta1ext .Convert_v1beta1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition (newCRD , convertedCRD , nil ); err != nil {
1092
1104
return err
1093
1105
}
1094
- for _ , oldVersion := range oldCRD .Spec .Versions {
1095
- gvr := schema.GroupVersionResource {Group : oldCRD .Spec .Group , Version : oldVersion .Name , Resource : oldCRD .Spec .Names .Plural }
1096
- err := o .validateExistingCRs (gvr , convertedCRD )
1097
- if err != nil {
1098
- return err
1106
+ for _ , version := range oldCRD .Spec .Versions {
1107
+ if ! version .Served {
1108
+ gvr := schema.GroupVersionResource {Group : oldCRD .Spec .Group , Version : version .Name , Resource : oldCRD .Spec .Names .Plural }
1109
+ err := o .validateExistingCRs (gvr , convertedCRD )
1110
+ if err != nil {
1111
+ return err
1112
+ }
1099
1113
}
1100
1114
}
1101
1115
@@ -1106,7 +1120,7 @@ func (o *Operator) validateCustomResourceDefinition(oldCRD *v1beta1ext.CustomRes
1106
1120
return err
1107
1121
}
1108
1122
}
1109
-
1123
+ o . logger . Debugf ( "Successfully validated CRD %s \n " , newCRD . Name )
1110
1124
return nil
1111
1125
}
1112
1126
@@ -1198,7 +1212,8 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
1198
1212
} else if len (matchedCSV ) > 1 {
1199
1213
o .logger .Debugf ("Found multiple owners for CRD %v" , crd )
1200
1214
1201
- if err := ensureCRDVersions (currentCRD , & crd ); err != nil {
1215
+ err := ensureCRDVersions (currentCRD , & crd )
1216
+ if err != nil {
1202
1217
return errorwrap .Wrapf (err , "error missing existing CRD version(s) in new CRD: %s" , step .Resource .Name )
1203
1218
}
1204
1219
0 commit comments