@@ -1106,23 +1106,35 @@ func (o *Operator) ResolvePlan(plan *v1alpha1.InstallPlan) error {
1106
1106
return nil
1107
1107
}
1108
1108
1109
- // Ensure all existing versions are present in new CRD
1109
+ // Ensure all existing served versions are present in new CRD
1110
1110
func ensureCRDVersions (oldCRD * v1beta1ext.CustomResourceDefinition , newCRD * v1beta1ext.CustomResourceDefinition ) error {
1111
+ newCRDVersions := map [string ]struct {}{}
1112
+
1113
+ for _ , newVersion := range newCRD .Spec .Versions {
1114
+ newCRDVersions [newVersion .Name ] = struct {}{}
1115
+ }
1116
+ if newCRD .Spec .Version != "" {
1117
+ newCRDVersions [newCRD .Spec .Version ] = struct {}{}
1118
+ }
1119
+
1111
1120
for _ , oldVersion := range oldCRD .Spec .Versions {
1112
- var versionPresent bool
1113
- for _ , newVersion := range newCRD . Spec . Versions {
1114
- if oldVersion . Name == newVersion . Name {
1115
- versionPresent = true
1121
+ if oldVersion . Served {
1122
+ _ , ok := newCRDVersions [ oldVersion . Name ]
1123
+ if ! ok {
1124
+ return fmt . Errorf ( "New CRD (%s) must contain existing served versions (%s)" , oldCRD . Name , oldVersion . Name )
1116
1125
}
1117
1126
}
1118
- if ! versionPresent {
1119
- return fmt .Errorf ("not allowing CRD (%v) update with unincluded version %v" , newCRD .GetName (), oldVersion )
1127
+ }
1128
+ if oldCRD .Spec .Version != "" {
1129
+ _ , ok := newCRDVersions [oldCRD .Spec .Version ]
1130
+ if ! ok {
1131
+ return fmt .Errorf ("New CRD (%s) must contain existing version (%s)" , oldCRD .Name , oldCRD .Spec .Version )
1120
1132
}
1121
1133
}
1122
-
1123
1134
return nil
1124
1135
}
1125
1136
1137
+ // Validate all existing served versions against new CRD's validation (if changed)
1126
1138
func (o * Operator ) validateCustomResourceDefinition (oldCRD * v1beta1ext.CustomResourceDefinition , newCRD * v1beta1ext.CustomResourceDefinition ) error {
1127
1139
o .logger .Debugf ("Comparing %#v to %#v" , oldCRD .Spec .Validation , newCRD .Spec .Validation )
1128
1140
// If validation schema is unchanged, return right away
@@ -1133,11 +1145,13 @@ func (o *Operator) validateCustomResourceDefinition(oldCRD *v1beta1ext.CustomRes
1133
1145
if err := v1beta1ext .Convert_v1beta1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition (newCRD , convertedCRD , nil ); err != nil {
1134
1146
return err
1135
1147
}
1136
- for _ , oldVersion := range oldCRD .Spec .Versions {
1137
- gvr := schema.GroupVersionResource {Group : oldCRD .Spec .Group , Version : oldVersion .Name , Resource : oldCRD .Spec .Names .Plural }
1138
- err := o .validateExistingCRs (gvr , convertedCRD )
1139
- if err != nil {
1140
- return err
1148
+ for _ , version := range oldCRD .Spec .Versions {
1149
+ if ! version .Served {
1150
+ gvr := schema.GroupVersionResource {Group : oldCRD .Spec .Group , Version : version .Name , Resource : oldCRD .Spec .Names .Plural }
1151
+ err := o .validateExistingCRs (gvr , convertedCRD )
1152
+ if err != nil {
1153
+ return err
1154
+ }
1141
1155
}
1142
1156
}
1143
1157
@@ -1148,7 +1162,7 @@ func (o *Operator) validateCustomResourceDefinition(oldCRD *v1beta1ext.CustomRes
1148
1162
return err
1149
1163
}
1150
1164
}
1151
-
1165
+ o . logger . Debugf ( "Successfully validated CRD %s \n " , newCRD . Name )
1152
1166
return nil
1153
1167
}
1154
1168
@@ -1240,7 +1254,8 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
1240
1254
} else if len (matchedCSV ) > 1 {
1241
1255
o .logger .Debugf ("Found multiple owners for CRD %v" , crd )
1242
1256
1243
- if err := ensureCRDVersions (currentCRD , & crd ); err != nil {
1257
+ err := ensureCRDVersions (currentCRD , & crd )
1258
+ if err != nil {
1244
1259
return errorwrap .Wrapf (err , "error missing existing CRD version(s) in new CRD: %s" , step .Resource .Name )
1245
1260
}
1246
1261
0 commit comments