@@ -17,6 +17,7 @@ import (
17
17
rbacv1 "k8s.io/api/rbac/v1"
18
18
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
19
19
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
20
+ apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
20
21
"k8s.io/apiextensions-apiserver/pkg/apiserver/validation"
21
22
extinf "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions"
22
23
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -1305,30 +1306,6 @@ func (o *Operator) ResolvePlan(plan *v1alpha1.InstallPlan) error {
1305
1306
return nil
1306
1307
}
1307
1308
1308
- func GetCRDV1VersionsMap (crd * apiextensionsv1.CustomResourceDefinition ) map [string ]struct {} {
1309
- versionsMap := map [string ]struct {}{}
1310
-
1311
- for _ , version := range crd .Spec .Versions {
1312
- versionsMap [version .Name ] = struct {}{}
1313
- }
1314
- return versionsMap
1315
- }
1316
-
1317
- // Ensure all existing served versions are present in new CRD
1318
- func EnsureCRDVersions (oldCRD * apiextensionsv1.CustomResourceDefinition , newCRD * apiextensionsv1.CustomResourceDefinition ) error {
1319
- newCRDVersions := GetCRDV1VersionsMap (newCRD )
1320
-
1321
- for _ , oldVersion := range oldCRD .Spec .Versions {
1322
- if oldVersion .Served {
1323
- _ , ok := newCRDVersions [oldVersion .Name ]
1324
- if ! ok {
1325
- return fmt .Errorf ("New CRD (%s) must contain existing served versions (%s)" , oldCRD .Name , oldVersion .Name )
1326
- }
1327
- }
1328
- }
1329
- return nil
1330
- }
1331
-
1332
1309
// Validate all existing served versions against new CRD's validation (if changed)
1333
1310
func validateV1CRDCompatibility (dynamicClient dynamic.Interface , oldCRD * apiextensionsv1.CustomResourceDefinition , newCRD * apiextensionsv1.CustomResourceDefinition ) error {
1334
1311
logrus .Debugf ("Comparing %#v to %#v" , oldCRD .Spec .Versions , newCRD .Spec .Versions )
@@ -1364,6 +1341,36 @@ func validateV1CRDCompatibility(dynamicClient dynamic.Interface, oldCRD *apiexte
1364
1341
return nil
1365
1342
}
1366
1343
1344
+ // Validate all existing served versions against new CRD's validation (if changed)
1345
+ func validateV1Beta1CRDCompatibility (dynamicClient dynamic.Interface , oldCRD * apiextensionsv1beta1.CustomResourceDefinition , newCRD * apiextensionsv1beta1.CustomResourceDefinition ) error {
1346
+ logrus .Debugf ("Comparing %#v to %#v" , oldCRD .Spec .Validation , newCRD .Spec .Validation )
1347
+
1348
+ // TODO return early of all versions are equal
1349
+ convertedCRD := & apiextensions.CustomResourceDefinition {}
1350
+ if err := apiextensionsv1beta1 .Convert_v1beta1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition (newCRD , convertedCRD , nil ); err != nil {
1351
+ return err
1352
+ }
1353
+ for _ , version := range oldCRD .Spec .Versions {
1354
+ if ! version .Served {
1355
+ gvr := schema.GroupVersionResource {Group : oldCRD .Spec .Group , Version : version .Name , Resource : oldCRD .Spec .Names .Plural }
1356
+ err := validateExistingCRs (dynamicClient , gvr , convertedCRD )
1357
+ if err != nil {
1358
+ return err
1359
+ }
1360
+ }
1361
+ }
1362
+
1363
+ if oldCRD .Spec .Version != "" {
1364
+ gvr := schema.GroupVersionResource {Group : oldCRD .Spec .Group , Version : oldCRD .Spec .Version , Resource : oldCRD .Spec .Names .Plural }
1365
+ err := validateExistingCRs (dynamicClient , gvr , convertedCRD )
1366
+ if err != nil {
1367
+ return err
1368
+ }
1369
+ }
1370
+ logrus .Debugf ("Successfully validated CRD %s\n " , newCRD .Name )
1371
+ return nil
1372
+ }
1373
+
1367
1374
func validateExistingCRs (dynamicClient dynamic.Interface , gvr schema.GroupVersionResource , newCRD * apiextensions.CustomResourceDefinition ) error {
1368
1375
// make dynamic client
1369
1376
crList , err := dynamicClient .Resource (gvr ).List (context .TODO (), metav1.ListOptions {})
@@ -1383,33 +1390,6 @@ func validateExistingCRs(dynamicClient dynamic.Interface, gvr schema.GroupVersio
1383
1390
return nil
1384
1391
}
1385
1392
1386
- // Attempt to remove stored versions that have been deprecated before allowing
1387
- // those versions to be removed from the new CRD.
1388
- // The function may not always succeed as storedVersions requires at least one
1389
- // version. If there is only stored version, it won't be removed until a new
1390
- // stored version is added.
1391
- func removeDeprecatedV1StoredVersions (oldCRD * apiextensionsv1.CustomResourceDefinition , newCRD * apiextensionsv1.CustomResourceDefinition ) []string {
1392
- // StoredVersions requires to have at least one version.
1393
- if len (oldCRD .Status .StoredVersions ) <= 1 {
1394
- return nil
1395
- }
1396
-
1397
- newStoredVersions := []string {}
1398
- newCRDVersions := GetCRDV1VersionsMap (newCRD )
1399
- for _ , v := range oldCRD .Status .StoredVersions {
1400
- _ , ok := newCRDVersions [v ]
1401
- if ok {
1402
- newStoredVersions = append (newStoredVersions , v )
1403
- }
1404
- }
1405
-
1406
- if len (newStoredVersions ) < 1 {
1407
- return nil
1408
- } else {
1409
- return newStoredVersions
1410
- }
1411
- }
1412
-
1413
1393
// ExecutePlan applies a planned InstallPlan to a namespace.
1414
1394
func (o * Operator ) ExecutePlan (plan * v1alpha1.InstallPlan ) error {
1415
1395
if plan .Status .Phase != v1alpha1 .InstallPlanPhaseInstalling {
@@ -1436,7 +1416,7 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
1436
1416
}
1437
1417
1438
1418
ensurer := newStepEnsurer (kubeclient , crclient , dynamicClient )
1439
- b := newBuilder (kubeclient , dynamicClient , o .csvProvidedAPIsIndexer )
1419
+ b := newBuilder (kubeclient , dynamicClient , o .csvProvidedAPIsIndexer , o . logger )
1440
1420
1441
1421
for i , step := range plan .Status .Plan {
1442
1422
doStep := true
0 commit comments