Skip to content

Commit 44ac7a7

Browse files
committed
Handle mutliple skips and add unit test
Signed-off-by: Vu Dinh <[email protected]>
1 parent c5f7984 commit 44ac7a7

File tree

2 files changed

+80
-13
lines changed

2 files changed

+80
-13
lines changed

pkg/controller/registry/resolver/resolver.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ func (r *SatResolver) sortChannel(bundles []*Operator) ([]*Operator, error) {
525525
// if a replaces b, then replacedBy[b] = a
526526
replacedBy := map[*Operator]*Operator{}
527527
replaces := map[*Operator]*Operator{}
528+
skipped := map[string]*Operator{}
528529

529530
for _, b := range bundles {
530531
bundleLookup[b.Identifier()] = b
@@ -540,6 +541,7 @@ func (r *SatResolver) sortChannel(bundles []*Operator) ([]*Operator, error) {
540541
for _, skip := range b.skips {
541542
if r, ok := bundleLookup[skip]; ok {
542543
replacedBy[r] = b
544+
skipped[skip] = r
543545
}
544546
}
545547
}
@@ -559,12 +561,19 @@ func (r *SatResolver) sortChannel(bundles []*Operator) ([]*Operator, error) {
559561

560562
head := headCandidates[0]
561563
current := head
564+
skip := false
562565
for {
563-
channel = append(channel, current)
566+
if skip == false {
567+
channel = append(channel, current)
568+
}
569+
skip = false
564570
next, ok := replaces[current]
565571
if !ok {
566572
break
567573
}
574+
if _, ok := skipped[current.Identifier()]; ok {
575+
skip = true
576+
}
568577
current = next
569578
}
570579

pkg/controller/registry/resolver/resolver_test.go

Lines changed: 70 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
335335
},
336336
operators: []*Operator{
337337
genOperator("packageA.v1", "0.0.1", "packageA.v1", "packageA", "alpha", "community", namespace, nil,
338-
nil, opToAddVersionDeps, "",false),
338+
nil, opToAddVersionDeps, "", false),
339339
},
340340
},
341341
registry.CatalogKey{
@@ -348,7 +348,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
348348
},
349349
operators: []*Operator{
350350
genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator",
351-
namespace, nil, nil, nil, "",false),
351+
namespace, nil, nil, nil, "", false),
352352
},
353353
},
354354
registry.CatalogKey{
@@ -362,7 +362,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
362362
priority: catalogSourcePriority(100),
363363
operators: []*Operator{
364364
genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "high-priority-operator",
365-
namespace, nil, nil, nil, "",false),
365+
namespace, nil, nil, nil, "", false),
366366
},
367367
},
368368
},
@@ -377,9 +377,9 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
377377
assert.NoError(t, err)
378378
expected := OperatorSet{
379379
"packageA.v1": genOperator("packageA.v1", "0.0.1", "packageA.v1", "packageA", "alpha", "community", "olm",
380-
nil, nil, opToAddVersionDeps, "",false),
380+
nil, nil, opToAddVersionDeps, "", false),
381381
"packageB.v1": genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "high-priority-operator", "olm",
382-
nil, nil, nil, "",false),
382+
nil, nil, nil, "", false),
383383
}
384384
assert.Equal(t, 2, len(operators))
385385
for k, e := range expected {
@@ -398,7 +398,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
398398
priority: catalogSourcePriority(100),
399399
operators: []*Operator{
400400
genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator",
401-
namespace, nil, nil, nil, "",false),
401+
namespace, nil, nil, nil, "", false),
402402
},
403403
}
404404

@@ -410,9 +410,9 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
410410
assert.NoError(t, err)
411411
expected = OperatorSet{
412412
"packageA.v1": genOperator("packageA.v1", "0.0.1", "packageA.v1", "packageA", "alpha", "community", "olm",
413-
nil, nil, opToAddVersionDeps, "",false),
413+
nil, nil, opToAddVersionDeps, "", false),
414414
"packageB.v1": genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator", "olm",
415-
nil, nil, nil, "",false),
415+
nil, nil, nil, "", false),
416416
}
417417
assert.Equal(t, 2, len(operators))
418418
for k, e := range expected {
@@ -430,9 +430,9 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
430430
},
431431
operators: []*Operator{
432432
genOperator("packageA.v1", "0.0.1", "packageA.v1", "packageA", "alpha", "community", namespace, nil,
433-
nil, opToAddVersionDeps, "",false),
433+
nil, opToAddVersionDeps, "", false),
434434
genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community",
435-
namespace, nil, nil, nil, "",false),
435+
namespace, nil, nil, nil, "", false),
436436
},
437437
}
438438

@@ -444,9 +444,9 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) {
444444
assert.NoError(t, err)
445445
expected = OperatorSet{
446446
"packageA.v1": genOperator("packageA.v1", "0.0.1", "packageA.v1", "packageA", "alpha", "community", "olm",
447-
nil, nil, opToAddVersionDeps, "",false),
447+
nil, nil, opToAddVersionDeps, "", false),
448448
"packageB.v1": genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community", "olm",
449-
nil, nil, nil, "",false),
449+
nil, nil, nil, "", false),
450450
}
451451
assert.Equal(t, 2, len(operators))
452452
for k, e := range expected {
@@ -1343,3 +1343,61 @@ func TestSolveOperators_WithoutDeprecated(t *testing.T) {
13431343
}
13441344
require.EqualValues(t, expected, operators)
13451345
}
1346+
1347+
func TestSolveOperators_WithSkips(t *testing.T) {
1348+
APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}}
1349+
Provides := APISet
1350+
1351+
namespace := "olm"
1352+
catalog := registry.CatalogKey{"community", namespace}
1353+
1354+
newSub := newSub(namespace, "packageB", "alpha", catalog)
1355+
subs := []*v1alpha1.Subscription{newSub}
1356+
1357+
opToAddVersionDeps := []*api.Dependency{
1358+
{
1359+
Type: "olm.gvk",
1360+
Value: `{"group":"g","kind":"k","version":"v"}`,
1361+
},
1362+
}
1363+
1364+
opB := genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false)
1365+
op1 := genOperator("packageA.v1", "1.0.0", "", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false)
1366+
op2 := genOperator("packageA.v2", "2.0.0", "packageA.v1", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false)
1367+
op3 := genOperator("packageA.v3", "3.0.0", "packageA.v2", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false)
1368+
op4 := genOperator("packageA.v4", "4.0.0", "packageA.v2", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false)
1369+
op4.skips = []string{"packageA.v3"}
1370+
op5 := genOperator("packageA.v5", "5.0.0", "packageA.v1", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false)
1371+
op5.skips = []string{"packageA.v2", "packageA.v3", "packageA.v4"}
1372+
op6 := genOperator("packageA.v6", "6.0.0", "packageA.v5", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false)
1373+
1374+
fakeNamespacedOperatorCache := NamespacedOperatorCache{
1375+
snapshots: map[registry.CatalogKey]*CatalogSnapshot{
1376+
registry.CatalogKey{
1377+
Namespace: "olm",
1378+
Name: "community",
1379+
}: {
1380+
key: registry.CatalogKey{
1381+
Namespace: "olm",
1382+
Name: "community",
1383+
},
1384+
operators: []*Operator{
1385+
opB, op1, op2, op3, op4, op5, op6,
1386+
},
1387+
},
1388+
},
1389+
}
1390+
satResolver := SatResolver{
1391+
cache: getFakeOperatorCache(fakeNamespacedOperatorCache),
1392+
log: logrus.New(),
1393+
}
1394+
1395+
operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs)
1396+
assert.NoError(t, err)
1397+
1398+
expected := OperatorSet{
1399+
"packageB.v1": genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false),
1400+
"packageA.v6": genOperator("packageA.v6", "6.0.0", "packageA.v5", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false),
1401+
}
1402+
require.EqualValues(t, expected, operators)
1403+
}

0 commit comments

Comments
 (0)