@@ -1254,9 +1254,9 @@ var _ = Describe("Subscription", func() {
1254
1254
require .Len (GinkgoT (), installPlan .Status .CatalogSources , 1 )
1255
1255
})
1256
1256
1257
- // CatSrc :
1257
+ // CatSrc1 :
1258
1258
//
1259
- // Package A (apackage)
1259
+ // Package 1 (apackage)
1260
1260
// Default Channel: Stable
1261
1261
// Channel Stable:
1262
1262
// Operator A (Requires: CRD 1, CRD 2 )
@@ -1266,12 +1266,19 @@ var _ = Describe("Subscription", func() {
1266
1266
// Default Channel: Stable
1267
1267
// Channel Stable:
1268
1268
// Operator B (Provides: CRD)
1269
- // CatSrc2:
1269
+ // Channel Alpha:
1270
+ // Operator D (Provides: CRD)
1270
1271
//
1271
- // Package B (bpackage)
1272
+ // CatSrc2:
1273
+ // Package 2 (bpackage)
1272
1274
// Default Channel: Stable
1273
1275
// Channel Stable:
1274
1276
// Operator C (Provides: CRD 2)
1277
+ // Package 3 (cpackage)
1278
+ // Default Channel: Stable
1279
+ // Channel Stable:
1280
+ // Operator E (Provides: CRD 2)
1281
+ //
1275
1282
// Then create a subscription:
1276
1283
//
1277
1284
// CatalogSource: CatSrc
@@ -1280,10 +1287,11 @@ var _ = Describe("Subscription", func() {
1280
1287
// StartingCSV: CSV A
1281
1288
//
1282
1289
// Check installed:
1290
+ // CSV A, CSV B, CSV E
1283
1291
//
1284
- // CSV A, CSV B, CSV C
1285
- //
1286
- // CSV A required B and C but didn't get them from Package A
1292
+ // CSV ABC: not chosen as it is the same package with CSV A
1293
+ // CSV D: not chosen as it is in non-default channel
1294
+ // CSV C: not chosen as it is the same package with CSV B (which is chosen)
1287
1295
It ("creation with dependencies required and provided in different versions of an operator in the same package" , func () {
1288
1296
1289
1297
defer cleaner .NotifyTestComplete (true )
@@ -1335,6 +1343,7 @@ var _ = Describe("Subscription", func() {
1335
1343
// Create CSV
1336
1344
packageName1 := genName ("apackage" )
1337
1345
packageName2 := genName ("bpackage" )
1346
+ packageName3 := genName ("cpackage" )
1338
1347
1339
1348
namedStrategy := newNginxInstallStrategy ((genName ("dep" )), permissions , nil )
1340
1349
depNamedStrategy := newNginxInstallStrategy ((genName ("dep" )), permissions , nil )
@@ -1350,6 +1359,8 @@ var _ = Describe("Subscription", func() {
1350
1359
csvC := newCSV ("nginx-c-dep" , testNamespace , "" , semver .MustParse ("0.1.0" ), []apiextensions.CustomResourceDefinition {crd2 }, nil , depNamedStrategy2 )
1351
1360
// csvD provides CRD1 in the same catalogsource with csvA (apackage)
1352
1361
csvD := newCSV ("nginx-d-dep" , testNamespace , "" , semver .MustParse ("0.1.0" ), []apiextensions.CustomResourceDefinition {crd }, nil , depNamedStrategy )
1362
+ // csvE provides CRD2 in the different catalogsource with csvC (bpackage)
1363
+ csvE := newCSV ("nginx-e-dep" , testNamespace , "" , semver .MustParse ("0.1.0" ), []apiextensions.CustomResourceDefinition {crd2 }, nil , depNamedStrategy2 )
1353
1364
1354
1365
// Create PackageManifests 1
1355
1366
// Contain csvA, ABC and B
@@ -1382,6 +1393,13 @@ var _ = Describe("Subscription", func() {
1382
1393
},
1383
1394
DefaultChannelName : stableChannel ,
1384
1395
},
1396
+ {
1397
+ PackageName : packageName3 ,
1398
+ Channels : []registry.PackageChannel {
1399
+ {Name : stableChannel , CurrentCSVName : csvE .GetName ()},
1400
+ },
1401
+ DefaultChannelName : stableChannel ,
1402
+ },
1385
1403
}
1386
1404
1387
1405
catalogSourceName := genName ("catsrc" )
@@ -1402,7 +1420,7 @@ var _ = Describe("Subscription", func() {
1402
1420
}
1403
1421
1404
1422
catalogSourceName2 := genName ("catsrc" )
1405
- catsrc2 , cleanup2 := createInternalCatalogSource (kubeClient , crClient , catalogSourceName2 , testNamespace , manifests2 , []apiextensions.CustomResourceDefinition {crd2 }, []v1alpha1.ClusterServiceVersion {csvC })
1423
+ catsrc2 , cleanup2 := createInternalCatalogSource (kubeClient , crClient , catalogSourceName2 , testNamespace , manifests2 , []apiextensions.CustomResourceDefinition {crd2 }, []v1alpha1.ClusterServiceVersion {csvC , csvE })
1406
1424
defer cleanup2 ()
1407
1425
1408
1426
// Ensure that the catalog source is resolved before we create a subscription.
@@ -1435,6 +1453,189 @@ var _ = Describe("Subscription", func() {
1435
1453
_ , err = crClient .OperatorsV1alpha1 ().ClusterServiceVersions (testNamespace ).Get (context .TODO (), csvD .Name , metav1.GetOptions {})
1436
1454
require .Error (GinkgoT (), err )
1437
1455
})
1456
+
1457
+ // csvA owns CRD1 & csvB owns CRD2 and requires CRD1
1458
+ // Create subscription for csvB lead to installation of csvB and csvA
1459
+ // Update catsrc to upgrade csvA to csvNewA which now requires CRD1
1460
+ // csvNewA can't be installed due to no other operators provide CRD1 for it
1461
+ // (Note: OLM can't pick csvA as dependency for csvNewA as it is from the same
1462
+ // same package)
1463
+ // Update catsrc again to upgrade csvB to csvNewB which now owns both CRD1 and
1464
+ // CRD2.
1465
+ // Now csvNewA and csvNewB are installed successfully as csvNewB provides CRD1
1466
+ // that csvNewA requires
1467
+ It ("creation in case of transferring providedAPIs" , func () {
1468
+
1469
+ defer cleaner .NotifyTestComplete (true )
1470
+
1471
+ kubeClient := newKubeClient ()
1472
+ crClient := newCRClient ()
1473
+
1474
+ permissions := deploymentPermissions ()
1475
+
1476
+ crdPlural := genName ("ins" )
1477
+ crdName := crdPlural + ".cluster.com"
1478
+ crdPlural2 := genName ("ins" )
1479
+ crdName2 := crdPlural2 + ".cluster.com"
1480
+
1481
+ crd := apiextensions.CustomResourceDefinition {
1482
+ ObjectMeta : metav1.ObjectMeta {
1483
+ Name : crdName ,
1484
+ },
1485
+ Spec : apiextensions.CustomResourceDefinitionSpec {
1486
+ Group : "cluster.com" ,
1487
+ Version : "v1alpha1" ,
1488
+ Names : apiextensions.CustomResourceDefinitionNames {
1489
+ Plural : crdPlural ,
1490
+ Singular : crdPlural ,
1491
+ Kind : crdPlural ,
1492
+ ListKind : "list" + crdPlural ,
1493
+ },
1494
+ Scope : "Namespaced" ,
1495
+ },
1496
+ }
1497
+
1498
+ crd2 := apiextensions.CustomResourceDefinition {
1499
+ ObjectMeta : metav1.ObjectMeta {
1500
+ Name : crdName2 ,
1501
+ },
1502
+ Spec : apiextensions.CustomResourceDefinitionSpec {
1503
+ Group : "cluster.com" ,
1504
+ Version : "v1alpha1" ,
1505
+ Names : apiextensions.CustomResourceDefinitionNames {
1506
+ Plural : crdPlural2 ,
1507
+ Singular : crdPlural2 ,
1508
+ Kind : crdPlural2 ,
1509
+ ListKind : "list" + crdPlural2 ,
1510
+ },
1511
+ Scope : "Namespaced" ,
1512
+ },
1513
+ }
1514
+
1515
+ // Create CSV
1516
+ packageName1 := genName ("apackage" )
1517
+ packageName2 := genName ("bpackage" )
1518
+
1519
+ namedStrategy := newNginxInstallStrategy ((genName ("dep" )), permissions , nil )
1520
+ namedStrategy2 := newNginxInstallStrategy ((genName ("dep" )), permissions , nil )
1521
+ // csvA provides CRD
1522
+ csvA := newCSV ("nginx-a" , testNamespace , "" , semver .MustParse ("0.1.0" ), []apiextensions.CustomResourceDefinition {crd }, nil , namedStrategy )
1523
+ // csvB provides CRD2 and requires CRD
1524
+ csvB := newCSV ("nginx-b" , testNamespace , "" , semver .MustParse ("0.1.0" ), []apiextensions.CustomResourceDefinition {crd2 }, []apiextensions.CustomResourceDefinition {crd }, namedStrategy2 )
1525
+ // New csvA requires CRD (transfer CRD ownership to the new csvB)
1526
+ csvNewA := newCSV ("nginx-new-a" , testNamespace , "nginx-a" , semver .MustParse ("0.2.0" ), nil , []apiextensions.CustomResourceDefinition {crd }, namedStrategy )
1527
+ // New csvB provides CRD and CRD2
1528
+ csvNewB := newCSV ("nginx-new-b" , testNamespace , "nginx-b" , semver .MustParse ("0.2.0" ), []apiextensions.CustomResourceDefinition {crd , crd2 }, nil , namedStrategy2 )
1529
+
1530
+ // Create PackageManifests 1
1531
+ // Contain csvA, ABC and B
1532
+ manifests := []registry.PackageManifest {
1533
+ {
1534
+ PackageName : packageName1 ,
1535
+ Channels : []registry.PackageChannel {
1536
+ {Name : stableChannel , CurrentCSVName : csvA .GetName ()},
1537
+ },
1538
+ DefaultChannelName : stableChannel ,
1539
+ },
1540
+ {
1541
+ PackageName : packageName2 ,
1542
+ Channels : []registry.PackageChannel {
1543
+ {Name : stableChannel , CurrentCSVName : csvB .GetName ()},
1544
+ },
1545
+ DefaultChannelName : stableChannel ,
1546
+ },
1547
+ }
1548
+
1549
+ catalogSourceName := genName ("catsrc" )
1550
+ catsrc , cleanup := createInternalCatalogSource (kubeClient , crClient , catalogSourceName , testNamespace , manifests , []apiextensions.CustomResourceDefinition {crd , crd2 }, []v1alpha1.ClusterServiceVersion {csvA , csvB })
1551
+ defer cleanup ()
1552
+
1553
+ // Ensure that the catalog source is resolved before we create a subscription.
1554
+ _ , err := fetchCatalogSourceOnStatus (crClient , catsrc .GetName (), testNamespace , catalogSourceRegistryPodSynced )
1555
+ require .NoError (GinkgoT (), err )
1556
+
1557
+ subscriptionSpec := & v1alpha1.SubscriptionSpec {
1558
+ CatalogSource : catsrc .GetName (),
1559
+ CatalogSourceNamespace : catsrc .GetNamespace (),
1560
+ Package : packageName2 ,
1561
+ Channel : stableChannel ,
1562
+ StartingCSV : csvB .GetName (),
1563
+ InstallPlanApproval : v1alpha1 .ApprovalAutomatic ,
1564
+ }
1565
+
1566
+ // Create a subscription that has a dependency
1567
+ subscriptionName := genName ("sub-" )
1568
+ cleanupSubscription := createSubscriptionForCatalogWithSpec (GinkgoT (), crClient , testNamespace , subscriptionName , subscriptionSpec )
1569
+ defer cleanupSubscription ()
1570
+
1571
+ subscription , err := fetchSubscription (crClient , testNamespace , subscriptionName , subscriptionStateAtLatestChecker )
1572
+ require .NoError (GinkgoT (), err )
1573
+ require .NotNil (GinkgoT (), subscription )
1574
+
1575
+ // Check that a single catalog source was used to resolve the InstallPlan
1576
+ _ , err = fetchInstallPlan (GinkgoT (), crClient , subscription .Status .InstallPlanRef .Name , buildInstallPlanPhaseCheckFunc (v1alpha1 .InstallPlanPhaseComplete ))
1577
+ require .NoError (GinkgoT (), err )
1578
+ // Fetch CSVs A and B
1579
+ _ , err = fetchCSV (GinkgoT (), crClient , csvA .Name , testNamespace , csvSucceededChecker )
1580
+ require .NoError (GinkgoT (), err )
1581
+ _ , err = fetchCSV (GinkgoT (), crClient , csvB .Name , testNamespace , csvSucceededChecker )
1582
+ require .NoError (GinkgoT (), err )
1583
+
1584
+ // Update PackageManifest
1585
+ manifests = []registry.PackageManifest {
1586
+ {
1587
+ PackageName : packageName1 ,
1588
+ Channels : []registry.PackageChannel {
1589
+ {Name : stableChannel , CurrentCSVName : csvNewA .GetName ()},
1590
+ },
1591
+ DefaultChannelName : stableChannel ,
1592
+ },
1593
+ {
1594
+ PackageName : packageName2 ,
1595
+ Channels : []registry.PackageChannel {
1596
+ {Name : stableChannel , CurrentCSVName : csvB .GetName ()},
1597
+ },
1598
+ DefaultChannelName : stableChannel ,
1599
+ },
1600
+ }
1601
+ updateInternalCatalog (GinkgoT (), kubeClient , crClient , catalogSourceName , testNamespace , []apiextensions.CustomResourceDefinition {crd , crd2 }, []v1alpha1.ClusterServiceVersion {csvNewA , csvA , csvB }, manifests )
1602
+ csvAsub := strings .Join ([]string {packageName1 , stableChannel , catalogSourceName , testNamespace }, "-" )
1603
+ _ , err = fetchSubscription (crClient , testNamespace , csvAsub , subscriptionStateUpgradeAvailableChecker )
1604
+ require .NoError (GinkgoT (), err )
1605
+ // Ensure csvNewA is not installed
1606
+ _ , err = crClient .OperatorsV1alpha1 ().ClusterServiceVersions (testNamespace ).Get (context .Background (), csvNewA .Name , metav1.GetOptions {})
1607
+ require .Error (GinkgoT (), err )
1608
+ // Ensure csvA still exists
1609
+ _ , err = fetchCSV (GinkgoT (), crClient , csvA .Name , testNamespace , csvSucceededChecker )
1610
+ require .NoError (GinkgoT (), err )
1611
+
1612
+ // Update packagemanifest again
1613
+ manifests = []registry.PackageManifest {
1614
+ {
1615
+ PackageName : packageName1 ,
1616
+ Channels : []registry.PackageChannel {
1617
+ {Name : stableChannel , CurrentCSVName : csvNewA .GetName ()},
1618
+ },
1619
+ DefaultChannelName : stableChannel ,
1620
+ },
1621
+ {
1622
+ PackageName : packageName2 ,
1623
+ Channels : []registry.PackageChannel {
1624
+ {Name : stableChannel , CurrentCSVName : csvNewB .GetName ()},
1625
+ },
1626
+ DefaultChannelName : stableChannel ,
1627
+ },
1628
+ }
1629
+ updateInternalCatalog (GinkgoT (), kubeClient , crClient , catalogSourceName , testNamespace , []apiextensions.CustomResourceDefinition {crd , crd2 }, []v1alpha1.ClusterServiceVersion {csvA , csvB , csvNewA , csvNewB }, manifests )
1630
+ _ , err = fetchSubscription (crClient , testNamespace , subscriptionName , subscriptionStateUpgradePendingChecker )
1631
+ require .NoError (GinkgoT (), err )
1632
+ // Ensure csvNewA is installed
1633
+ _ , err = fetchCSV (GinkgoT (), crClient , csvNewA .Name , testNamespace , csvSucceededChecker )
1634
+ require .NoError (GinkgoT (), err )
1635
+ // Ensure csvNewB is installed
1636
+ _ , err = fetchCSV (GinkgoT (), crClient , csvNewB .Name , testNamespace , csvSucceededChecker )
1637
+ require .NoError (GinkgoT (), err )
1638
+ })
1438
1639
})
1439
1640
1440
1641
const (
0 commit comments