From e5d76fd7ce5b87b41d1e9f9f339dc38d9981f76d Mon Sep 17 00:00:00 2001 From: Pasquale Congiusti Date: Mon, 10 Apr 2023 12:10:29 +0200 Subject: [PATCH 1/2] fix(controller): camelcatalog default timeout Closes #4226 --- ...camel.apache.org_integrationplatforms.yaml | 8 ++++++ .../ROOT/partials/apis/camel-k-crds.adoc | 7 +++++ .../catalog_builder_test.go | 23 ++++++++++++++++ e2e/support/test_support.go | 10 +++++++ .../crds/crd-integration-platform.yaml | 8 ++++++ .../camel/v1/integrationplatform_types.go | 2 ++ .../camel/v1/integrationplatformbuildspec.go | 27 ++++++++++++------- pkg/controller/catalog/initialize.go | 20 +++++++++++--- pkg/platform/defaults.go | 4 +++ 9 files changed, 97 insertions(+), 12 deletions(-) diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml index 51672f39f5..ff540749ed 100644 --- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml +++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml @@ -80,6 +80,10 @@ spec: images. It can be useful if you want to provide some custom base image with further utility softwares type: string + buildCatalogToolTimeout: + description: the timeout (in seconds) to use when creating the + build tools container image + type: integer buildStrategy: description: the strategy to adopt for building an Integration base image @@ -1626,6 +1630,10 @@ spec: images. It can be useful if you want to provide some custom base image with further utility softwares type: string + buildCatalogToolTimeout: + description: the timeout (in seconds) to use when creating the + build tools container image + type: integer buildStrategy: description: the strategy to adopt for building an Integration base image diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc index a2b565eef7..04c2565946 100644 --- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc +++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc @@ -1877,6 +1877,13 @@ It can be useful if you want to provide some custom base image with further util the image registry used to push/pull Integration images +|`buildCatalogToolTimeout` + +int +| + + +the timeout (in seconds) to use when creating the build tools container image + |`timeout` + *https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#duration-v1-meta[Kubernetes meta/v1.Duration]* | diff --git a/e2e/commonwithcustominstall/catalog_builder_test.go b/e2e/commonwithcustominstall/catalog_builder_test.go index ee124db657..93abed2f60 100644 --- a/e2e/commonwithcustominstall/catalog_builder_test.go +++ b/e2e/commonwithcustominstall/catalog_builder_test.go @@ -36,6 +36,7 @@ import ( ) func TestCamelCatalogBuilder(t *testing.T) { + WithNewTestNamespace(t, func(ns string) { operatorID := fmt.Sprintf("camel-k-%s", ns) Expect(KamelInstallWithID(operatorID, ns).Execute()).To(Succeed()) @@ -144,4 +145,26 @@ func TestCamelCatalogBuilder(t *testing.T) { Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed()) }) + + WithNewTestNamespace(t, func(ns string) { + operatorID := fmt.Sprintf("camel-k-%s", ns) + Expect(KamelInstallWithID(operatorID, ns).Execute()).To(Succeed()) + Eventually(OperatorPod(ns)).ShouldNot(BeNil()) + Eventually(Platform(ns)).ShouldNot(BeNil()) + + pl := Platform(ns)() + // set a very short timeout to simulate it + pl.Spec.Build.BuildCatalogToolTimeout = 1 + TestClient().Update(TestContext, pl) + Eventually(Platform(ns)).ShouldNot(BeNil()) + Eventually(PlatformBuildCatalogToolTimeout(ns)).Should(Equal(1)) + + Eventually(PlatformConditionStatus(ns, v1.IntegrationPlatformConditionReady), TestTimeoutShort). + Should(Equal(corev1.ConditionTrue)) + catalogName := fmt.Sprintf("camel-catalog-%s", strings.ToLower(defaults.DefaultRuntimeVersion)) + + Eventually(CamelCatalog(ns, catalogName)).ShouldNot(BeNil()) + Eventually(CamelCatalogPhase(ns, catalogName)).Should(Equal(v1.CamelCatalogPhaseError)) + Eventually(CamelCatalogCondition(ns, catalogName, v1.CamelCatalogConditionReady)().Message).Should(ContainSubstring("build timeout")) + }) } diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go index 877ca7f409..db42596aca 100644 --- a/e2e/support/test_support.go +++ b/e2e/support/test_support.go @@ -1779,6 +1779,16 @@ func PlatformProfile(ns string) func() v1.TraitProfile { } } +func PlatformBuildCatalogToolTimeout(ns string) func() int { + return func() int { + p := Platform(ns)() + if p == nil { + return 0 + } + return p.Status.Build.BuildCatalogToolTimeout + } +} + func AssignPlatformToOperator(ns, operator string) error { pl := Platform(ns)() if pl == nil { diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml index 51672f39f5..ff540749ed 100644 --- a/helm/camel-k/crds/crd-integration-platform.yaml +++ b/helm/camel-k/crds/crd-integration-platform.yaml @@ -80,6 +80,10 @@ spec: images. It can be useful if you want to provide some custom base image with further utility softwares type: string + buildCatalogToolTimeout: + description: the timeout (in seconds) to use when creating the + build tools container image + type: integer buildStrategy: description: the strategy to adopt for building an Integration base image @@ -1626,6 +1630,10 @@ spec: images. It can be useful if you want to provide some custom base image with further utility softwares type: string + buildCatalogToolTimeout: + description: the timeout (in seconds) to use when creating the + build tools container image + type: integer buildStrategy: description: the strategy to adopt for building an Integration base image diff --git a/pkg/apis/camel/v1/integrationplatform_types.go b/pkg/apis/camel/v1/integrationplatform_types.go index 0c378f9c7c..d8b0a3f58a 100644 --- a/pkg/apis/camel/v1/integrationplatform_types.go +++ b/pkg/apis/camel/v1/integrationplatform_types.go @@ -120,6 +120,8 @@ type IntegrationPlatformBuildSpec struct { BaseImage string `json:"baseImage,omitempty"` // the image registry used to push/pull Integration images Registry RegistrySpec `json:"registry,omitempty"` + // the timeout (in seconds) to use when creating the build tools container image + BuildCatalogToolTimeout int `json:"buildCatalogToolTimeout,omitempty"` // how much time to wait before time out the build process Timeout *metav1.Duration `json:"timeout,omitempty"` // Maven configuration used to build the Camel/Camel-Quarkus applications diff --git a/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go b/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go index e57151e07c..d2806ae60f 100644 --- a/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go +++ b/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go @@ -27,15 +27,16 @@ import ( // IntegrationPlatformBuildSpecApplyConfiguration represents an declarative configuration of the IntegrationPlatformBuildSpec type for use // with apply. type IntegrationPlatformBuildSpecApplyConfiguration struct { - BuildStrategy *v1.BuildStrategy `json:"buildStrategy,omitempty"` - PublishStrategy *v1.IntegrationPlatformBuildPublishStrategy `json:"publishStrategy,omitempty"` - RuntimeVersion *string `json:"runtimeVersion,omitempty"` - RuntimeProvider *v1.RuntimeProvider `json:"runtimeProvider,omitempty"` - BaseImage *string `json:"baseImage,omitempty"` - Registry *RegistrySpecApplyConfiguration `json:"registry,omitempty"` - Timeout *metav1.Duration `json:"timeout,omitempty"` - Maven *MavenSpecApplyConfiguration `json:"maven,omitempty"` - PublishStrategyOptions map[string]string `json:"PublishStrategyOptions,omitempty"` + BuildStrategy *v1.BuildStrategy `json:"buildStrategy,omitempty"` + PublishStrategy *v1.IntegrationPlatformBuildPublishStrategy `json:"publishStrategy,omitempty"` + RuntimeVersion *string `json:"runtimeVersion,omitempty"` + RuntimeProvider *v1.RuntimeProvider `json:"runtimeProvider,omitempty"` + BaseImage *string `json:"baseImage,omitempty"` + Registry *RegistrySpecApplyConfiguration `json:"registry,omitempty"` + BuildCatalogToolTimeout *int `json:"buildCatalogToolTimeout,omitempty"` + Timeout *metav1.Duration `json:"timeout,omitempty"` + Maven *MavenSpecApplyConfiguration `json:"maven,omitempty"` + PublishStrategyOptions map[string]string `json:"PublishStrategyOptions,omitempty"` } // IntegrationPlatformBuildSpecApplyConfiguration constructs an declarative configuration of the IntegrationPlatformBuildSpec type for use with @@ -92,6 +93,14 @@ func (b *IntegrationPlatformBuildSpecApplyConfiguration) WithRegistry(value *Reg return b } +// WithBuildCatalogToolTimeout sets the BuildCatalogToolTimeout field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BuildCatalogToolTimeout field is set to the value of the last call. +func (b *IntegrationPlatformBuildSpecApplyConfiguration) WithBuildCatalogToolTimeout(value int) *IntegrationPlatformBuildSpecApplyConfiguration { + b.BuildCatalogToolTimeout = &value + return b +} + // WithTimeout sets the Timeout field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Timeout field is set to the value of the last call. diff --git a/pkg/controller/catalog/initialize.go b/pkg/controller/catalog/initialize.go index 11c4d7d33a..28fe28b735 100644 --- a/pkg/controller/catalog/initialize.go +++ b/pkg/controller/catalog/initialize.go @@ -25,6 +25,7 @@ import ( "os" "runtime" "strings" + "time" v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1" "github.com/apache/camel-k/v2/pkg/builder" @@ -71,10 +72,10 @@ func (action *initializeAction) Handle(ctx context.Context, catalog *v1.CamelCat return catalog, err } - return initialize(options, platform.Spec.Build.Registry.Address, catalog) + return initialize(options, platform.Status.Build.Registry.Address, platform.Status.Build.BuildCatalogToolTimeout, catalog) } -func initialize(options spectrum.Options, registryAddress string, catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) { +func initialize(options spectrum.Options, registryAddress string, buildCatalogTimeout int, catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) { target := catalog.DeepCopy() imageName := fmt.Sprintf( "%s/camel-k-runtime-%s-builder:%s", @@ -115,7 +116,7 @@ func initialize(options spectrum.Options, registryAddress string, catalog *v1.Ca options.Base = catalog.Spec.GetQuarkusToolingImage() options.Target = imageName - err := buildRuntimeBuilderImage(options) + err := buildRuntimeBuilderWithTimeout(options, time.Duration(buildCatalogTimeout)*time.Second) if err != nil { target.Status.Phase = v1.CamelCatalogPhaseError @@ -159,6 +160,19 @@ func imageSnapshot(options spectrum.Options) bool { return strings.HasSuffix(options.Base, "snapshot") } +func buildRuntimeBuilderWithTimeout(options spectrum.Options, timeout time.Duration) error { + result := make(chan error, 1) + go func() { + result <- buildRuntimeBuilderImage(options) + }() + select { + case <-time.After(timeout): + return fmt.Errorf("build timeout: %s", timeout.String()) + case result := <-result: + return result + } +} + // This func will take care to dynamically build an image that will contain the tools required // by the catalog build plus kamel binary and a maven wrapper required for the build. func buildRuntimeBuilderImage(options spectrum.Options) error { diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go index d585eb4f65..981863c72f 100644 --- a/pkg/platform/defaults.go +++ b/pkg/platform/defaults.go @@ -226,6 +226,10 @@ func setPlatformDefaults(p *v1.IntegrationPlatform, verbose bool) error { Duration: 5 * time.Minute, } } + if p.Status.Build.BuildCatalogToolTimeout == 0 { + log.Debugf("Integration Platform [%s]: setting build camel catalog tool timeout", p.Namespace) + p.Status.Build.BuildCatalogToolTimeout = 60 + } _, cacheEnabled := p.Status.Build.PublishStrategyOptions[builder.KanikoBuildCacheEnabled] if p.Status.Build.PublishStrategy == v1.IntegrationPlatformBuildPublishStrategyKaniko && !cacheEnabled { // Default to disabling Kaniko cache warmer From 12c22446e39fe0d16156a35d063c93c3741b3a9e Mon Sep 17 00:00:00 2001 From: Pasquale Congiusti Date: Tue, 11 Apr 2023 10:34:07 +0200 Subject: [PATCH 2/2] chore(api): make catalog timeout a Duration --- ...camel.apache.org_integrationplatforms.yaml | 4 +-- .../ROOT/partials/apis/camel-k-crds.adoc | 2 +- .../catalog_builder_test.go | 14 ++++++-- e2e/support/test_support.go | 6 ++-- .../crds/crd-integration-platform.yaml | 4 +-- .../camel/v1/integrationplatform_types.go | 2 +- .../v1/integrationplatform_types_support.go | 10 +++++- pkg/apis/camel/v1/zz_generated.deepcopy.go | 5 +++ .../camel/v1/integrationplatformbuildspec.go | 4 +-- pkg/controller/catalog/initialize.go | 12 ++++--- pkg/platform/defaults.go | 32 ++++++++++++++----- 11 files changed, 68 insertions(+), 27 deletions(-) diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml index ff540749ed..5589fbc0f0 100644 --- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml +++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml @@ -83,7 +83,7 @@ spec: buildCatalogToolTimeout: description: the timeout (in seconds) to use when creating the build tools container image - type: integer + type: string buildStrategy: description: the strategy to adopt for building an Integration base image @@ -1633,7 +1633,7 @@ spec: buildCatalogToolTimeout: description: the timeout (in seconds) to use when creating the build tools container image - type: integer + type: string buildStrategy: description: the strategy to adopt for building an Integration base image diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc index 04c2565946..5a093cd9ac 100644 --- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc +++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc @@ -1878,7 +1878,7 @@ It can be useful if you want to provide some custom base image with further util the image registry used to push/pull Integration images |`buildCatalogToolTimeout` + -int +*https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#duration-v1-meta[Kubernetes meta/v1.Duration]* | diff --git a/e2e/commonwithcustominstall/catalog_builder_test.go b/e2e/commonwithcustominstall/catalog_builder_test.go index 93abed2f60..9184c1ff70 100644 --- a/e2e/commonwithcustominstall/catalog_builder_test.go +++ b/e2e/commonwithcustominstall/catalog_builder_test.go @@ -26,9 +26,11 @@ import ( "fmt" "strings" "testing" + "time" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" . "github.com/apache/camel-k/v2/e2e/support" v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1" @@ -153,11 +155,17 @@ func TestCamelCatalogBuilder(t *testing.T) { Eventually(Platform(ns)).ShouldNot(BeNil()) pl := Platform(ns)() - // set a very short timeout to simulate it - pl.Spec.Build.BuildCatalogToolTimeout = 1 + // set a very short timeout to simulate the timeout + pl.Spec.Build.BuildCatalogToolTimeout = &metav1.Duration{ + Duration: 1 * time.Second, + } TestClient().Update(TestContext, pl) Eventually(Platform(ns)).ShouldNot(BeNil()) - Eventually(PlatformBuildCatalogToolTimeout(ns)).Should(Equal(1)) + Eventually(PlatformBuildCatalogToolTimeout(ns)).Should(Equal( + &metav1.Duration{ + Duration: 1 * time.Second, + }, + )) Eventually(PlatformConditionStatus(ns, v1.IntegrationPlatformConditionReady), TestTimeoutShort). Should(Equal(corev1.ConditionTrue)) diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go index db42596aca..bc058c8436 100644 --- a/e2e/support/test_support.go +++ b/e2e/support/test_support.go @@ -1779,11 +1779,11 @@ func PlatformProfile(ns string) func() v1.TraitProfile { } } -func PlatformBuildCatalogToolTimeout(ns string) func() int { - return func() int { +func PlatformBuildCatalogToolTimeout(ns string) func() *metav1.Duration { + return func() *metav1.Duration { p := Platform(ns)() if p == nil { - return 0 + return &metav1.Duration{} } return p.Status.Build.BuildCatalogToolTimeout } diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml index ff540749ed..5589fbc0f0 100644 --- a/helm/camel-k/crds/crd-integration-platform.yaml +++ b/helm/camel-k/crds/crd-integration-platform.yaml @@ -83,7 +83,7 @@ spec: buildCatalogToolTimeout: description: the timeout (in seconds) to use when creating the build tools container image - type: integer + type: string buildStrategy: description: the strategy to adopt for building an Integration base image @@ -1633,7 +1633,7 @@ spec: buildCatalogToolTimeout: description: the timeout (in seconds) to use when creating the build tools container image - type: integer + type: string buildStrategy: description: the strategy to adopt for building an Integration base image diff --git a/pkg/apis/camel/v1/integrationplatform_types.go b/pkg/apis/camel/v1/integrationplatform_types.go index d8b0a3f58a..f631630945 100644 --- a/pkg/apis/camel/v1/integrationplatform_types.go +++ b/pkg/apis/camel/v1/integrationplatform_types.go @@ -121,7 +121,7 @@ type IntegrationPlatformBuildSpec struct { // the image registry used to push/pull Integration images Registry RegistrySpec `json:"registry,omitempty"` // the timeout (in seconds) to use when creating the build tools container image - BuildCatalogToolTimeout int `json:"buildCatalogToolTimeout,omitempty"` + BuildCatalogToolTimeout *metav1.Duration `json:"buildCatalogToolTimeout,omitempty"` // how much time to wait before time out the build process Timeout *metav1.Duration `json:"timeout,omitempty"` // Maven configuration used to build the Camel/Camel-Quarkus applications diff --git a/pkg/apis/camel/v1/integrationplatform_types_support.go b/pkg/apis/camel/v1/integrationplatform_types_support.go index 0d9b0a2e4a..599f40ef70 100644 --- a/pkg/apis/camel/v1/integrationplatform_types_support.go +++ b/pkg/apis/camel/v1/integrationplatform_types_support.go @@ -186,7 +186,7 @@ func (b IntegrationPlatformBuildSpec) IsOptionEnabled(option string) bool { return false } -// Add a publish strategy option +// AddOption add a publish strategy option func (b *IntegrationPlatformBuildSpec) AddOption(option string, value string) { options := b.PublishStrategyOptions if options == nil { @@ -204,6 +204,14 @@ func (b IntegrationPlatformBuildSpec) GetTimeout() metav1.Duration { return *b.Timeout } +// GetBuildCatalogToolTimeout returns the specified duration or a default one +func (b IntegrationPlatformBuildSpec) GetBuildCatalogToolTimeout() metav1.Duration { + if b.BuildCatalogToolTimeout == nil { + return metav1.Duration{} + } + return *b.BuildCatalogToolTimeout +} + var _ ResourceCondition = IntegrationPlatformCondition{} // GetConditions -- diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go index 1ace84bea9..f7b543f17b 100644 --- a/pkg/apis/camel/v1/zz_generated.deepcopy.go +++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go @@ -991,6 +991,11 @@ func (in *IntegrationPlatform) DeepCopyObject() runtime.Object { func (in *IntegrationPlatformBuildSpec) DeepCopyInto(out *IntegrationPlatformBuildSpec) { *out = *in out.Registry = in.Registry + if in.BuildCatalogToolTimeout != nil { + in, out := &in.BuildCatalogToolTimeout, &out.BuildCatalogToolTimeout + *out = new(metav1.Duration) + **out = **in + } if in.Timeout != nil { in, out := &in.Timeout, &out.Timeout *out = new(metav1.Duration) diff --git a/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go b/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go index d2806ae60f..d884675afe 100644 --- a/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go +++ b/pkg/client/camel/applyconfiguration/camel/v1/integrationplatformbuildspec.go @@ -33,7 +33,7 @@ type IntegrationPlatformBuildSpecApplyConfiguration struct { RuntimeProvider *v1.RuntimeProvider `json:"runtimeProvider,omitempty"` BaseImage *string `json:"baseImage,omitempty"` Registry *RegistrySpecApplyConfiguration `json:"registry,omitempty"` - BuildCatalogToolTimeout *int `json:"buildCatalogToolTimeout,omitempty"` + BuildCatalogToolTimeout *metav1.Duration `json:"buildCatalogToolTimeout,omitempty"` Timeout *metav1.Duration `json:"timeout,omitempty"` Maven *MavenSpecApplyConfiguration `json:"maven,omitempty"` PublishStrategyOptions map[string]string `json:"PublishStrategyOptions,omitempty"` @@ -96,7 +96,7 @@ func (b *IntegrationPlatformBuildSpecApplyConfiguration) WithRegistry(value *Reg // WithBuildCatalogToolTimeout sets the BuildCatalogToolTimeout field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the BuildCatalogToolTimeout field is set to the value of the last call. -func (b *IntegrationPlatformBuildSpecApplyConfiguration) WithBuildCatalogToolTimeout(value int) *IntegrationPlatformBuildSpecApplyConfiguration { +func (b *IntegrationPlatformBuildSpecApplyConfiguration) WithBuildCatalogToolTimeout(value metav1.Duration) *IntegrationPlatformBuildSpecApplyConfiguration { b.BuildCatalogToolTimeout = &value return b } diff --git a/pkg/controller/catalog/initialize.go b/pkg/controller/catalog/initialize.go index 28fe28b735..98d4ddfbec 100644 --- a/pkg/controller/catalog/initialize.go +++ b/pkg/controller/catalog/initialize.go @@ -72,14 +72,14 @@ func (action *initializeAction) Handle(ctx context.Context, catalog *v1.CamelCat return catalog, err } - return initialize(options, platform.Status.Build.Registry.Address, platform.Status.Build.BuildCatalogToolTimeout, catalog) + return initialize(options, platform, catalog) } -func initialize(options spectrum.Options, registryAddress string, buildCatalogTimeout int, catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) { +func initialize(options spectrum.Options, ip *v1.IntegrationPlatform, catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) { target := catalog.DeepCopy() imageName := fmt.Sprintf( "%s/camel-k-runtime-%s-builder:%s", - registryAddress, + ip.Status.Build.Registry.Address, catalog.Spec.Runtime.Provider, strings.ToLower(catalog.Spec.Runtime.Version), ) @@ -116,7 +116,7 @@ func initialize(options spectrum.Options, registryAddress string, buildCatalogTi options.Base = catalog.Spec.GetQuarkusToolingImage() options.Target = imageName - err := buildRuntimeBuilderWithTimeout(options, time.Duration(buildCatalogTimeout)*time.Second) + err := buildRuntimeBuilderWithTimeout(options, ip.Status.Build.GetBuildCatalogToolTimeout().Duration) if err != nil { target.Status.Phase = v1.CamelCatalogPhaseError @@ -161,6 +161,10 @@ func imageSnapshot(options spectrum.Options) bool { } func buildRuntimeBuilderWithTimeout(options spectrum.Options, timeout time.Duration) error { + // Backward compatibility with IP which had not a timeout field + if timeout == 0 { + return buildRuntimeBuilderImage(options) + } result := make(chan error, 1) go func() { result <- buildRuntimeBuilderImage(options) diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go index 981863c72f..fa24f4fa9b 100644 --- a/pkg/platform/defaults.go +++ b/pkg/platform/defaults.go @@ -209,7 +209,12 @@ func setPlatformDefaults(p *v1.IntegrationPlatform, verbose bool) error { p.Status.Build.PublishStrategyOptions[builder.KanikoPVCName] = p.Name } - if p.Status.Build.GetTimeout().Duration != 0 { + // Build timeout + if p.Status.Build.GetTimeout().Duration == 0 { + p.Status.Build.Timeout = &metav1.Duration{ + Duration: 5 * time.Minute, + } + } else { d := p.Status.Build.GetTimeout().Duration.Truncate(time.Second) if verbose && p.Status.Build.GetTimeout().Duration != d { @@ -221,15 +226,26 @@ func setPlatformDefaults(p *v1.IntegrationPlatform, verbose bool) error { Duration: d, } } - if p.Status.Build.GetTimeout().Duration == 0 { - p.Status.Build.Timeout = &metav1.Duration{ - Duration: 5 * time.Minute, + + // Catalog tools build timeout + if p.Status.Build.GetBuildCatalogToolTimeout().Duration == 0 { + log.Debugf("Integration Platform [%s]: setting default build camel catalog tool timeout (1 minute)", p.Namespace) + p.Status.Build.BuildCatalogToolTimeout = &metav1.Duration{ + Duration: 1 * time.Minute, + } + } else { + d := p.Status.Build.GetBuildCatalogToolTimeout().Duration.Truncate(time.Second) + + if verbose && p.Status.Build.GetBuildCatalogToolTimeout().Duration != d { + log.Log.Infof("Build catalog tools timeout minimum unit is sec (configured: %s, truncated: %s)", p.Status.Build.GetBuildCatalogToolTimeout().Duration, d) + } + + log.Debugf("Integration Platform [%s]: setting build catalog tools timeout", p.Namespace) + p.Status.Build.BuildCatalogToolTimeout = &metav1.Duration{ + Duration: d, } } - if p.Status.Build.BuildCatalogToolTimeout == 0 { - log.Debugf("Integration Platform [%s]: setting build camel catalog tool timeout", p.Namespace) - p.Status.Build.BuildCatalogToolTimeout = 60 - } + _, cacheEnabled := p.Status.Build.PublishStrategyOptions[builder.KanikoBuildCacheEnabled] if p.Status.Build.PublishStrategy == v1.IntegrationPlatformBuildPublishStrategyKaniko && !cacheEnabled { // Default to disabling Kaniko cache warmer