You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2023/04/11 15:30:58 UTC

[camel-k] 02/02: chore(api): make catalog timeout a Duration

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 0aadb7e7f562c822d6ae8854c4f58eaa9da3423c
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue Apr 11 10:34:07 2023 +0200

    chore(api): make catalog timeout a Duration
---
 .../camel.apache.org_integrationplatforms.yaml     |  4 +--
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  |  2 +-
 .../catalog_builder_test.go                        | 14 ++++++++--
 e2e/support/test_support.go                        |  6 ++--
 helm/camel-k/crds/crd-integration-platform.yaml    |  4 +--
 pkg/apis/camel/v1/integrationplatform_types.go     |  2 +-
 .../camel/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 ff540749e..5589fbc0f 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 04c256594..5a093cd9a 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 93abed2f6..9184c1ff7 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 db42596ac..bc058c843 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 ff540749e..5589fbc0f 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 d8b0a3f58..f63163094 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 0d9b0a2e4..599f40ef7 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 1ace84bea..f7b543f17 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 d2806ae60..d884675af 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 28fe28b73..98d4ddfbe 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 981863c72..fa24f4fa9 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