func()

in oracle/controllers/instancecontroller/instance_controller_parameters.go [176:258]


func (r *InstanceReconciler) parameterUpdateStateMachine(ctx context.Context, req ctrl.Request, inst v1alpha1.Instance, log logr.Logger) (ctrl.Result, error) {

	if !isParameterUpdateStateMachineEntryCondition(&inst) {
		return ctrl.Result{}, nil
	}

	// If the current parameter state is equal to the requested state skip the update
	if eq := reflect.DeepEqual(inst.Spec.Parameters, inst.Status.CurrentParameters); eq {
		return ctrl.Result{}, nil
	}

	// If the last failed parameter update is equal to the requested state skip it.
	if eq := reflect.DeepEqual(inst.Spec.Parameters, inst.Status.LastFailedParameterUpdate); eq {
		return ctrl.Result{}, nil
	}

	if result, err := r.sanityCheckTimeRange(inst, log); err != nil {
		return result, err
	}

	log.Info("parameterUpdateStateMachine: Entered state machine")
	instanceReadyCond := k8s.FindCondition(inst.Status.Conditions, k8s.Ready)
	switch instanceReadyCond.Reason {
	case k8s.CreateComplete:
		inst.Status.CurrentActiveStateMachine = controllers.ParameterUpdateStateMachine

		_, dynamicParamsRollbackState, err := fetchCurrentParameterState(ctx, r, r.DatabaseClientFactory, inst)
		if err != nil {
			msg := "parameterUpdateStateMachine: Sanity check failed for instance parameters"
			r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateRollbackInProgress, fmt.Sprintf("%s: %v", msg, err), log)
			return ctrl.Result{Requeue: true}, err
		}
		inst.Status.CurrentParameters = dynamicParamsRollbackState

		msg := "parameterUpdateStateMachine: parameter update in progress"
		r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateInProgress, msg, log)
		log.Info("parameterUpdateStateMachine: SM CreateComplete -> ParameterUpdateInProgress")

	case k8s.ParameterUpdateInProgress:
		restartRequired, err := r.setParameters(ctx, inst, log)
		if err != nil {
			msg := "parameterUpdateStateMachine: Error while setting instance parameters"
			r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateRollbackInProgress, fmt.Sprintf("%s: %v", msg, err), log)
			log.Info("parameterUpdateStateMachine: SM ParameterUpdateInProgress -> ParameterUpdateRollbackInProgress")
			return ctrl.Result{Requeue: true}, nil
		}
		if restartRequired {
			log.Info("parameterUpdateStateMachine: static parameter specified in config, scheduling restart to activate them")
			if err := controllers.BounceDatabase(ctx, r, r.DatabaseClientFactory, inst.Namespace, inst.Name, controllers.BounceDatabaseRequest{
				Sid: inst.Spec.CDBName,
			}); err != nil {
				msg := "parameterUpdateStateMachine: error while restarting database after setting static parameters"
				r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateRollbackInProgress, fmt.Sprintf("%s: %v", msg, err), log)
				log.Info("parameterUpdateStateMachine: SM ParameterUpdateInProgress -> ParameterUpdateRollbackInProgress")
				return ctrl.Result{Requeue: true}, nil
			}
		}
		r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateComplete, "", log)
		log.Info("parameterUpdateStateMachine: SM ParameterUpdateInProgress -> ParameterUpdateComplete")
		return ctrl.Result{Requeue: true}, nil

	case k8s.ParameterUpdateComplete:
		inst.Status.CurrentParameters = inst.Spec.Parameters
		msg := "parameterUpdateStateMachine: Parameter update successful"
		r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionTrue, k8s.CreateComplete, msg, log)
		inst.Status.CurrentActiveStateMachine = ""
		log.Info("parameterUpdateStateMachine: SM ParameterUpdateComplete -> CreateComplete")
		return ctrl.Result{}, nil

	case k8s.ParameterUpdateRollbackInProgress:
		if err := r.initiateRecovery(ctx, inst, inst.Status.CurrentParameters, log); err != nil {
			log.Info("parameterUpdateStateMachine: recovery failed, instance currently in irrecoverable state", "err", err)
			return ctrl.Result{}, err
		}
		inst.Status.LastFailedParameterUpdate = inst.Spec.Parameters
		msg := "parameterUpdateStateMachine: instance recovered after bad parameter update"
		r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionTrue, k8s.CreateComplete, msg, log)
		inst.Status.CurrentActiveStateMachine = ""
		log.Info("parameterUpdateStateMachine: SM ParameterUpdateRollbackInProgress -> CreateComplete")
		return ctrl.Result{}, nil
	}
	return ctrl.Result{}, nil
}