Skip to content

Commit 118f80d

Browse files
committed
DBAAS-1193: workaround to the ack-rds-controller v0.1.1 upgrade issue with ARO
1 parent 606ad4c commit 118f80d

8 files changed

+1967
-242
lines changed

api/v1beta1/webhook_suite_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ var _ = BeforeSuite(func() {
116116
ClientDisableCacheFor: []client.Object{
117117
&operatorframework.ClusterServiceVersion{},
118118
&corev1.Secret{},
119-
&corev1.ConfigMap{},
120119
},
121120
})
122121
Expect(err).NotTo(HaveOccurred())

bundle/manifests/dbaas-operator.clusterserviceversion.yaml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -415,14 +415,6 @@ spec:
415415
spec:
416416
clusterPermissions:
417417
- rules:
418-
- apiGroups:
419-
- ""
420-
resources:
421-
- configmaps
422-
- secrets
423-
verbs:
424-
- create
425-
- get
426418
- apiGroups:
427419
- ""
428420
resources:
@@ -607,6 +599,7 @@ spec:
607599
verbs:
608600
- delete
609601
- get
602+
- list
610603
- update
611604
- apiGroups:
612605
- operators.coreos.com

config/rbac/role.yaml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,6 @@ metadata:
66
creationTimestamp: null
77
name: manager-role
88
rules:
9-
- apiGroups:
10-
- ""
11-
resources:
12-
- configmaps
13-
- secrets
14-
verbs:
15-
- create
16-
- get
179
- apiGroups:
1810
- ""
1911
resources:
@@ -198,6 +190,7 @@ rules:
198190
verbs:
199191
- delete
200192
- get
193+
- list
201194
- update
202195
- apiGroups:
203196
- operators.coreos.com

controllers/dbaasplatform_controller.go

Lines changed: 21 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ import (
3737
"github.com/operator-framework/api/pkg/operators/v1alpha1"
3838

3939
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
40-
appsv1 "k8s.io/api/apps/v1"
41-
v1 "k8s.io/api/core/v1"
4240
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
4341
apierrors "k8s.io/apimachinery/pkg/api/errors"
4442
apimeta "k8s.io/apimachinery/pkg/api/meta"
@@ -88,7 +86,7 @@ type DBaaSPlatformReconciler struct {
8886
//+kubebuilder:rbac:groups=dbaas.redhat.com,resources=*/finalizers,verbs=update
8987
//+kubebuilder:rbac:groups=operators.coreos.com,resources=catalogsources;operatorgroups,verbs=get;list;create;update;watch
9088
//+kubebuilder:rbac:groups=operators.coreos.com,resources=subscriptions,verbs=get;list;create;update;watch;delete
91-
//+kubebuilder:rbac:groups=operators.coreos.com,resources=clusterserviceversions,verbs=get;update;delete
89+
//+kubebuilder:rbac:groups=operators.coreos.com,resources=clusterserviceversions,verbs=get;update;delete;list
9290
//+kubebuilder:rbac:groups=operators.coreos.com,resources=clusterserviceversions/finalizers,verbs=update
9391
//+kubebuilder:rbac:groups=apps,resources=deployments;daemonsets;statefulsets,verbs=get;list;create;update;watch;delete
9492
//+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;create;update;watch;delete
@@ -100,7 +98,6 @@ type DBaaSPlatformReconciler struct {
10098
//+kubebuilder:rbac:groups=config.openshift.io,resources=consoles,verbs=get;list;watch
10199
//+kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=get;list;watch
102100
//+kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=validatingwebhookconfigurations,verbs=get;list;watch;delete
103-
//+kubebuilder:rbac:groups="",resources=secrets;configmaps,verbs=get;create
104101

105102
// Reconcile is part of the main kubernetes reconciliation loop which aims to
106103
// move the current state of the cluster closer to the desired state.
@@ -133,11 +130,6 @@ func (r *DBaaSPlatformReconciler) Reconcile(ctx context.Context, req ctrl.Reques
133130
logger.Error(err, "Error related to conversion webhook setup")
134131
}
135132

136-
// temporary fix for ack-rds-controller v0.1.3 upgrade issue
137-
if err = r.fixRDSControllerUpgrade(ctx); err != nil {
138-
logger.Error(err, "Error related to ack-rds-controller v0.1.3 upgrade")
139-
}
140-
141133
if cr.DeletionTimestamp != nil {
142134
event = metrics.LabelEventValueDelete
143135
} else {
@@ -433,82 +425,38 @@ func (r *DBaaSPlatformReconciler) fixConversionWebhooks(ctx context.Context) err
433425

434426
// Temporary solution to the rds-controller upgrade issue, will revert in the next release
435427
func (r *DBaaSPlatformReconciler) prepareRDSController(ctx context.Context, cli k8sclient.Client) error {
436-
secret := &v1.Secret{
437-
ObjectMeta: metav1.ObjectMeta{
438-
Name: "ack-rds-user-secrets", //#nosec G101
439-
Namespace: r.DBaaSReconciler.InstallNamespace,
440-
},
428+
subscriptionList := &v1alpha1.SubscriptionList{}
429+
if err := cli.List(ctx, subscriptionList, k8sclient.InNamespace(r.InstallNamespace)); err != nil {
430+
return err
441431
}
442-
if err := cli.Get(ctx, k8sclient.ObjectKeyFromObject(secret), secret); err != nil {
443-
if apierrors.IsNotFound(err) {
444-
secret.Data = map[string][]byte{
445-
"AWS_ACCESS_KEY_ID": []byte("dummy"),
446-
"AWS_SECRET_ACCESS_KEY": []byte("dummy"), //#nosec G101
447-
}
448-
if err := cli.Create(ctx, secret); err != nil {
432+
for _, subscription := range subscriptionList.Items {
433+
if subscription.Spec != nil && subscription.Spec.Package == "ack-rds-controller" {
434+
if err := cli.Delete(ctx, &subscription); err != nil {
449435
return err
450436
}
451-
} else {
452-
return err
453437
}
454438
}
455439

456-
cm := &v1.ConfigMap{
457-
ObjectMeta: metav1.ObjectMeta{
458-
Name: "ack-rds-user-config",
459-
Namespace: r.DBaaSReconciler.InstallNamespace,
460-
},
440+
csvList := &v1alpha1.ClusterServiceVersionList{}
441+
if err := cli.List(ctx, csvList, k8sclient.InNamespace(r.InstallNamespace)); err != nil {
442+
return err
461443
}
462-
if err := cli.Get(ctx, k8sclient.ObjectKeyFromObject(cm), cm); err != nil {
463-
if apierrors.IsNotFound(err) {
464-
cm.Data = map[string]string{
465-
"AWS_REGION": "dummy",
466-
"AWS_ENDPOINT_URL": "",
467-
"ACK_ENABLE_DEVELOPMENT_LOGGING": "false",
468-
"ACK_WATCH_NAMESPACE": "",
469-
"ACK_LOG_LEVEL": "info",
470-
"ACK_RESOURCE_TAGS": "rhoda",
444+
for _, csv := range csvList.Items {
445+
instanceCRD := false
446+
clusterCRD := false
447+
for _, crd := range csv.Spec.CustomResourceDefinitions.Owned {
448+
if crd.Name == "dbinstances.rds.services.k8s.aws" && crd.Kind == "DBInstance" {
449+
instanceCRD = true
450+
} else if crd.Name == "dbclusters.rds.services.k8s.aws" && crd.Kind == "DBCluster" {
451+
clusterCRD = true
471452
}
472-
if err := cli.Create(ctx, cm); err != nil {
453+
}
454+
if instanceCRD && clusterCRD {
455+
if err := cli.Delete(ctx, &csv); err != nil {
473456
return err
474457
}
475-
} else {
476-
return err
477458
}
478459
}
479460

480461
return nil
481462
}
482-
483-
// Temporary solution to the rds-controller v0.1.3 upgrade issue
484-
func (r *DBaaSPlatformReconciler) fixRDSControllerUpgrade(ctx context.Context) error {
485-
csv := &v1alpha1.ClusterServiceVersion{
486-
ObjectMeta: metav1.ObjectMeta{
487-
Name: "ack-rds-controller.v0.1.3",
488-
Namespace: r.DBaaSReconciler.InstallNamespace,
489-
},
490-
}
491-
if err := r.Client.Get(ctx, k8sclient.ObjectKeyFromObject(csv), csv); err != nil {
492-
if apierrors.IsNotFound(err) {
493-
return nil
494-
}
495-
return err
496-
}
497-
498-
if csv.Status.Phase == v1alpha1.CSVPhaseFailed && csv.Status.Reason == v1alpha1.CSVReasonComponentFailed &&
499-
csv.Status.Message == "install strategy failed: Deployment.apps \"ack-rds-controller\" is invalid: spec.selector: "+
500-
"Invalid value: v1.LabelSelector{MatchLabels:map[string]string{\"app.kubernetes.io/name\":\"ack-rds-controller\"}, "+
501-
"MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable" {
502-
ackDeployment := &appsv1.Deployment{
503-
ObjectMeta: metav1.ObjectMeta{
504-
Name: "ack-rds-controller",
505-
Namespace: r.DBaaSReconciler.InstallNamespace,
506-
},
507-
}
508-
if err := r.Client.Delete(ctx, ackDeployment); err != nil {
509-
return err
510-
}
511-
log.FromContext(ctx).Info("Applied fix to the failed RDS controller v0.1.3 installation")
512-
}
513-
return nil
514-
}

controllers/dbaasplatform_controller_test.go

Lines changed: 0 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,10 @@ import (
44
. "github.com/onsi/ginkgo"
55
. "github.com/onsi/gomega"
66

7-
appsv1 "k8s.io/api/apps/v1"
8-
v1 "k8s.io/api/core/v1"
9-
"k8s.io/apimachinery/pkg/api/errors"
107
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11-
"k8s.io/utils/pointer"
128
"sigs.k8s.io/controller-runtime/pkg/client"
139

1410
dbaasv1beta1 "github.com/RHEcosystemAppEng/dbaas-operator/api/v1beta1"
15-
"github.com/operator-framework/api/pkg/operators/v1alpha1"
1611
)
1712

1813
var _ = Describe("DBaaSPlatform controller", func() {
@@ -48,149 +43,4 @@ var _ = Describe("DBaaSPlatform controller", func() {
4843
Expect(cr.Status.Conditions[0].Type).To(Equal(dbaasv1beta1.DBaaSPlatformReadyType))
4944
})
5045
})
51-
52-
Describe("install dummy secret and configmap for rds-controller upgrade", func() {
53-
It("should find the dummy secret and configmap after installation", func() {
54-
Eventually(func() bool {
55-
secret := &v1.Secret{
56-
ObjectMeta: metav1.ObjectMeta{
57-
Name: "ack-rds-user-secrets", //#nosec G101
58-
Namespace: testNamespace,
59-
},
60-
}
61-
err := dRec.Get(ctx, client.ObjectKeyFromObject(secret), secret)
62-
if err != nil {
63-
return false
64-
}
65-
return true
66-
}, timeout).Should(BeTrue())
67-
68-
Eventually(func() bool {
69-
cm := &v1.ConfigMap{
70-
ObjectMeta: metav1.ObjectMeta{
71-
Name: "ack-rds-user-config",
72-
Namespace: testNamespace,
73-
},
74-
}
75-
err := dRec.Get(ctx, client.ObjectKeyFromObject(cm), cm)
76-
if err != nil {
77-
return false
78-
}
79-
return true
80-
}, timeout).Should(BeTrue())
81-
})
82-
})
83-
84-
Describe("delete deployment for rds-controller v0.1.3 upgrade", func() {
85-
csv := &v1alpha1.ClusterServiceVersion{
86-
ObjectMeta: metav1.ObjectMeta{
87-
Name: "ack-rds-controller.v0.1.3",
88-
Namespace: testNamespace,
89-
},
90-
Spec: v1alpha1.ClusterServiceVersionSpec{
91-
DisplayName: "AWS Controllers for Kubernetes - Amazon RDS",
92-
InstallStrategy: v1alpha1.NamedInstallStrategy{
93-
StrategyName: "deployment",
94-
StrategySpec: v1alpha1.StrategyDetailsDeployment{
95-
DeploymentSpecs: []v1alpha1.StrategyDeploymentSpec{
96-
{
97-
Name: "ack-rds-controller",
98-
Spec: appsv1.DeploymentSpec{
99-
Replicas: pointer.Int32(1),
100-
Selector: &metav1.LabelSelector{
101-
MatchLabels: map[string]string{
102-
"app.kubernetes.io/name": "ack-rds-controller",
103-
},
104-
},
105-
Template: v1.PodTemplateSpec{
106-
ObjectMeta: metav1.ObjectMeta{
107-
Labels: map[string]string{
108-
"app.kubernetes.io/name": "ack-rds-controller",
109-
},
110-
},
111-
Spec: v1.PodSpec{
112-
Containers: []v1.Container{
113-
{
114-
Name: "controller",
115-
Image: "quay.io/ecosystem-appeng/busybox",
116-
ImagePullPolicy: v1.PullIfNotPresent,
117-
Command: []string{"sh", "-c", "echo The app is running! && sleep 3600"},
118-
},
119-
},
120-
},
121-
},
122-
},
123-
},
124-
},
125-
},
126-
},
127-
},
128-
}
129-
BeforeEach(assertResourceCreation(csv))
130-
AfterEach(assertResourceDeletion(csv))
131-
132-
rdsDeployment := &appsv1.Deployment{
133-
ObjectMeta: metav1.ObjectMeta{
134-
Name: "ack-rds-controller",
135-
Namespace: testNamespace,
136-
},
137-
Spec: appsv1.DeploymentSpec{
138-
Replicas: pointer.Int32(1),
139-
Selector: &metav1.LabelSelector{
140-
MatchLabels: map[string]string{
141-
"name": "ack-rds-controller",
142-
},
143-
},
144-
Template: v1.PodTemplateSpec{
145-
ObjectMeta: metav1.ObjectMeta{
146-
Labels: map[string]string{
147-
"name": "ack-rds-controller",
148-
},
149-
},
150-
Spec: v1.PodSpec{
151-
Containers: []v1.Container{
152-
{
153-
Name: "ack-rds-controller",
154-
Image: "quay.io/ecosystem-appeng/busybox",
155-
ImagePullPolicy: v1.PullIfNotPresent,
156-
Command: []string{"sh", "-c", "echo The app is running! && sleep 3600"},
157-
},
158-
},
159-
},
160-
},
161-
},
162-
}
163-
BeforeEach(assertResourceCreation(rdsDeployment))
164-
AfterEach(assertResourceDeletionIfNotExists(rdsDeployment))
165-
166-
It("should delete the deployment for the csv error", func() {
167-
By("making the csv in failed status")
168-
Eventually(func() bool {
169-
if err := dRec.Get(ctx, client.ObjectKeyFromObject(csv), csv); err != nil {
170-
return false
171-
}
172-
173-
csv.Status.Phase = v1alpha1.CSVPhaseFailed
174-
csv.Status.Reason = v1alpha1.CSVReasonComponentFailed
175-
csv.Status.Message = "install strategy failed: Deployment.apps \"ack-rds-controller\" is invalid: spec.selector: " +
176-
"Invalid value: v1.LabelSelector{MatchLabels:map[string]string{\"app.kubernetes.io/name\":\"ack-rds-controller\"}, " +
177-
"MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable"
178-
179-
if err := dRec.Status().Update(ctx, csv); err != nil {
180-
return false
181-
}
182-
return true
183-
}, timeout).Should(BeTrue())
184-
185-
By("checking if the deployment is deleted")
186-
Eventually(func() bool {
187-
if err := dRec.Get(ctx, client.ObjectKeyFromObject(rdsDeployment), rdsDeployment); err != nil {
188-
if errors.IsNotFound(err) {
189-
return true
190-
}
191-
}
192-
return false
193-
}, timeout).Should(BeTrue())
194-
})
195-
})
19646
})

0 commit comments

Comments
 (0)