func()

in pkg/controller/jenkins/jenkins_controller.go [83:226]


func (r *ReconcileJenkins) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
	log := r.log.WithValues(logNamespaceKey, request.Namespace, logNameKey, request.Name)
	log.Info("Reconciling has been started")

	instance := &jenkinsApi.Jenkins{}

	if err := r.client.Get(ctx, request.NamespacedName, instance); err != nil {
		if k8sErrors.IsNotFound(err) {
			// Request object not found, could have been deleted after reconcile request.
			// Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.
			// Return and don't requeue
			log.Info("instance not found")

			return reconcile.Result{}, nil
		}

		return reconcile.Result{}, fmt.Errorf("failed to Get Jenkins instance: %w", err)
	}

	if instance.Status.Status == "" || instance.Status.Status == StatusFailed {
		log.Info("Installation has been started")

		if err := r.updateStatus(ctx, instance, StatusInstall); err != nil {
			return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, err
		}
	}

	if instance.Status.Status == StatusInstall {
		log.Info("Installation has finished")

		if err := r.updateStatus(ctx, instance, StatusCreated); err != nil {
			return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, err
		}
	}

	// Create Admin password secret
	if err := r.service.CreateAdminPassword(instance); err != nil {
		log.Error(err, "Admin password secret creation has failed")

		return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second},
			fmt.Errorf("failed to create admin password secret creation: %w", err)
	}

	dcIsReady, err := r.service.IsDeploymentReady(instance)
	if err != nil {
		return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second},
			fmt.Errorf("failed to check if Deployment configs are ready: %w", err)
	}

	if !dcIsReady {
		log.Info("Deployment configs is not ready for configuration yet")

		return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, nil
	}

	if instance.Status.Status == StatusCreated || instance.Status.Status == "" {
		log.Info("Configuration has started")

		if updErr := r.updateStatus(ctx, instance, StatusConfiguring); updErr != nil {
			return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, updErr
		}
	}

	instance, isFinished, err := r.service.Configure(instance)
	if err != nil {
		log.Error(err, "Configuration has failed")

		return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second},
			fmt.Errorf("failed to finish configuration: %w", err)
	}

	if !isFinished {
		log.Info("Configuration is not finished")

		return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, nil
	}

	if instance.Status.Status == StatusConfiguring {
		log.Info("Configuration has finished")

		if updErr := r.updateStatus(ctx, instance, StatusConfigured); updErr != nil {
			return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, updErr
		}
	}

	if instance.Status.Status == StatusConfigured {
		log.Info("Exposing configuration has started")

		if updErr := r.updateStatus(ctx, instance, StatusIntegrationStart); updErr != nil {
			return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, updErr
		}
	}

	instance, upd, err := r.service.ExposeConfiguration(instance)
	if err != nil {
		log.Error(err, "Expose configuration has failed")

		return reconcile.Result{
			RequeueAfter: helper.DefaultRequeueTime * time.Second,
		}, fmt.Errorf("failed to expose configuration: %w", err)
	}

	if upd {
		if err = r.updateInstanceStatus(ctx, instance); err != nil {
			return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second},
				fmt.Errorf("failed to update instance status: %w", err)
		}
	}

	instance, isFinished, err = r.service.Integration(instance)
	if err != nil {
		log.Error(err, "Integration has failed")

		return reconcile.Result{
			RequeueAfter: helper.DefaultRequeueTime * time.Second,
		}, fmt.Errorf("integration failed: %w", err)
	}

	if !isFinished {
		log.Info("Integration is not finished")

		return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, nil
	}

	if instance.Status.Status == StatusIntegrationStart {
		log.Info("Configuration has been finished", instance.Namespace, instance.Name)

		if err = r.updateStatus(ctx, instance, StatusReady); err != nil {
			log.Info("Couldn't update status")

			return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, nil
		}
	}

	if err = r.updateAvailableStatus(ctx, instance, true); err != nil {
		log.Info("Failed to update availability status")

		return reconcile.Result{RequeueAfter: helper.DefaultRequeueTime * time.Second}, err
	}

	log.Info("Reconciling has been finished")

	return reconcile.Result{RequeueAfter: requeueAfter}, nil
}