Skip to content

Commit a8b00ef

Browse files
Merge pull request #1687 from dinhxuanvu/add-label-type
feat(resolver): Add label dependency type to new resolver
2 parents 5e5b11f + e97eaa1 commit a8b00ef

File tree

13 files changed

+457
-80
lines changed

13 files changed

+457
-80
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/openshift/api v0.0.0-20200331152225-585af27e34fd
2424
github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0
2525
github.com/operator-framework/api v0.3.11
26-
github.com/operator-framework/operator-registry v1.13.3
26+
github.com/operator-framework/operator-registry v1.13.6
2727
github.com/otiai10/copy v1.2.0
2828
github.com/pkg/errors v0.9.1
2929
github.com/prometheus/client_golang v1.2.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -587,8 +587,8 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ
587587
github.com/operator-framework/api v0.3.7-0.20200602203552-431198de9fc2/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q=
588588
github.com/operator-framework/api v0.3.11 h1:+fyck2pcr+vVGnVxM4UNoi7qOSMVCTQOWW2xsJtLSq0=
589589
github.com/operator-framework/api v0.3.11/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q=
590-
github.com/operator-framework/operator-registry v1.13.3 h1:SaZ1IKLKGizVgTtT8AlDgaMXFYOiIPxRf8KLve0/DXM=
591-
github.com/operator-framework/operator-registry v1.13.3/go.mod h1:YhnIzOVjRU2ZwZtzt+fjcjW8ujJaSFynBEu7QVKaSdU=
590+
github.com/operator-framework/operator-registry v1.13.6 h1:h/dIjQQS7uneQNRifrSz7h0xg4Xyjg6C9f6XZofbMPg=
591+
github.com/operator-framework/operator-registry v1.13.6/go.mod h1:YhnIzOVjRU2ZwZtzt+fjcjW8ujJaSFynBEu7QVKaSdU=
592592
github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=
593593
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
594594
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=

pkg/controller/registry/resolver/cache.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,25 @@ func WithVersionInRange(r semver.Range) OperatorPredicate {
422422
}
423423
}
424424

425+
func WithLabel(label string) OperatorPredicate {
426+
return func(o *Operator) bool {
427+
for _, p := range o.Properties() {
428+
if p.Type != opregistry.LabelType {
429+
continue
430+
}
431+
var prop opregistry.LabelProperty
432+
err := json.Unmarshal([]byte(p.Value), &prop)
433+
if err != nil {
434+
continue
435+
}
436+
if prop.Label == label {
437+
return true
438+
}
439+
}
440+
return false
441+
}
442+
}
443+
425444
func ProvidingAPI(api opregistry.APIKey) OperatorPredicate {
426445
return func(o *Operator) bool {
427446
for _, p := range o.Properties() {

pkg/controller/registry/resolver/operators.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg
258258

259259
// legacy support - if the api doesn't contain properties/dependencies, build them from required/provided apis
260260
properties := bundle.Properties
261-
if properties == nil || len(properties) == 0{
261+
if properties == nil || len(properties) == 0 {
262262
properties, err = apisToProperties(provided)
263263
if err != nil {
264264
return nil, err
@@ -297,8 +297,6 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg
297297
return op, nil
298298
}
299299

300-
301-
302300
return &Operator{
303301
name: bundle.CsvName,
304302
replaces: bundle.Replaces,
@@ -445,6 +443,7 @@ func PredicateForDependency(dependency *api.Dependency) (OperatorPredicate, erro
445443
var predicates = map[string]func(string) (OperatorPredicate, error){
446444
opregistry.GVKType: predicateForGVKDependency,
447445
opregistry.PackageType: predicateForPackageDependency,
446+
opregistry.LabelType: predicateForLabelDependency,
448447
}
449448

450449
func predicateForGVKDependency(value string) (OperatorPredicate, error) {
@@ -472,6 +471,15 @@ func predicateForPackageDependency(value string) (OperatorPredicate, error) {
472471
return And(WithPackage(pkg.PackageName), WithVersionInRange(ver)), nil
473472
}
474473

474+
func predicateForLabelDependency(value string) (OperatorPredicate, error) {
475+
var label opregistry.LabelDependency
476+
if err := json.Unmarshal([]byte(value), &label); err != nil {
477+
return nil, err
478+
}
479+
480+
return WithLabel(label.Label), nil
481+
}
482+
475483
func apisToDependencies(apis APISet) (out []*api.Dependency, err error) {
476484
if len(apis) == 0 {
477485
return

pkg/controller/registry/resolver/resolver_test.go

Lines changed: 107 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,107 @@ func TestSolveOperators_WithGVKDependencies(t *testing.T) {
419419
}
420420
}
421421

422+
func TestSolveOperators_WithLabelDependencies(t *testing.T) {
423+
namespace := "olm"
424+
catalog := registry.CatalogKey{"community", namespace}
425+
426+
newSub := newSub(namespace, "packageA", "alpha", catalog)
427+
subs := []*v1alpha1.Subscription{newSub}
428+
429+
deps := []*api.Dependency{
430+
{
431+
Type: "olm.label",
432+
Value: `{"label":"lts"}`,
433+
},
434+
}
435+
436+
props := []*api.Property{
437+
{
438+
Type: "olm.label",
439+
Value: `{"label":"lts"}`,
440+
},
441+
}
442+
443+
operatorBv1 := genOperator("packageB.v1", "1.0.0", "", "packageB", "beta", "community", "olm", nil, nil, nil, "")
444+
for _, p := range props {
445+
operatorBv1.properties = append(operatorBv1.properties, p)
446+
}
447+
448+
fakeNamespacedOperatorCache := NamespacedOperatorCache{
449+
snapshots: map[registry.CatalogKey]*CatalogSnapshot{
450+
registry.CatalogKey{
451+
Namespace: "olm",
452+
Name: "community",
453+
}: {
454+
key: registry.CatalogKey{
455+
Namespace: "olm",
456+
Name: "community",
457+
},
458+
operators: []*Operator{
459+
genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, ""),
460+
operatorBv1,
461+
},
462+
},
463+
},
464+
}
465+
satResolver := SatResolver{
466+
cache: getFakeOperatorCache(fakeNamespacedOperatorCache),
467+
}
468+
469+
operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs)
470+
assert.NoError(t, err)
471+
assert.Equal(t, 2, len(operators))
472+
473+
expected := OperatorSet{
474+
"packageA": genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, ""),
475+
"packageB.v1": operatorBv1,
476+
}
477+
for k := range expected {
478+
require.NotNil(t, operators[k])
479+
assert.EqualValues(t, k, operators[k].Identifier())
480+
}
481+
}
482+
483+
func TestSolveOperators_WithUnsatisfiableLabelDependencies(t *testing.T) {
484+
namespace := "olm"
485+
catalog := registry.CatalogKey{"community", namespace}
486+
487+
newSub := newSub(namespace, "packageA", "alpha", catalog)
488+
subs := []*v1alpha1.Subscription{newSub}
489+
490+
deps := []*api.Dependency{
491+
{
492+
Type: "olm.label",
493+
Value: `{"label":"lts"}`,
494+
},
495+
}
496+
497+
fakeNamespacedOperatorCache := NamespacedOperatorCache{
498+
snapshots: map[registry.CatalogKey]*CatalogSnapshot{
499+
registry.CatalogKey{
500+
Namespace: "olm",
501+
Name: "community",
502+
}: {
503+
key: registry.CatalogKey{
504+
Namespace: "olm",
505+
Name: "community",
506+
},
507+
operators: []*Operator{
508+
genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, ""),
509+
genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, ""),
510+
},
511+
},
512+
},
513+
}
514+
satResolver := SatResolver{
515+
cache: getFakeOperatorCache(fakeNamespacedOperatorCache),
516+
}
517+
518+
operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs)
519+
assert.Error(t, err)
520+
assert.Equal(t, 0, len(operators))
521+
}
522+
422523
func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) {
423524
APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}}
424525
Provides := APISet
@@ -596,7 +697,7 @@ func TestSolveOperators_PreferCatalogInSameNamespace(t *testing.T) {
596697

597698
csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil)
598699
csvs := []*v1alpha1.ClusterServiceVersion{csv}
599-
sub := existingSub(namespace,"packageA.v1", "packageA", "alpha", catalog)
700+
sub := existingSub(namespace, "packageA.v1", "packageA", "alpha", catalog)
600701
subs := []*v1alpha1.Subscription{sub}
601702

602703
fakeNamespacedOperatorCache := NamespacedOperatorCache{
@@ -789,7 +890,7 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing.
789890
assert.NoError(t, err)
790891
assert.Equal(t, 2, len(operators))
791892
expected := OperatorSet{
792-
"packageA.v1": stripBundle(genOperator("packageA.v1", "", "", "packageA", "alpha", "@existing", catalog.Namespace, nil, Provides, nil, "")),
893+
"packageA.v1": stripBundle(genOperator("packageA.v1", "", "", "packageA", "alpha", "@existing", catalog.Namespace, nil, Provides, nil, "")),
793894
"packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", catalog.Name, catalog.Namespace, Provides, nil, apiSetToDependencies(Provides, nil), ""),
794895
}
795896
for k := range expected {
@@ -903,8 +1004,8 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) {
9031004
catalog := registry.CatalogKey{Name: "community", Namespace: namespace}
9041005

9051006
phases := []struct {
906-
subs []*v1alpha1.Subscription
907-
catalog *CatalogSnapshot
1007+
subs []*v1alpha1.Subscription
1008+
catalog *CatalogSnapshot
9081009
expected OperatorSet
9091010
}{
9101011
{
@@ -1023,7 +1124,7 @@ func genOperator(name, version, replaces, pkg, channel, catalogName, catalogName
10231124
Properties: apiSetToProperties(providedAPIs, nil),
10241125
},
10251126
dependencies: dependencies,
1026-
properties: apiSetToProperties(providedAPIs, nil),
1127+
properties: apiSetToProperties(providedAPIs, nil),
10271128
sourceInfo: &OperatorSourceInfo{
10281129
Catalog: registry.CatalogKey{
10291130
Name: catalogName,
@@ -1041,4 +1142,4 @@ func genOperator(name, version, replaces, pkg, channel, catalogName, catalogName
10411142
func stripBundle(o *Operator) *Operator {
10421143
o.bundle = nil
10431144
return o
1044-
}
1145+
}

vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/generate.go

Lines changed: 2 additions & 38 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/validate.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-registry/pkg/registry/interface.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)