Skip to content

Commit 77e14ef

Browse files
committed
Add catalog weighting
Signed-off-by: Harish <[email protected]>
1 parent b7f4660 commit 77e14ef

File tree

6 files changed

+86
-8
lines changed

6 files changed

+86
-8
lines changed

pkg/controller/registry/resolver/cache.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
8+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
79
"sort"
810
"sync"
911
"time"
@@ -45,6 +47,7 @@ type OperatorCacheProvider interface {
4547
type OperatorCache struct {
4648
logger logrus.FieldLogger
4749
rcp RegistryClientProvider
50+
crClient versioned.Interface
4851
snapshots map[registry.CatalogKey]*CatalogSnapshot
4952
ttl time.Duration
5053
sem chan struct{}
@@ -53,14 +56,15 @@ type OperatorCache struct {
5356

5457
var _ OperatorCacheProvider = &OperatorCache{}
5558

56-
func NewOperatorCache(rcp RegistryClientProvider, log logrus.FieldLogger) *OperatorCache {
59+
func NewOperatorCache(rcp RegistryClientProvider, log logrus.FieldLogger, client versioned.Interface) *OperatorCache {
5760
const (
5861
MaxConcurrentSnapshotUpdates = 4
5962
)
6063

6164
return &OperatorCache{
6265
logger: log,
6366
rcp: rcp,
67+
crClient: client,
6468
snapshots: make(map[registry.CatalogKey]*CatalogSnapshot),
6569
ttl: 5 * time.Minute,
6670
sem: make(chan struct{}, MaxConcurrentSnapshotUpdates),
@@ -151,11 +155,20 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin
151155

152156
for _, miss := range misses {
153157
ctx, cancel := context.WithTimeout(context.Background(), CachePopulateTimeout)
158+
159+
catsrcPriority := 0
160+
// Ignoring error and treating catalog source priority as 0 if not found
161+
catsrc, err := c.crClient.OperatorsV1alpha1().CatalogSources(miss.Namespace).Get(ctx, miss.Name, v1.GetOptions{})
162+
if err == nil {
163+
catsrcPriority = catsrc.Spec.Priority
164+
}
165+
154166
s := CatalogSnapshot{
155-
logger: c.logger.WithField("catalog", miss),
156-
key: miss,
157-
expiry: now.Add(c.ttl),
158-
pop: cancel,
167+
logger: c.logger.WithField("catalog", miss),
168+
key: miss,
169+
expiry: now.Add(c.ttl),
170+
pop: cancel,
171+
priority: setCatalogPriority(miss, catsrcPriority),
159172
}
160173
s.m.Lock()
161174
c.snapshots[miss] = &s
@@ -277,6 +290,7 @@ type CatalogSnapshot struct {
277290
operators []*Operator
278291
m sync.RWMutex
279292
pop context.CancelFunc
293+
priority Priority
280294
}
281295

282296
func (s *CatalogSnapshot) Cancel() {
@@ -354,6 +368,9 @@ func (s SortableSnapshots) Less(i, j int) bool {
354368
return false
355369
}
356370

371+
if s.snapshots[i].priority != s.snapshots[j].priority {
372+
return s.snapshots[i].priority.catsrcPriority > s.snapshots[j].priority.catsrcPriority
373+
}
357374
// the rest are sorted first in namespace preference order, then by name
358375
if s.snapshots[i].key.Namespace != s.snapshots[j].key.Namespace {
359376
return s.namespaces[s.snapshots[i].key.Namespace] < s.namespaces[s.snapshots[j].key.Namespace]
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package resolver
2+
3+
import "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry"
4+
5+
type Priority struct {
6+
catsrcPriority int
7+
}
8+
9+
const (
10+
defaultRHCatalogSourceName = ""
11+
defaultCertifiedCatalogSourceName = ""
12+
defaultCommunityCatalogSourceName = ""
13+
defaultRHCatalogSourcePriority = -100
14+
defaultCertifiedCatalogSourcePriority = -200
15+
defaultCommunityCatalogSourcePriority = -300
16+
)
17+
18+
func setCatalogPriority(key registry.CatalogKey, catsrc int) Priority {
19+
if catsrc == 0 {
20+
return assignDefaultCatalogPriority(key, catsrc)
21+
}
22+
return Priority{catsrcPriority: catsrc}
23+
}
24+
25+
func assignDefaultCatalogPriority(key registry.CatalogKey, catsrc int) Priority {
26+
27+
if key.Name == defaultRHCatalogSourceName {
28+
return Priority{catsrcPriority: defaultRHCatalogSourcePriority}
29+
}
30+
31+
if key.Name == defaultCertifiedCatalogSourceName {
32+
return Priority{catsrcPriority: defaultCertifiedCatalogSourcePriority}
33+
}
34+
35+
if key.Name == defaultCommunityCatalogSourceName {
36+
return Priority{catsrcPriority: defaultCommunityCatalogSourcePriority}
37+
}
38+
39+
return Priority{catsrcPriority: 0}
40+
}

pkg/controller/registry/resolver/resolver.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
78
"sort"
89

910
"github.com/operator-framework/api/pkg/operators/v1alpha1"
@@ -24,9 +25,9 @@ type SatResolver struct {
2425
log logrus.FieldLogger
2526
}
2627

27-
func NewDefaultSatResolver(rcp RegistryClientProvider, log logrus.FieldLogger) *SatResolver {
28+
func NewDefaultSatResolver(rcp RegistryClientProvider, log logrus.FieldLogger, client versioned.Interface) *SatResolver {
2829
return &SatResolver{
29-
cache: NewOperatorCache(rcp, log),
30+
cache: NewOperatorCache(rcp, log, client),
3031
log: log,
3132
}
3233
}

pkg/controller/registry/resolver/step_resolver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versio
5555
client: client,
5656
kubeclient: kubeclient,
5757
globalCatalogNamespace: globalCatalogNamespace,
58-
satResolver: NewDefaultSatResolver(NewDefaultRegistryClientProvider(log, provider), log),
58+
satResolver: NewDefaultSatResolver(NewDefaultRegistryClientProvider(log, provider), log, client),
5959
log: log,
6060
}
6161
}

vendor/github.com/operator-framework/api/pkg/operators/catalogsource_types.go

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

vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/catalogsource_types.go

Lines changed: 10 additions & 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)