Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Commit 5ba620e

Browse files
pohlyavalluri
authored andcommitted
operator: avoid duplicate list of object types
By constructing the objects with TypeMeta, we can retrieve GroupVersionKind from them when needed.
1 parent e4a4418 commit 5ba620e

File tree

3 files changed

+61
-45
lines changed

3 files changed

+61
-45
lines changed

pkg/pmem-csi-operator/controller/deployment/controller_driver.go

+58-20
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
pmemtls "github.com/intel/pmem-csi/pkg/pmem-csi-operator/pmem-tls"
2222
pmemgrpc "github.com/intel/pmem-csi/pkg/pmem-grpc"
2323
"github.com/intel/pmem-csi/pkg/version"
24+
2425
appsv1 "k8s.io/api/apps/v1"
2526
corev1 "k8s.io/api/core/v1"
2627
rbacv1 "k8s.io/api/rbac/v1"
@@ -45,23 +46,60 @@ const (
4546
provisionerMetricsPort = 10011
4647
)
4748

49+
func typeMeta(gv schema.GroupVersion, kind string) metav1.TypeMeta {
50+
return metav1.TypeMeta{
51+
APIVersion: gv.String(),
52+
Kind: kind,
53+
}
54+
}
55+
56+
// A list of all currently created objects. This must be kept in sync
57+
// with the code in Reconcile(). When removing a type here, it must be
58+
// copied to obsoleteObjects below.
59+
//
60+
// The RBAC rules in deploy/kustomize/operator/operator.yaml must
61+
// allow all of the operations (creation, patching, etc.).
62+
var currentObjects = []apiruntime.Object{
63+
&rbacv1.ClusterRole{TypeMeta: typeMeta(rbacv1.SchemeGroupVersion, "ClusterRole")},
64+
&rbacv1.ClusterRoleBinding{TypeMeta: typeMeta(rbacv1.SchemeGroupVersion, "ClusterRoleBinding")},
65+
&storagev1beta1.CSIDriver{TypeMeta: typeMeta(storagev1beta1.SchemeGroupVersion, "CSIDriver")},
66+
&appsv1.DaemonSet{TypeMeta: typeMeta(appsv1.SchemeGroupVersion, "DaemonSet")},
67+
&rbacv1.Role{TypeMeta: typeMeta(rbacv1.SchemeGroupVersion, "Role")},
68+
&rbacv1.RoleBinding{TypeMeta: typeMeta(rbacv1.SchemeGroupVersion, "RoleBinding")},
69+
&corev1.Secret{TypeMeta: typeMeta(corev1.SchemeGroupVersion, "Secret")},
70+
&corev1.Service{TypeMeta: typeMeta(corev1.SchemeGroupVersion, "Service")},
71+
&corev1.ServiceAccount{TypeMeta: typeMeta(corev1.SchemeGroupVersion, "ServiceAccount")},
72+
&appsv1.StatefulSet{TypeMeta: typeMeta(appsv1.SchemeGroupVersion, "StatefulSet")},
73+
}
74+
75+
// A list of objects that may have been created by a previous release
76+
// of the operator. This is relevant when updating from such an older
77+
// release to the current one, because the current one must remove
78+
// obsolete objects.
79+
//
80+
// The RBAC rules in deploy/kustomize/operator/operator.yaml must
81+
// allow listing and removing of these objects.
82+
var obsoleteObjects = []apiruntime.Object{
83+
&corev1.ConfigMap{TypeMeta: typeMeta(corev1.SchemeGroupVersion, "ConfigMap")}, // included only for testing purposes
84+
}
85+
4886
// A list of all object types potentially created by the operator,
4987
// in this or any previous release. In other words, this list may grow,
50-
// but never shrink, because a newer release needs to delete objects
51-
// created by an older release.
52-
// This list also must be kept in sync with the operator RBAC rules.
53-
var AllObjectTypes = []schema.GroupVersionKind{
54-
rbacv1.SchemeGroupVersion.WithKind("RoleList"),
55-
rbacv1.SchemeGroupVersion.WithKind("ClusterRoleList"),
56-
rbacv1.SchemeGroupVersion.WithKind("RoleBindingList"),
57-
rbacv1.SchemeGroupVersion.WithKind("ClusterRoleBindingList"),
58-
corev1.SchemeGroupVersion.WithKind("ServiceAccountList"),
59-
corev1.SchemeGroupVersion.WithKind("SecretList"),
60-
corev1.SchemeGroupVersion.WithKind("ServiceList"),
61-
corev1.SchemeGroupVersion.WithKind("ConfigMapList"),
62-
appsv1.SchemeGroupVersion.WithKind("DaemonSetList"),
63-
appsv1.SchemeGroupVersion.WithKind("StatefulSetList"),
64-
storagev1beta1.SchemeGroupVersion.WithKind("CSIDriverList"),
88+
// but never shrink.
89+
var allObjects = append(currentObjects[:], obsoleteObjects...)
90+
91+
// Returns a slice with a new unstructured.UnstructuredList for each object
92+
// in allObjects.
93+
func AllObjectLists() []*unstructured.UnstructuredList {
94+
var lists []*unstructured.UnstructuredList
95+
for _, obj := range allObjects {
96+
gvk := obj.GetObjectKind().GroupVersionKind()
97+
gvk.Kind += "List"
98+
list := &unstructured.UnstructuredList{}
99+
list.SetGroupVersionKind(gvk)
100+
lists = append(lists, list)
101+
}
102+
return lists
65103
}
66104

67105
type PmemCSIDriver struct {
@@ -150,7 +188,9 @@ func (op *ObjectPatch) Apply(c client.Client, labels map[string]string) error {
150188
return c.Patch(context.TODO(), op.obj, op.patch)
151189
}
152190

153-
// Reconcile reconciles the driver deployment
191+
// Reconcile reconciles the driver deployment. When adding new
192+
// objects, extend also currentObjects above and the RBAC rules in
193+
// deploy/kustomize/operator/operator.yaml.
154194
func (d *PmemCSIDriver) Reconcile(r *ReconcileDeployment) error {
155195

156196
if err := d.EnsureDefaults(r.containerImage); err != nil {
@@ -638,14 +678,12 @@ func (d *PmemCSIDriver) deleteObsoleteObjects(r *ReconcileDeployment, newObjects
638678
klog.V(5).Infof("==>%q type %q", metaObj.GetName(), obj.GetObjectKind().GroupVersionKind())
639679
}
640680

641-
for _, gvk := range AllObjectTypes {
642-
list := &unstructured.UnstructuredList{}
643-
list.SetGroupVersionKind(gvk)
681+
for _, list := range AllObjectLists() {
644682
opts := &client.ListOptions{
645683
Namespace: d.namespace,
646684
}
647685

648-
klog.V(5).Infof("Fetching '%s' list with options: %v", gvk, opts.Namespace)
686+
klog.V(5).Infof("Fetching '%s' list with options: %v", list.GetObjectKind(), opts.Namespace)
649687
if err := r.client.List(context.TODO(), list, opts); err != nil {
650688
return err
651689
}

pkg/pmem-csi-operator/controller/deployment/deployment_controller.go

+1-21
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ import (
1818
"github.com/intel/pmem-csi/pkg/k8sutil"
1919
pmemcontroller "github.com/intel/pmem-csi/pkg/pmem-csi-operator/controller"
2020
"github.com/intel/pmem-csi/pkg/version"
21-
appsv1 "k8s.io/api/apps/v1"
2221
corev1 "k8s.io/api/core/v1"
23-
rbacv1 "k8s.io/api/rbac/v1"
24-
storagev1beta1 "k8s.io/api/storage/v1beta1"
2522
"k8s.io/apimachinery/pkg/api/meta"
2623
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2724
"k8s.io/apimachinery/pkg/runtime"
@@ -166,24 +163,7 @@ func add(mgr manager.Manager, r *ReconcileDeployment) error {
166163
},
167164
}
168165

169-
// All possible object types for a Deployment CR
170-
// that would requires redeploying on change
171-
// NOTE: This list must be kept in sync with the objects
172-
// created by PmemCSIDriver.Reconcile() in controller_driver.go
173-
subresources := []runtime.Object{
174-
&rbacv1.ClusterRole{},
175-
&rbacv1.ClusterRoleBinding{},
176-
&storagev1beta1.CSIDriver{},
177-
&appsv1.DaemonSet{},
178-
&rbacv1.Role{},
179-
&rbacv1.RoleBinding{},
180-
&corev1.Secret{},
181-
&corev1.Service{},
182-
&corev1.ServiceAccount{},
183-
&appsv1.StatefulSet{},
184-
}
185-
186-
for _, resource := range subresources {
166+
for _, resource := range currentObjects {
187167
if err := c.Watch(&source.Kind{Type: resource}, &handler.EnqueueRequestForOwner{
188168
IsController: true,
189169
OwnerType: &pmemcsiv1alpha1.Deployment{},

test/e2e/operator/validate/validate.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -498,16 +498,14 @@ func prettyPrintObjectID(object unstructured.Unstructured) string {
498498
func listAllDeployedObjects(c client.Client, deployment api.Deployment) ([]unstructured.Unstructured, error) {
499499
objects := []unstructured.Unstructured{}
500500

501-
for _, gvk := range operatordeployment.AllObjectTypes {
502-
list := &unstructured.UnstructuredList{}
503-
list.SetGroupVersionKind(gvk)
501+
for _, list := range operatordeployment.AllObjectLists() {
504502
opts := &client.ListOptions{
505503
Namespace: deployment.Namespace,
506504
}
507505
// Filtering by owner doesn't work, so we have to use brute-force and look at all
508506
// objects.
509507
if err := c.List(context.Background(), list, opts); err != nil {
510-
return objects, fmt.Errorf("list %s: %v", gvk, err)
508+
return objects, fmt.Errorf("list %s: %v", list.GetObjectKind(), err)
511509
}
512510
outer:
513511
for _, object := range list.Items {

0 commit comments

Comments
 (0)