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

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

commit 23e73a596c7e984c7e00d3df713f55bce92f4c0e
Author: Nicola Ferraro <[email protected]>
AuthorDate: Mon Dec 9 10:51:43 2019 +0100

    Fix #1120: do not change spec in platform
---
 .../camel/v1alpha1/integrationplatform_types.go    |   1 +
 .../v1alpha1/integrationplatform_types_support.go  |  19 ++
 pkg/cmd/describe_platform.go                       |  23 ++-
 pkg/controller/integrationkit/build.go             |   2 +-
 pkg/controller/integrationplatform/create.go       |   4 +-
 pkg/controller/integrationplatform/create_test.go  |   5 +-
 pkg/controller/integrationplatform/initialize.go   | 170 +----------------
 .../integrationplatform/initialize_test.go         |  32 ++--
 pkg/controller/integrationplatform/kaniko_cache.go |   4 +-
 pkg/controller/integrationplatform/monitor.go      |   6 +
 pkg/controller/integrationplatform/warm_test.go    |   7 +
 pkg/platform/defaults.go                           | 201 +++++++++++++++++++++
 pkg/platform/platform.go                           |  15 +-
 pkg/trait/builder_test.go                          |  10 +-
 pkg/trait/camel.go                                 |   6 +-
 pkg/trait/container_test.go                        |   2 +
 pkg/trait/deployment_test.go                       |   1 +
 pkg/trait/environment_test.go                      |   3 +
 pkg/trait/istio_test.go                            |   1 +
 pkg/trait/knative_service_test.go                  |   2 +
 pkg/trait/knative_test.go                          |   2 +
 pkg/trait/pull_secret.go                           |   2 +-
 pkg/trait/quarkus.go                               |  14 +-
 pkg/trait/rest-dsl.go                              |   6 +-
 pkg/trait/route_test.go                            |   4 +-
 pkg/trait/service_test.go                          |   3 +
 pkg/trait/trait_catalog.go                         |   4 +-
 pkg/trait/trait_test.go                            |   5 +-
 pkg/trait/util_test.go                             |   2 +
 script/Makefile                                    |   2 +-
 30 files changed, 339 insertions(+), 219 deletions(-)

diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types.go 
b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
index 72aaea7..f21b207 100644
--- a/pkg/apis/camel/v1alpha1/integrationplatform_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
@@ -41,6 +41,7 @@ type IntegrationPlatformResourcesSpec struct {
 
 // IntegrationPlatformStatus defines the observed state of IntegrationPlatform
 type IntegrationPlatformStatus struct {
+       FullConfig IntegrationPlatformSpec        `json:"fullConfig,omitempty"`
        Phase      IntegrationPlatformPhase       `json:"phase,omitempty"`
        Conditions []IntegrationPlatformCondition `json:"conditions,omitempty"`
        Version    string                         `json:"version,omitempty"`
diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types_support.go 
b/pkg/apis/camel/v1alpha1/integrationplatform_types_support.go
index 1edbdbd..6ca9029 100644
--- a/pkg/apis/camel/v1alpha1/integrationplatform_types_support.go
+++ b/pkg/apis/camel/v1alpha1/integrationplatform_types_support.go
@@ -73,6 +73,10 @@ func (in *IntegrationPlatform) Configurations() 
[]ConfigurationSpec {
                return []ConfigurationSpec{}
        }
 
+       if len(in.Status.FullConfig.Configuration) > 0 {
+               return in.Status.FullConfig.Configuration
+       }
+
        return in.Spec.Configuration
 }
 
@@ -84,6 +88,21 @@ func (in *IntegrationPlatform) AddConfiguration(confType 
string, confValue strin
        })
 }
 
+// GetActualValue can be used to extract information the platform spec or its 
derived config in the status
+func (in *IntegrationPlatform) GetActualValue(extractor func(spec 
IntegrationPlatformSpec) string) string {
+       res := extractor(in.Status.FullConfig)
+       if res == "" {
+               res = extractor(in.Spec)
+       }
+       return res
+}
+
+// ResyncStatusFullConfig copies the spec configuration into the 
status-fullConfig field.
+func (in *IntegrationPlatform) ResyncStatusFullConfig() {
+       cl := in.Spec.DeepCopy()
+       in.Status.FullConfig = *cl
+}
+
 // GetCondition returns the condition with the provided type.
 func (in *IntegrationPlatformStatus) GetCondition(condType 
IntegrationPlatformConditionType) *IntegrationPlatformCondition {
        for i := range in.Conditions {
diff --git a/pkg/cmd/describe_platform.go b/pkg/cmd/describe_platform.go
index 58e74a1..bab719f 100644
--- a/pkg/cmd/describe_platform.go
+++ b/pkg/cmd/describe_platform.go
@@ -90,17 +90,26 @@ func (command *describePlatformCommand) 
describeIntegrationPlatform(platform v1a
                describeObjectMeta(w, platform.ObjectMeta)
                w.Write(0, "Phase:\t%s\n", platform.Status.Phase)
                w.Write(0, "Version:\t%s\n", platform.Status.Version)
-               w.Write(0, "Base Image:\t%s\n", platform.Spec.Build.BaseImage)
-               w.Write(0, "Camel Version:\t%s\n", 
platform.Spec.Build.CamelVersion)
-               w.Write(0, "Local Repository:\t%s\n", 
platform.Spec.Build.Maven.LocalRepository)
-               w.Write(0, "Publish Strategy:\t%s\n", 
platform.Spec.Build.PublishStrategy)
-
-               if len(platform.Spec.Resources.Kits) > 0 {
+               w.Write(0, "Base Image:\t%s\n", 
platform.GetActualValue(getPlatformBaseImage))
+               w.Write(0, "Camel Version:\t%s\n", 
platform.GetActualValue(getPlatformCamelVersion))
+               w.Write(0, "Local Repository:\t%s\n", 
platform.GetActualValue(getPlatformMavenLocalRepository))
+               w.Write(0, "Publish Strategy:\t%s\n", 
platform.GetActualValue(getPlatformPublishStrategy))
+
+               kits := platform.Status.FullConfig.Resources.Kits
+               if len(kits) == 0 {
+                       kits = platform.Spec.Resources.Kits
+               }
+               if len(kits) > 0 {
                        w.Write(0, "Resources:\n")
                        w.Write(1, "Kits:\n")
-                       for _, kit := range platform.Spec.Resources.Kits {
+                       for _, kit := range kits {
                                w.Write(2, "%s\n", kit)
                        }
                }
        })
 }
+
+func getPlatformBaseImage(spec v1alpha1.IntegrationPlatformSpec) string 
{return spec.Build.BaseImage}
+func getPlatformCamelVersion(spec v1alpha1.IntegrationPlatformSpec) string 
{return spec.Build.CamelVersion}
+func getPlatformMavenLocalRepository(spec v1alpha1.IntegrationPlatformSpec) 
string {return spec.Build.Maven.LocalRepository}
+func getPlatformPublishStrategy(spec v1alpha1.IntegrationPlatformSpec) string 
{return string(spec.Build.PublishStrategy)}
diff --git a/pkg/controller/integrationkit/build.go 
b/pkg/controller/integrationkit/build.go
index a7f2319..3a785f0 100644
--- a/pkg/controller/integrationkit/build.go
+++ b/pkg/controller/integrationkit/build.go
@@ -96,7 +96,7 @@ func (action *buildAction) handleBuildSubmitted(ctx 
context.Context, kit *v1alph
                                CamelVersion:    env.CamelCatalog.Version,
                                RuntimeVersion:  
env.CamelCatalog.RuntimeVersion,
                                RuntimeProvider: 
env.CamelCatalog.RuntimeProvider,
-                               Platform:        env.Platform.Spec,
+                               Platform:        env.Platform.Status.FullConfig,
                                Dependencies:    kit.Spec.Dependencies,
                                // TODO: sort for easy read
                                Steps:    builder.StepIDsFor(env.Steps...),
diff --git a/pkg/controller/integrationplatform/create.go 
b/pkg/controller/integrationplatform/create.go
index 5fccaa7..ee9a3fc 100644
--- a/pkg/controller/integrationplatform/create.go
+++ b/pkg/controller/integrationplatform/create.go
@@ -56,10 +56,10 @@ func (action *createAction) Handle(ctx context.Context, 
platform *v1alpha1.Integ
                }
        }
 
-       if l := len(platform.Spec.Resources.Kits); l > 0 {
+       if l := len(platform.Status.FullConfig.Resources.Kits); l > 0 {
                res := make([]string, 0, l)
 
-               for _, c := range platform.Spec.Resources.Kits {
+               for _, c := range platform.Status.FullConfig.Resources.Kits {
                        //
                        // Assuming that if the resource ends with a yaml 
extension, the full
                        // resource name is provided
diff --git a/pkg/controller/integrationplatform/create_test.go 
b/pkg/controller/integrationplatform/create_test.go
index 2670eb7..0cfabca 100644
--- a/pkg/controller/integrationplatform/create_test.go
+++ b/pkg/controller/integrationplatform/create_test.go
@@ -23,8 +23,8 @@ import (
        "testing"
 
        "github.com/apache/camel-k/deploy"
-
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/platform"
        "github.com/apache/camel-k/pkg/util/log"
        "github.com/apache/camel-k/pkg/util/test"
        "github.com/rs/xid"
@@ -41,6 +41,9 @@ func TestCreate(t *testing.T) {
        c, err := test.NewFakeClient(&ip)
        assert.Nil(t, err)
 
+       err = platform.ConfigureDefaults(context.TODO(), c, &ip, false)
+       assert.Nil(t, err)
+
        h := NewCreateAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
diff --git a/pkg/controller/integrationplatform/initialize.go 
b/pkg/controller/integrationplatform/initialize.go
index 663a3b5..c6b1c09 100644
--- a/pkg/controller/integrationplatform/initialize.go
+++ b/pkg/controller/integrationplatform/initialize.go
@@ -19,10 +19,6 @@ package integrationplatform
 
 import (
        "context"
-       "fmt"
-       "time"
-
-       "github.com/apache/camel-k/pkg/util/maven"
 
        corev1 "k8s.io/api/core/v1"
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
@@ -31,10 +27,8 @@ import (
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
        "github.com/apache/camel-k/pkg/client"
-       "github.com/apache/camel-k/pkg/util/defaults"
-       "github.com/apache/camel-k/pkg/util/openshift"
-
        platformutil "github.com/apache/camel-k/pkg/platform"
+       "github.com/apache/camel-k/pkg/util/defaults"
 )
 
 // NewInitializeAction returns a action that initializes the platform 
configuration when not provided by the user
@@ -71,62 +65,11 @@ func (action *initializeAction) Handle(ctx context.Context, 
platform *v1alpha1.I
                return nil, nil
        }
 
-       // update missing fields in the resource
-       if platform.Spec.Cluster == "" {
-               // determine the kind of cluster the platform is installed into
-               isOpenShift, err := openshift.IsOpenShift(action.client)
-               switch {
-               case err != nil:
-                       return nil, err
-               case isOpenShift:
-                       platform.Spec.Cluster = 
v1alpha1.IntegrationPlatformClusterOpenShift
-               default:
-                       platform.Spec.Cluster = 
v1alpha1.IntegrationPlatformClusterKubernetes
-               }
-       }
-
-       if platform.Spec.Build.PublishStrategy == "" {
-               if platform.Spec.Cluster == 
v1alpha1.IntegrationPlatformClusterOpenShift {
-                       platform.Spec.Build.PublishStrategy = 
v1alpha1.IntegrationPlatformBuildPublishStrategyS2I
-               } else {
-                       platform.Spec.Build.PublishStrategy = 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko
-               }
-       }
-
-       if platform.Spec.Build.BuildStrategy == "" {
-               // If the operator is global, a global build strategy should be 
used
-               if platformutil.IsCurrentOperatorGlobal() {
-                       // The only global strategy we have for now
-                       platform.Spec.Build.BuildStrategy = 
v1alpha1.IntegrationPlatformBuildStrategyPod
-               } else {
-                       if platform.Spec.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko {
-                               // The build output has to be shared with 
Kaniko via a persistent volume
-                               platform.Spec.Build.BuildStrategy = 
v1alpha1.IntegrationPlatformBuildStrategyPod
-                       } else {
-                               platform.Spec.Build.BuildStrategy = 
v1alpha1.IntegrationPlatformBuildStrategyRoutine
-                       }
-               }
-       }
-
-       err = action.setDefaults(ctx, platform)
-       if err != nil {
+       if err = platformutil.ConfigureDefaults(ctx, action.client, platform, 
true); err != nil {
                return nil, err
        }
 
-       if platform.Spec.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko && 
platform.Spec.Build.Registry.Address == "" {
-               action.L.Info("No registry specified for publishing images")
-       }
-
-       if platform.Spec.Build.Maven.Timeout.Duration != 0 {
-               action.L.Infof("Maven Timeout set to %s", 
platform.Spec.Build.Maven.Timeout.Duration)
-       }
-
-       err = action.client.Update(ctx, platform)
-       if err != nil {
-               return nil, err
-       }
-
-       if platform.Spec.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko {
+       if platform.Status.FullConfig.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko {
                // Create the persistent volume claim used to coordinate build 
pod output
                // with Kaniko cache and build input
                action.L.Info("Create persistent volume claim")
@@ -135,7 +78,7 @@ func (action *initializeAction) Handle(ctx context.Context, 
platform *v1alpha1.I
                        return nil, err
                }
 
-               if platform.Spec.Build.IsKanikoCacheEnabled() {
+               if platform.Status.FullConfig.Build.IsKanikoCacheEnabled() {
                        // Create the Kaniko warmer pod that caches the base 
image into the Camel K builder volume
                        action.L.Info("Create Kaniko cache warmer pod")
                        err = createKanikoCacheWarmerPod(ctx, action.client, 
platform)
@@ -170,97 +113,6 @@ func (action *initializeAction) isDuplicate(ctx 
context.Context, thisPlatform *v
        return false, nil
 }
 
-func (action *initializeAction) setDefaults(ctx context.Context, platform 
*v1alpha1.IntegrationPlatform) error {
-       if platform.Spec.Profile == "" {
-               platform.Spec.Profile = platformutil.DetermineBestProfile(ctx, 
action.client, platform)
-       }
-       if platform.Spec.Build.CamelVersion == "" {
-               platform.Spec.Build.CamelVersion = 
defaults.CamelVersionConstraint
-       }
-       if platform.Spec.Build.RuntimeVersion == "" {
-               platform.Spec.Build.RuntimeVersion = 
defaults.RuntimeVersionConstraint
-       }
-       if platform.Spec.Build.BaseImage == "" {
-               platform.Spec.Build.BaseImage = defaults.BaseImage
-       }
-       if platform.Spec.Build.Maven.LocalRepository == "" {
-               platform.Spec.Build.Maven.LocalRepository = 
defaults.LocalRepository
-       }
-       if platform.Spec.Build.PersistentVolumeClaim == "" {
-               platform.Spec.Build.PersistentVolumeClaim = platform.Name
-       }
-
-       if platform.Spec.Build.Timeout.Duration != 0 {
-               d := platform.Spec.Build.Timeout.Duration.Truncate(time.Second)
-
-               if platform.Spec.Build.Timeout.Duration != d {
-                       action.L.Infof("Build timeout minimum unit is sec 
(configured: %s, truncated: %s)", platform.Spec.Build.Timeout.Duration, d)
-               }
-
-               platform.Spec.Build.Timeout.Duration = d
-       }
-       if platform.Spec.Build.Timeout.Duration == 0 {
-               platform.Spec.Build.Timeout.Duration = 5 * time.Minute
-       }
-
-       if platform.Spec.Build.Maven.Timeout.Duration != 0 {
-               d := 
platform.Spec.Build.Maven.Timeout.Duration.Truncate(time.Second)
-
-               if platform.Spec.Build.Maven.Timeout.Duration != d {
-                       action.L.Infof("Maven timeout minimum unit is sec 
(configured: %s, truncated: %s)", platform.Spec.Build.Maven.Timeout.Duration, d)
-               }
-
-               platform.Spec.Build.Maven.Timeout.Duration = d
-       }
-       if platform.Spec.Build.Maven.Timeout.Duration == 0 {
-               n := platform.Spec.Build.Timeout.Duration.Seconds() * 0.75
-               platform.Spec.Build.Maven.Timeout.Duration = (time.Duration(n) 
* time.Second).Truncate(time.Second)
-       }
-
-       if platform.Spec.Build.Maven.Settings.ConfigMapKeyRef == nil && 
platform.Spec.Build.Maven.Settings.SecretKeyRef == nil {
-               var repositories []maven.Repository
-               for i, c := range platform.Spec.Configuration {
-                       if c.Type == "repository" {
-                               repository := maven.NewRepository(c.Value)
-                               if repository.ID == "" {
-                                       repository.ID = 
fmt.Sprintf("repository-%03d", i)
-                               }
-                               repositories = append(repositories, repository)
-                       }
-               }
-
-               settings := maven.NewDefaultSettings(repositories)
-
-               err := createMavenSettingsConfigMap(ctx, action.client, 
platform, settings)
-               if err != nil {
-                       return err
-               }
-
-               platform.Spec.Build.Maven.Settings.ConfigMapKeyRef = 
&corev1.ConfigMapKeySelector{
-                       LocalObjectReference: corev1.LocalObjectReference{
-                               Name: platform.Name + "-maven-settings",
-                       },
-                       Key: "settings.xml",
-               }
-       }
-
-       if platform.Spec.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko && 
platform.Spec.Build.KanikoBuildCache == nil {
-               // Default to using Kaniko cache warmer
-               defaultKanikoBuildCache := true
-               platform.Spec.Build.KanikoBuildCache = &defaultKanikoBuildCache
-               action.L.Infof("Kaniko cache set to %t", 
*platform.Spec.Build.KanikoBuildCache)
-       }
-
-       action.L.Infof("CamelVersion set to %s", 
platform.Spec.Build.CamelVersion)
-       action.L.Infof("RuntimeVersion set to %s", 
platform.Spec.Build.RuntimeVersion)
-       action.L.Infof("BaseImage set to %s", platform.Spec.Build.BaseImage)
-       action.L.Infof("LocalRepository set to %s", 
platform.Spec.Build.Maven.LocalRepository)
-       action.L.Infof("Timeout set to %s", platform.Spec.Build.Timeout)
-       action.L.Infof("Maven Timeout set to %s", 
platform.Spec.Build.Maven.Timeout.Duration)
-
-       return nil
-}
-
 func createPersistentVolumeClaim(ctx context.Context, client client.Client, 
platform *v1alpha1.IntegrationPlatform) error {
        volumeSize, err := resource.ParseQuantity("1Gi")
        if err != nil {
@@ -299,17 +151,3 @@ func createPersistentVolumeClaim(ctx context.Context, 
client client.Client, plat
 
        return nil
 }
-
-func createMavenSettingsConfigMap(ctx context.Context, client client.Client, 
platform *v1alpha1.IntegrationPlatform, settings maven.Settings) error {
-       cm, err := maven.CreateSettingsConfigMap(platform.Namespace, 
platform.Name, settings)
-       if err != nil {
-               return err
-       }
-
-       err = client.Create(ctx, cm)
-       if err != nil && !k8serrors.IsAlreadyExists(err) {
-               return err
-       }
-
-       return nil
-}
diff --git a/pkg/controller/integrationplatform/initialize_test.go 
b/pkg/controller/integrationplatform/initialize_test.go
index e744a9d..d465cbe 100644
--- a/pkg/controller/integrationplatform/initialize_test.go
+++ b/pkg/controller/integrationplatform/initialize_test.go
@@ -22,6 +22,7 @@ import (
        "testing"
        "time"
 
+       "github.com/apache/camel-k/pkg/platform"
        "github.com/rs/xid"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
@@ -42,6 +43,8 @@ func TestTimeouts_Default(t *testing.T) {
        c, err := test.NewFakeClient(&ip)
        assert.Nil(t, err)
 
+       assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false))
+
        h := NewInitializeAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
@@ -50,11 +53,11 @@ func TestTimeouts_Default(t *testing.T) {
        assert.Nil(t, err)
        assert.NotNil(t, answer)
 
-       n := answer.Spec.Build.Timeout.Duration.Seconds() * 0.75
+       n := answer.Status.FullConfig.Build.Timeout.Duration.Seconds() * 0.75
        d := (time.Duration(n) * time.Second).Truncate(time.Second)
 
-       assert.Equal(t, d, answer.Spec.Build.Maven.Timeout.Duration)
-       assert.Equal(t, 5*time.Minute, answer.Spec.Build.Timeout.Duration)
+       assert.Equal(t, d, 
answer.Status.FullConfig.Build.Maven.Timeout.Duration)
+       assert.Equal(t, 5*time.Minute, 
answer.Status.FullConfig.Build.Timeout.Duration)
 }
 
 func TestTimeouts_MavenComputedFromBuild(t *testing.T) {
@@ -73,6 +76,8 @@ func TestTimeouts_MavenComputedFromBuild(t *testing.T) {
        c, err := test.NewFakeClient(&ip)
        assert.Nil(t, err)
 
+       assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false))
+
        h := NewInitializeAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
@@ -81,11 +86,11 @@ func TestTimeouts_MavenComputedFromBuild(t *testing.T) {
        assert.Nil(t, err)
        assert.NotNil(t, answer)
 
-       n := answer.Spec.Build.Timeout.Duration.Seconds() * 0.75
+       n := answer.Status.FullConfig.Build.Timeout.Duration.Seconds() * 0.75
        d := (time.Duration(n) * time.Second).Truncate(time.Second)
 
-       assert.Equal(t, d, answer.Spec.Build.Maven.Timeout.Duration)
-       assert.Equal(t, 1*time.Minute, answer.Spec.Build.Timeout.Duration)
+       assert.Equal(t, d, 
answer.Status.FullConfig.Build.Maven.Timeout.Duration)
+       assert.Equal(t, 1*time.Minute, 
answer.Status.FullConfig.Build.Timeout.Duration)
 }
 
 func TestTimeouts_Truncated(t *testing.T) {
@@ -111,6 +116,8 @@ func TestTimeouts_Truncated(t *testing.T) {
        c, err := test.NewFakeClient(&ip)
        assert.Nil(t, err)
 
+       assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false))
+
        h := NewInitializeAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
@@ -119,8 +126,8 @@ func TestTimeouts_Truncated(t *testing.T) {
        assert.Nil(t, err)
        assert.NotNil(t, answer)
 
-       assert.Equal(t, 2*time.Minute, answer.Spec.Build.Maven.Timeout.Duration)
-       assert.Equal(t, 5*time.Minute, answer.Spec.Build.Timeout.Duration)
+       assert.Equal(t, 2*time.Minute, 
answer.Status.FullConfig.Build.Maven.Timeout.Duration)
+       assert.Equal(t, 5*time.Minute, 
answer.Status.FullConfig.Build.Timeout.Duration)
 }
 
 func TestDefaultMavenSettingsApplied(t *testing.T) {
@@ -132,6 +139,8 @@ func TestDefaultMavenSettingsApplied(t *testing.T) {
        c, err := test.NewFakeClient(&ip)
        assert.Nil(t, err)
 
+       assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false))
+
        h := NewInitializeAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
@@ -140,7 +149,8 @@ func TestDefaultMavenSettingsApplied(t *testing.T) {
        assert.Nil(t, err)
        assert.NotNil(t, answer)
 
-       assert.NotNil(t, answer.Spec.Build.Maven.Settings.ConfigMapKeyRef)
-       assert.Equal(t, "test-platform-maven-settings", 
answer.Spec.Build.Maven.Settings.ConfigMapKeyRef.Name)
-       assert.Equal(t, "settings.xml", 
answer.Spec.Build.Maven.Settings.ConfigMapKeyRef.Key)
+       assert.NotNil(t, 
answer.Status.FullConfig.Build.Maven.Settings.ConfigMapKeyRef)
+       assert.Nil(t, answer.Spec.Build.Maven.Settings.ConfigMapKeyRef)
+       assert.Equal(t, "test-platform-maven-settings", 
answer.Status.FullConfig.Build.Maven.Settings.ConfigMapKeyRef.Name)
+       assert.Equal(t, "settings.xml", 
answer.Status.FullConfig.Build.Maven.Settings.ConfigMapKeyRef.Key)
 }
diff --git a/pkg/controller/integrationplatform/kaniko_cache.go 
b/pkg/controller/integrationplatform/kaniko_cache.go
index 217c50f..2e09d50 100644
--- a/pkg/controller/integrationplatform/kaniko_cache.go
+++ b/pkg/controller/integrationplatform/kaniko_cache.go
@@ -59,7 +59,7 @@ func createKanikoCacheWarmerPod(ctx context.Context, client 
client.Client, platf
                                        Image: 
fmt.Sprintf("gcr.io/kaniko-project/warmer:v%s", defaults.KanikoVersion),
                                        Args: []string{
                                                "--cache-dir=/workspace/cache",
-                                               "--image=" + 
platform.Spec.Build.BaseImage,
+                                               "--image=" + 
platform.Status.FullConfig.Build.BaseImage,
                                        },
                                        VolumeMounts: []corev1.VolumeMount{
                                                {
@@ -91,7 +91,7 @@ func createKanikoCacheWarmerPod(ctx context.Context, client 
client.Client, platf
                                        Name: "camel-k-builder",
                                        VolumeSource: corev1.VolumeSource{
                                                PersistentVolumeClaim: 
&corev1.PersistentVolumeClaimVolumeSource{
-                                                       ClaimName: 
platform.Spec.Build.PersistentVolumeClaim,
+                                                       ClaimName: 
platform.Status.FullConfig.Build.PersistentVolumeClaim,
                                                },
                                        },
                                },
diff --git a/pkg/controller/integrationplatform/monitor.go 
b/pkg/controller/integrationplatform/monitor.go
index d1e5390..380f3f1 100644
--- a/pkg/controller/integrationplatform/monitor.go
+++ b/pkg/controller/integrationplatform/monitor.go
@@ -21,6 +21,7 @@ import (
        "context"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       platformutils "github.com/apache/camel-k/pkg/platform"
        "github.com/apache/camel-k/pkg/util/defaults"
 )
 
@@ -48,5 +49,10 @@ func (action *monitorAction) Handle(ctx context.Context, 
platform *v1alpha1.Inte
                action.L.Info("IntegrationPlatform version updated", "version", 
platform.Status.Version)
        }
 
+       // Refresh applied configuration
+       if err := platformutils.ConfigureDefaults(ctx, action.client, platform, 
false); err != nil {
+               return nil, err
+       }
+
        return platform, nil
 }
diff --git a/pkg/controller/integrationplatform/warm_test.go 
b/pkg/controller/integrationplatform/warm_test.go
index 160cbc6..d564031 100644
--- a/pkg/controller/integrationplatform/warm_test.go
+++ b/pkg/controller/integrationplatform/warm_test.go
@@ -21,6 +21,7 @@ import (
        "context"
        "testing"
 
+       "github.com/apache/camel-k/pkg/platform"
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
@@ -54,6 +55,8 @@ func TestWarm_Succeeded(t *testing.T) {
        c, err := test.NewFakeClient(&ip, &pod)
        assert.Nil(t, err)
 
+       assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false))
+
        h := NewWarmAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
@@ -86,6 +89,8 @@ func TestWarm_Failing(t *testing.T) {
        c, err := test.NewFakeClient(&ip, &pod)
        assert.Nil(t, err)
 
+       assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false))
+
        h := NewWarmAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
@@ -118,6 +123,8 @@ func TestWarm_WarmingUp(t *testing.T) {
        c, err := test.NewFakeClient(&ip, &pod)
        assert.Nil(t, err)
 
+       assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false))
+
        h := NewWarmAction()
        h.InjectLogger(log.Log)
        h.InjectClient(c)
diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go
new file mode 100644
index 0000000..e3e768d
--- /dev/null
+++ b/pkg/platform/defaults.go
@@ -0,0 +1,201 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package platform
+
+import (
+       "context"
+       "fmt"
+       "time"
+
+       "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/client"
+       "github.com/apache/camel-k/pkg/util/defaults"
+       "github.com/apache/camel-k/pkg/util/log"
+       "github.com/apache/camel-k/pkg/util/maven"
+       "github.com/apache/camel-k/pkg/util/openshift"
+       corev1 "k8s.io/api/core/v1"
+       k8serrors "k8s.io/apimachinery/pkg/api/errors"
+)
+
+// ConfigureDefaults fills with default values all missing details about the 
integration platform.
+// Defaults are set in the status->appliedConfiguration fields, not in the 
spec.
+func ConfigureDefaults(ctx context.Context, c client.Client, p 
*v1alpha1.IntegrationPlatform, verbose bool) error {
+       // Reset the state to initial values
+       p.ResyncStatusFullConfig()
+
+       // update missing fields in the resource
+       if p.Status.FullConfig.Cluster == "" {
+               // determine the kind of cluster the platform is installed into
+               isOpenShift, err := openshift.IsOpenShift(c)
+               switch {
+               case err != nil:
+                       return err
+               case isOpenShift:
+                       p.Status.FullConfig.Cluster = 
v1alpha1.IntegrationPlatformClusterOpenShift
+               default:
+                       p.Status.FullConfig.Cluster = 
v1alpha1.IntegrationPlatformClusterKubernetes
+               }
+       }
+
+       if p.Status.FullConfig.Build.PublishStrategy == "" {
+               if p.Status.FullConfig.Cluster == 
v1alpha1.IntegrationPlatformClusterOpenShift {
+                       p.Status.FullConfig.Build.PublishStrategy = 
v1alpha1.IntegrationPlatformBuildPublishStrategyS2I
+               } else {
+                       p.Status.FullConfig.Build.PublishStrategy = 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko
+               }
+       }
+
+       if p.Status.FullConfig.Build.BuildStrategy == "" {
+               // If the operator is global, a global build strategy should be 
used
+               if IsCurrentOperatorGlobal() {
+                       // The only global strategy we have for now
+                       p.Status.FullConfig.Build.BuildStrategy = 
v1alpha1.IntegrationPlatformBuildStrategyPod
+               } else {
+                       if p.Status.FullConfig.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko {
+                               // The build output has to be shared with 
Kaniko via a persistent volume
+                               p.Status.FullConfig.Build.BuildStrategy = 
v1alpha1.IntegrationPlatformBuildStrategyPod
+                       } else {
+                               p.Status.FullConfig.Build.BuildStrategy = 
v1alpha1.IntegrationPlatformBuildStrategyRoutine
+                       }
+               }
+       }
+
+       err := setPlatformDefaults(ctx, c, p, verbose)
+       if err != nil {
+               return err
+       }
+
+       if verbose && p.Status.FullConfig.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko && 
p.Status.FullConfig.Build.Registry.Address == "" {
+               log.Log.Info("No registry specified for publishing images")
+       }
+
+       if verbose && p.Status.FullConfig.Build.Maven.Timeout.Duration != 0 {
+               log.Log.Infof("Maven Timeout set to %s", 
p.Status.FullConfig.Build.Maven.Timeout.Duration)
+       }
+
+       return nil
+}
+
+func setPlatformDefaults(ctx context.Context, c client.Client, p 
*v1alpha1.IntegrationPlatform, verbose bool) error {
+       if p.Status.FullConfig.Profile == "" {
+               p.Status.FullConfig.Profile = DetermineBestProfile(ctx, c, p)
+       }
+       if p.Status.FullConfig.Build.CamelVersion == "" {
+               p.Status.FullConfig.Build.CamelVersion = 
defaults.CamelVersionConstraint
+       }
+       if p.Status.FullConfig.Build.RuntimeVersion == "" {
+               p.Status.FullConfig.Build.RuntimeVersion = 
defaults.RuntimeVersionConstraint
+       }
+       if p.Status.FullConfig.Build.BaseImage == "" {
+               p.Status.FullConfig.Build.BaseImage = defaults.BaseImage
+       }
+       if p.Status.FullConfig.Build.Maven.LocalRepository == "" {
+               p.Status.FullConfig.Build.Maven.LocalRepository = 
defaults.LocalRepository
+       }
+       if p.Status.FullConfig.Build.PersistentVolumeClaim == "" {
+               p.Status.FullConfig.Build.PersistentVolumeClaim = p.Name
+       }
+
+       if p.Status.FullConfig.Build.Timeout.Duration != 0 {
+               d := 
p.Status.FullConfig.Build.Timeout.Duration.Truncate(time.Second)
+
+               if verbose && p.Status.FullConfig.Build.Timeout.Duration != d {
+                       log.Log.Infof("Build timeout minimum unit is sec 
(configured: %s, truncated: %s)", p.Status.FullConfig.Build.Timeout.Duration, d)
+               }
+
+               p.Status.FullConfig.Build.Timeout.Duration = d
+       }
+       if p.Status.FullConfig.Build.Timeout.Duration == 0 {
+               p.Status.FullConfig.Build.Timeout.Duration = 5 * time.Minute
+       }
+
+       if p.Status.FullConfig.Build.Maven.Timeout.Duration != 0 {
+               d := 
p.Status.FullConfig.Build.Maven.Timeout.Duration.Truncate(time.Second)
+
+               if verbose && p.Status.FullConfig.Build.Maven.Timeout.Duration 
!= d {
+                       log.Log.Infof("Maven timeout minimum unit is sec 
(configured: %s, truncated: %s)", 
p.Status.FullConfig.Build.Maven.Timeout.Duration, d)
+               }
+
+               p.Status.FullConfig.Build.Maven.Timeout.Duration = d
+       }
+       if p.Status.FullConfig.Build.Maven.Timeout.Duration == 0 {
+               n := p.Status.FullConfig.Build.Timeout.Duration.Seconds() * 0.75
+               p.Status.FullConfig.Build.Maven.Timeout.Duration = 
(time.Duration(n) * time.Second).Truncate(time.Second)
+       }
+
+       if p.Status.FullConfig.Build.Maven.Settings.ConfigMapKeyRef == nil && 
p.Status.FullConfig.Build.Maven.Settings.SecretKeyRef == nil {
+               var repositories []maven.Repository
+               for i, c := range p.Status.FullConfig.Configuration {
+                       if c.Type == "repository" {
+                               repository := maven.NewRepository(c.Value)
+                               if repository.ID == "" {
+                                       repository.ID = 
fmt.Sprintf("repository-%03d", i)
+                               }
+                               repositories = append(repositories, repository)
+                       }
+               }
+
+               settings := maven.NewDefaultSettings(repositories)
+
+               err := createDefaultMavenSettingsConfigMap(ctx, c, p, settings)
+               if err != nil {
+                       return err
+               }
+
+               p.Status.FullConfig.Build.Maven.Settings.ConfigMapKeyRef = 
&corev1.ConfigMapKeySelector {
+                       LocalObjectReference: corev1.LocalObjectReference{
+                               Name: p.Name + "-maven-settings",
+                       },
+                       Key: "settings.xml",
+               }
+       }
+
+       if p.Status.FullConfig.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko && 
p.Status.FullConfig.Build.KanikoBuildCache == nil {
+               // Default to using Kaniko cache warmer
+               defaultKanikoBuildCache := true
+               p.Status.FullConfig.Build.KanikoBuildCache = 
&defaultKanikoBuildCache
+               if verbose {
+                       log.Log.Infof("Kaniko cache set to %t", 
*p.Status.FullConfig.Build.KanikoBuildCache)
+               }
+       }
+
+       if verbose {
+               log.Log.Infof("CamelVersion set to %s", 
p.Status.FullConfig.Build.CamelVersion)
+               log.Log.Infof("RuntimeVersion set to %s", 
p.Status.FullConfig.Build.RuntimeVersion)
+               log.Log.Infof("BaseImage set to %s", 
p.Status.FullConfig.Build.BaseImage)
+               log.Log.Infof("LocalRepository set to %s", 
p.Status.FullConfig.Build.Maven.LocalRepository)
+               log.Log.Infof("Timeout set to %s", 
p.Status.FullConfig.Build.Timeout)
+               log.Log.Infof("Maven Timeout set to %s", 
p.Status.FullConfig.Build.Maven.Timeout.Duration)
+       }
+
+       return nil
+}
+
+func createDefaultMavenSettingsConfigMap(ctx context.Context, client 
client.Client, p *v1alpha1.IntegrationPlatform, settings maven.Settings) error {
+       cm, err := maven.CreateSettingsConfigMap(p.Namespace, p.Name, settings)
+       if err != nil {
+               return err
+       }
+
+       err = client.Create(ctx, cm)
+       if err != nil && !k8serrors.IsAlreadyExists(err) {
+               return err
+       }
+
+       return nil
+}
diff --git a/pkg/platform/platform.go b/pkg/platform/platform.go
index 83c2e82..7fb539a 100644
--- a/pkg/platform/platform.go
+++ b/pkg/platform/platform.go
@@ -99,8 +99,8 @@ func IsActive(p *v1alpha1.IntegrationPlatform) bool {
 
 // DetermineBestProfile tries to detect the best trait profile for the platform
 func DetermineBestProfile(ctx context.Context, c k8sclient.Reader, p 
*v1alpha1.IntegrationPlatform) v1alpha1.TraitProfile {
-       if p.Spec.Profile != "" {
-               return p.Spec.Profile
+       if p.Status.FullConfig.Profile != "" {
+               return p.Status.FullConfig.Profile
        }
        if knative.IsEnabledInNamespace(ctx, c, p.Namespace) {
                return v1alpha1.TraitProfileKnative
@@ -110,10 +110,11 @@ func DetermineBestProfile(ctx context.Context, c 
k8sclient.Reader, p *v1alpha1.I
 
 // GetProfile returns the current profile of the platform (if present) or 
returns the default one for the cluster
 func GetProfile(p *v1alpha1.IntegrationPlatform) v1alpha1.TraitProfile {
-       if p.Spec.Profile != "" {
-               return p.Spec.Profile
+       if p.Status.FullConfig.Profile != "" {
+               return p.Status.FullConfig.Profile
        }
-       switch p.Spec.Cluster {
+
+       switch p.Status.FullConfig.Cluster {
        case v1alpha1.IntegrationPlatformClusterKubernetes:
                return v1alpha1.TraitProfileKubernetes
        case v1alpha1.IntegrationPlatformClusterOpenShift:
@@ -124,10 +125,10 @@ func GetProfile(p *v1alpha1.IntegrationPlatform) 
v1alpha1.TraitProfile {
 
 // SupportsS2iPublishStrategy --
 func SupportsS2iPublishStrategy(p *v1alpha1.IntegrationPlatform) bool {
-       return p.Spec.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyS2I
+       return p.Status.FullConfig.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyS2I
 }
 
 // SupportsKanikoPublishStrategy --
 func SupportsKanikoPublishStrategy(p *v1alpha1.IntegrationPlatform) bool {
-       return p.Spec.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko && 
p.Spec.Build.Registry.Address != ""
+       return p.Status.FullConfig.Build.PublishStrategy == 
v1alpha1.IntegrationPlatformBuildPublishStrategyKaniko && 
p.Status.FullConfig.Build.Registry.Address != ""
 }
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 9fa42bf..87dea37 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -46,7 +46,7 @@ func TestBuilderTraitNotAppliedBecauseOfNilKit(t *testing.T) {
                e := e // pin
                e.IntegrationKit = nil
 
-               t.Run(string(e.Platform.Spec.Cluster), func(t *testing.T) {
+               t.Run(string(e.Platform.Status.FullConfig.Cluster), func(t 
*testing.T) {
                        err := NewBuilderTestCatalog().apply(e)
 
                        assert.Nil(t, err)
@@ -67,7 +67,7 @@ func TestBuilderTraitNotAppliedBecauseOfNilPhase(t 
*testing.T) {
                e := e // pin
                e.IntegrationKit.Status.Phase = 
v1alpha1.IntegrationKitPhaseInitialization
 
-               t.Run(string(e.Platform.Spec.Cluster), func(t *testing.T) {
+               t.Run(string(e.Platform.Status.FullConfig.Cluster), func(t 
*testing.T) {
                        err := NewBuilderTestCatalog().apply(e)
 
                        assert.Nil(t, err)
@@ -124,7 +124,7 @@ func createBuilderTestEnv(cluster 
v1alpha1.IntegrationPlatformCluster, strategy
                panic(err)
        }
 
-       return &Environment{
+       res := &Environment{
                C:            context.TODO(),
                CamelCatalog: c,
                Catalog:      NewCatalog(context.TODO(), nil),
@@ -157,6 +157,10 @@ func createBuilderTestEnv(cluster 
v1alpha1.IntegrationPlatformCluster, strategy
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+
+       res.Platform.ResyncStatusFullConfig()
+
+       return res
 }
 
 func NewBuilderTestCatalog() *Catalog {
diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go
index ca59d11..95e9669 100644
--- a/pkg/trait/camel.go
+++ b/pkg/trait/camel.go
@@ -105,7 +105,7 @@ func (t *camelTrait) loadOrCreateCatalog(e *Environment, 
camelVersion string, ru
                // the required versions (camel and runtime) are not expressed 
as
                // semver constraints
                if exactVersionRegexp.MatchString(camelVersion) && 
exactVersionRegexp.MatchString(runtimeVersion) {
-                       catalog, err = camel.GenerateCatalog(e.C, e.Client, ns, 
e.Platform.Spec.Build.Maven, camelVersion, runtimeVersion)
+                       catalog, err = camel.GenerateCatalog(e.C, e.Client, ns, 
e.Platform.Status.FullConfig.Build.Maven, camelVersion, runtimeVersion)
                        if err != nil {
                                return err
                        }
@@ -148,7 +148,7 @@ func (t *camelTrait) determineCamelVersion(e *Environment) 
string {
        if e.IntegrationKit != nil && e.IntegrationKit.Status.CamelVersion != 
"" {
                return e.IntegrationKit.Status.CamelVersion
        }
-       return e.Platform.Spec.Build.CamelVersion
+       return e.Platform.Status.FullConfig.Build.CamelVersion
 }
 
 func (t *camelTrait) determineRuntimeVersion(e *Environment) string {
@@ -161,7 +161,7 @@ func (t *camelTrait) determineRuntimeVersion(e 
*Environment) string {
        if e.IntegrationKit != nil && e.IntegrationKit.Status.RuntimeVersion != 
"" {
                return e.IntegrationKit.Status.RuntimeVersion
        }
-       return e.Platform.Spec.Build.RuntimeVersion
+       return e.Platform.Status.FullConfig.Build.RuntimeVersion
 }
 
 // IsPlatformTrait overrides base class method
diff --git a/pkg/trait/container_test.go b/pkg/trait/container_test.go
index 90b9613..f66c0c8 100644
--- a/pkg/trait/container_test.go
+++ b/pkg/trait/container_test.go
@@ -72,6 +72,7 @@ func TestContainerWithDefaults(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        err = traitCatalog.apply(&environment)
 
@@ -134,6 +135,7 @@ func TestContainerWithCustomName(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        err = traitCatalog.apply(&environment)
 
diff --git a/pkg/trait/deployment_test.go b/pkg/trait/deployment_test.go
index 15a30df..9d45328 100644
--- a/pkg/trait/deployment_test.go
+++ b/pkg/trait/deployment_test.go
@@ -199,6 +199,7 @@ func createNominalDeploymentTest() (*deploymentTrait, 
*Environment) {
                },
                Resources: kubernetes.NewCollection(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        return trait, environment
 }
diff --git a/pkg/trait/environment_test.go b/pkg/trait/environment_test.go
index 977ab4b..e13a472 100644
--- a/pkg/trait/environment_test.go
+++ b/pkg/trait/environment_test.go
@@ -66,6 +66,7 @@ func TestDefaultEnvironment(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       env.Platform.ResyncStatusFullConfig()
 
        err = NewEnvironmentTestCatalog().apply(&env)
 
@@ -134,6 +135,7 @@ func TestEnabledContainerMetaDataEnvVars(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       env.Platform.ResyncStatusFullConfig()
 
        err = NewEnvironmentTestCatalog().apply(&env)
 
@@ -202,6 +204,7 @@ func TestDisabledContainerMetaDataEnvVars(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       env.Platform.ResyncStatusFullConfig()
 
        err = NewEnvironmentTestCatalog().apply(&env)
 
diff --git a/pkg/trait/istio_test.go b/pkg/trait/istio_test.go
index b68d374..92d91bf 100644
--- a/pkg/trait/istio_test.go
+++ b/pkg/trait/istio_test.go
@@ -64,6 +64,7 @@ func NewIstioTestEnv(t *testing.T, d *appsv1.Deployment, s 
*serving.Service, ena
                EnvVars:   make([]corev1.EnvVar, 0),
                Resources: kubernetes.NewCollection(s, d),
        }
+       env.Platform.ResyncStatusFullConfig()
 
        if enabled {
                env.Integration.Spec.Traits["istio"].Configuration["enabled"] = 
"true"
diff --git a/pkg/trait/knative_service_test.go 
b/pkg/trait/knative_service_test.go
index faad1b2..5da9b54 100644
--- a/pkg/trait/knative_service_test.go
+++ b/pkg/trait/knative_service_test.go
@@ -112,6 +112,7 @@ func TestKnativeService(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        err = traitCatalog.apply(&environment)
 
@@ -238,6 +239,7 @@ func TestKnativeServiceWithCustomContainerName(t 
*testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        err = traitCatalog.apply(&environment)
 
diff --git a/pkg/trait/knative_test.go b/pkg/trait/knative_test.go
index 3596188..716059c 100644
--- a/pkg/trait/knative_test.go
+++ b/pkg/trait/knative_test.go
@@ -98,6 +98,7 @@ func TestKnativeEnvConfigurationFromTrait(t *testing.T) {
                Resources:      k8sutils.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        c, err := NewFakeClient("ns")
        assert.Nil(t, err)
@@ -207,6 +208,7 @@ func TestKnativeEnvConfigurationFromSource(t *testing.T) {
                Resources:      k8sutils.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        c, err := NewFakeClient("ns")
        assert.Nil(t, err)
diff --git a/pkg/trait/pull_secret.go b/pkg/trait/pull_secret.go
index db79632..56394cc 100644
--- a/pkg/trait/pull_secret.go
+++ b/pkg/trait/pull_secret.go
@@ -60,7 +60,7 @@ func (t *pullSecretTrait) Configure(e *Environment) (bool, 
error) {
 
        if t.Auto == nil || *t.Auto {
                if t.SecretName == "" {
-                       secret := e.Platform.Spec.Build.Registry.Secret
+                       secret := 
e.Platform.Status.FullConfig.Build.Registry.Secret
                        if secret != "" {
                                key := client.ObjectKey{Namespace: 
e.Platform.Namespace, Name: secret}
                                obj := v1.Secret{}
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index 8cbb165..3696aa8 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -94,7 +94,7 @@ func (t *quarkusTrait) loadOrCreateCatalog(e *Environment, 
camelVersion string,
                // semver constraints
                if exactVersionRegexp.MatchString(camelVersion) && 
exactVersionRegexp.MatchString(runtimeVersion) &&
                        exactVersionRegexp.MatchString(camelQuarkusVersion) && 
exactVersionRegexp.MatchString(quarkusVersion) {
-                       catalog, err = camel.GenerateCatalogWithProvider(e.C, 
e.Client, ns, e.Platform.Spec.Build.Maven, camelVersion, runtimeVersion,
+                       catalog, err = camel.GenerateCatalogWithProvider(e.C, 
e.Client, ns, e.Platform.Status.FullConfig.Build.Maven, camelVersion, 
runtimeVersion,
                                "quarkus",
                                []maven.Dependency{
                                        {
@@ -201,9 +201,9 @@ func (t *quarkusTrait) determineQuarkusVersion(e 
*Environment) string {
                e.IntegrationKit.Status.RuntimeProvider.Quarkus.QuarkusVersion 
!= "" {
                return 
e.IntegrationKit.Status.RuntimeProvider.Quarkus.QuarkusVersion
        }
-       if e.Platform.Spec.Build.RuntimeProvider != nil && 
e.Platform.Spec.Build.RuntimeProvider.Quarkus != nil &&
-               e.Platform.Spec.Build.RuntimeProvider.Quarkus.QuarkusVersion != 
"" {
-               return 
e.Platform.Spec.Build.RuntimeProvider.Quarkus.QuarkusVersion
+       if e.Platform.Status.FullConfig.Build.RuntimeProvider != nil && 
e.Platform.Status.FullConfig.Build.RuntimeProvider.Quarkus != nil &&
+               
e.Platform.Status.FullConfig.Build.RuntimeProvider.Quarkus.QuarkusVersion != "" 
{
+               return 
e.Platform.Status.FullConfig.Build.RuntimeProvider.Quarkus.QuarkusVersion
        }
        return defaults.QuarkusVersionConstraint
 }
@@ -220,9 +220,9 @@ func (t *quarkusTrait) determineCamelQuarkusVersion(e 
*Environment) string {
                
e.IntegrationKit.Status.RuntimeProvider.Quarkus.CamelQuarkusVersion != "" {
                return 
e.IntegrationKit.Status.RuntimeProvider.Quarkus.CamelQuarkusVersion
        }
-       if e.Platform.Spec.Build.RuntimeProvider != nil && 
e.Platform.Spec.Build.RuntimeProvider.Quarkus != nil &&
-               
e.Platform.Spec.Build.RuntimeProvider.Quarkus.CamelQuarkusVersion != "" {
-               return 
e.Platform.Spec.Build.RuntimeProvider.Quarkus.CamelQuarkusVersion
+       if e.Platform.Status.FullConfig.Build.RuntimeProvider != nil && 
e.Platform.Status.FullConfig.Build.RuntimeProvider.Quarkus != nil &&
+               
e.Platform.Status.FullConfig.Build.RuntimeProvider.Quarkus.CamelQuarkusVersion 
!= "" {
+               return 
e.Platform.Status.FullConfig.Build.RuntimeProvider.Quarkus.CamelQuarkusVersion
        }
        return defaults.CamelQuarkusVersionConstraint
 }
diff --git a/pkg/trait/rest-dsl.go b/pkg/trait/rest-dsl.go
index efc5ecd..022dbb2 100644
--- a/pkg/trait/rest-dsl.go
+++ b/pkg/trait/rest-dsl.go
@@ -114,12 +114,12 @@ func (t *restDslTrait) Apply(e *Environment) error {
                }
 
                mc := maven.NewContext(tmpDir, project)
-               mc.LocalRepository = e.Platform.Spec.Build.Maven.LocalRepository
-               mc.Timeout = e.Platform.Spec.Build.Maven.Timeout.Duration
+               mc.LocalRepository = 
e.Platform.Status.FullConfig.Build.Maven.LocalRepository
+               mc.Timeout = 
e.Platform.Status.FullConfig.Build.Maven.Timeout.Duration
                mc.AddArgument("-Dopenapi.spec=" + in)
                mc.AddArgument("-Ddsl.out=" + out)
 
-               settings, err := kubernetes.ResolveValueSource(e.C, e.Client, 
e.Integration.Namespace, &e.Platform.Spec.Build.Maven.Settings)
+               settings, err := kubernetes.ResolveValueSource(e.C, e.Client, 
e.Integration.Namespace, &e.Platform.Status.FullConfig.Build.Maven.Settings)
                if err != nil {
                        return err
                }
diff --git a/pkg/trait/route_test.go b/pkg/trait/route_test.go
index 24f4895..3a43156 100644
--- a/pkg/trait/route_test.go
+++ b/pkg/trait/route_test.go
@@ -39,7 +39,7 @@ func createTestRouteEnvironment(t *testing.T, name string) 
*Environment {
        catalog, err := camel.DefaultCatalog()
        assert.Nil(t, err)
 
-       return &Environment{
+       res := &Environment{
                CamelCatalog: catalog,
                Catalog:      NewCatalog(context.TODO(), nil),
                Integration: &v1alpha1.Integration{
@@ -92,6 +92,8 @@ func createTestRouteEnvironment(t *testing.T, name string) 
*Environment {
                        },
                ),
        }
+       res.Platform.ResyncStatusFullConfig()
+       return res
 }
 
 func TestRoute_Default(t *testing.T) {
diff --git a/pkg/trait/service_test.go b/pkg/trait/service_test.go
index 5505de0..da72d7a 100644
--- a/pkg/trait/service_test.go
+++ b/pkg/trait/service_test.go
@@ -96,6 +96,7 @@ func TestServiceWithDefaults(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        err = traitCatalog.apply(&environment)
 
@@ -194,6 +195,7 @@ func TestService(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        err = traitCatalog.apply(&environment)
 
@@ -277,6 +279,7 @@ func TestServiceWithCustomContainerName(t *testing.T) {
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       environment.Platform.ResyncStatusFullConfig()
 
        err = traitCatalog.apply(&environment)
 
diff --git a/pkg/trait/trait_catalog.go b/pkg/trait/trait_catalog.go
index 32d5faa..8df6c30 100644
--- a/pkg/trait/trait_catalog.go
+++ b/pkg/trait/trait_catalog.go
@@ -279,8 +279,8 @@ func (c *Catalog) GetTrait(id string) Trait {
 }
 
 func (c *Catalog) configure(env *Environment) error {
-       if env.Platform != nil && env.Platform.Spec.Traits != nil {
-               if err := c.configureTraits(env.Platform.Spec.Traits); err != 
nil {
+       if env.Platform != nil && env.Platform.Status.FullConfig.Traits != nil {
+               if err := 
c.configureTraits(env.Platform.Status.FullConfig.Traits); err != nil {
                        return err
                }
        }
diff --git a/pkg/trait/trait_test.go b/pkg/trait/trait_test.go
index 67faa61..3a9f9e7 100644
--- a/pkg/trait/trait_test.go
+++ b/pkg/trait/trait_test.go
@@ -177,6 +177,7 @@ func TestTraitHierarchyDecode(t *testing.T) {
                        "autoscaling-target": "15",
                },
        }
+       env.Platform.ResyncStatusFullConfig()
 
        env.IntegrationKit.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
        env.IntegrationKit.Spec.Traits["knative-service"] = v1alpha1.TraitSpec{
@@ -433,7 +434,7 @@ func createTestEnv(t *testing.T, cluster 
v1alpha1.IntegrationPlatformCluster, sc
        catalog, err := camel.DefaultCatalog()
        assert.Nil(t, err)
 
-       return &Environment{
+       res := &Environment{
                CamelCatalog: catalog,
                Catalog:      NewCatalog(context.TODO(), nil),
                Integration: &v1alpha1.Integration{
@@ -471,6 +472,8 @@ func createTestEnv(t *testing.T, cluster 
v1alpha1.IntegrationPlatformCluster, sc
                Resources:      kubernetes.NewCollection(),
                Classpath:      strset.New(),
        }
+       res.Platform.ResyncStatusFullConfig()
+       return res
 }
 
 func NewTraitTestCatalog() *Catalog {
diff --git a/pkg/trait/util_test.go b/pkg/trait/util_test.go
index ec2709e..c6df916 100644
--- a/pkg/trait/util_test.go
+++ b/pkg/trait/util_test.go
@@ -54,6 +54,7 @@ func TestCollectConfigurationValues(t *testing.T) {
                        },
                },
        }
+       e.Platform.ResyncStatusFullConfig()
 
        assert.Contains(t, e.CollectConfigurationValues("configmap"), 
"my-cm-integration")
        assert.Contains(t, e.CollectConfigurationValues("secret"), 
"my-secret-platform")
@@ -90,6 +91,7 @@ func TestCollectConfigurationPairs(t *testing.T) {
                        },
                },
        }
+       e.Platform.ResyncStatusFullConfig()
 
        pairs := e.CollectConfigurationPairs("property")
        assert.Equal(t, "integration", pairs["p1"])
diff --git a/script/Makefile b/script/Makefile
index 5e610b3..eda1632 100644
--- a/script/Makefile
+++ b/script/Makefile
@@ -241,4 +241,4 @@ install-minikube:
 release-notes:
        ./script/gen_release_notes.sh $(LAST_RELEASED_VERSION) $(VERSION)
 
-.PHONY: build build-kamel build-resources build-olm unsnapshot-olm dep codegen 
images images-dec images-push images-push-staging test check test-integration 
clean release cross-compile package-examples set-version git-tag release-notes 
check-licenses generate-deepcopy generate-client generate-doc
+.PHONY: build build-kamel build-resources build-olm unsnapshot-olm dep codegen 
images images-dev images-push images-push-staging test check test-integration 
clean release cross-compile package-examples set-version git-tag release-notes 
check-licenses generate-deepcopy generate-client generate-doc

Reply via email to