This is an automated email from the ASF dual-hosted git repository. pcongiusti pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 57149cfdbf9db836363e411350857f97e47984af Author: Pasquale Congiusti <pasquale.congiu...@gmail.com> AuthorDate: Thu Apr 18 15:37:40 2024 +0200 chore(trait): disable traits requiring catalog when missing We must explicitly define which are the traits that can be executed and which can't because missing catalog. The catalog has sense only for the "managed" Integrations. --- addons/keda/keda.go | 4 +++- addons/master/master.go | 3 +++ addons/resume/resume.go | 3 +++ addons/telemetry/telemetry.go | 4 +++- addons/tracing/tracing.go | 42 +++++++++++++++++--------------------- pkg/trait/builder.go | 4 +++- pkg/trait/camel.go | 26 +++++++++++++---------- pkg/trait/camel_test.go | 34 ++++++++++++++++-------------- pkg/trait/container.go | 1 - pkg/trait/cron.go | 7 ++++--- pkg/trait/dependencies.go | 4 +++- pkg/trait/dependencies_test.go | 8 ++++++-- pkg/trait/error_handler.go | 4 +++- pkg/trait/error_handler_test.go | 14 +++++++++---- pkg/trait/health.go | 3 +++ pkg/trait/jvm.go | 6 +++--- pkg/trait/kamelets.go | 3 +++ pkg/trait/knative.go | 3 +++ pkg/trait/knative_service.go | 4 ++-- pkg/trait/logging.go | 2 +- pkg/trait/openapi.go | 4 +++- pkg/trait/quarkus.go | 3 +++ pkg/trait/service.go | 6 ++++-- pkg/trait/service_binding.go | 3 +++ pkg/trait/trait_condition_types.go | 17 ++++++++++++++- 25 files changed, 138 insertions(+), 74 deletions(-) diff --git a/addons/keda/keda.go b/addons/keda/keda.go index ce4b56ab9..184dbdb90 100644 --- a/addons/keda/keda.go +++ b/addons/keda/keda.go @@ -120,10 +120,12 @@ func (t *kedaTrait) Configure(e *trait.Environment) (bool, *trait.TraitCondition if e.Integration == nil || !pointer.BoolDeref(t.Enabled, false) { return false, nil, nil } + if e.CamelCatalog == nil { + return false, trait.NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if !e.IntegrationInPhase(camelv1.IntegrationPhaseInitialization) && !e.IntegrationInRunningPhases() { return false, nil, nil } - if t.Auto == nil || *t.Auto { if err := t.populateTriggersFromKamelets(e); err != nil { return false, nil, err diff --git a/addons/master/master.go b/addons/master/master.go index 692bfb2c4..deec026f1 100644 --- a/addons/master/master.go +++ b/addons/master/master.go @@ -92,6 +92,9 @@ func (t *masterTrait) Configure(e *trait.Environment) (bool, *trait.TraitConditi if !pointer.BoolDeref(t.Enabled, true) { return false, trait.NewIntegrationConditionUserDisabled(masterComponent), nil } + if e.CamelCatalog == nil { + return false, trait.NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if !e.IntegrationInPhase(v1.IntegrationPhaseInitialization, v1.IntegrationPhaseBuildingKit) && !e.IntegrationInRunningPhases() { return false, nil, nil } diff --git a/addons/resume/resume.go b/addons/resume/resume.go index 221ae0364..2f44d1701 100644 --- a/addons/resume/resume.go +++ b/addons/resume/resume.go @@ -79,6 +79,9 @@ func (r *resumeTrait) Configure(environment *trait.Environment) (bool, *trait.Tr if !pointer.BoolDeref(r.Enabled, false) { return false, nil, nil } + if environment.CamelCatalog == nil { + return false, trait.NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if !environment.IntegrationInPhase(v1.IntegrationPhaseInitialization) && !environment.IntegrationInRunningPhases() { return false, nil, nil } diff --git a/addons/telemetry/telemetry.go b/addons/telemetry/telemetry.go index ec7f7c858..d6363a868 100644 --- a/addons/telemetry/telemetry.go +++ b/addons/telemetry/telemetry.go @@ -93,7 +93,9 @@ func (t *telemetryTrait) Configure(e *trait.Environment) (bool, *trait.TraitCond if e.Integration == nil || !pointer.BoolDeref(t.Enabled, false) { return false, nil, nil } - + if e.CamelCatalog == nil { + return false, trait.NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } var condition *trait.TraitCondition if pointer.BoolDeref(t.Auto, true) { if t.Endpoint == "" { diff --git a/addons/tracing/tracing.go b/addons/tracing/tracing.go index 0cf3852e0..52cb6684c 100644 --- a/addons/tracing/tracing.go +++ b/addons/tracing/tracing.go @@ -90,6 +90,9 @@ func (t *tracingTrait) Configure(e *trait.Environment) (bool, *trait.TraitCondit if e.Integration == nil || !pointer.BoolDeref(t.Enabled, false) { return false, nil, nil } + if e.CamelCatalog == nil { + return false, trait.NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if pointer.BoolDeref(t.Auto, true) { if t.Endpoint == "" { @@ -125,30 +128,23 @@ func (t *tracingTrait) Configure(e *trait.Environment) (bool, *trait.TraitCondit func (t *tracingTrait) Apply(e *trait.Environment) error { util.StringSliceUniqueAdd(&e.Integration.Status.Capabilities, v1.CapabilityTracing) - if e.CamelCatalog != nil { - provider := e.CamelCatalog.CamelCatalogSpec.Runtime.Provider - properties := tracingProperties[provider] - - if appPropEnabled := properties[propEnabled]; appPropEnabled != "" { - e.ApplicationProperties[appPropEnabled] = "true" - } - - if appPropEndpoint := properties[propEndpoint]; appPropEndpoint != "" && t.Endpoint != "" { - e.ApplicationProperties[appPropEndpoint] = t.Endpoint - } - - if appPropServiceName := properties[propServiceName]; appPropServiceName != "" && t.ServiceName != "" { - e.ApplicationProperties[appPropServiceName] = t.ServiceName - } - - if appPropSamplerType := properties[propSamplerType]; appPropSamplerType != "" && t.SamplerType != nil { - e.ApplicationProperties[appPropSamplerType] = *t.SamplerType - } - - if appPropSamplerParam := properties[propSamplerParam]; appPropSamplerParam != "" && t.SamplerParam != nil { - e.ApplicationProperties[appPropSamplerParam] = *t.SamplerParam - } + provider := e.CamelCatalog.CamelCatalogSpec.Runtime.Provider + properties := tracingProperties[provider] + if appPropEnabled := properties[propEnabled]; appPropEnabled != "" { + e.ApplicationProperties[appPropEnabled] = "true" + } + if appPropEndpoint := properties[propEndpoint]; appPropEndpoint != "" && t.Endpoint != "" { + e.ApplicationProperties[appPropEndpoint] = t.Endpoint + } + if appPropServiceName := properties[propServiceName]; appPropServiceName != "" && t.ServiceName != "" { + e.ApplicationProperties[appPropServiceName] = t.ServiceName + } + if appPropSamplerType := properties[propSamplerType]; appPropSamplerType != "" && t.SamplerType != nil { + e.ApplicationProperties[appPropSamplerType] = *t.SamplerType + } + if appPropSamplerParam := properties[propSamplerParam]; appPropSamplerParam != "" && t.SamplerParam != nil { + e.ApplicationProperties[appPropSamplerParam] = *t.SamplerParam } return nil diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go index 115ea6d66..afbc66688 100644 --- a/pkg/trait/builder.go +++ b/pkg/trait/builder.go @@ -90,7 +90,9 @@ func (t *builderTrait) Configure(e *Environment) (bool, *TraitCondition, error) if e.IntegrationKit == nil { return false, nil, nil } - + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } condition := t.adaptDeprecatedFields() if e.Platform.Status.Build.PublishStrategy == v1.IntegrationPlatformBuildPublishStrategySpectrum { condition = newOrAppend(condition, "Spectrum publishing strategy is deprecated and may be removed in future releases. Make sure to use any supported publishing strategy instead.") diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go index 9f573c503..46a7ef2d3 100644 --- a/pkg/trait/camel.go +++ b/pkg/trait/camel.go @@ -63,11 +63,8 @@ func (t *camelTrait) Matches(trait Trait) bool { } func (t *camelTrait) Configure(e *Environment) (bool, *TraitCondition, error) { - if e.IntegrationKit != nil && e.IntegrationKit.IsExternal() { - return false, newIntegrationConditionPlatformDisabledWithMessage("Camel", "integration kit was not created via Camel K operator"), nil - } if e.Integration != nil && e.Integration.IsSynthetic() { - return false, newIntegrationConditionPlatformDisabledWithMessage("Camel", "syntetic integration"), nil + return false, NewIntegrationConditionPlatformDisabledWithMessage("Camel", "synthetic integration"), nil } if t.RuntimeVersion == "" { @@ -82,13 +79,26 @@ func (t *camelTrait) Configure(e *Environment) (bool, *TraitCondition, error) { } func (t *camelTrait) Apply(e *Environment) error { + if e.IntegrationKitInPhase(v1.IntegrationKitPhaseReady) && e.IntegrationInRunningPhases() { + // Get all resources + maps := t.computeConfigMaps(e) + e.Resources.AddAll(maps) + } + if e.IntegrationKit != nil && e.IntegrationKit.IsSynthetic() { + // This is required as during init phase, the trait set by default these values + // which are widely used in the platform for different purposese. + if e.Integration != nil { + e.Integration.Status.RuntimeVersion = "" + e.Integration.Status.RuntimeProvider = "" + } + return nil + } if e.CamelCatalog == nil { if err := t.loadOrCreateCatalog(e, t.RuntimeVersion); err != nil { return err } } e.RuntimeVersion = e.CamelCatalog.Runtime.Version - if e.Integration != nil { e.Integration.Status.RuntimeVersion = e.CamelCatalog.Runtime.Version e.Integration.Status.RuntimeProvider = e.CamelCatalog.Runtime.Provider @@ -98,12 +108,6 @@ func (t *camelTrait) Apply(e *Environment) error { e.IntegrationKit.Status.RuntimeProvider = e.CamelCatalog.Runtime.Provider } - if e.IntegrationKitInPhase(v1.IntegrationKitPhaseReady) && e.IntegrationInRunningPhases() { - // Get all resources - maps := t.computeConfigMaps(e) - e.Resources.AddAll(maps) - } - return nil } diff --git a/pkg/trait/camel_test.go b/pkg/trait/camel_test.go index 2ca58645e..175f154c3 100644 --- a/pkg/trait/camel_test.go +++ b/pkg/trait/camel_test.go @@ -45,6 +45,7 @@ func TestConfigureEnabledCamelTraitSucceeds(t *testing.T) { func TestApplyCamelTraitSucceeds(t *testing.T) { trait, environment := createNominalCamelTest(false) + environment.Integration.Status.Phase = v1.IntegrationPhaseBuildingKit configured, condition, err := trait.Configure(environment) require.NoError(t, err) @@ -63,6 +64,22 @@ func TestApplyCamelTraitSucceeds(t *testing.T) { assert.False(t, exactVersionRegexp.MatchString("wroong")) } +func TestApplyCamelTraitExternalKit(t *testing.T) { + trait, environment := createNominalCamelTest(false) + environment.IntegrationKit.Labels[v1.IntegrationKitTypeLabel] = v1.IntegrationKitTypeSynthetic + + configured, condition, err := trait.Configure(environment) + require.NoError(t, err) + assert.Nil(t, condition) + assert.True(t, configured) + err = trait.Apply(environment) + require.NoError(t, err) + assert.Equal(t, "", environment.Integration.Status.RuntimeVersion) + assert.Equal(t, v1.RuntimeProvider(""), environment.Integration.Status.RuntimeProvider) + assert.Equal(t, "", environment.IntegrationKit.Status.RuntimeVersion) + assert.Equal(t, v1.RuntimeProvider(""), environment.Integration.Status.RuntimeProvider) +} + func TestApplyCamelTraitWithoutEnvironmentCatalogAndUnmatchableVersionFails(t *testing.T) { trait, environment := createNominalCamelTest(false) environment.CamelCatalog = nil @@ -233,6 +250,7 @@ func TestCamelMatches(t *testing.T) { func TestCamelCatalogSemver(t *testing.T) { trait, environment := createNominalCamelTest(true) + environment.Integration.Status.Phase = v1.IntegrationPhaseBuildingKit trait.RuntimeVersion = "2.x" environment.CamelCatalog.CamelCatalogSpec.Runtime.Version = "2.16.0" @@ -247,20 +265,6 @@ func TestCamelCatalogSemver(t *testing.T) { assert.Equal(t, environment.CamelCatalog.CamelCatalogSpec.Runtime.Version, environment.RuntimeVersion) } -func TestCamelTraitExternalKit(t *testing.T) { - trait, environment := createNominalCamelTest(true) - environment.Integration.Status = v1.IntegrationStatus{} - environment.IntegrationKit.Labels[v1.IntegrationKitTypeLabel] = v1.IntegrationKitTypeExternal - - configured, condition, err := trait.Configure(environment) - require.NoError(t, err) - assert.Equal(t, "explicitly disabled by the platform: integration kit was not created via Camel K operator", condition.message) - assert.False(t, configured) - - assert.Equal(t, v1.RuntimeProvider(""), environment.Integration.Status.RuntimeProvider) - assert.Equal(t, "", environment.Integration.Status.RuntimeVersion) -} - func TestCamelTraitSyntheticIntegration(t *testing.T) { trait, environment := createNominalCamelTest(true) environment.Integration.Status = v1.IntegrationStatus{} @@ -269,7 +273,7 @@ func TestCamelTraitSyntheticIntegration(t *testing.T) { configured, condition, err := trait.Configure(environment) require.NoError(t, err) - assert.Equal(t, "explicitly disabled by the platform: syntetic integration", condition.message) + assert.Equal(t, "explicitly disabled by the platform: synthetic integration", condition.message) assert.False(t, configured) assert.Equal(t, v1.RuntimeProvider(""), environment.Integration.Status.RuntimeProvider) diff --git a/pkg/trait/container.go b/pkg/trait/container.go index ecb5d160f..19ab28ee5 100644 --- a/pkg/trait/container.go +++ b/pkg/trait/container.go @@ -168,7 +168,6 @@ func (t *containerTrait) configureImageIntegrationKit(e *Environment) error { kit.SetOperatorID(operatorID) } - t.L.Infof("image %s", kit.Spec.Image) e.Resources.Add(kit) e.Integration.SetIntegrationKit(kit) } diff --git a/pkg/trait/cron.go b/pkg/trait/cron.go index 3e81c8ea2..67bbd7efb 100644 --- a/pkg/trait/cron.go +++ b/pkg/trait/cron.go @@ -84,9 +84,8 @@ func (t *cronTrait) Configure(e *Environment) (bool, *TraitCondition, error) { return false, nil, nil } if e.CamelCatalog == nil { - return false, newIntegrationConditionPlatformDisabledWithMessage("Cron", "no camel catalog available for this Integration"), nil + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil } - if _, ok := e.CamelCatalog.Runtime.Capabilities[v1.CapabilityCron]; !ok { return false, NewIntegrationCondition( "Cron", @@ -96,7 +95,6 @@ func (t *cronTrait) Configure(e *Environment) (bool, *TraitCondition, error) { "the runtime provider %s does not declare 'cron' capability", ), nil } - if pointer.BoolDeref(t.Auto, true) { globalCron, err := t.getGlobalCron(e) if err != nil { @@ -309,6 +307,9 @@ func (c *cronInfo) withSchedule(schedule string) *cronInfo { } func (t *cronTrait) getGlobalCron(e *Environment) (*cronInfo, error) { + if e.CamelCatalog == nil { + return nil, nil + } fromURIs, err := t.getSourcesFromURIs(e) if err != nil { return nil, err diff --git a/pkg/trait/dependencies.go b/pkg/trait/dependencies.go index e8d6e5d0f..b2dc4b7f9 100644 --- a/pkg/trait/dependencies.go +++ b/pkg/trait/dependencies.go @@ -42,7 +42,9 @@ func (t *dependenciesTrait) Configure(e *Environment) (bool, *TraitCondition, er if e.Integration == nil { return false, nil, nil } - + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } return e.IntegrationInPhase(v1.IntegrationPhaseInitialization), nil, nil } diff --git a/pkg/trait/dependencies_test.go b/pkg/trait/dependencies_test.go index bda3b785d..e3d4aeeba 100644 --- a/pkg/trait/dependencies_test.go +++ b/pkg/trait/dependencies_test.go @@ -28,9 +28,13 @@ import ( ) func TestDependenciesTraitApplicability(t *testing.T) { + catalog, err := camel.DefaultCatalog() + require.NoError(t, err) + e := &Environment{ - Catalog: NewEnvironmentTestCatalog(), - Integration: &v1.Integration{}, + CamelCatalog: catalog, + Catalog: NewEnvironmentTestCatalog(), + Integration: &v1.Integration{}, } trait := newDependenciesTrait() diff --git a/pkg/trait/error_handler.go b/pkg/trait/error_handler.go index c37388e69..829304073 100644 --- a/pkg/trait/error_handler.go +++ b/pkg/trait/error_handler.go @@ -44,11 +44,13 @@ func (t *errorHandlerTrait) Configure(e *Environment) (bool, *TraitCondition, er if e.Integration == nil { return false, nil, nil } + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if !e.IntegrationInPhase(v1.IntegrationPhaseInitialization) && !e.IntegrationInRunningPhases() { return false, nil, nil } - if t.ErrorHandlerRef == "" { t.ErrorHandlerRef = e.Integration.Spec.GetConfigurationProperty(v1.ErrorHandlerRefName) } diff --git a/pkg/trait/error_handler_test.go b/pkg/trait/error_handler_test.go index d5579aa95..4f6ed6168 100644 --- a/pkg/trait/error_handler_test.go +++ b/pkg/trait/error_handler_test.go @@ -29,9 +29,12 @@ import ( ) func TestErrorHandlerConfigureFromIntegrationProperty(t *testing.T) { + catalog, err := camel.DefaultCatalog() + require.NoError(t, err) e := &Environment{ - Catalog: NewEnvironmentTestCatalog(), - Integration: &v1.Integration{}, + CamelCatalog: catalog, + Catalog: NewEnvironmentTestCatalog(), + Integration: &v1.Integration{}, } e.Integration.Spec.AddConfigurationProperty(fmt.Sprintf("%v = %s", v1.ErrorHandlerRefName, "defaultErrorHandler")) @@ -56,9 +59,12 @@ func TestErrorHandlerConfigureFromIntegrationProperty(t *testing.T) { } func TestErrorHandlerApplySource(t *testing.T) { + catalog, err := camel.DefaultCatalog() + require.NoError(t, err) e := &Environment{ - Catalog: NewEnvironmentTestCatalog(), - Integration: &v1.Integration{}, + CamelCatalog: catalog, + Catalog: NewEnvironmentTestCatalog(), + Integration: &v1.Integration{}, } e.Integration.Spec.AddConfiguration("property", fmt.Sprintf("%v = %s", v1.ErrorHandlerRefName, "defaultErrorHandler")) e.Integration.Status.Phase = v1.IntegrationPhaseInitialization diff --git a/pkg/trait/health.go b/pkg/trait/health.go index c01c5cb31..a214b7144 100644 --- a/pkg/trait/health.go +++ b/pkg/trait/health.go @@ -53,6 +53,9 @@ func newHealthTrait() Trait { } func (t *healthTrait) Configure(e *Environment) (bool, *TraitCondition, error) { + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if e.Integration == nil || !e.IntegrationInPhase(v1.IntegrationPhaseInitialization) && !e.IntegrationInRunningPhases() { return false, nil, nil diff --git a/pkg/trait/jvm.go b/pkg/trait/jvm.go index a47e59f6f..57a59081a 100644 --- a/pkg/trait/jvm.go +++ b/pkg/trait/jvm.go @@ -66,16 +66,16 @@ func (t *jvmTrait) Configure(e *Environment) (bool, *TraitCondition, error) { // The JVM trait must be disabled in case the current IntegrationKit corresponds to a native build if qt := e.Catalog.GetTrait(quarkusTraitID); qt != nil { if quarkus, ok := qt.(*quarkusTrait); ok && quarkus.isNativeIntegration(e) { - return false, newIntegrationConditionPlatformDisabledWithMessage("JVM", "quarkus native build"), nil + return false, NewIntegrationConditionPlatformDisabledWithMessage("JVM", "quarkus native build"), nil } } if e.IntegrationKit != nil && e.IntegrationKit.IsSynthetic() { - return false, newIntegrationConditionPlatformDisabledWithMessage("JVM", "integration kit was not created via Camel K operator"), nil + return false, NewIntegrationConditionPlatformDisabledWithMessage("JVM", "integration kit was not created via Camel K operator"), nil } if e.CamelCatalog == nil { - return false, newIntegrationConditionPlatformDisabledWithMessage("JVM", "no camel catalog available for this Integration"), nil + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil } return true, nil, nil } diff --git a/pkg/trait/kamelets.go b/pkg/trait/kamelets.go index 280501848..77df3baf2 100644 --- a/pkg/trait/kamelets.go +++ b/pkg/trait/kamelets.go @@ -79,6 +79,9 @@ func (t *kameletsTrait) Configure(e *Environment) (bool, *TraitCondition, error) if !pointer.BoolDeref(t.Enabled, true) { return false, NewIntegrationConditionUserDisabled("Kamelets"), nil } + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if !e.IntegrationInPhase(v1.IntegrationPhaseInitialization) && !e.IntegrationInRunningPhases() { return false, nil, nil } diff --git a/pkg/trait/knative.go b/pkg/trait/knative.go index 30063f98a..3328ec650 100644 --- a/pkg/trait/knative.go +++ b/pkg/trait/knative.go @@ -73,6 +73,9 @@ func (t *knativeTrait) Configure(e *Environment) (bool, *TraitCondition, error) if !pointer.BoolDeref(t.Enabled, true) { return false, NewIntegrationConditionUserDisabled("Knative"), nil } + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if !e.IntegrationInPhase(v1.IntegrationPhaseInitialization) && !e.IntegrationInRunningPhases() { return false, nil, nil } diff --git a/pkg/trait/knative_service.go b/pkg/trait/knative_service.go index e8baaf7d6..a8e53a779 100644 --- a/pkg/trait/knative_service.go +++ b/pkg/trait/knative_service.go @@ -144,8 +144,8 @@ func (t *knativeServiceTrait) Apply(e *Environment) error { } func (t *knativeServiceTrait) SelectControllerStrategy(e *Environment) (*ControllerStrategy, error) { - if !pointer.BoolDeref(t.Enabled, true) { - // explicitly disabled + if !pointer.BoolDeref(t.Enabled, true) || e.CamelCatalog == nil { + // explicitly disabled or sourceless Integration (missing catalog) return nil, nil } diff --git a/pkg/trait/logging.go b/pkg/trait/logging.go index 1063e21e7..aaea69eee 100644 --- a/pkg/trait/logging.go +++ b/pkg/trait/logging.go @@ -56,7 +56,7 @@ func (l loggingTrait) Configure(e *Environment) (bool, *TraitCondition, error) { return false, NewIntegrationConditionUserDisabled("Logging"), nil } if e.CamelCatalog == nil { - return false, newIntegrationConditionPlatformDisabledWithMessage("Logging", "no camel catalog available for this Integration"), nil + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil } return e.IntegrationInRunningPhases(), nil, nil diff --git a/pkg/trait/openapi.go b/pkg/trait/openapi.go index 1cbc5fe96..1157b80a6 100644 --- a/pkg/trait/openapi.go +++ b/pkg/trait/openapi.go @@ -59,7 +59,9 @@ func (t *openAPITrait) Configure(e *Environment) (bool, *TraitCondition, error) if !e.IntegrationInPhase(v1.IntegrationPhaseInitialization) { return false, nil, nil } - + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } // check if the runtime provides 'rest' capabilities if _, ok := e.CamelCatalog.Runtime.Capabilities[v1.CapabilityRest]; !ok { return false, nil, fmt.Errorf("the runtime provider %s does not declare 'rest' capability", e.CamelCatalog.Runtime.Provider) diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go index 1140029be..28b44a382 100644 --- a/pkg/trait/quarkus.go +++ b/pkg/trait/quarkus.go @@ -140,6 +140,9 @@ func (t *quarkusTrait) Matches(trait Trait) bool { } func (t *quarkusTrait) Configure(e *Environment) (bool, *TraitCondition, error) { + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } condition := t.adaptDeprecatedFields() return e.IntegrationInPhase(v1.IntegrationPhaseBuildingKit) || diff --git a/pkg/trait/service.go b/pkg/trait/service.go index b2e081ab2..515133658 100644 --- a/pkg/trait/service.go +++ b/pkg/trait/service.go @@ -56,13 +56,15 @@ func (t *serviceTrait) Configure(e *Environment) (bool, *TraitCondition, error) "explicitly disabled", ), nil } - + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } // in case the knative-service and service trait are enabled, the knative-service has priority // then this service is disabled if e.GetTrait(knativeServiceTraitID) != nil { knativeServiceTrait, _ := e.GetTrait(knativeServiceTraitID).(*knativeServiceTrait) if pointer.BoolDeref(knativeServiceTrait.Enabled, true) { - return false, newIntegrationConditionPlatformDisabledWithMessage("Service", "knative-service trait has priority over this trait"), nil + return false, NewIntegrationConditionPlatformDisabledWithMessage("Service", "knative-service trait has priority over this trait"), nil } } diff --git a/pkg/trait/service_binding.go b/pkg/trait/service_binding.go index 867c8b4c2..2ed176670 100644 --- a/pkg/trait/service_binding.go +++ b/pkg/trait/service_binding.go @@ -70,6 +70,9 @@ func (t *serviceBindingTrait) Configure(e *Environment) (bool, *TraitCondition, if !pointer.BoolDeref(t.Enabled, true) { return false, NewIntegrationConditionUserDisabled("ServiceBinding"), nil } + if e.CamelCatalog == nil { + return false, NewIntegrationConditionPlatformDisabledCatalogMissing(), nil + } if len(t.Services) == 0 { return false, nil, nil } diff --git a/pkg/trait/trait_condition_types.go b/pkg/trait/trait_condition_types.go index 216993a27..86abc5ea2 100644 --- a/pkg/trait/trait_condition_types.go +++ b/pkg/trait/trait_condition_types.go @@ -56,10 +56,25 @@ func NewIntegrationConditionUserDisabled(traitID string) *TraitCondition { return NewIntegrationCondition(traitID, v1.IntegrationConditionTraitInfo, corev1.ConditionTrue, traitConfigurationReason, userDisabledMessage) } -func newIntegrationConditionPlatformDisabledWithMessage(traitID string, message string) *TraitCondition { +func NewIntegrationConditionUserEnabledWithMessage(traitID string, message string) *TraitCondition { + return NewIntegrationCondition(traitID, v1.IntegrationConditionTraitInfo, corev1.ConditionTrue, traitConfigurationReason, fmt.Sprintf("%s: %s", userEnabledMessage, message)) +} + +func NewIntegrationConditionPlatformDisabledWithMessage(traitID string, message string) *TraitCondition { return NewIntegrationCondition(traitID, v1.IntegrationConditionTraitInfo, corev1.ConditionTrue, traitConfigurationReason, fmt.Sprintf("%s: %s", platformDisabledMessage, message)) } +// This one is reused among different traits in order to avoid polluting the conditions with the same message. +func NewIntegrationConditionPlatformDisabledCatalogMissing() *TraitCondition { + return NewIntegrationCondition( + "Generic", + v1.IntegrationConditionTraitInfo, + corev1.ConditionTrue, + traitConfigurationReason, + "no camel catalog available for this Integration. Several traits have not been executed for this reason. Check applied trait condition to know more.", + ) +} + func (tc *TraitCondition) integrationCondition() (v1.IntegrationConditionType, corev1.ConditionStatus, string, string) { return v1.IntegrationConditionType(fmt.Sprintf("%s%s", tc.traitID, tc.integrationConditionType)), tc.conditionStatus,