Skip to content

Commit fedd694

Browse files
Merge pull request #118 from kevinrizza/stop-using-ownerrefs
Remove Dependency on Owner References
2 parents 890bc1f + 255d89f commit fedd694

15 files changed

+289
-89
lines changed

manifests/05_role.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ rules:
2828
- create
2929
- delete
3030
- update
31+
- list
3132
- apiGroups:
3233
- operators.coreos.com
3334
resources:
@@ -37,6 +38,7 @@ rules:
3738
- create
3839
- delete
3940
- update
41+
- list
4042
- apiGroups:
4143
- apps
4244
resources:
@@ -46,6 +48,7 @@ rules:
4648
- create
4749
- delete
4850
- update
51+
- list
4952
- apiGroups:
5053
- config.openshift.io
5154
resources:
@@ -71,3 +74,4 @@ rules:
7174
- create
7275
- delete
7376
- update
77+
- list

pkg/catalogsourceconfig/catalogsourcebuilder.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ import (
66
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
77
)
88

9+
// OpsrcOwnerNameLabel is the label used to mark ownership over resources
10+
// that are owned by the CatalogSourceConfig. When this label is set, the reconciler
11+
// should handle these resources when the CatalogSourceConfig is deleted.
12+
const CscOwnerNameLabel string = "csc-owner-name"
13+
14+
// OpsrcOwnerNamespaceLabel is the label used to mark ownership over resources
15+
// that are owned by the CatalogSourceConfig. When this label is set, the reconciler
16+
// should handle these resources when the CatalogSourceConfig is deleted.
17+
const CscOwnerNamespaceLabel string = "csc-owner-namespace"
18+
919
// CatalogSourceBuilder builds a new CatalogSource object.
1020
type CatalogSourceBuilder struct {
1121
cs olm.CatalogSource
@@ -49,6 +59,10 @@ func (b *CatalogSourceBuilder) WithOLMLabels(cscLabels map[string]string) *Catal
4959
labels[key] = value
5060
}
5161

62+
for key, value := range b.cs.GetLabels() {
63+
labels[key] = value
64+
}
65+
5266
b.WithTypeMeta()
5367
objectMeta := b.cs.GetObjectMeta()
5468
if objectMeta == nil {
@@ -58,12 +72,18 @@ func (b *CatalogSourceBuilder) WithOLMLabels(cscLabels map[string]string) *Catal
5872
return b
5973
}
6074

61-
// WithOwner sets the owner of the CatalogSource object to the given owner.
62-
func (b *CatalogSourceBuilder) WithOwner(owner *v1alpha1.CatalogSourceConfig) *CatalogSourceBuilder {
63-
b.cs.SetOwnerReferences(append(b.cs.GetOwnerReferences(),
64-
[]metav1.OwnerReference{
65-
*metav1.NewControllerRef(owner, owner.GroupVersionKind()),
66-
}[0]))
75+
// WithOwnerLabel sets the owner label of the CatalogSource object to the given owner.
76+
func (b *CatalogSourceBuilder) WithOwnerLabel(owner *v1alpha1.CatalogSourceConfig) *CatalogSourceBuilder {
77+
labels := map[string]string{
78+
CscOwnerNameLabel: owner.Name,
79+
CscOwnerNamespaceLabel: owner.Namespace,
80+
}
81+
82+
for key, value := range b.cs.GetLabels() {
83+
labels[key] = value
84+
}
85+
86+
b.cs.SetLabels(labels)
6787
return b
6888
}
6989

pkg/catalogsourceconfig/configuring.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func GetPackageIDs(csIDs string) []string {
153153
// newCatalogSource returns a CatalogSource object.
154154
func newCatalogSource(csc *v1alpha1.CatalogSourceConfig, address string) *olm.CatalogSource {
155155
builder := new(CatalogSourceBuilder).
156-
WithOwner(csc).
156+
WithOwnerLabel(csc).
157157
WithMeta(csc.Name, csc.Spec.TargetNamespace).
158158
WithSpec(olm.SourceTypeGrpc, address, csc.Spec.DisplayName, csc.Spec.Publisher)
159159

pkg/catalogsourceconfig/deleted.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ package catalogsourceconfig
33
import (
44
"context"
55

6+
olm "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
67
"github.com/operator-framework/operator-marketplace/pkg/apis/marketplace/v1alpha1"
78
log "github.com/sirupsen/logrus"
9+
apps "k8s.io/api/apps/v1"
10+
core "k8s.io/api/core/v1"
11+
rbac "k8s.io/api/rbac/v1"
12+
"k8s.io/apimachinery/pkg/labels"
13+
utilerrors "k8s.io/apimachinery/pkg/util/errors"
814
"sigs.k8s.io/controller-runtime/pkg/client"
915
)
1016

@@ -47,6 +53,12 @@ func (r *deletedReconciler) Reconcile(ctx context.Context, in *v1alpha1.CatalogS
4753
// Evict the catalogsourceconfig data from the cache.
4854
r.cache.Evict(out)
4955

56+
// Delete all created resources
57+
err = r.deleteCreatedResources(ctx, in.Name, in.Namespace)
58+
if err != nil {
59+
return nil, nil, err
60+
}
61+
5062
// Remove the csc finalizer from the object.
5163
out.RemoveFinalizer()
5264

@@ -61,3 +73,106 @@ func (r *deletedReconciler) Reconcile(ctx context.Context, in *v1alpha1.CatalogS
6173

6274
return out, nil, nil
6375
}
76+
77+
// Delete all resources owned by the catalog source config
78+
func (r *deletedReconciler) deleteCreatedResources(ctx context.Context, name, namespace string) error {
79+
allErrors := []error{}
80+
labelMap := map[string]string{
81+
CscOwnerNameLabel: name,
82+
CscOwnerNamespaceLabel: namespace,
83+
}
84+
labelSelector := labels.SelectorFromSet(labelMap)
85+
options := &client.ListOptions{LabelSelector: labelSelector}
86+
87+
// Delete Catalog Sources
88+
catalogSources := &olm.CatalogSourceList{}
89+
err := r.client.List(ctx, options, catalogSources)
90+
if err != nil {
91+
allErrors = append(allErrors, err)
92+
}
93+
94+
for _, catalogSource := range catalogSources.Items {
95+
r.logger.Infof("Removing catalogSource %s from namespace %s", catalogSource.Name, catalogSource.Namespace)
96+
err := r.client.Delete(ctx, &catalogSource)
97+
if err != nil {
98+
allErrors = append(allErrors, err)
99+
}
100+
}
101+
102+
// Delete Services
103+
services := &core.ServiceList{}
104+
err = r.client.List(ctx, options, services)
105+
if err != nil {
106+
allErrors = append(allErrors, err)
107+
}
108+
109+
for _, service := range services.Items {
110+
r.logger.Infof("Removing service %s from namespace %s", service.Name, service.Namespace)
111+
err := r.client.Delete(ctx, &service)
112+
if err != nil {
113+
allErrors = append(allErrors, err)
114+
}
115+
}
116+
117+
// Delete Deployments
118+
deployments := &apps.DeploymentList{}
119+
err = r.client.List(ctx, options, deployments)
120+
if err != nil {
121+
allErrors = append(allErrors, err)
122+
}
123+
124+
for _, deployment := range deployments.Items {
125+
r.logger.Infof("Removing deployment %s from namespace %s", deployment.Name, deployment.Namespace)
126+
err := r.client.Delete(ctx, &deployment)
127+
if err != nil {
128+
allErrors = append(allErrors, err)
129+
}
130+
}
131+
132+
// Delete Role Bindings
133+
roleBindings := &rbac.RoleBindingList{}
134+
err = r.client.List(ctx, options, roleBindings)
135+
if err != nil {
136+
allErrors = append(allErrors, err)
137+
}
138+
139+
for _, roleBinding := range roleBindings.Items {
140+
r.logger.Infof("Removing roleBinding %s from namespace %s", roleBinding.Name, roleBinding.Namespace)
141+
err := r.client.Delete(ctx, &roleBinding)
142+
if err != nil {
143+
allErrors = append(allErrors, err)
144+
}
145+
}
146+
147+
// Delete Roles
148+
roles := &rbac.RoleList{}
149+
err = r.client.List(ctx, options, roles)
150+
if err != nil {
151+
allErrors = append(allErrors, err)
152+
}
153+
154+
for _, role := range roles.Items {
155+
r.logger.Infof("Removing role %s from namespace %s", role.Name, role.Namespace)
156+
err := r.client.Delete(ctx, &role)
157+
if err != nil {
158+
allErrors = append(allErrors, err)
159+
}
160+
}
161+
162+
// Delete Service Accounts
163+
serviceAccounts := &core.ServiceAccountList{}
164+
err = r.client.List(ctx, options, serviceAccounts)
165+
if err != nil {
166+
allErrors = append(allErrors, err)
167+
}
168+
169+
for _, serviceAccount := range serviceAccounts.Items {
170+
r.logger.Infof("Removing serviceAccount %s from namespace %s", serviceAccount.Name, serviceAccount.Namespace)
171+
err := r.client.Delete(ctx, &serviceAccount)
172+
if err != nil {
173+
allErrors = append(allErrors, err)
174+
}
175+
}
176+
177+
return utilerrors.NewAggregate(allErrors)
178+
}

pkg/catalogsourceconfig/deploymentbuilder.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,18 @@ func (b *DeploymentBuilder) WithMeta(name, namespace string) *DeploymentBuilder
3737
return b
3838
}
3939

40-
// WithOwner sets the owner of the Deployment object to the given owner.
41-
func (b *DeploymentBuilder) WithOwner(owner *v1alpha1.CatalogSourceConfig) *DeploymentBuilder {
42-
b.deployment.SetOwnerReferences(append(b.deployment.GetOwnerReferences(),
43-
[]meta.OwnerReference{
44-
*meta.NewControllerRef(owner, owner.GroupVersionKind()),
45-
}[0]))
40+
// WithOwnerLabel sets the owner label of the Deployment object to the given owner.
41+
func (b *DeploymentBuilder) WithOwnerLabel(owner *v1alpha1.CatalogSourceConfig) *DeploymentBuilder {
42+
labels := map[string]string{
43+
CscOwnerNameLabel: owner.Name,
44+
CscOwnerNamespaceLabel: owner.Namespace,
45+
}
46+
47+
for key, value := range b.deployment.GetLabels() {
48+
labels[key] = value
49+
}
50+
51+
b.deployment.SetLabels(labels)
4652
return b
4753
}
4854

pkg/catalogsourceconfig/podtemplatebuilder.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,18 @@ func (b *PodTemplateBuilder) WithObjectMeta(name, namespace string) *PodTemplate
2525
return b
2626
}
2727

28-
// WithOwner sets the owner of the PodTemplate object to the given owner.
29-
func (b *PodTemplateBuilder) WithOwner(owner *v1alpha1.CatalogSourceConfig) *PodTemplateBuilder {
30-
b.pt.SetOwnerReferences(append(b.pt.GetOwnerReferences(),
31-
[]meta.OwnerReference{
32-
*meta.NewControllerRef(owner, owner.GroupVersionKind()),
33-
}[0]))
28+
// WithOwnerLabel sets the owner label of the PodTemplate object to the given owner.
29+
func (b *PodTemplateBuilder) WithOwnerLabel(owner *v1alpha1.CatalogSourceConfig) *PodTemplateBuilder {
30+
labels := map[string]string{
31+
CscOwnerNameLabel: owner.Name,
32+
CscOwnerNamespaceLabel: owner.Namespace,
33+
}
34+
35+
for key, value := range b.pt.GetLabels() {
36+
labels[key] = value
37+
}
38+
39+
b.pt.SetLabels(labels)
3440
return b
3541
}
3642

pkg/catalogsourceconfig/registry.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ func (r *registry) getSubjects() []rbac.Subject {
273273
func (r *registry) newDeployment(registryCommand []string) *apps.Deployment {
274274
return new(DeploymentBuilder).
275275
WithMeta(r.csc.GetName(), r.csc.GetNamespace()).
276-
WithOwner(r.csc.CatalogSourceConfig).
276+
WithOwnerLabel(r.csc.CatalogSourceConfig).
277277
WithSpec(1, r.getLabel(), r.newPodTemplateSpec(registryCommand)).
278278
Deployment()
279279
}
@@ -329,7 +329,7 @@ func (r *registry) newPodTemplateSpec(registryCommand []string) core.PodTemplate
329329
func (r *registry) newRole(operatorSources []string) *rbac.Role {
330330
return new(RoleBuilder).
331331
WithMeta(r.csc.GetName(), r.csc.GetNamespace()).
332-
WithOwner(r.csc.CatalogSourceConfig).
332+
WithOwnerLabel(r.csc.CatalogSourceConfig).
333333
WithRules(getRules(operatorSources)).
334334
Role()
335335
}
@@ -338,7 +338,7 @@ func (r *registry) newRole(operatorSources []string) *rbac.Role {
338338
func (r *registry) newRoleBinding(roleName string) *rbac.RoleBinding {
339339
return new(RoleBindingBuilder).
340340
WithMeta(r.csc.GetName(), r.csc.GetNamespace()).
341-
WithOwner(r.csc.CatalogSourceConfig).
341+
WithOwnerLabel(r.csc.CatalogSourceConfig).
342342
WithSubjects(r.getSubjects()).
343343
WithRoleRef(roleName).
344344
RoleBinding()
@@ -348,7 +348,7 @@ func (r *registry) newRoleBinding(roleName string) *rbac.RoleBinding {
348348
func (r *registry) newService() *core.Service {
349349
return new(ServiceBuilder).
350350
WithMeta(r.csc.GetName(), r.csc.GetNamespace()).
351-
WithOwner(r.csc.CatalogSourceConfig).
351+
WithOwnerLabel(r.csc.CatalogSourceConfig).
352352
WithSpec(r.newServiceSpec()).
353353
Service()
354354
}
@@ -357,7 +357,7 @@ func (r *registry) newService() *core.Service {
357357
func (r *registry) newServiceAccount() *core.ServiceAccount {
358358
return new(ServiceAccountBuilder).
359359
WithMeta(r.csc.GetName(), r.csc.GetNamespace()).
360-
WithOwner(r.csc.CatalogSourceConfig).
360+
WithOwnerLabel(r.csc.CatalogSourceConfig).
361361
ServiceAccount()
362362
}
363363

pkg/catalogsourceconfig/rolebindingbuilder.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,18 @@ func (b *RoleBindingBuilder) WithMeta(name, namespace string) *RoleBindingBuilde
3636
return b
3737
}
3838

39-
// WithOwner sets the owner of the RoleBinding object to the given owner.
40-
func (b *RoleBindingBuilder) WithOwner(owner *v1alpha1.CatalogSourceConfig) *RoleBindingBuilder {
41-
b.rb.SetOwnerReferences(append(b.rb.GetOwnerReferences(),
42-
[]meta.OwnerReference{
43-
*meta.NewControllerRef(owner, owner.GroupVersionKind()),
44-
}[0]))
39+
// WithOwnerLabel sets the owner label of the RoleBinding object to the given owner.
40+
func (b *RoleBindingBuilder) WithOwnerLabel(owner *v1alpha1.CatalogSourceConfig) *RoleBindingBuilder {
41+
labels := map[string]string{
42+
CscOwnerNameLabel: owner.Name,
43+
CscOwnerNamespaceLabel: owner.Namespace,
44+
}
45+
46+
for key, value := range b.rb.GetLabels() {
47+
labels[key] = value
48+
}
49+
50+
b.rb.SetLabels(labels)
4551
return b
4652
}
4753

pkg/catalogsourceconfig/rolebuilder.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,18 @@ func (b *RoleBuilder) WithMeta(name, namespace string) *RoleBuilder {
3636
return b
3737
}
3838

39-
// WithOwner sets the owner of the Role object to the given owner.
40-
func (b *RoleBuilder) WithOwner(owner *v1alpha1.CatalogSourceConfig) *RoleBuilder {
41-
b.role.SetOwnerReferences(append(b.role.GetOwnerReferences(),
42-
[]meta.OwnerReference{
43-
*meta.NewControllerRef(owner, owner.GroupVersionKind()),
44-
}[0]))
39+
// WithOwnerLabel sets the owner label of the Role object to the given owner.
40+
func (b *RoleBuilder) WithOwnerLabel(owner *v1alpha1.CatalogSourceConfig) *RoleBuilder {
41+
labels := map[string]string{
42+
CscOwnerNameLabel: owner.Name,
43+
CscOwnerNamespaceLabel: owner.Namespace,
44+
}
45+
46+
for key, value := range b.role.GetLabels() {
47+
labels[key] = value
48+
}
49+
50+
b.role.SetLabels(labels)
4551
return b
4652
}
4753

pkg/catalogsourceconfig/serviceaccountbuilder.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,17 @@ func (b *ServiceAccountBuilder) WithMeta(name, namespace string) *ServiceAccount
3636
return b
3737
}
3838

39-
// WithOwner sets the owner of the ServiceAccount object to the given owner.
40-
func (b *ServiceAccountBuilder) WithOwner(owner *v1alpha1.CatalogSourceConfig) *ServiceAccountBuilder {
41-
b.sa.SetOwnerReferences(append(b.sa.GetOwnerReferences(),
42-
[]meta.OwnerReference{
43-
*meta.NewControllerRef(owner, owner.GroupVersionKind()),
44-
}[0]))
39+
// WithOwnerLabel sets the owner label of the ServiceAccount object to the given owner.
40+
func (b *ServiceAccountBuilder) WithOwnerLabel(owner *v1alpha1.CatalogSourceConfig) *ServiceAccountBuilder {
41+
labels := map[string]string{
42+
CscOwnerNameLabel: owner.Name,
43+
CscOwnerNamespaceLabel: owner.Namespace,
44+
}
45+
46+
for key, value := range b.sa.GetLabels() {
47+
labels[key] = value
48+
}
49+
50+
b.sa.SetLabels(labels)
4551
return b
4652
}

0 commit comments

Comments
 (0)