in controllers/dsmaster_controller.go [73:209]
func (r *DSMasterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
masterLogger.Info("dmMaster start reconcile logic")
defer masterLogger.Info("dmMaster Reconcile end ---------------------------------------------")
cluster := &dsv1alpha1.DSMaster{}
if err := r.Client.Get(ctx, req.NamespacedName, cluster); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
desired := cluster.DeepCopy()
sa := &corev1.ServiceAccount{}
saReq := ctrl.Request{
NamespacedName: types.NamespacedName{
Namespace: req.Namespace,
Name: dsv1alpha1.DsServiceAccount,
},
}
err := r.Get(ctx, saReq.NamespacedName, sa)
if apierrors.IsNotFound(err) {
err := r.createServiceAccountIfNotExists(ctx, cluster)
if err != nil {
return ctrl.Result{}, err
}
}
// Handler finalizer
// examine DeletionTimestamp to determine if object is under deletion
if cluster.ObjectMeta.DeletionTimestamp.IsZero() {
// The object is not being deleted, so if it does not have our finalizer,
// then lets add the finalizer and update the object. This is equivalent
// registering our finalizer.
if !controllerutil.ContainsFinalizer(desired, dsv1alpha1.FinalizerName) {
controllerutil.AddFinalizer(desired, dsv1alpha1.FinalizerName)
if err := r.Update(ctx, desired); err != nil {
return ctrl.Result{}, err
}
}
} else {
// The object is being deleted
if controllerutil.ContainsFinalizer(desired, dsv1alpha1.FinalizerName) {
// our finalizer is present, so lets handle any external dependency
if err := r.ensureDSMasterDeleted(ctx, cluster); err != nil {
return ctrl.Result{}, err
}
// remove our finalizer from the list and update it.
controllerutil.RemoveFinalizer(desired, dsv1alpha1.FinalizerName)
if err := r.Update(ctx, desired); err != nil {
return ctrl.Result{}, err
}
}
// Stop reconciliation as the item is being deleted
return ctrl.Result{}, nil
}
// If dsmaster-cluster is paused, we do nothing on things changed.
// Until dsmaster-cluster is un-paused, we will reconcile to the state of that point.
if cluster.Spec.Paused {
masterLogger.Info("ds-master control has been paused: ", "ds-master-name", cluster.Name)
desired.Status.ControlPaused = true
if err := r.Status().Patch(ctx, desired, client.MergeFrom(cluster)); err != nil {
if apierrors.IsConflict(err) {
return ctrl.Result{Requeue: true}, nil
} else {
masterLogger.Error(err, "unexpected error when master update status in paused")
return ctrl.Result{}, err
}
}
r.recorder.Event(cluster, corev1.EventTypeNormal, "the master spec status is paused", "do nothing")
return ctrl.Result{}, nil
}
// 1. First time we see the ds-master-cluster, initialize it
if cluster.Status.Phase == dsv1alpha1.DsPhaseNone {
desired.Status.Phase = dsv1alpha1.DsPhaseCreating
masterLogger.Info("phase had been changed from none ---> creating")
if err := r.Client.Status().Patch(ctx, desired, client.MergeFrom(cluster)); err != nil {
if apierrors.IsConflict(err) {
return ctrl.Result{RequeueAfter: 100 * time.Millisecond}, err
} else {
masterLogger.Error(err, "unexpected error when master update status in creating")
return ctrl.Result{}, err
}
}
}
//2 ensure the headless service
masterLogger.Info("Ensuring cluster service")
if err := r.ensureMasterService(ctx, cluster); err != nil {
return ctrl.Result{}, err
}
//2 ensure the headless service
masterLogger.Info("Ensuring worker hpa")
if err := r.ensureHPA(ctx, cluster); err != nil {
return ctrl.Result{}, err
}
// 4. Ensure bootstrapped, we will block here util cluster is up and healthy
masterLogger.Info("Ensuring cluster members")
if requeue, err := r.ensureMembers(ctx, cluster); requeue {
return ctrl.Result{RequeueAfter: 5 * time.Second}, err
}
// 5. Ensure cluster scaled
masterLogger.Info("Ensuring cluster scaled")
if requeue, err := r.ensureScaled(ctx, cluster); requeue {
return ctrl.Result{Requeue: true, RequeueAfter: 5 * time.Second}, err
}
// 6. Ensure cluster upgraded
masterLogger.Info("Ensuring cluster upgraded")
if requeue, err := r.ensureUpgraded(ctx, cluster); requeue {
return ctrl.Result{Requeue: true}, err
}
desired.Status.Phase = dsv1alpha1.DsPhaseFinished
if err := r.Status().Patch(ctx, desired, client.MergeFrom(cluster)); err != nil {
if apierrors.IsConflict(err) {
return ctrl.Result{Requeue: true}, nil
} else {
masterLogger.Error(err, "unexpected error when master update status in finished")
return ctrl.Result{}, err
}
}
masterLogger.Info("******************************************************")
desired.Status.Phase = dsv1alpha1.DsPhaseNone
if err := r.Update(ctx, desired); err != nil {
return ctrl.Result{}, err
}
return ctrl.Result{Requeue: false}, nil
}