Skip to content

Commit 1e63998

Browse files
committed
feat(olm): use cache listers in olm-operator
1 parent 9b2e775 commit 1e63998

33 files changed

+3236
-69
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ container-mockgen:
130130
docker build -t olm:mockgen -f mockgen.Dockerfile .
131131
docker run --name temp-mockgen olm:mockgen /bin/true
132132
docker cp temp-mockgen:/go/src/github.com/operator-framework/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/. ./pkg/api/wrappers/wrappersfakes
133-
docker cp temp-mockgen:/go/src/github.com/operator-framework/operator-lifecycle-manager/pkg/fakes/. ./pkg/fakes
133+
docker cp temp-mockgen:/go/src/github.com/operator-framework/operator-lifecycle-manager/pkg/fakes/client-go/listers/. ./pkg/fakes/client-go/listers
134+
docker cp temp-mockgen:/go/src/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/. ./pkg/lib/operatorlister/operatorlisterfakes
134135
docker cp temp-mockgen:/go/src/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient/mock_client.go ./pkg/lib/operatorclient/mock_client.go
135136
docker rm temp-mockgen
136137

go.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,14 @@ k8s.io/api v0.0.0-20181108095152-eee84a6322ca h1:0gIeW03B5m7yni69Y95oPgDXv7ow7pu
214214
k8s.io/api v0.0.0-20181108095152-eee84a6322ca/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA=
215215
k8s.io/apiextensions-apiserver v0.0.0-20180905004947-16750353bf97 h1:s4lWWs6JN5kWVzk5bztddkr5kgO/cGIbqTDP+QttUeQ=
216216
k8s.io/apiextensions-apiserver v0.0.0-20180905004947-16750353bf97/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE=
217+
k8s.io/apiextensions-apiserver v0.0.0-20181110192823-2c43ee60e25b h1:O3KqnOdhludLAAHs7bvV7UpPYow3gqLqF5Junc5hbw8=
217218
k8s.io/apimachinery v0.0.0-20181026144827-8ee1a638bafa h1:i0EOpPFWExNx7efINILpw8LJeah7gakRl1zjvwVfjiI=
218219
k8s.io/apimachinery v0.0.0-20181026144827-8ee1a638bafa/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0=
219220
k8s.io/apiserver v0.0.0-20181026151315-13cfe3978170 h1:CqI85nZvPaV+7JFono0nAOGOx2brocqefcOhDPVhHKI=
220221
k8s.io/apiserver v0.0.0-20181026151315-13cfe3978170/go.mod h1:6bqaTSOSJavUIXUtfaR9Os9JtTCm8ZqH2SUl2S60C4w=
221222
k8s.io/client-go v8.0.0+incompatible h1:tTI4hRmb1DRMl4fG6Vclfdi6nTM82oIrTT7HfitmxC4=
222223
k8s.io/client-go v8.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
224+
k8s.io/client-go v9.0.0+incompatible h1:2kqW3X2xQ9SbFvWZjGEHBLlWc1LG9JIJNXWkuqwdZ3A=
223225
k8s.io/code-generator v0.0.0-20180904193909-8c97d6ab64da h1:L6YB6ObZIbZlYikTQcCjzZGilwS3OVyQBA2esULs8VM=
224226
k8s.io/code-generator v0.0.0-20180904193909-8c97d6ab64da/go.mod h1:MYiN+ZJZ9HkETbgVZdWw2AsuAi9PZ4V80cwfuf2axe8=
225227
k8s.io/gengo v0.0.0-20181106084056-51747d6e00da h1:ZMvcXtMVbhUCtCuiSEzBV+Eur4swzfdxx6ZyX3qT6dk=
@@ -228,6 +230,7 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92 h1:PgoMI/L1Nu5Vmvgm+vGheLuxKST8h6
228230
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
229231
k8s.io/kube-aggregator v0.0.0-20180905000155-efa32eb095fe h1:LM48rywzVEPRg+Os2oUL9/vsztPQGoxmiD3m5VySchw=
230232
k8s.io/kube-aggregator v0.0.0-20180905000155-efa32eb095fe/go.mod h1:8sbzT4QQKDEmSCIbfqjV0sd97GpUT7A4W626sBiYJmU=
233+
k8s.io/kube-aggregator v0.0.0-20181110192014-6f96af33cb59 h1:8VFjmCurXo3sMW0ASrUvoE4aT8FCzsIz55uic1EyUIc=
231234
k8s.io/kube-openapi v0.0.0-20181031203759-72693cb1fadd h1:ggv/Vfza0i5xuhUZyYyxcc25AmQvHY8Zi1C2m8WgBvA=
232235
k8s.io/kube-openapi v0.0.0-20181031203759-72693cb1fadd/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
233236
k8s.io/kubernetes v1.11.5-beta.0.0.20181108064615-3290824d1c7b h1:i9PV0cnNZrleFj2YjDYDAUku1qg/SlKfdm4LdTJzAFo=

pkg/api/wrappers/deployment_install_client.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
package wrappers
33

44
import (
5-
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
6-
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
75
"github.com/pkg/errors"
86
appsv1 "k8s.io/api/apps/v1"
97
corev1 "k8s.io/api/core/v1"
108
rbacv1 "k8s.io/api/rbac/v1"
119
apierrors "k8s.io/apimachinery/pkg/api/errors"
1210
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
12+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
13+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister"
14+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
1315
)
1416

1517
var ErrNilObject = errors.New("Bad object supplied: <nil>")
@@ -27,14 +29,16 @@ type InstallStrategyDeploymentInterface interface {
2729

2830
type InstallStrategyDeploymentClientForNamespace struct {
2931
opClient operatorclient.ClientInterface
32+
opLister operatorlister.OperatorLister
3033
Namespace string
3134
}
3235

3336
var _ InstallStrategyDeploymentInterface = &InstallStrategyDeploymentClientForNamespace{}
3437

35-
func NewInstallStrategyDeploymentClient(opClient operatorclient.ClientInterface, namespace string) InstallStrategyDeploymentInterface {
38+
func NewInstallStrategyDeploymentClient(opClient operatorclient.ClientInterface, opLister operatorlister.OperatorLister, namespace string) InstallStrategyDeploymentInterface {
3639
return &InstallStrategyDeploymentClientForNamespace{
3740
opClient: opClient,
41+
opLister: opLister,
3842
Namespace: namespace,
3943
}
4044
}
@@ -52,7 +56,7 @@ func (c *InstallStrategyDeploymentClientForNamespace) EnsureServiceAccount(servi
5256
return nil, ErrNilObject
5357
}
5458

55-
foundAccount, err := c.opClient.GetServiceAccount(c.Namespace, serviceAccount.Name)
59+
foundAccount, err := c.opLister.CoreV1().ServiceAccountLister().ServiceAccounts(c.Namespace).Get(serviceAccount.Name)
5660
if err != nil && !apierrors.IsNotFound(err) {
5761
return nil, errors.Wrap(err, "checking for existing serviceacccount failed")
5862
}
@@ -96,14 +100,13 @@ func (c *InstallStrategyDeploymentClientForNamespace) CreateOrUpdateDeployment(d
96100
}
97101

98102
func (c *InstallStrategyDeploymentClientForNamespace) GetServiceAccountByName(serviceAccountName string) (*corev1.ServiceAccount, error) {
99-
return c.opClient.KubernetesInterface().CoreV1().ServiceAccounts(c.Namespace).Get(serviceAccountName, metav1.GetOptions{})
103+
return c.opLister.CoreV1().ServiceAccountLister().ServiceAccounts(c.Namespace).Get(serviceAccountName)
100104
}
101105

102106
func (c *InstallStrategyDeploymentClientForNamespace) FindAnyDeploymentsMatchingNames(depNames []string) ([]*appsv1.Deployment, error) {
103107
var deployments []*appsv1.Deployment
104108
for _, depName := range depNames {
105-
fetchedDep, err := c.opClient.GetDeployment(c.Namespace, depName)
106-
109+
fetchedDep, err := c.opLister.AppsV1().DeploymentLister().Deployments(c.Namespace).Get(depName)
107110
if err == nil {
108111
deployments = append(deployments, fetchedDep)
109112
} else {

pkg/api/wrappers/deployment_install_client_test.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,27 @@ package wrappers
33
import (
44
"fmt"
55
"testing"
6+
"time"
67

78
"github.com/golang/mock/gomock"
8-
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
9-
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
109
"github.com/pkg/errors"
1110
"github.com/stretchr/testify/require"
1211
corev1 "k8s.io/api/core/v1"
1312
"k8s.io/apimachinery/pkg/api/equality"
1413
apierrors "k8s.io/apimachinery/pkg/api/errors"
1514
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1615
"k8s.io/apimachinery/pkg/util/diff"
16+
17+
listerfakes "github.com/operator-framework/operator-lifecycle-manager/pkg/fakes/client-go/listers"
18+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
19+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
20+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes"
1721
)
1822

1923
var (
2024
Controller = false
2125
BlockOwnerDeletion = false
26+
WakeupInterval = 5 * time.Second
2227
)
2328

2429
func ownerReferenceFromCSV(csv *v1alpha1.ClusterServiceVersion) metav1.OwnerReference {
@@ -405,13 +410,18 @@ func TestEnsureServiceAccount(t *testing.T) {
405410
t.Run(testName, func(t *testing.T) {
406411
ctrl := gomock.NewController(t)
407412
mockOpClient := operatorclient.NewMockClientInterface(ctrl)
408-
client := NewInstallStrategyDeploymentClient(mockOpClient, tt.state.namespace)
413+
fakeLister := &operatorlisterfakes.FakeOperatorLister{}
414+
fakeCoreV1Lister := &operatorlisterfakes.FakeCoreV1Lister{}
415+
fakeServiceAccountLister := &listerfakes.FakeServiceAccountLister{}
416+
fakeServiceAccountNamespacedLister := &listerfakes.FakeServiceAccountNamespaceLister{}
417+
fakeServiceAccountNamespacedLister.GetReturns(tt.state.existingServiceAccount, tt.state.getServiceAccountError)
418+
fakeServiceAccountLister.ServiceAccountsReturns(fakeServiceAccountNamespacedLister)
419+
fakeCoreV1Lister.ServiceAccountListerReturns(fakeServiceAccountLister)
420+
fakeLister.CoreV1Returns(fakeCoreV1Lister)
409421

410-
mockOpClient.EXPECT().
411-
GetServiceAccount(tt.state.namespace, tt.input.serviceAccountName).
412-
Return(tt.state.existingServiceAccount, tt.state.getServiceAccountError).
413-
AnyTimes()
422+
client := NewInstallStrategyDeploymentClient(mockOpClient, fakeLister, tt.state.namespace)
414423

424+
415425
mockOpClient.EXPECT().
416426
CreateServiceAccount(tt.input.serviceAccount).
417427
Return(tt.state.createServiceAccountResult, tt.state.createServiceAccountError).

pkg/controller/install/resolver.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
1111
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/wrappers"
1212
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
13+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister"
1314
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
1415
)
1516

@@ -24,7 +25,7 @@ type StrategyInstaller interface {
2425

2526
type StrategyResolverInterface interface {
2627
UnmarshalStrategy(s v1alpha1.NamedInstallStrategy) (strategy Strategy, err error)
27-
InstallerForStrategy(strategyName string, opClient operatorclient.ClientInterface, owner ownerutil.Owner, previousStrategy Strategy) StrategyInstaller
28+
InstallerForStrategy(strategyName string, opClient operatorclient.ClientInterface, opLister operatorlister.OperatorLister, owner ownerutil.Owner, previousStrategy Strategy) StrategyInstaller
2829
}
2930

3031
type StrategyResolver struct{}
@@ -42,10 +43,10 @@ func (r *StrategyResolver) UnmarshalStrategy(s v1alpha1.NamedInstallStrategy) (s
4243
return
4344
}
4445

45-
func (r *StrategyResolver) InstallerForStrategy(strategyName string, opClient operatorclient.ClientInterface, owner ownerutil.Owner, previousStrategy Strategy) StrategyInstaller {
46+
func (r *StrategyResolver) InstallerForStrategy(strategyName string, opClient operatorclient.ClientInterface, opLister operatorlister.OperatorLister, owner ownerutil.Owner, previousStrategy Strategy) StrategyInstaller {
4647
switch strategyName {
4748
case InstallStrategyNameDeployment:
48-
strategyClient := wrappers.NewInstallStrategyDeploymentClient(opClient, owner.GetNamespace())
49+
strategyClient := wrappers.NewInstallStrategyDeploymentClient(opClient, opLister, owner.GetNamespace())
4950
return NewStrategyDeploymentInstaller(strategyClient, owner, previousStrategy)
5051
}
5152

pkg/controller/operators/olm/operator.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"k8s.io/client-go/tools/record"
2020
"k8s.io/client-go/util/workqueue"
2121
kagg "k8s.io/kube-aggregator/pkg/client/informers/externalversions"
22+
aextv1beta1 "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions"
2223

2324
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
2425
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
@@ -145,7 +146,7 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
145146
op.RegisterQueueInformer(namespaceQueueInformer)
146147
op.lister.CoreV1().RegisterNamespaceLister(namespaceInformer.Lister())
147148

148-
// Register APIService QueueInformers
149+
// Register APIService QueueInformer
149150
apiServiceInformer := kagg.NewSharedInformerFactory(opClient.ApiregistrationV1Interface(), wakeupInterval).Apiregistration().V1().APIServices()
150151
op.RegisterQueueInformer(queueinformer.NewInformer(
151152
workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "apiservices"),
@@ -158,6 +159,20 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
158159
metrics.NewMetricsNil(),
159160
))
160161
op.lister.APIRegistrationV1().RegisterAPIServiceLister(apiServiceInformer.Lister())
162+
163+
// Register CustomResourceDefinition QueueInformer
164+
customResourceDefinitionInformer := aextv1beta1.NewSharedInformerFactory(opClient.ApiextensionsV1beta1Interface(), wakeupInterval).Apiextensions().V1beta1().CustomResourceDefinitions()
165+
op.RegisterQueueInformer(queueinformer.NewInformer(
166+
workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "customresourcedefinitions"),
167+
customResourceDefinitionInformer.Informer(),
168+
op.syncObject,
169+
&cache.ResourceEventHandlerFuncs{
170+
DeleteFunc: op.handleDeletion,
171+
},
172+
"customresourcedefinitions",
173+
metrics.NewMetricsNil(),
174+
))
175+
op.lister.APIExtensionsV1beta1().RegisterCustomResourceDefinitionLister(customResourceDefinitionInformer.Lister())
161176

162177
// Register Secret QueueInformer
163178
secretInformer := informers.NewSharedInformerFactory(opClient.KubernetesInterface(), wakeupInterval).Core().V1().Secrets()
@@ -214,7 +229,7 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
214229
// Register queue and QueueInformer
215230
queueName := fmt.Sprintf("%s/clusterserviceversions", namespace)
216231
csvQueue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), queueName)
217-
csvQueueInformer := queueinformer.NewInformer(csvQueue, csvInformer.Informer(), op.syncClusterServiceVersion, csvHandlers, queueName, metrics.NewMetricsCSV(op.client))
232+
csvQueueInformer := queueinformer.NewInformer(csvQueue, csvInformer.Informer(), op.syncClusterServiceVersion, csvHandlers, queueName, metrics.NewMetricsCSV(op.lister.OperatorsV1alpha1().ClusterServiceVersionLister()))
218233
op.RegisterQueueInformer(csvQueueInformer)
219234
op.csvQueues[namespace] = csvQueue
220235
}
@@ -592,6 +607,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v
592607
for _, csv := range a.findIntermediatesForDeletion(out) {
593608
// we only mark them in this step, in case some get deleted but others fail and break the replacement chain
594609
csv.SetPhaseWithEvent(v1alpha1.CSVPhaseDeleting, v1alpha1.CSVReasonReplaced, "has been replaced by a newer ClusterServiceVersion that has successfully installed.", a.recorder)
610+
595611
// ignore errors and success here; this step is just an optimization to speed up GC
596612
a.client.OperatorsV1alpha1().ClusterServiceVersions(csv.GetNamespace()).UpdateStatus(csv)
597613
a.requeueCSV(csv.GetName(), csv.GetNamespace())
@@ -726,7 +742,7 @@ func (a *Operator) parseStrategiesAndUpdateStatus(csv *v1alpha1.ClusterServiceVe
726742
}
727743

728744
strName := strategy.GetStrategyName()
729-
installer := a.resolver.InstallerForStrategy(strName, a.OpClient, csv, previousStrategy)
745+
installer := a.resolver.InstallerForStrategy(strName, a.OpClient, a.lister, csv, previousStrategy)
730746
return installer, strategy, previousStrategy
731747
}
732748

@@ -790,7 +806,7 @@ func (a *Operator) isReplacing(in *v1alpha1.ClusterServiceVersion) *v1alpha1.Clu
790806
if in.Spec.Replaces == "" {
791807
return nil
792808
}
793-
previous, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(in.GetNamespace()).Get(in.Spec.Replaces, metav1.GetOptions{})
809+
previous, err := a.lister.OperatorsV1alpha1().ClusterServiceVersionLister().ClusterServiceVersions(in.GetNamespace()).Get(in.Spec.Replaces)
794810
if err != nil {
795811
log.Debugf("unable to get previous csv: %s", err.Error())
796812
return nil

0 commit comments

Comments
 (0)