func()

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
}