This is an automated email from the ASF dual-hosted git repository.

astefanutti pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit daf9c0fa003a80f69bbae3724fee8e642f2a20e4
Author: lburgazzoli <lburgazz...@gmail.com>
AuthorDate: Tue Jul 2 16:52:47 2019 +0200

    Move waiting for platform to controller #797
---
 pkg/apis/camel/v1alpha1/build_types.go             |  8 ++-
 pkg/apis/camel/v1alpha1/common_types_support.go    | 14 +++-
 pkg/apis/camel/v1alpha1/integration_types.go       |  6 +-
 pkg/apis/camel/v1alpha1/integrationkit_types.go    |  6 +-
 pkg/controller/build/build_controller.go           | 61 +++++++++++-----
 pkg/controller/build/{initialize.go => error.go}   | 22 +++---
 pkg/controller/build/initialize.go                 |  2 +-
 pkg/controller/build/recovery.go                   | 10 +--
 pkg/controller/integration/deploy.go               |  3 +-
 .../integration/{monitor.go => error.go}           | 21 +++---
 pkg/controller/integration/initialize.go           | 34 +--------
 .../integration/integration_controller.go          | 82 ++++++++++++++--------
 pkg/controller/integration/monitor.go              |  5 +-
 .../integrationkit/{monitor.go => error.go}        | 20 +++---
 pkg/controller/integrationkit/initialize.go        | 12 +---
 .../integrationkit/integrationkit_controller.go    | 73 ++++++++++++-------
 pkg/controller/integrationkit/monitor.go           |  4 +-
 pkg/trait/builder_test.go                          |  2 +-
 pkg/trait/gc.go                                    |  2 +-
 pkg/trait/probes.go                                |  4 +-
 pkg/trait/probes_test.go                           |  2 +-
 21 files changed, 218 insertions(+), 175 deletions(-)

diff --git a/pkg/apis/camel/v1alpha1/build_types.go 
b/pkg/apis/camel/v1alpha1/build_types.go
index 1c51661..b70ffd0 100644
--- a/pkg/apis/camel/v1alpha1/build_types.go
+++ b/pkg/apis/camel/v1alpha1/build_types.go
@@ -64,8 +64,12 @@ const (
        // BuildKind --
        BuildKind string = "Build"
 
-       // BuildPhaseInitial --
-       BuildPhaseInitial BuildPhase = ""
+       // BuildPhaseNone --
+       BuildPhaseNone BuildPhase = ""
+       // BuildPhaseInitialization --
+       BuildPhaseInitialization BuildPhase = "initialization"
+       // BuildPhaseWaitingForPlatform --
+       BuildPhaseWaitingForPlatform BuildPhase = "Waiting For Platform"
        // BuildPhaseScheduling --
        BuildPhaseScheduling BuildPhase = "Scheduling"
        // BuildPhasePending --
diff --git a/pkg/apis/camel/v1alpha1/common_types_support.go 
b/pkg/apis/camel/v1alpha1/common_types_support.go
index 09cf835..b09ee3f 100644
--- a/pkg/apis/camel/v1alpha1/common_types_support.go
+++ b/pkg/apis/camel/v1alpha1/common_types_support.go
@@ -19,12 +19,22 @@ package v1alpha1
 
 import (
        "fmt"
+
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 func (in *Artifact) String() string {
        return in.ID
 }
 
-func (spec ConfigurationSpec) String() string {
-       return fmt.Sprintf("%s=%s", spec.Type, spec.Value)
+func (in *ConfigurationSpec) String() string {
+       return fmt.Sprintf("%s=%s", in.Type, in.Value)
+}
+
+// NewErrorFailure --
+func NewErrorFailure(err error) *Failure {
+       return &Failure{
+               Reason: err.Error(),
+               Time:   metav1.Now(),
+       }
 }
diff --git a/pkg/apis/camel/v1alpha1/integration_types.go 
b/pkg/apis/camel/v1alpha1/integration_types.go
index 9127432..86ab6f3 100644
--- a/pkg/apis/camel/v1alpha1/integration_types.go
+++ b/pkg/apis/camel/v1alpha1/integration_types.go
@@ -142,8 +142,10 @@ const (
        // IntegrationKind --
        IntegrationKind string = "Integration"
 
-       // IntegrationPhaseInitial --
-       IntegrationPhaseInitial IntegrationPhase = ""
+       // IntegrationPhaseNone --
+       IntegrationPhaseNone IntegrationPhase = ""
+       // IntegrationPhaseInitialization --
+       IntegrationPhaseInitialization IntegrationPhase = "initialization"
        // IntegrationPhaseWaitingForPlatform --
        IntegrationPhaseWaitingForPlatform IntegrationPhase = "Waiting For 
Platform"
        // IntegrationPhaseBuildingKit --
diff --git a/pkg/apis/camel/v1alpha1/integrationkit_types.go 
b/pkg/apis/camel/v1alpha1/integrationkit_types.go
index 2d199ae..a00cc86 100644
--- a/pkg/apis/camel/v1alpha1/integrationkit_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationkit_types.go
@@ -82,8 +82,10 @@ const (
        // IntegrationKitTypeExternal --
        IntegrationKitTypeExternal = "external"
 
-       // IntegrationKitPhaseInitial --
-       IntegrationKitPhaseInitial IntegrationKitPhase = ""
+       // IntegrationKitPhaseNone --
+       IntegrationKitPhaseNone IntegrationKitPhase = ""
+       // IntegrationKitPhaseInitialization --
+       IntegrationKitPhaseInitialization IntegrationKitPhase = "initialization"
        // IntegrationKitPhaseWaitingForPlatform --
        IntegrationKitPhaseWaitingForPlatform IntegrationKitPhase = "Waiting 
For Platform"
        // IntegrationKitPhaseBuildSubmitted --
diff --git a/pkg/controller/build/build_controller.go 
b/pkg/controller/build/build_controller.go
index fd85160..b88d0cb 100644
--- a/pkg/controller/build/build_controller.go
+++ b/pkg/controller/build/build_controller.go
@@ -21,6 +21,7 @@ import (
        "sync"
        "time"
 
+       "github.com/apache/camel-k/pkg/platform"
        corev1 "k8s.io/api/core/v1"
        "k8s.io/apimachinery/pkg/api/errors"
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
@@ -161,6 +162,34 @@ func (r *ReconcileBuild) Reconcile(request 
reconcile.Request) (reconcile.Result,
                return reconcile.Result{}, err
        }
 
+       target := instance.DeepCopy()
+       targetLog := rlog.ForBuild(target)
+
+       if target.Status.Phase == v1alpha1.BuildPhaseNone || 
target.Status.Phase == v1alpha1.BuildPhaseWaitingForPlatform {
+               pl, err := platform.GetCurrentPlatform(ctx, r.client, 
target.Namespace)
+               switch {
+               case err != nil:
+                       target.Status.Phase = v1alpha1.BuildPhaseError
+                       target.Status.Failure = v1alpha1.NewErrorFailure(err)
+               case pl.Status.Phase != v1alpha1.IntegrationPlatformPhaseReady:
+                       target.Status.Phase = 
v1alpha1.BuildPhaseWaitingForPlatform
+               default:
+                       target.Status.Phase = v1alpha1.BuildPhaseInitialization
+               }
+
+               if instance.Status.Phase != target.Status.Phase {
+                       err = r.update(ctx, target)
+                       if err != nil {
+                               if k8serrors.IsConflict(err) {
+                                       targetLog.Error(err, "conflict")
+                                       err = nil
+                               }
+                       }
+               }
+
+               return reconcile.Result{}, err
+       }
+
        actions := []Action{
                NewInitializeAction(),
                NewScheduleRoutineAction(r.reader, r.builder, &r.routines),
@@ -168,14 +197,9 @@ func (r *ReconcileBuild) Reconcile(request 
reconcile.Request) (reconcile.Result,
                NewMonitorRoutineAction(&r.routines),
                NewMonitorPodAction(),
                NewErrorRecoveryAction(),
+               NewErrorAction(),
        }
 
-       var err error
-
-       target := instance.DeepCopy()
-       targetPhase := target.Status.Phase
-       targetLog := rlog.ForBuild(target)
-
        for _, a := range actions {
                a.InjectClient(r.client)
                a.InjectLogger(targetLog)
@@ -183,15 +207,13 @@ func (r *ReconcileBuild) Reconcile(request 
reconcile.Request) (reconcile.Result,
                if a.CanHandle(target) {
                        targetLog.Infof("Invoking action %s", a.Name())
 
-                       phaseFrom := target.Status.Phase
-
-                       target, err = a.Handle(ctx, target)
+                       newTarget, err := a.Handle(ctx, target)
                        if err != nil {
                                return reconcile.Result{}, err
                        }
 
-                       if target != nil {
-                               if err := r.client.Status().Update(ctx, 
target); err != nil {
+                       if newTarget != nil {
+                               if err := r.update(ctx, newTarget); err != nil {
                                        if k8serrors.IsConflict(err) {
                                                targetLog.Error(err, "conflict")
                                                return reconcile.Result{
@@ -202,15 +224,15 @@ func (r *ReconcileBuild) Reconcile(request 
reconcile.Request) (reconcile.Result,
                                        return reconcile.Result{}, err
                                }
 
-                               targetPhase = target.Status.Phase
-
-                               if targetPhase != phaseFrom {
+                               if newTarget.Status.Phase != 
target.Status.Phase {
                                        targetLog.Info(
                                                "state transition",
-                                               "phase-from", phaseFrom,
-                                               "phase-to", target.Status.Phase,
+                                               "phase-from", 
target.Status.Phase,
+                                               "phase-to", 
newTarget.Status.Phase,
                                        )
                                }
+
+                               target = newTarget
                        }
 
                        // handle one action at time so the resource
@@ -220,7 +242,7 @@ func (r *ReconcileBuild) Reconcile(request 
reconcile.Request) (reconcile.Result,
        }
 
        // Requeue scheduling build so that it re-enters the build working queue
-       if targetPhase == v1alpha1.BuildPhaseScheduling || targetPhase == 
v1alpha1.BuildPhaseFailed {
+       if target.Status.Phase == v1alpha1.BuildPhaseScheduling || 
target.Status.Phase == v1alpha1.BuildPhaseFailed {
                return reconcile.Result{
                        RequeueAfter: 5 * time.Second,
                }, nil
@@ -228,3 +250,8 @@ func (r *ReconcileBuild) Reconcile(request 
reconcile.Request) (reconcile.Result,
 
        return reconcile.Result{}, nil
 }
+
+// Update --
+func (r *ReconcileBuild) update(ctx context.Context, target *v1alpha1.Build) 
error {
+       return r.client.Status().Update(ctx, target)
+}
diff --git a/pkg/controller/build/initialize.go b/pkg/controller/build/error.go
similarity index 65%
copy from pkg/controller/build/initialize.go
copy to pkg/controller/build/error.go
index a6fba9c..62d42b8 100644
--- a/pkg/controller/build/initialize.go
+++ b/pkg/controller/build/error.go
@@ -23,28 +23,26 @@ import (
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 )
 
-// NewInitializeAction creates a new initialize action
-func NewInitializeAction() Action {
-       return &initializeAction{}
+// NewErrorAction creates a new error action for scheduled routine
+func NewErrorAction() Action {
+       return &errorAction{}
 }
 
-type initializeAction struct {
+type errorAction struct {
        baseAction
 }
 
 // Name returns a common name of the action
-func (action *initializeAction) Name() string {
-       return "initialize"
+func (action *errorAction) Name() string {
+       return "error"
 }
 
 // CanHandle tells whether this action can handle the build
-func (action *initializeAction) CanHandle(build *v1alpha1.Build) bool {
-       return build.Status.Phase == v1alpha1.BuildPhaseInitial
+func (action *errorAction) CanHandle(build *v1alpha1.Build) bool {
+       return build.Status.Phase == v1alpha1.BuildPhaseError
 }
 
 // Handle handles the builds
-func (action *initializeAction) Handle(ctx context.Context, build 
*v1alpha1.Build) (*v1alpha1.Build, error) {
-       build.Status.Phase = v1alpha1.BuildPhaseScheduling
-
-       return build, nil
+func (action *errorAction) Handle(ctx context.Context, build *v1alpha1.Build) 
(*v1alpha1.Build, error) {
+       return nil, nil
 }
diff --git a/pkg/controller/build/initialize.go 
b/pkg/controller/build/initialize.go
index a6fba9c..a3c0674 100644
--- a/pkg/controller/build/initialize.go
+++ b/pkg/controller/build/initialize.go
@@ -39,7 +39,7 @@ func (action *initializeAction) Name() string {
 
 // CanHandle tells whether this action can handle the build
 func (action *initializeAction) CanHandle(build *v1alpha1.Build) bool {
-       return build.Status.Phase == v1alpha1.BuildPhaseInitial
+       return build.Status.Phase == v1alpha1.BuildPhaseInitialization
 }
 
 // Handle handles the builds
diff --git a/pkg/controller/build/recovery.go b/pkg/controller/build/recovery.go
index 4492c87..f7abc97 100644
--- a/pkg/controller/build/recovery.go
+++ b/pkg/controller/build/recovery.go
@@ -24,8 +24,6 @@ import (
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/pkg/platform"
-
        "github.com/jpillora/backoff"
 )
 
@@ -56,12 +54,6 @@ func (action *errorRecoveryAction) CanHandle(build 
*v1alpha1.Build) bool {
 }
 
 func (action *errorRecoveryAction) Handle(ctx context.Context, build 
*v1alpha1.Build) (*v1alpha1.Build, error) {
-       // The integration platform must be initialized before handling the 
error recovery
-       if _, err := platform.GetCurrentPlatform(ctx, action.client, 
build.Namespace); err != nil {
-               action.L.Info("Waiting for an integration platform to be 
initialized")
-               return nil, nil
-       }
-
        if build.Status.Failure == nil {
                build.Status.Failure = &v1alpha1.Failure{
                        Reason: build.Status.Error,
@@ -96,7 +88,7 @@ func (action *errorRecoveryAction) Handle(ctx 
context.Context, build *v1alpha1.B
        }
 
        build.Status = v1alpha1.BuildStatus{}
-       build.Status.Phase = v1alpha1.BuildPhaseInitial
+       build.Status.Phase = v1alpha1.BuildPhaseInitialization
        build.Status.Failure.Recovery.Attempt++
        build.Status.Failure.Recovery.AttemptTime = metav1.Now()
 
diff --git a/pkg/controller/integration/deploy.go 
b/pkg/controller/integration/deploy.go
index 36c43ec..d61e5ec 100644
--- a/pkg/controller/integration/deploy.go
+++ b/pkg/controller/integration/deploy.go
@@ -57,8 +57,7 @@ func (action *deployAction) Handle(ctx context.Context, 
integration *v1alpha1.In
                return nil, err
        }
 
-       target := integration.DeepCopy()
-       target.Status.Phase = v1alpha1.IntegrationPhaseRunning
+       integration.Status.Phase = v1alpha1.IntegrationPhaseRunning
 
        return integration, nil
 }
diff --git a/pkg/controller/integration/monitor.go 
b/pkg/controller/integration/error.go
similarity index 67%
copy from pkg/controller/integration/monitor.go
copy to pkg/controller/integration/error.go
index b5c99cb..262e866 100644
--- a/pkg/controller/integration/monitor.go
+++ b/pkg/controller/integration/error.go
@@ -24,25 +24,24 @@ import (
        "github.com/apache/camel-k/pkg/util/digest"
 )
 
-// NewMonitorAction creates a new monitoring action for an integration
-func NewMonitorAction() Action {
-       return &monitorAction{}
+// NewErrorAction creates a new error action for an integration
+func NewErrorAction() Action {
+       return &errorAction{}
 }
 
-type monitorAction struct {
+type errorAction struct {
        baseAction
 }
 
-func (action *monitorAction) Name() string {
-       return "monitor"
+func (action *errorAction) Name() string {
+       return "error"
 }
 
-func (action *monitorAction) CanHandle(integration *v1alpha1.Integration) bool 
{
-       return integration.Status.Phase == v1alpha1.IntegrationPhaseRunning ||
-               integration.Status.Phase == v1alpha1.IntegrationPhaseError
+func (action *errorAction) CanHandle(integration *v1alpha1.Integration) bool {
+       return integration.Status.Phase == v1alpha1.IntegrationPhaseError
 }
 
-func (action *monitorAction) Handle(ctx context.Context, integration 
*v1alpha1.Integration) (*v1alpha1.Integration, error) {
+func (action *errorAction) Handle(ctx context.Context, integration 
*v1alpha1.Integration) (*v1alpha1.Integration, error) {
        hash, err := digest.ComputeForIntegration(integration)
        if err != nil {
                return nil, err
@@ -52,7 +51,7 @@ func (action *monitorAction) Handle(ctx context.Context, 
integration *v1alpha1.I
                action.L.Info("Integration needs a rebuild")
 
                integration.Status.Digest = hash
-               integration.Status.Phase = ""
+               integration.Status.Phase = 
v1alpha1.IntegrationPhaseInitialization
 
                return integration, nil
        }
diff --git a/pkg/controller/integration/initialize.go 
b/pkg/controller/integration/initialize.go
index 8fed1e8..53be34d 100644
--- a/pkg/controller/integration/initialize.go
+++ b/pkg/controller/integration/initialize.go
@@ -21,7 +21,6 @@ import (
        "context"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/pkg/platform"
        "github.com/apache/camel-k/pkg/trait"
 )
 
@@ -41,42 +40,11 @@ func (action *initializeAction) Name() string {
 
 // CanHandle tells whether this action can handle the integration
 func (action *initializeAction) CanHandle(integration *v1alpha1.Integration) 
bool {
-       return integration.Status.Phase == v1alpha1.IntegrationPhaseInitial || 
integration.Status.Phase == v1alpha1.IntegrationPhaseWaitingForPlatform
+       return integration.Status.Phase == 
v1alpha1.IntegrationPhaseInitialization
 }
 
 // Handle handles the integrations
 func (action *initializeAction) Handle(ctx context.Context, integration 
*v1alpha1.Integration) (*v1alpha1.Integration, error) {
-       pl, err := platform.GetCurrentPlatform(ctx, action.client, 
integration.Namespace)
-       if err != nil {
-               return nil, err
-       }
-
-       // The integration platform needs to be ready before starting to create 
integrations
-       if pl.Status.Phase != v1alpha1.IntegrationPlatformPhaseReady {
-               action.L.Info("Waiting for the integration platform to be 
initialized")
-
-               if integration.Status.Phase != 
v1alpha1.IntegrationPhaseWaitingForPlatform {
-                       integration.Status.Phase = 
v1alpha1.IntegrationPhaseWaitingForPlatform
-                       return integration, nil
-               }
-
-               return nil, nil
-       }
-
-       //
-       // restore phase to initial phase as traits are not aware of
-       // WaitingForPlatform phase
-       //
-       if integration.Status.Phase == 
v1alpha1.IntegrationPhaseWaitingForPlatform {
-               integration.Status.Phase = v1alpha1.IntegrationPhaseInitial
-
-               return integration, nil
-       }
-
-       // better not changing the spec section of the target because it may be 
used for comparison by a
-       // higher level controller (e.g. Knative source controller)
-
-       // execute custom initialization
        if _, err := trait.Apply(ctx, action.client, integration, nil); err != 
nil {
                return nil, err
        }
diff --git a/pkg/controller/integration/integration_controller.go 
b/pkg/controller/integration/integration_controller.go
index e604252..2bdfb96 100644
--- a/pkg/controller/integration/integration_controller.go
+++ b/pkg/controller/integration/integration_controller.go
@@ -19,6 +19,8 @@ package integration
 import (
        "context"
 
+       "github.com/apache/camel-k/pkg/platform"
+
        "github.com/apache/camel-k/pkg/util/digest"
 
        "k8s.io/apimachinery/pkg/api/errors"
@@ -224,25 +226,48 @@ func (r *ReconcileIntegration) Reconcile(request 
reconcile.Request) (reconcile.R
                return reconcile.Result{}, err
        }
 
-       actions := []Action{
-               NewInitializeAction(),
-               NewBuildKitAction(),
-               NewDeployAction(),
-               NewMonitorAction(),
-               NewDeleteAction(),
-       }
-
        // Delete phase
        if instance.GetDeletionTimestamp() != nil {
                instance.Status.Phase = v1alpha1.IntegrationPhaseDeleting
        }
 
-       var targetPhase v1alpha1.IntegrationPhase
-       var err error
-
        target := instance.DeepCopy()
        targetLog := rlog.ForIntegration(target)
 
+       if target.Status.Phase == v1alpha1.IntegrationPhaseNone || 
target.Status.Phase == v1alpha1.IntegrationPhaseWaitingForPlatform {
+               pl, err := platform.GetCurrentPlatform(ctx, r.client, 
target.Namespace)
+               switch {
+               case err != nil:
+                       target.Status.Phase = v1alpha1.IntegrationPhaseError
+                       target.Status.Failure = v1alpha1.NewErrorFailure(err)
+               case pl.Status.Phase != v1alpha1.IntegrationPlatformPhaseReady:
+                       target.Status.Phase = 
v1alpha1.IntegrationPhaseWaitingForPlatform
+               default:
+                       target.Status.Phase = 
v1alpha1.IntegrationPhaseInitialization
+               }
+
+               if instance.Status.Phase != target.Status.Phase {
+                       err = r.update(ctx, target)
+                       if err != nil {
+                               if k8serrors.IsConflict(err) {
+                                       targetLog.Error(err, "conflict")
+                                       err = nil
+                               }
+                       }
+               }
+
+               return reconcile.Result{}, err
+       }
+
+       actions := []Action{
+               NewInitializeAction(),
+               NewBuildKitAction(),
+               NewDeployAction(),
+               NewMonitorAction(),
+               NewErrorAction(),
+               NewDeleteAction(),
+       }
+
        for _, a := range actions {
                a.InjectClient(r.client)
                a.InjectLogger(targetLog)
@@ -250,22 +275,13 @@ func (r *ReconcileIntegration) Reconcile(request 
reconcile.Request) (reconcile.R
                if a.CanHandle(target) {
                        targetLog.Infof("Invoking action %s", a.Name())
 
-                       phaseFrom := target.Status.Phase
-
-                       target, err = a.Handle(ctx, target)
+                       newTarget, err := a.Handle(ctx, target)
                        if err != nil {
                                return reconcile.Result{}, err
                        }
 
-                       if target != nil {
-                               dgst, err := 
digest.ComputeForIntegration(target)
-                               if err != nil {
-                                       return reconcile.Result{}, err
-                               }
-
-                               target.Status.Digest = dgst
-
-                               if err := r.client.Status().Update(ctx, 
target); err != nil {
+                       if newTarget != nil {
+                               if err := r.update(ctx, newTarget); err != nil {
                                        if k8serrors.IsConflict(err) {
                                                targetLog.Error(err, "conflict")
                                                return reconcile.Result{
@@ -276,13 +292,11 @@ func (r *ReconcileIntegration) Reconcile(request 
reconcile.Request) (reconcile.R
                                        return reconcile.Result{}, err
                                }
 
-                               targetPhase = target.Status.Phase
-
-                               if targetPhase != phaseFrom {
+                               if newTarget.Status.Phase != 
target.Status.Phase {
                                        targetLog.Info(
                                                "state transition",
-                                               "phase-from", phaseFrom,
-                                               "phase-to", target.Status.Phase,
+                                               "phase-from", 
target.Status.Phase,
+                                               "phase-to", 
newTarget.Status.Phase,
                                        )
                                }
                        }
@@ -295,3 +309,15 @@ func (r *ReconcileIntegration) Reconcile(request 
reconcile.Request) (reconcile.R
 
        return reconcile.Result{}, nil
 }
+
+// Update --
+func (r *ReconcileIntegration) update(ctx context.Context, target 
*v1alpha1.Integration) error {
+       dgst, err := digest.ComputeForIntegration(target)
+       if err != nil {
+               return err
+       }
+
+       target.Status.Digest = dgst
+
+       return r.client.Status().Update(ctx, target)
+}
diff --git a/pkg/controller/integration/monitor.go 
b/pkg/controller/integration/monitor.go
index b5c99cb..f4ff480 100644
--- a/pkg/controller/integration/monitor.go
+++ b/pkg/controller/integration/monitor.go
@@ -38,8 +38,7 @@ func (action *monitorAction) Name() string {
 }
 
 func (action *monitorAction) CanHandle(integration *v1alpha1.Integration) bool 
{
-       return integration.Status.Phase == v1alpha1.IntegrationPhaseRunning ||
-               integration.Status.Phase == v1alpha1.IntegrationPhaseError
+       return integration.Status.Phase == v1alpha1.IntegrationPhaseRunning
 }
 
 func (action *monitorAction) Handle(ctx context.Context, integration 
*v1alpha1.Integration) (*v1alpha1.Integration, error) {
@@ -52,7 +51,7 @@ func (action *monitorAction) Handle(ctx context.Context, 
integration *v1alpha1.I
                action.L.Info("Integration needs a rebuild")
 
                integration.Status.Digest = hash
-               integration.Status.Phase = ""
+               integration.Status.Phase = 
v1alpha1.IntegrationPhaseInitialization
 
                return integration, nil
        }
diff --git a/pkg/controller/integrationkit/monitor.go 
b/pkg/controller/integrationkit/error.go
similarity index 65%
copy from pkg/controller/integrationkit/monitor.go
copy to pkg/controller/integrationkit/error.go
index a3910b1..ac63e46 100644
--- a/pkg/controller/integrationkit/monitor.go
+++ b/pkg/controller/integrationkit/error.go
@@ -24,24 +24,24 @@ import (
        "github.com/apache/camel-k/pkg/util/digest"
 )
 
-// NewMonitorAction creates a new monitoring handling action for the kit
-func NewMonitorAction() Action {
-       return &monitorAction{}
+// NewErrorAction creates a new error handling action for the kit
+func NewErrorAction() Action {
+       return &errorAction{}
 }
 
-type monitorAction struct {
+type errorAction struct {
        baseAction
 }
 
-func (action *monitorAction) Name() string {
-       return "monitor"
+func (action *errorAction) Name() string {
+       return "error"
 }
 
-func (action *monitorAction) CanHandle(kit *v1alpha1.IntegrationKit) bool {
-       return kit.Status.Phase == v1alpha1.IntegrationKitPhaseReady || 
kit.Status.Phase == v1alpha1.IntegrationKitPhaseError
+func (action *errorAction) CanHandle(kit *v1alpha1.IntegrationKit) bool {
+       return kit.Status.Phase == v1alpha1.IntegrationKitPhaseError
 }
 
-func (action *monitorAction) Handle(ctx context.Context, kit 
*v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error) {
+func (action *errorAction) Handle(ctx context.Context, kit 
*v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error) {
        hash, err := digest.ComputeForIntegrationKit(kit)
        if err != nil {
                return nil, err
@@ -50,7 +50,7 @@ func (action *monitorAction) Handle(ctx context.Context, kit 
*v1alpha1.Integrati
                action.L.Info("IntegrationKit needs a rebuild")
 
                kit.Status.Digest = hash
-               kit.Status.Phase = v1alpha1.IntegrationKitPhaseBuildSubmitted
+               kit.Status.Phase = v1alpha1.IntegrationKitPhaseInitialization
 
                return kit, nil
        }
diff --git a/pkg/controller/integrationkit/initialize.go 
b/pkg/controller/integrationkit/initialize.go
index 405797f..cfdb138 100644
--- a/pkg/controller/integrationkit/initialize.go
+++ b/pkg/controller/integrationkit/initialize.go
@@ -21,7 +21,6 @@ import (
        "context"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/pkg/platform"
        "github.com/apache/camel-k/pkg/trait"
 )
 
@@ -39,18 +38,11 @@ func (action *initializeAction) Name() string {
 }
 
 func (action *initializeAction) CanHandle(kit *v1alpha1.IntegrationKit) bool {
-       return kit.Status.Phase == v1alpha1.IntegrationKitPhaseInitial || 
kit.Status.Phase == v1alpha1.IntegrationKitPhaseWaitingForPlatform
+       return kit.Status.Phase == v1alpha1.IntegrationKitPhaseInitialization
 }
 
 func (action *initializeAction) Handle(ctx context.Context, kit 
*v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error) {
-       // The integration platform needs to be initialized before starting to 
create kits
-       _, err := platform.GetCurrentPlatform(ctx, action.client, kit.Namespace)
-       if err != nil {
-               action.L.Info("Waiting for the integration platform to be 
initialized")
-               return nil, nil
-       }
-
-       _, err = trait.Apply(ctx, action.client, nil, kit)
+       _, err := trait.Apply(ctx, action.client, nil, kit)
        if err != nil {
                return nil, err
        }
diff --git a/pkg/controller/integrationkit/integrationkit_controller.go 
b/pkg/controller/integrationkit/integrationkit_controller.go
index bca22e2..ff401d5 100644
--- a/pkg/controller/integrationkit/integrationkit_controller.go
+++ b/pkg/controller/integrationkit/integrationkit_controller.go
@@ -19,6 +19,8 @@ package integrationkit
 import (
        "context"
 
+       "github.com/apache/camel-k/pkg/platform"
+
        "github.com/apache/camel-k/pkg/util/digest"
 
        "k8s.io/apimachinery/pkg/api/errors"
@@ -141,18 +143,41 @@ func (r *ReconcileIntegrationKit) Reconcile(request 
reconcile.Request) (reconcil
                return reconcile.Result{}, err
        }
 
+       target := instance.DeepCopy()
+       targetLog := rlog.ForIntegrationKit(target)
+
+       if target.Status.Phase == v1alpha1.IntegrationKitPhaseNone || 
target.Status.Phase == v1alpha1.IntegrationKitPhaseWaitingForPlatform {
+               pl, err := platform.GetCurrentPlatform(ctx, r.client, 
target.Namespace)
+               switch {
+               case err != nil:
+                       target.Status.Phase = v1alpha1.IntegrationKitPhaseError
+                       target.Status.Failure = v1alpha1.NewErrorFailure(err)
+               case pl.Status.Phase != v1alpha1.IntegrationPlatformPhaseReady:
+                       target.Status.Phase = 
v1alpha1.IntegrationKitPhaseWaitingForPlatform
+               default:
+                       target.Status.Phase = 
v1alpha1.IntegrationKitPhaseInitialization
+               }
+
+               if instance.Status.Phase != target.Status.Phase {
+                       err = r.update(ctx, target)
+                       if err != nil {
+                               if k8serrors.IsConflict(err) {
+                                       targetLog.Error(err, "conflict")
+                                       err = nil
+                               }
+                       }
+               }
+
+               return reconcile.Result{}, err
+       }
+
        actions := []Action{
                NewInitializeAction(),
                NewBuildAction(),
                NewMonitorAction(),
+               NewErrorAction(),
        }
 
-       var targetPhase v1alpha1.IntegrationKitPhase
-       var err error
-
-       target := instance.DeepCopy()
-       targetLog := rlog.ForIntegrationKit(target)
-
        for _, a := range actions {
                a.InjectClient(r.client)
                a.InjectLogger(targetLog)
@@ -160,23 +185,13 @@ func (r *ReconcileIntegrationKit) Reconcile(request 
reconcile.Request) (reconcil
                if a.CanHandle(target) {
                        targetLog.Infof("Invoking action %s", a.Name())
 
-                       phaseFrom := target.Status.Phase
-
-                       target, err = a.Handle(ctx, target)
+                       newTarget, err := a.Handle(ctx, target)
                        if err != nil {
                                return reconcile.Result{}, err
                        }
 
-                       if target != nil {
-                               dgst, err := 
digest.ComputeForIntegrationKit(target)
-                               if err != nil {
-                                       return reconcile.Result{}, err
-                               }
-
-                               target.Status.Digest = dgst
-
-                               err = r.client.Status().Update(ctx, target)
-                               if err != nil {
+                       if newTarget != nil {
+                               if err := r.update(ctx, newTarget); err != nil {
                                        if k8serrors.IsConflict(err) {
                                                targetLog.Error(err, "conflict")
                                                return reconcile.Result{
@@ -187,13 +202,11 @@ func (r *ReconcileIntegrationKit) Reconcile(request 
reconcile.Request) (reconcil
                                        return reconcile.Result{}, err
                                }
 
-                               targetPhase = target.Status.Phase
-
-                               if targetPhase != phaseFrom {
+                               if newTarget.Status.Phase != 
target.Status.Phase {
                                        targetLog.Info(
                                                "state transition",
-                                               "phase-from", phaseFrom,
-                                               "phase-to", target.Status.Phase,
+                                               "phase-from", 
target.Status.Phase,
+                                               "phase-to", 
newTarget.Status.Phase,
                                        )
                                }
                        }
@@ -206,3 +219,15 @@ func (r *ReconcileIntegrationKit) Reconcile(request 
reconcile.Request) (reconcil
 
        return reconcile.Result{}, nil
 }
+
+// Update --
+func (r *ReconcileIntegrationKit) update(ctx context.Context, target 
*v1alpha1.IntegrationKit) error {
+       dgst, err := digest.ComputeForIntegrationKit(target)
+       if err != nil {
+               return err
+       }
+
+       target.Status.Digest = dgst
+
+       return r.client.Status().Update(ctx, target)
+}
diff --git a/pkg/controller/integrationkit/monitor.go 
b/pkg/controller/integrationkit/monitor.go
index a3910b1..fdcfcbc 100644
--- a/pkg/controller/integrationkit/monitor.go
+++ b/pkg/controller/integrationkit/monitor.go
@@ -38,7 +38,7 @@ func (action *monitorAction) Name() string {
 }
 
 func (action *monitorAction) CanHandle(kit *v1alpha1.IntegrationKit) bool {
-       return kit.Status.Phase == v1alpha1.IntegrationKitPhaseReady || 
kit.Status.Phase == v1alpha1.IntegrationKitPhaseError
+       return kit.Status.Phase == v1alpha1.IntegrationKitPhaseReady
 }
 
 func (action *monitorAction) Handle(ctx context.Context, kit 
*v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error) {
@@ -50,7 +50,7 @@ func (action *monitorAction) Handle(ctx context.Context, kit 
*v1alpha1.Integrati
                action.L.Info("IntegrationKit needs a rebuild")
 
                kit.Status.Digest = hash
-               kit.Status.Phase = v1alpha1.IntegrationKitPhaseBuildSubmitted
+               kit.Status.Phase = v1alpha1.IntegrationKitPhaseInitialization
 
                return kit, nil
        }
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index a921cc8..f1153d3 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -66,7 +66,7 @@ func TestBuilderTraitNotAppliedBecauseOfNilPhase(t 
*testing.T) {
 
        for _, e := range environments {
                e := e // pin
-               e.IntegrationKit.Status.Phase = ""
+               e.IntegrationKit.Status.Phase = 
v1alpha1.IntegrationKitPhaseInitialization
 
                t.Run(string(e.Platform.Spec.Cluster), func(t *testing.T) {
                        err := NewBuilderTestCatalog().apply(e)
diff --git a/pkg/trait/gc.go b/pkg/trait/gc.go
index 68da326..d104db1 100644
--- a/pkg/trait/gc.go
+++ b/pkg/trait/gc.go
@@ -46,7 +46,7 @@ func (t *garbageCollectorTrait) Configure(e *Environment) 
(bool, error) {
                return false, nil
        }
 
-       return e.IntegrationInPhase(v1alpha1.IntegrationPhaseInitial) ||
+       return e.IntegrationInPhase(v1alpha1.IntegrationPhaseInitialization) ||
                e.IntegrationInPhase(v1alpha1.IntegrationPhaseDeploying), nil
 }
 
diff --git a/pkg/trait/probes.go b/pkg/trait/probes.go
index 7d76132..1cfb46a 100644
--- a/pkg/trait/probes.go
+++ b/pkg/trait/probes.go
@@ -58,14 +58,14 @@ func newProbesTrait() *probesTrait {
 
 func (t *probesTrait) Configure(e *Environment) (bool, error) {
        if t.Enabled != nil && *t.Enabled {
-               return e.IntegrationInPhase(v1alpha1.IntegrationPhaseInitial) 
|| e.IntegrationInPhase(v1alpha1.IntegrationPhaseDeploying), nil
+               return 
e.IntegrationInPhase(v1alpha1.IntegrationPhaseInitialization) || 
e.IntegrationInPhase(v1alpha1.IntegrationPhaseDeploying), nil
        }
 
        return false, nil
 }
 
 func (t *probesTrait) Apply(e *Environment) error {
-       if e.IntegrationInPhase(v1alpha1.IntegrationPhaseInitial) {
+       if e.IntegrationInPhase(v1alpha1.IntegrationPhaseInitialization) {
                util.StringSliceUniqueAdd(&e.Integration.Status.Dependencies, 
"runtime:health")
 
                // sort the dependencies to get always the same list if they 
don't change
diff --git a/pkg/trait/probes_test.go b/pkg/trait/probes_test.go
index 82c95cf..90b6b56 100644
--- a/pkg/trait/probes_test.go
+++ b/pkg/trait/probes_test.go
@@ -34,7 +34,7 @@ func TestProbesDeps(t *testing.T) {
        e := Environment{
                Integration: &v1alpha1.Integration{
                        Status: v1alpha1.IntegrationStatus{
-                               Phase: v1alpha1.IntegrationPhaseInitial,
+                               Phase: v1alpha1.IntegrationPhaseInitialization,
                        },
                },
        }

Reply via email to