Skip to content

Commit bcbc5d6

Browse files
Merge pull request #1735 from dinhxuanvu/add-skips-operator
Bug 1869441: Add skips information to Operator representation
2 parents 18dd8b3 + 44ac7a7 commit bcbc5d6

File tree

3 files changed

+97
-19
lines changed

3 files changed

+97
-19
lines changed

pkg/controller/registry/resolver/operators.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ type OperatorSurface interface {
218218
Inline() bool
219219
Dependencies() []*api.Dependency
220220
Properties() []*api.Property
221+
Skips() []string
221222
}
222223

223224
type Operator struct {
@@ -230,6 +231,7 @@ type Operator struct {
230231
sourceInfo *OperatorSourceInfo
231232
dependencies []*api.Dependency
232233
properties []*api.Property
234+
skips []string
233235
}
234236

235237
var _ OperatorSurface = &Operator{}
@@ -307,6 +309,7 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg
307309
sourceInfo: sourceInfo,
308310
dependencies: dependencies,
309311
properties: properties,
312+
skips: bundle.Skips,
310313
}, nil
311314
}
312315

@@ -372,6 +375,10 @@ func (o *Operator) Replaces() string {
372375
return o.replaces
373376
}
374377

378+
func (o *Operator) Skips() []string {
379+
return o.skips
380+
}
381+
375382
func (o *Operator) SetReplaces(replacing string) {
376383
o.replaces = replacing
377384
}

pkg/controller/registry/resolver/resolver.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -522,21 +522,27 @@ func (r *SatResolver) sortChannel(bundles []*Operator) ([]*Operator, error) {
522522

523523
bundleLookup := map[string]*Operator{}
524524

525-
// if a replacedBy b, then replacedBy[b] = a
525+
// 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
531532
}
532533

533534
for _, b := range bundles {
534-
if b.replaces == "" {
535-
continue
535+
if b.replaces != "" {
536+
if r, ok := bundleLookup[b.replaces]; ok {
537+
replacedBy[r] = b
538+
replaces[b] = r
539+
}
536540
}
537-
if r, ok := bundleLookup[b.replaces]; ok {
538-
replacedBy[r] = b
539-
replaces[b] = r
541+
for _, skip := range b.skips {
542+
if r, ok := bundleLookup[skip]; ok {
543+
replacedBy[r] = b
544+
skipped[skip] = r
545+
}
540546
}
541547
}
542548

@@ -555,12 +561,19 @@ func (r *SatResolver) sortChannel(bundles []*Operator) ([]*Operator, error) {
555561

556562
head := headCandidates[0]
557563
current := head
564+
skip := false
558565
for {
559-
channel = append(channel, current)
566+
if skip == false {
567+
channel = append(channel, current)
568+
}
569+
skip = false
560570
next, ok := replaces[current]
561571
if !ok {
562572
break
563573
}
574+
if _, ok := skipped[current.Identifier()]; ok {
575+
skip = true
576+
}
564577
current = next
565578
}
566579

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)