in oracle/controllers/instancecontroller/utils.go [205:274]
func (r *InstanceReconciler) reconcileMonitoring(ctx context.Context, inst *v1alpha1.Instance, log logr.Logger, images map[string]string) (ctrl.Result, error) {
requeueDuration := 0 * time.Second
deploymentName := GetMonitoringDepName(inst.Name)
monitoringUserSecretName := fmt.Sprintf("%s-secret", deploymentName)
monitoringUser := "gcsql$monitor"
monitoringSecret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Namespace: inst.Namespace,
Name: monitoringUserSecretName,
},
}
if result, err := ctrl.CreateOrUpdate(ctx, r.Client, monitoringSecret, func() error {
if err := ctrlutil.SetOwnerReference(monitoringSecret, inst, r.Scheme()); err != nil {
return err
}
if monitoringSecret.Data == nil {
monitoringSecret.Data = make(map[string][]byte)
}
if len(monitoringSecret.Data["username"]) == 0 {
monitoringSecret.Data["username"] = []byte(monitoringUser)
}
if len(monitoringSecret.Data["password"]) == 0 {
monitoringPass, _ := security.RandOraclePassword()
monitoringSecret.Data["password"] = []byte(monitoringPass)
}
return nil
}); err != nil {
return ctrl.Result{}, fmt.Errorf("creating monitoring secret %s/%s: %w", monitoringSecret.Namespace, monitoringSecret.Name, err)
} else if result != ctrlutil.OperationResultNone {
// Wait until we are sure the secret is reconciled to create the user.
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
}
dbdClient, closeConn, err := r.DatabaseClientFactory.New(ctx, r, inst.GetNamespace(), inst.Name)
if err != nil {
return ctrl.Result{}, err
}
defer closeConn()
// Only if user doesnt exist.
// Create cdb user with access to all pdb.
resp, err := dbdClient.RunSQLPlusFormatted(ctx, &dbdpb.RunSQLPlusCMDRequest{
Commands: []string{fmt.Sprintf("select username from dba_users where username='%s'", strings.ToUpper(monitoringUser))},
})
if err == nil && len(resp.GetMsg()) < 1 {
if _, err := dbdClient.RunSQLPlus(ctx, &dbdpb.RunSQLPlusCMDRequest{
Commands: []string{
fmt.Sprintf("create user %s identified by %s", monitoringUser, string(monitoringSecret.Data["password"])),
fmt.Sprintf("grant %s to %s container=all", "connect, select any dictionary", monitoringUser),
fmt.Sprintf("alter user %s set container_data=all container=current", monitoringUser),
},
Suppress: true,
}); err != nil {
log.Error(err, "Creating the monitoring user failed")
requeueDuration = 30 * time.Second
}
} else if err != nil {
// Wait for the database to be available
requeueDuration = 30 * time.Second
}
if err := r.createMonitoringDeployment(ctx, inst, controllers.DefaultReplicaCnt, images); err != nil {
return ctrl.Result{}, err
}
return ctrl.Result{RequeueAfter: requeueDuration}, nil
}