Skip to content

Commit 3930f51

Browse files
committed
Merge branch 'idesai_bug_fixes' into 'master'
DG and SIDB bug fixes See merge request rac-docker-dev/oracle-database-operator!252
2 parents 8520105 + 3ad2f3c commit 3930f51

File tree

7 files changed

+93
-53
lines changed

7 files changed

+93
-53
lines changed

apis/database/v1alpha1/dataguardbroker_types.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,15 @@ type DataguardBrokerSpec struct {
5050
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
5151
// Important: Run "make" to regenerate code after modifying this file
5252

53-
PrimaryDatabaseRef string `json:"primaryDatabaseRef"`
54-
StandbyDatabaseRefs []string `json:"standbyDatabaseRefs"`
55-
SetAsPrimaryDatabase string `json:"setAsPrimaryDatabase,omitempty"`
56-
LoadBalancer bool `json:"loadBalancer,omitempty"`
57-
53+
PrimaryDatabaseRef string `json:"primaryDatabaseRef"`
54+
StandbyDatabaseRefs []string `json:"standbyDatabaseRefs"`
55+
SetAsPrimaryDatabase string `json:"setAsPrimaryDatabase,omitempty"`
56+
LoadBalancer bool `json:"loadBalancer,omitempty"`
57+
ServiceAnnotations map[string]string `json:"serviceAnnotations,omitempty"`
5858
// +kubebuilder:validation:Enum=MaxPerformance;MaxAvailability
59-
ProtectionMode string `json:"protectionMode"`
60-
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
61-
FastStartFailOver DataguardBrokerFastStartFailOver `json:"fastStartFailOver,omitempty"`
59+
ProtectionMode string `json:"protectionMode"`
60+
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
61+
FastStartFailOver DataguardBrokerFastStartFailOver `json:"fastStartFailOver,omitempty"`
6262
}
6363

6464
type DataguardBrokerFastStartFailOver struct {

apis/database/v1alpha1/dataguardbroker_webhook.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,24 @@ var _ webhook.Defaulter = &DataguardBroker{}
6969
func (r *DataguardBroker) Default() {
7070
dataguardbrokerlog.Info("default", "name", r.Name)
7171

72+
if (r.Spec.LoadBalancer) {
73+
if r.Spec.ServiceAnnotations == nil {
74+
r.Spec.ServiceAnnotations= make(map[string]string)
75+
}
76+
// Annotations required for a flexible load balancer on oci
77+
_, ok := r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape"]
78+
if(!ok) {
79+
r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape"] = "flexible"
80+
}
81+
_,ok = r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-min"]
82+
if(!ok) {
83+
r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-min"] = "10"
84+
}
85+
_,ok = r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-max"]
86+
if(!ok) {
87+
r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-max"] = "100"
88+
}
89+
}
7290
}
7391

7492
// TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.

apis/database/v1alpha1/singleinstancedatabase_webhook.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,25 @@ var _ webhook.Defaulter = &SingleInstanceDatabase{}
7272
func (r *SingleInstanceDatabase) Default() {
7373
singleinstancedatabaselog.Info("default", "name", r.Name)
7474

75+
if r.Spec.LoadBalancer {
76+
// Annotations required for a flexible load balancer on oci
77+
if r.Spec.ServiceAnnotations == nil {
78+
r.Spec.ServiceAnnotations= make(map[string]string)
79+
}
80+
_, ok := r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape"]
81+
if(!ok) {
82+
r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape"] = "flexible"
83+
}
84+
_,ok = r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-min"]
85+
if(!ok) {
86+
r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-min"] = "10"
87+
}
88+
_,ok = r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-max"]
89+
if(!ok) {
90+
r.Spec.ServiceAnnotations["service.beta.kubernetes.io/oci-load-balancer-shape-flex-max"] = "100"
91+
}
92+
}
93+
7594
if r.Spec.AdminPassword.KeepSecret == nil {
7695
keepSecret := true
7796
r.Spec.AdminPassword.KeepSecret = &keepSecret

config/samples/sidb/dataguardbroker.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ spec:
1515

1616
## Standby DB pod CRD Metadata Name to add this DB to DG config
1717
standbyDatabaseRefs:
18-
# - standbyDatabase-sample1
19-
# - standbyDatabase-sample2
18+
# - standbydatabase-sample
19+
# - standbydatabase-sample1
2020

2121
## Type of service . Applicable on cloud enviroments only
2222
## if loadBalService : false , service type = "NodePort" . else "LoadBalancer"
@@ -26,4 +26,4 @@ spec:
2626
protectionMode: MaxAvailability
2727

2828
## Manual Switchover to this database to make it primary(if not already), requires target Database SID .
29-
setAsPrimaryDatabase: ""
29+
setAsPrimaryDatabase: ""

config/samples/sidb/singleinstancedatabase_standby.yaml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,16 @@
66
apiVersion: database.oracle.com/v1alpha1
77
kind: SingleInstanceDatabase
88
metadata:
9-
# Creates base sidb-sample. Use singleinstancedatabase_clone.yaml for cloning
9+
# Creates base standbydatabase-sample. Use singleinstancedatabase_clone.yaml for cloning
1010
# and singleinstancedatabase_patch.yaml for patching
11-
name: sidb-sample
11+
name: standbydatabase-sample
1212
namespace: default
1313
spec:
1414

1515
## Use only alphanumeric characters for sid
16-
sid: ORCL1
16+
sid: ORCLS
1717

18-
## Reference to a source primary database from which
19-
## Format: 1. Intra-cluster: you can give name of the primary database or the database connect string in `<host>:<port>/<service_name>` format
20-
## 2. Inter-cluster: Database connect string in `<host>:<port>/<service_name>` format
18+
## Reference to a source primary database name
2119
primaryDatabaseRef: "sidb-sample"
2220

2321
## Enable this flag for creating Physical Standby Database

controllers/database/dataguardbroker_controller.go

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,14 @@ func (r *DataguardBrokerReconciler) Reconcile(ctx context.Context, req ctrl.Requ
103103

104104
// Manage SingleInstanceDatabase Deletion
105105
result, err := r.manageDataguardBrokerDeletion(req, ctx, dataguardBroker)
106-
if result.Requeue || err != nil {
106+
if result.Requeue {
107107
r.Log.Info("Reconcile queued")
108108
return result, err
109109
}
110+
if err != nil {
111+
r.Log.Error(err,err.Error())
112+
return result,err
113+
}
110114

111115
// Fetch Primary Database Reference
112116
singleInstanceDatabase := &dbapi.SingleInstanceDatabase{}
@@ -251,6 +255,15 @@ func (r *DataguardBrokerReconciler) instantiateSVCSpec(m *dbapi.DataguardBroker)
251255
Labels: map[string]string{
252256
"app": m.Name,
253257
},
258+
Annotations : func() map[string]string {
259+
annotations := make(map[string]string)
260+
if len(m.Spec.ServiceAnnotations) != 0 {
261+
for key, value := range m.Spec.ServiceAnnotations {
262+
annotations[key] = value
263+
}
264+
}
265+
return annotations
266+
}(),
254267
},
255268
Spec: corev1.ServiceSpec{
256269
Ports: []corev1.ServicePort{
@@ -1052,33 +1065,6 @@ func (r *DataguardBrokerReconciler) manageDataguardBrokerDeletion(req ctrl.Reque
10521065
// indicated by the deletion timestamp being set.
10531066
isDataguardBrokerMarkedToBeDeleted := m.GetDeletionTimestamp() != nil
10541067
if isDataguardBrokerMarkedToBeDeleted {
1055-
1056-
// Make a singleinstancedatabase with empty
1057-
singleInstanceDatabase := &dbapi.SingleInstanceDatabase{}
1058-
err := r.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: m.Spec.PrimaryDatabaseRef}, singleInstanceDatabase)
1059-
if err != nil {
1060-
log.Error(err,err.Error())
1061-
return requeueY,err
1062-
}
1063-
// Get its POD
1064-
// Validate if Primary Database Reference is ready
1065-
result, sidbReadyPod, _ := r.validateSidbReadiness(m, singleInstanceDatabase, ctx, req)
1066-
if result.Requeue {
1067-
log.Info("Reconcile queued")
1068-
return result, nil
1069-
}
1070-
// Get its Role
1071-
out, err := dbcommons.GetDatabaseRole(sidbReadyPod, r, r.Config, ctx, req, singleInstanceDatabase.Spec.Edition)
1072-
// check if its PRIMARY
1073-
if strings.ToUpper(out) != "PRIMARY" {
1074-
eventReason := "Deletion"
1075-
eventMsg := "DataGuard Broker cannot be deleted since primaryDatabaseRef is not in PRIMARY role"
1076-
log.Info("DataGuard Broker cannot be deleted since primaryDatabaseRef is not in PRIMARY role")
1077-
r.Recorder.Eventf(m, corev1.EventTypeWarning, eventReason, eventMsg)
1078-
return requeueN, nil
1079-
}
1080-
// if not PRIMARY throw error and log it
1081-
10821068
if controllerutil.ContainsFinalizer(m, dataguardBrokerFinalizer) {
10831069
// Run finalization logic for dataguardBrokerFinalizer. If the
10841070
// finalization logic fails, don't remove the finalizer so
@@ -1138,8 +1124,22 @@ func (r *DataguardBrokerReconciler) cleanupDataguardBroker(req ctrl.Request, ctx
11381124
return result, nil
11391125
}
11401126

1127+
// Get its Role
1128+
out, err := dbcommons.GetDatabaseRole(sidbReadyPod, r, r.Config, ctx, req, singleInstanceDatabase.Spec.Edition)
1129+
if err != nil {
1130+
log.Error(err, err.Error())
1131+
return requeueY, err
1132+
}
1133+
// check if its PRIMARY database
1134+
if strings.ToUpper(out) != "PRIMARY" {
1135+
eventReason := "Deletion"
1136+
eventMsg := "DataGuard Broker cannot be deleted since primaryDatabaseRef is not in PRIMARY role"
1137+
r.Recorder.Eventf(m, corev1.EventTypeWarning, eventReason, eventMsg)
1138+
return requeueY, errors.New(eventMsg)
1139+
}
1140+
11411141
// Get Primary database to remove dataguard configuration
1142-
_, out, err := dbcommons.GetDatabasesInDgConfig(sidbReadyPod, r, r.Config, ctx, req)
1142+
_, out, err = dbcommons.GetDatabasesInDgConfig(sidbReadyPod, r, r.Config, ctx, req)
11431143
if err != nil {
11441144
log.Error(err, err.Error())
11451145
return requeueY, err

controllers/database/singleinstancedatabase_controller.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ func (r *SingleInstanceDatabaseReconciler) Reconcile(ctx context.Context, req ct
149149
r.Log.Info("Reconcile queued")
150150
return result, nil
151151
}
152+
if err != nil {
153+
r.Log.Error(err,err.Error())
154+
return result, err
155+
}
152156

153157
// First validate
154158
result, err = r.validate(singleInstanceDatabase, cloneFromDatabase, referredPrimaryDatabase, ctx, req)
@@ -2633,13 +2637,7 @@ func (r *SingleInstanceDatabaseReconciler) updateORDSStatus(m *dbapi.SingleInsta
26332637
func (r *SingleInstanceDatabaseReconciler) manageSingleInstanceDatabaseDeletion(req ctrl.Request, ctx context.Context,
26342638
m *dbapi.SingleInstanceDatabase) (ctrl.Result, error) {
26352639
log := r.Log.WithValues("manageSingleInstanceDatabaseDeletion", req.NamespacedName)
2636-
2637-
log.Info("DG broker is configured with the DB " + m.Status.Sid + " : " + strconv.FormatBool(m.Status.DgBrokerConfigured))
2638-
if (m.Status.DgBrokerConfigured){
2639-
log.Info("Database cannot be deleted as it is present in a DataGuard Broker configuration")
2640-
r.Recorder.Eventf(m, corev1.EventTypeWarning, "Deleting", "Database cannot be deleted as it is present in a DataGuard Broker configuration")
2641-
return requeueN,nil
2642-
}
2640+
26432641

26442642
// Check if the SingleInstanceDatabase instance is marked to be deleted, which is
26452643
// indicated by the deletion timestamp being set.
@@ -2697,6 +2695,13 @@ func (r *SingleInstanceDatabaseReconciler) cleanupSingleInstanceDatabase(req ctr
26972695
return requeueY, nil
26982696
}
26992697

2698+
if (m.Status.DgBrokerConfigured){
2699+
eventReason := "Cannot Delete"
2700+
eventMsg := "Database cannot be deleted as it is present in a DataGuard Broker configuration"
2701+
r.Recorder.Eventf(m, corev1.EventTypeWarning, eventReason, eventReason)
2702+
return requeueY,errors.New(eventMsg)
2703+
}
2704+
27002705
// call deletePods() with zero pods in avaiable and nil readyPod to delete all pods
27012706
result, err := r.deletePods(ctx, req, m, []corev1.Pod{}, corev1.Pod{}, 0, 0)
27022707
if result.Requeue {

0 commit comments

Comments
 (0)