Skip to content

Commit 0db4a76

Browse files
committed
feat(lister): add catalogsources to operatorlister
1 parent 00cb4ee commit 0db4a76

File tree

2 files changed

+101
-1
lines changed

2 files changed

+101
-1
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package operatorlister
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
"k8s.io/apimachinery/pkg/labels"
9+
"k8s.io/apimachinery/pkg/types"
10+
11+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
12+
listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
13+
)
14+
15+
type UnionCatalogSourceLister struct {
16+
catsrcListers map[string]listers.CatalogSourceLister
17+
catsrcLock sync.RWMutex
18+
}
19+
20+
// List lists all CatalogSources in the indexer.
21+
func (ucl *UnionCatalogSourceLister) List(selector labels.Selector) (ret []*v1alpha1.CatalogSource, err error) {
22+
ucl.catsrcLock.RLock()
23+
defer ucl.catsrcLock.RUnlock()
24+
25+
set := make(map[types.UID]*v1alpha1.CatalogSource)
26+
for _, cl := range ucl.catsrcListers {
27+
catsrcs, err := cl.List(selector)
28+
if err != nil {
29+
return nil, err
30+
}
31+
32+
for _, catsrc := range catsrcs {
33+
set[catsrc.GetUID()] = catsrc
34+
}
35+
}
36+
37+
for _, catsrc := range set {
38+
ret = append(ret, catsrc)
39+
}
40+
41+
return
42+
}
43+
44+
// CatalogSources returns an object that can list and get CatalogSources.
45+
func (ucl *UnionCatalogSourceLister) CatalogSources(namespace string) listers.CatalogSourceNamespaceLister {
46+
ucl.catsrcLock.RLock()
47+
defer ucl.catsrcLock.RUnlock()
48+
49+
// Check for specific namespace listers
50+
if cl, ok := ucl.catsrcListers[namespace]; ok {
51+
return cl.CatalogSources(namespace)
52+
}
53+
54+
// Check for any namespace-all listers
55+
if cl, ok := ucl.catsrcListers[metav1.NamespaceAll]; ok {
56+
return cl.CatalogSources(namespace)
57+
}
58+
59+
return &NullCatalogSourceNamespaceLister{}
60+
}
61+
62+
func (ucl *UnionCatalogSourceLister) RegisterCatalogSourceLister(namespace string, lister listers.CatalogSourceLister) {
63+
ucl.catsrcLock.Lock()
64+
defer ucl.catsrcLock.Unlock()
65+
66+
if ucl.catsrcListers == nil {
67+
ucl.catsrcListers = make(map[string]listers.CatalogSourceLister)
68+
}
69+
70+
ucl.catsrcListers[namespace] = lister
71+
}
72+
73+
func (l *operatorsV1alpha1Lister) RegisterCatalogSourceLister(namespace string, lister listers.CatalogSourceLister) {
74+
l.catalogSourceLister.RegisterCatalogSourceLister(namespace, lister)
75+
}
76+
77+
func (l *operatorsV1alpha1Lister) CatalogSourceLister() listers.CatalogSourceLister {
78+
return l.catalogSourceLister
79+
}
80+
81+
// NullCatalogSourceNamespaceLister is an implementation of a null CatalogSourceNamespaceLister. It is
82+
// used to prevent nil pointers when no CatalogSourceNamespaceLister has been registered for a given
83+
// namespace.
84+
type NullCatalogSourceNamespaceLister struct {
85+
listers.CatalogSourceNamespaceLister
86+
}
87+
88+
// List returns nil and an error explaining that this is a NullCatalogSourceNamespaceLister.
89+
func (n *NullCatalogSourceNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.CatalogSource, err error) {
90+
return nil, fmt.Errorf("cannot list CatalogSources with a NullCatalogSourceNamespaceLister")
91+
}
92+
93+
// Get returns nil and an error explaining that this is a NullCatalogSourceNamespaceLister.
94+
func (n *NullCatalogSourceNamespaceLister) Get(name string) (*v1alpha1.CatalogSource, error) {
95+
return nil, fmt.Errorf("cannot get CatalogSource with a NullCatalogSourceNamespaceLister")
96+
}

pkg/lib/operatorlister/lister.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
rbacv1 "k8s.io/client-go/listers/rbac/v1"
88
aregv1 "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1"
99

10-
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1"
10+
v1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1"
1111
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
1212
)
1313

@@ -78,10 +78,12 @@ type APIExtensionsV1beta1Lister interface {
7878
//go:generate counterfeiter . OperatorsV1alpha1Lister
7979
type OperatorsV1alpha1Lister interface {
8080
RegisterClusterServiceVersionLister(namespace string, lister v1alpha1.ClusterServiceVersionLister)
81+
RegisterCatalogSourceLister(namespace string, lister v1alpha1.CatalogSourceLister)
8182
RegisterSubscriptionLister(namespace string, lister v1alpha1.SubscriptionLister)
8283
RegisterInstallPlanLister(namespace string, lister v1alpha1.InstallPlanLister)
8384

8485
ClusterServiceVersionLister() v1alpha1.ClusterServiceVersionLister
86+
CatalogSourceLister() v1alpha1.CatalogSourceLister
8587
SubscriptionLister() v1alpha1.SubscriptionLister
8688
InstallPlanLister() v1alpha1.InstallPlanLister
8789
}
@@ -161,13 +163,15 @@ func newAPIExtensionsV1beta1Lister() *apiExtensionsV1beta1Lister {
161163

162164
type operatorsV1alpha1Lister struct {
163165
clusterServiceVersionLister *UnionClusterServiceVersionLister
166+
catalogSourceLister *UnionCatalogSourceLister
164167
subscriptionLister *UnionSubscriptionLister
165168
installPlanLister *UnionInstallPlanLister
166169
}
167170

168171
func newOperatorsV1alpha1Lister() *operatorsV1alpha1Lister {
169172
return &operatorsV1alpha1Lister{
170173
clusterServiceVersionLister: &UnionClusterServiceVersionLister{},
174+
catalogSourceLister: &UnionCatalogSourceLister{},
171175
subscriptionLister: &UnionSubscriptionLister{},
172176
installPlanLister: &UnionInstallPlanLister{},
173177
}

0 commit comments

Comments
 (0)