Skip to content

Commit cf30b9f

Browse files
benluddykevinrizza
authored andcommitted
Use metadata-only watches when possible for Operator component APIs.
The Operator adoption controller reads metadata.ownerReferences and metadata.labels to adopt Operator components, and the Operator controller itself maintains a list of component references in status.components.refs. For APIs without a status.conditions field, these references are equivalent to v1 ObjectReferences, and can be constructed using only the component's metadata. For APIs that do have a status.conditions field, the references are augmented with that information. Signed-off-by: Ben Luddy <[email protected]> Upstream-repository: operator-lifecycle-manager Upstream-commit: 608d6bf1991cdc671a94848e884290a4bc4d9804
1 parent 62bd80f commit cf30b9f

File tree

12 files changed

+207
-104
lines changed

12 files changed

+207
-104
lines changed

staging/operator-lifecycle-manager/cmd/olm/manager.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
corev1 "k8s.io/api/core/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
78
"k8s.io/apimachinery/pkg/labels"
89
"k8s.io/apimachinery/pkg/runtime"
910
"k8s.io/apimachinery/pkg/selection"
@@ -34,6 +35,9 @@ func Manager(ctx context.Context, debug bool) (ctrl.Manager, error) {
3435
setupLog := ctrl.Log.WithName("setup").V(1)
3536

3637
scheme := runtime.NewScheme()
38+
if err := metav1.AddMetaToScheme(scheme); err != nil {
39+
return nil, err
40+
}
3741
if err := operators.AddToScheme(scheme); err != nil {
3842
// ctrl.NewManager needs the Scheme to be populated
3943
// up-front so that the NewCache implementation we

staging/operator-lifecycle-manager/pkg/controller/operators/adoption_controller.go

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
utilerrors "k8s.io/apimachinery/pkg/util/errors"
2020
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
2121
ctrl "sigs.k8s.io/controller-runtime"
22+
"sigs.k8s.io/controller-runtime/pkg/builder"
2223
"sigs.k8s.io/controller-runtime/pkg/client"
2324
"sigs.k8s.io/controller-runtime/pkg/handler"
2425
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -68,17 +69,17 @@ func (r *AdoptionReconciler) SetupWithManager(mgr ctrl.Manager) error {
6869
Watches(&source.Kind{Type: &appsv1.Deployment{}}, enqueueCSV).
6970
Watches(&source.Kind{Type: &corev1.Namespace{}}, enqueueCSV).
7071
Watches(&source.Kind{Type: &corev1.Service{}}, enqueueCSV).
71-
Watches(&source.Kind{Type: &corev1.ServiceAccount{}}, enqueueCSV).
72-
Watches(&source.Kind{Type: &corev1.Secret{}}, enqueueCSV).
73-
Watches(&source.Kind{Type: &corev1.ConfigMap{}}, enqueueCSV).
74-
Watches(&source.Kind{Type: &rbacv1.Role{}}, enqueueCSV).
75-
Watches(&source.Kind{Type: &rbacv1.RoleBinding{}}, enqueueCSV).
76-
Watches(&source.Kind{Type: &rbacv1.ClusterRole{}}, enqueueCSV).
77-
Watches(&source.Kind{Type: &rbacv1.ClusterRoleBinding{}}, enqueueCSV).
7872
Watches(&source.Kind{Type: &apiextensionsv1.CustomResourceDefinition{}}, enqueueProviders).
7973
Watches(&source.Kind{Type: &apiregistrationv1.APIService{}}, enqueueCSV).
8074
Watches(&source.Kind{Type: &operatorsv1alpha1.Subscription{}}, enqueueCSV).
8175
Watches(&source.Kind{Type: &operatorsv2.OperatorCondition{}}, enqueueCSV).
76+
Watches(&source.Kind{Type: &corev1.Secret{}}, enqueueCSV, builder.OnlyMetadata).
77+
Watches(&source.Kind{Type: &corev1.ConfigMap{}}, enqueueCSV, builder.OnlyMetadata).
78+
Watches(&source.Kind{Type: &corev1.ServiceAccount{}}, enqueueCSV, builder.OnlyMetadata).
79+
Watches(&source.Kind{Type: &rbacv1.Role{}}, enqueueCSV, builder.OnlyMetadata).
80+
Watches(&source.Kind{Type: &rbacv1.RoleBinding{}}, enqueueCSV, builder.OnlyMetadata).
81+
Watches(&source.Kind{Type: &rbacv1.ClusterRole{}}, enqueueCSV, builder.OnlyMetadata).
82+
Watches(&source.Kind{Type: &rbacv1.ClusterRoleBinding{}}, enqueueCSV, builder.OnlyMetadata).
8283
Complete(reconcile.Func(r.ReconcileClusterServiceVersion))
8384
if err != nil {
8485
return err
@@ -350,24 +351,7 @@ func (r *AdoptionReconciler) disownFromAll(ctx context.Context, component runtim
350351
func (r *AdoptionReconciler) adoptees(ctx context.Context, operator decorators.Operator, csv *operatorsv1alpha1.ClusterServiceVersion) ([]runtime.Object, error) {
351352
// Note: We need to figure out how to dynamically add new list types here (or some equivalent) in
352353
// order to support operators composed of custom resources.
353-
componentLists := []runtime.Object{
354-
&appsv1.DeploymentList{},
355-
&corev1.ServiceList{},
356-
&corev1.NamespaceList{},
357-
&corev1.ServiceAccountList{},
358-
&corev1.SecretList{},
359-
&corev1.ConfigMapList{},
360-
&rbacv1.RoleList{},
361-
&rbacv1.RoleBindingList{},
362-
&rbacv1.ClusterRoleList{},
363-
&rbacv1.ClusterRoleBindingList{},
364-
&apiregistrationv1.APIServiceList{},
365-
&apiextensionsv1.CustomResourceDefinitionList{},
366-
&operatorsv1alpha1.SubscriptionList{},
367-
&operatorsv1alpha1.InstallPlanList{},
368-
&operatorsv1alpha1.ClusterServiceVersionList{},
369-
&operatorsv2.OperatorConditionList{},
370-
}
354+
componentLists := componentLists()
371355

372356
// Only resources that aren't already labelled are adoption candidates
373357
selector, err := operator.NonComponentSelector()
@@ -403,7 +387,8 @@ func (r *AdoptionReconciler) adoptees(ctx context.Context, operator decorators.O
403387

404388
// Pick up owned CRDs
405389
for _, provided := range csv.Spec.CustomResourceDefinitions.Owned {
406-
crd := &apiextensionsv1.CustomResourceDefinition{}
390+
crd := &metav1.PartialObjectMetadata{}
391+
crd.SetGroupVersionKind(apiextensionsv1.SchemeGroupVersion.WithKind("CustomResourceDefinition"))
407392
if err := r.Get(ctx, types.NamespacedName{Name: provided.Name}, crd); err != nil {
408393
if !apierrors.IsNotFound(err) {
409394
// Inform requeue on transient error
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package operators
2+
3+
import (
4+
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
5+
operatorsv2 "github.com/operator-framework/api/pkg/operators/v2"
6+
appsv1 "k8s.io/api/apps/v1"
7+
corev1 "k8s.io/api/core/v1"
8+
rbacv1 "k8s.io/api/rbac/v1"
9+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
13+
)
14+
15+
func componentLists() []runtime.Object {
16+
return []runtime.Object{
17+
&appsv1.DeploymentList{},
18+
&corev1.ServiceList{},
19+
&corev1.NamespaceList{},
20+
&apiregistrationv1.APIServiceList{},
21+
&apiextensionsv1.CustomResourceDefinitionList{},
22+
&operatorsv1alpha1.SubscriptionList{},
23+
&operatorsv1alpha1.InstallPlanList{},
24+
&operatorsv1alpha1.ClusterServiceVersionList{},
25+
&operatorsv2.OperatorConditionList{},
26+
27+
&metav1.PartialObjectMetadataList{
28+
TypeMeta: metav1.TypeMeta{
29+
APIVersion: corev1.SchemeGroupVersion.String(),
30+
Kind: "SecretList",
31+
},
32+
},
33+
&metav1.PartialObjectMetadataList{
34+
TypeMeta: metav1.TypeMeta{
35+
APIVersion: corev1.SchemeGroupVersion.String(),
36+
Kind: "ConfigMapList",
37+
},
38+
},
39+
&metav1.PartialObjectMetadataList{
40+
TypeMeta: metav1.TypeMeta{
41+
APIVersion: corev1.SchemeGroupVersion.String(),
42+
Kind: "ServiceAccountList",
43+
},
44+
},
45+
&metav1.PartialObjectMetadataList{
46+
TypeMeta: metav1.TypeMeta{
47+
APIVersion: rbacv1.SchemeGroupVersion.String(),
48+
Kind: "RoleList",
49+
},
50+
},
51+
&metav1.PartialObjectMetadataList{
52+
TypeMeta: metav1.TypeMeta{
53+
APIVersion: rbacv1.SchemeGroupVersion.String(),
54+
Kind: "RoleBindingList",
55+
},
56+
},
57+
&metav1.PartialObjectMetadataList{
58+
TypeMeta: metav1.TypeMeta{
59+
APIVersion: rbacv1.SchemeGroupVersion.String(),
60+
Kind: "ClusterRoleList",
61+
},
62+
},
63+
&metav1.PartialObjectMetadataList{
64+
TypeMeta: metav1.TypeMeta{
65+
APIVersion: rbacv1.SchemeGroupVersion.String(),
66+
Kind: "ClusterRoleBindingList",
67+
},
68+
},
69+
}
70+
}

staging/operator-lifecycle-manager/pkg/controller/operators/decorators/operator.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1313
"k8s.io/apimachinery/pkg/labels"
1414
"k8s.io/apimachinery/pkg/runtime"
15+
"k8s.io/apimachinery/pkg/runtime/schema"
1516
"k8s.io/apimachinery/pkg/types"
1617
"k8s.io/client-go/tools/reference"
1718

@@ -344,6 +345,10 @@ func NewComponent(component runtime.Object, scheme *runtime.Scheme) (*Component,
344345
if err := scheme.Convert(component, u, nil); err != nil {
345346
return nil, err
346347
}
348+
// GVK may have been lost from PartialObjectMetadata during conversion.
349+
if gvk := component.GetObjectKind().GroupVersionKind(); gvk != schema.EmptyObjectKind.GroupVersionKind() {
350+
u.SetGroupVersionKind(gvk)
351+
}
347352

348353
c := &Component{
349354
Unstructured: u,

staging/operator-lifecycle-manager/pkg/controller/operators/decorators/operator_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ func TestAddComponents(t *testing.T) {
8888
scheme := runtime.NewScheme()
8989
require.NoError(t, k8sscheme.AddToScheme(scheme))
9090
require.NoError(t, operatorsv1alpha1.AddToScheme(scheme))
91+
require.NoError(t, metav1.AddMetaToScheme(scheme))
9192

9293
type fields struct {
9394
operator *operatorsv1.Operator

staging/operator-lifecycle-manager/pkg/controller/operators/operator_controller.go

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
kscheme "k8s.io/client-go/kubernetes/scheme"
1919
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
2020
ctrl "sigs.k8s.io/controller-runtime"
21+
"sigs.k8s.io/controller-runtime/pkg/builder"
2122
"sigs.k8s.io/controller-runtime/pkg/client"
2223
"sigs.k8s.io/controller-runtime/pkg/handler"
2324
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -69,20 +70,22 @@ func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
6970
For(&operatorsv1.Operator{}).
7071
Watches(&source.Kind{Type: &appsv1.Deployment{}}, enqueueOperator).
7172
Watches(&source.Kind{Type: &corev1.Namespace{}}, enqueueOperator).
72-
Watches(&source.Kind{Type: &corev1.ServiceAccount{}}, enqueueOperator).
73-
Watches(&source.Kind{Type: &corev1.Secret{}}, enqueueOperator).
74-
Watches(&source.Kind{Type: &corev1.ConfigMap{}}, enqueueOperator).
75-
Watches(&source.Kind{Type: &rbacv1.Role{}}, enqueueOperator).
76-
Watches(&source.Kind{Type: &rbacv1.RoleBinding{}}, enqueueOperator).
77-
Watches(&source.Kind{Type: &rbacv1.ClusterRole{}}, enqueueOperator).
78-
Watches(&source.Kind{Type: &rbacv1.ClusterRoleBinding{}}, enqueueOperator).
7973
Watches(&source.Kind{Type: &apiextensionsv1.CustomResourceDefinition{}}, enqueueOperator).
8074
Watches(&source.Kind{Type: &apiregistrationv1.APIService{}}, enqueueOperator).
8175
Watches(&source.Kind{Type: &operatorsv1alpha1.Subscription{}}, enqueueOperator).
8276
Watches(&source.Kind{Type: &operatorsv1alpha1.InstallPlan{}}, enqueueOperator).
8377
Watches(&source.Kind{Type: &operatorsv1alpha1.ClusterServiceVersion{}}, enqueueOperator).
8478
Watches(&source.Kind{Type: &operatorsv2.OperatorCondition{}}, enqueueOperator).
85-
// TODO(njhale): Add WebhookConfigurations and ConfigMaps
79+
// Metadata is sufficient to build component refs for
80+
// GVKs that don't have a .status.conditions field.
81+
Watches(&source.Kind{Type: &corev1.ServiceAccount{}}, enqueueOperator, builder.OnlyMetadata).
82+
Watches(&source.Kind{Type: &corev1.Secret{}}, enqueueOperator, builder.OnlyMetadata).
83+
Watches(&source.Kind{Type: &corev1.ConfigMap{}}, enqueueOperator, builder.OnlyMetadata).
84+
Watches(&source.Kind{Type: &rbacv1.Role{}}, enqueueOperator, builder.OnlyMetadata).
85+
Watches(&source.Kind{Type: &rbacv1.RoleBinding{}}, enqueueOperator, builder.OnlyMetadata).
86+
Watches(&source.Kind{Type: &rbacv1.ClusterRole{}}, enqueueOperator, builder.OnlyMetadata).
87+
Watches(&source.Kind{Type: &rbacv1.ClusterRoleBinding{}}, enqueueOperator, builder.OnlyMetadata).
88+
// TODO(njhale): Add WebhookConfigurations
8689
Complete(r)
8790
}
8891

@@ -196,23 +199,7 @@ func (r *OperatorReconciler) updateComponents(ctx context.Context, operator *dec
196199
func (r *OperatorReconciler) listComponents(ctx context.Context, selector labels.Selector) ([]runtime.Object, error) {
197200
// Note: We need to figure out how to dynamically add new list types here (or some equivalent) in
198201
// order to support operators composed of custom resources.
199-
componentLists := []runtime.Object{
200-
&appsv1.DeploymentList{},
201-
&corev1.NamespaceList{},
202-
&corev1.ServiceAccountList{},
203-
&corev1.SecretList{},
204-
&corev1.ConfigMapList{},
205-
&rbacv1.RoleList{},
206-
&rbacv1.RoleBindingList{},
207-
&rbacv1.ClusterRoleList{},
208-
&rbacv1.ClusterRoleBindingList{},
209-
&apiextensionsv1.CustomResourceDefinitionList{},
210-
&apiregistrationv1.APIServiceList{},
211-
&operatorsv1alpha1.SubscriptionList{},
212-
&operatorsv1alpha1.InstallPlanList{},
213-
&operatorsv1alpha1.ClusterServiceVersionList{},
214-
&operatorsv2.OperatorConditionList{},
215-
}
202+
componentLists := componentLists()
216203

217204
opt := client.MatchingLabelsSelector{Selector: selector}
218205
for _, list := range componentLists {

staging/operator-lifecycle-manager/pkg/controller/operators/suite_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ var _ = BeforeSuite(func() {
105105
Expect(cfg).ToNot(BeNil())
106106

107107
By("Setting up a controller manager")
108-
err = AddToScheme(scheme)
109-
Expect(err).ToNot(HaveOccurred())
108+
Expect(metav1.AddMetaToScheme(scheme)).To(Succeed())
109+
Expect(AddToScheme(scheme)).To(Succeed())
110110
mgr, err := ctrl.NewManager(cfg, ctrl.Options{
111111
MetricsBindAddress: "0", // Prevents conflicts with other test suites that might bind metrics
112112
Scheme: scheme,

vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/manager.go

Lines changed: 4 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/operator-lifecycle-manager/pkg/controller/operators/adoption_controller.go

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

0 commit comments

Comments
 (0)