Skip to content

Commit 5477338

Browse files
committed
ESO-167: Removes resources created for cert-controller component when cert-manager is enabled
1 parent f28215f commit 5477338

16 files changed

+210
-8
lines changed

bundle/manifests/external-secrets-operator.clusterserviceversion.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ metadata:
204204
categories: Security
205205
console.openshift.io/disable-operand-delete: "true"
206206
containerImage: openshift.io/external-secrets-operator:latest
207-
createdAt: "2025-08-18T11:50:12Z"
207+
createdAt: "2025-08-20T18:17:42Z"
208208
features.operators.openshift.io/cnf: "false"
209209
features.operators.openshift.io/cni: "false"
210210
features.operators.openshift.io/csi: "false"
@@ -403,6 +403,7 @@ spec:
403403
- deployments
404404
verbs:
405405
- create
406+
- delete
406407
- get
407408
- list
408409
- update

bundle/manifests/operator.openshift.io_externalsecrets.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
22
kind: CustomResourceDefinition
33
metadata:
44
annotations:
5-
controller-gen.kubebuilder.io/version: v0.16.1
5+
controller-gen.kubebuilder.io/version: v0.17.3
66
creationTimestamp: null
77
name: externalsecrets.operator.openshift.io
88
spec:

bundle/manifests/operator.openshift.io_externalsecretsmanagers.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
22
kind: CustomResourceDefinition
33
metadata:
44
annotations:
5-
controller-gen.kubebuilder.io/version: v0.16.1
5+
controller-gen.kubebuilder.io/version: v0.17.3
66
creationTimestamp: null
77
name: externalsecretsmanagers.operator.openshift.io
88
spec:

config/crd/bases/operator.openshift.io_externalsecrets.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
33
kind: CustomResourceDefinition
44
metadata:
55
annotations:
6-
controller-gen.kubebuilder.io/version: v0.16.1
6+
controller-gen.kubebuilder.io/version: v0.17.3
77
name: externalsecrets.operator.openshift.io
88
spec:
99
group: operator.openshift.io

config/crd/bases/operator.openshift.io_externalsecretsmanagers.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
33
kind: CustomResourceDefinition
44
metadata:
55
annotations:
6-
controller-gen.kubebuilder.io/version: v0.16.1
6+
controller-gen.kubebuilder.io/version: v0.17.3
77
name: externalsecretsmanagers.operator.openshift.io
88
spec:
99
group: operator.openshift.io

config/rbac/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ rules:
6565
- deployments
6666
verbs:
6767
- create
68+
- delete
6869
- get
6970
- list
7071
- update

pkg/controller/common/utils.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
corev1 "k8s.io/api/core/v1"
1313
rbacv1 "k8s.io/api/rbac/v1"
1414
crdv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
15+
"k8s.io/apimachinery/pkg/api/errors"
1516
"k8s.io/apimachinery/pkg/runtime"
1617
"k8s.io/apimachinery/pkg/runtime/serializer"
1718
"k8s.io/apimachinery/pkg/types"
@@ -22,6 +23,7 @@ import (
2223

2324
operatorv1alpha1 "github.com/openshift/external-secrets-operator/api/v1alpha1"
2425
operatorclient "github.com/openshift/external-secrets-operator/pkg/controller/client"
26+
"github.com/openshift/external-secrets-operator/pkg/operator/assets"
2527
)
2628

2729
var (
@@ -460,3 +462,35 @@ func (n *Now) Reset() {
460462

461463
n.done.Store(0)
462464
}
465+
466+
// DeleteObject is for deleting an object mentioned in the asset file passed.
467+
// Does not treat NotFound as an error, and can be extended in future with arg, whether to
468+
// return an error.
469+
// TODO: Extend for other object types as and when required.
470+
func DeleteObject(ctx context.Context, ctrlClient operatorclient.CtrlClient, obj client.Object, assetName string) error {
471+
var o client.Object
472+
switch obj.(type) {
473+
case *rbacv1.ClusterRole:
474+
o = DecodeClusterRoleObjBytes(assets.MustAsset(assetName))
475+
case *rbacv1.ClusterRoleBinding:
476+
o = DecodeClusterRoleBindingObjBytes(assets.MustAsset(assetName))
477+
case *appsv1.Deployment:
478+
o = DecodeDeploymentObjBytes(assets.MustAsset(assetName))
479+
case *corev1.Secret:
480+
o = DecodeSecretObjBytes(assets.MustAsset(assetName))
481+
case *corev1.ServiceAccount:
482+
o = DecodeServiceAccountObjBytes(assets.MustAsset(assetName))
483+
default:
484+
panic(fmt.Sprintf("unsupported object type: %T", obj))
485+
}
486+
exists, err := ctrlClient.Exists(ctx, types.NamespacedName{Name: o.GetName(), Namespace: o.GetNamespace()}, o)
487+
if err != nil {
488+
return err
489+
}
490+
if exists {
491+
if err := ctrlClient.Delete(ctx, o); err != nil && !errors.IsNotFound(err) {
492+
return err
493+
}
494+
}
495+
return nil
496+
}

pkg/controller/external_secrets/controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ type Reconciler struct {
9999
// +kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=roles;rolebindings;clusterroles;clusterrolebindings,verbs=get;list;watch;create;update;patch;delete
100100
// +kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=validatingwebhookconfigurations,verbs=get;list;watch;create;update;patch
101101
// +kubebuilder:rbac:groups="",resources=events;secrets;services;serviceaccounts,verbs=get;list;watch;create;update;delete;patch
102-
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update
102+
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;delete
103103
// +kubebuilder:rbac:groups=cert-manager.io,resources=certificates;clusterissuers;issuers,verbs=get;list;watch;create;update
104104
// +kubebuilder:rbac:groups="",resources=namespaces,verbs=get;list;watch;create
105105

pkg/controller/external_secrets/deployments.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ func (r *Reconciler) createOrApplyDeployments(externalsecrets *operatorv1alpha1.
4848
// Apply deployments based on the specified conditions.
4949
for _, d := range deployments {
5050
if !d.condition {
51+
if err := common.DeleteObject(r.ctx, r.CtrlClient, &appsv1.Deployment{}, d.assetName); err != nil {
52+
return fmt.Errorf("failed to delete deployment resource: %w", err)
53+
}
5154
continue
5255
}
5356
if err := r.createOrApplyDeploymentFromAsset(externalsecrets, d.assetName, resourceLabels, externalsecretsCreateRecon); err != nil {

pkg/controller/external_secrets/deployments_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import (
66

77
appsv1 "k8s.io/api/apps/v1"
88
corev1 "k8s.io/api/core/v1"
9+
"k8s.io/apimachinery/pkg/api/errors"
910
"k8s.io/apimachinery/pkg/api/resource"
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/apimachinery/pkg/runtime/schema"
1113
"k8s.io/apimachinery/pkg/types"
1214
"sigs.k8s.io/controller-runtime/pkg/client"
1315

@@ -352,6 +354,57 @@ func TestCreateOrApplyDeployments(t *testing.T) {
352354
},
353355
wantErr: `failed to update resource requirements: invalid resource requirements: [spec.resources.requests[test]: Invalid value: test: must be a standard resource type or fully qualified, spec.resources.requests[test]: Invalid value: test: must be a standard resource for containers]`,
354356
},
357+
{
358+
name: "cert-controller deployment deletion fails",
359+
preReq: func(r *Reconciler, m *fakes.FakeCtrlClient) {
360+
m.ExistsCalls(func(ctx context.Context, ns types.NamespacedName, obj client.Object) (bool, error) {
361+
switch o := obj.(type) {
362+
case *appsv1.Deployment:
363+
deployment := testDeployment(certControllerDeploymentAssetName)
364+
deployment.DeepCopyInto(o)
365+
}
366+
return true, nil
367+
})
368+
m.DeleteCalls(func(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error {
369+
return commontest.TestClientError
370+
})
371+
},
372+
updateExternalSecrets: func(i *v1alpha1.ExternalSecrets) {
373+
if i.Spec.ExternalSecretsConfig == nil {
374+
i.Spec.ExternalSecretsConfig = &v1alpha1.ExternalSecretsConfig{
375+
CertManagerConfig: &v1alpha1.CertManagerConfig{
376+
Enabled: "true",
377+
},
378+
}
379+
}
380+
},
381+
wantErr: `failed to delete deployment resource: test client error`,
382+
},
383+
{
384+
name: "cert-controller deployment NotFound, deletion is marked successful",
385+
preReq: func(r *Reconciler, m *fakes.FakeCtrlClient) {
386+
m.ExistsCalls(func(ctx context.Context, ns types.NamespacedName, obj client.Object) (bool, error) {
387+
switch o := obj.(type) {
388+
case *appsv1.Deployment:
389+
deployment := testDeployment(certControllerDeploymentAssetName)
390+
deployment.DeepCopyInto(o)
391+
}
392+
return true, nil
393+
})
394+
m.DeleteCalls(func(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error {
395+
return errors.NewNotFound(schema.GroupResource{}, obj.GetName())
396+
})
397+
},
398+
updateExternalSecrets: func(i *v1alpha1.ExternalSecrets) {
399+
if i.Spec.ExternalSecretsConfig == nil {
400+
i.Spec.ExternalSecretsConfig = &v1alpha1.ExternalSecretsConfig{
401+
CertManagerConfig: &v1alpha1.CertManagerConfig{
402+
Enabled: "true",
403+
},
404+
}
405+
}
406+
},
407+
},
355408
}
356409

357410
for _, tt := range tests {

0 commit comments

Comments
 (0)