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 2024/05/31 13:19:17 UTC

(camel-k) branch main updated: fix(cmd): promote correct labels

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


The following commit(s) were added to refs/heads/main by this push:
     new 250b3c1af fix(cmd): promote correct labels
250b3c1af is described below

commit 250b3c1afc384e7d76a47cb0520d197f29a0d723
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Fri May 31 11:48:37 2024 +0200

    fix(cmd): promote correct labels
    
    Closes #5541
---
 e2e/advanced/operator_id_filtering_test.go |  2 +-
 e2e/install/cli/global_test.go             |  2 +-
 pkg/cmd/promote.go                         | 29 ++++++++++-
 pkg/cmd/promote_test.go                    | 83 ++++++++++++++++++++++++++++++
 pkg/util/kubernetes/camel.go               |  6 +++
 5 files changed, 118 insertions(+), 4 deletions(-)

diff --git a/e2e/advanced/operator_id_filtering_test.go b/e2e/advanced/operator_id_filtering_test.go
index b0c0cbfc1..074c90c21 100644
--- a/e2e/advanced/operator_id_filtering_test.go
+++ b/e2e/advanced/operator_id_filtering_test.go
@@ -105,7 +105,7 @@ func TestOperatorIDFiltering(t *testing.T) {
 							Namespace: ns,
 							Name:      "external",
 							Labels: map[string]string{
-								"camel.apache.org/kit.type": v1.IntegrationKitTypeExternal,
+								v1.IntegrationKitTypeLabel: v1.IntegrationKitTypeExternal,
 							},
 							Annotations: map[string]string{
 								"camel.apache.org/operator.id": operator2,
diff --git a/e2e/install/cli/global_test.go b/e2e/install/cli/global_test.go
index cff223304..1ff3dd114 100644
--- a/e2e/install/cli/global_test.go
+++ b/e2e/install/cli/global_test.go
@@ -133,7 +133,7 @@ func TestRunGlobalInstall(t *testing.T) {
 						Namespace: ns5,
 						Name:      "external",
 						Labels: map[string]string{
-							"camel.apache.org/kit.type": v1.IntegrationKitTypeExternal,
+							v1.IntegrationKitTypeLabel: v1.IntegrationKitTypeExternal,
 						},
 					},
 					Spec: v1.IntegrationKitSpec{
diff --git a/pkg/cmd/promote.go b/pkg/cmd/promote.go
index c86a8dc5e..b8197b556 100644
--- a/pkg/cmd/promote.go
+++ b/pkg/cmd/promote.go
@@ -503,7 +503,7 @@ func (o *promoteCmdOptions) editIntegration(it *v1.Integration, kit *v1.Integrat
 	dstKit.Spec = *kit.Spec.DeepCopy()
 	dstKit.Annotations = cloneAnnotations(kit.Annotations, o.ToOperator)
 	dstKit.Labels = cloneLabels(kit.Labels)
-	dstKit.Labels["camel.apache.org/kit.type"] = v1.IntegrationKitTypeExternal
+	dstKit.Labels = alterKitLabels(dstKit.Labels, kit)
 	dstKit.Spec.Image = contImage
 	// Integration
 	dstIt := v1.NewIntegration(o.To, it.Name)
@@ -562,6 +562,31 @@ func cloneLabels(lbs map[string]string) map[string]string {
 	return newMap
 }
 
+// Change labels expected by Integration Kit replacing the creator to reflect the
+// fact the new kit was cloned by another one instead.
+func alterKitLabels(lbs map[string]string, kit *v1.IntegrationKit) map[string]string {
+	lbs[v1.IntegrationKitTypeLabel] = v1.IntegrationKitTypeExternal
+	if lbs[kubernetes.CamelCreatorLabelKind] != "" {
+		delete(lbs, kubernetes.CamelCreatorLabelKind)
+	}
+	if lbs[kubernetes.CamelCreatorLabelName] != "" {
+		delete(lbs, kubernetes.CamelCreatorLabelName)
+	}
+	if lbs[kubernetes.CamelCreatorLabelNamespace] != "" {
+		delete(lbs, kubernetes.CamelCreatorLabelNamespace)
+	}
+	if lbs[kubernetes.CamelCreatorLabelVersion] != "" {
+		delete(lbs, kubernetes.CamelCreatorLabelVersion)
+	}
+
+	lbs[kubernetes.CamelClonedLabelKind] = v1.IntegrationKitKind
+	lbs[kubernetes.CamelClonedLabelName] = kit.Name
+	lbs[kubernetes.CamelClonedLabelNamespace] = kit.Namespace
+	lbs[kubernetes.CamelClonedLabelVersion] = kit.ResourceVersion
+
+	return lbs
+}
+
 func (o *promoteCmdOptions) editPipe(kb *v1.Pipe, it *v1.Integration, kit *v1.IntegrationKit) (*v1.Pipe, *v1.IntegrationKit) {
 	contImage := it.Status.Image
 	// IntegrationKit
@@ -569,7 +594,7 @@ func (o *promoteCmdOptions) editPipe(kb *v1.Pipe, it *v1.Integration, kit *v1.In
 	dstKit.Spec = *kit.Spec.DeepCopy()
 	dstKit.Annotations = cloneAnnotations(kit.Annotations, o.ToOperator)
 	dstKit.Labels = cloneLabels(kit.Labels)
-	dstKit.Labels["camel.apache.org/kit.type"] = v1.IntegrationKitTypeExternal
+	dstKit.Labels = alterKitLabels(dstKit.Labels, kit)
 	dstKit.Spec.Image = contImage
 	// Pipe
 	dst := v1.NewPipe(o.To, kb.Name)
diff --git a/pkg/cmd/promote_test.go b/pkg/cmd/promote_test.go
index 91c1b9dc3..72b87d495 100644
--- a/pkg/cmd/promote_test.go
+++ b/pkg/cmd/promote_test.go
@@ -24,6 +24,7 @@ import (
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/v2/pkg/platform"
 	"github.com/apache/camel-k/v2/pkg/util/defaults"
+	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
 	"github.com/apache/camel-k/v2/pkg/util/test"
 	"github.com/spf13/cobra"
 	"github.com/stretchr/testify/assert"
@@ -98,6 +99,10 @@ kind: IntegrationKit
 metadata:
   creationTimestamp: null
   labels:
+    camel.apache.org/cloned.from.kind: IntegrationKit
+    camel.apache.org/cloned.from.name: my-it-test-kit
+    camel.apache.org/cloned.from.namespace: default
+    camel.apache.org/cloned.from.version: "999"
     camel.apache.org/kit.type: external
   name: my-it-test-kit
   namespace: prod-namespace
@@ -166,6 +171,10 @@ kind: IntegrationKit
 metadata:
   creationTimestamp: null
   labels:
+    camel.apache.org/cloned.from.kind: IntegrationKit
+    camel.apache.org/cloned.from.name: my-kb-test-kit
+    camel.apache.org/cloned.from.namespace: default
+    camel.apache.org/cloned.from.version: "999"
     camel.apache.org/kit.type: external
   name: my-kb-test-kit
   namespace: prod-namespace
@@ -236,6 +245,10 @@ kind: IntegrationKit
 metadata:
   creationTimestamp: null
   labels:
+    camel.apache.org/cloned.from.kind: IntegrationKit
+    camel.apache.org/cloned.from.name: my-it-test-kit
+    camel.apache.org/cloned.from.namespace: default
+    camel.apache.org/cloned.from.version: "999"
     camel.apache.org/kit.type: external
   name: my-it-test-kit
   namespace: prod-namespace
@@ -296,6 +309,10 @@ kind: IntegrationKit
 metadata:
   creationTimestamp: null
   labels:
+    camel.apache.org/cloned.from.kind: IntegrationKit
+    camel.apache.org/cloned.from.name: my-kb-test-kit
+    camel.apache.org/cloned.from.namespace: default
+    camel.apache.org/cloned.from.version: "999"
     camel.apache.org/kit.type: external
   name: my-kb-test-kit
   namespace: prod-namespace
@@ -393,6 +410,10 @@ metadata:
     camel.apache.org/operator.id: my-prod-operator
   creationTimestamp: null
   labels:
+    camel.apache.org/cloned.from.kind: IntegrationKit
+    camel.apache.org/cloned.from.name: my-it-test-kit
+    camel.apache.org/cloned.from.namespace: default
+    camel.apache.org/cloned.from.version: "999"
     camel.apache.org/kit.type: external
   name: my-it-test-kit
   namespace: prod
@@ -434,6 +455,10 @@ metadata:
     camel.apache.org/operator.id: my-prod-operator
   creationTimestamp: null
   labels:
+    camel.apache.org/cloned.from.kind: IntegrationKit
+    camel.apache.org/cloned.from.name: my-it-test-kit
+    camel.apache.org/cloned.from.namespace: default
+    camel.apache.org/cloned.from.version: "999"
     camel.apache.org/kit.type: external
   name: my-it-test-kit
   namespace: prod
@@ -461,3 +486,61 @@ spec:
 status: {}
 `, output)
 }
+
+func TestIntegrationKitWithLabels(t *testing.T) {
+	srcPlatform := v1.NewIntegrationPlatform("default", platform.DefaultPlatformName)
+	srcPlatform.Status.Version = defaults.Version
+	srcPlatform.Status.Build.RuntimeVersion = defaults.DefaultRuntimeVersion
+	srcPlatform.Status.Phase = v1.IntegrationPlatformPhaseReady
+	dstPlatform := v1.NewIntegrationPlatform("prod-namespace", platform.DefaultPlatformName)
+	dstPlatform.Status.Version = defaults.Version
+	dstPlatform.Status.Build.RuntimeVersion = defaults.DefaultRuntimeVersion
+	dstPlatform.Status.Phase = v1.IntegrationPlatformPhaseReady
+	defaultIntegration, defaultKit := nominalIntegration("my-it-test")
+	defaultKit.Labels = map[string]string{
+		kubernetes.CamelCreatorLabelKind:      "Integration",
+		kubernetes.CamelCreatorLabelName:      "my-original-it-name",
+		kubernetes.CamelCreatorLabelNamespace: "my-original-it-namespace",
+		kubernetes.CamelCreatorLabelVersion:   "my-original-it-version",
+	}
+	srcCatalog := createTestCamelCatalog(srcPlatform)
+	dstCatalog := createTestCamelCatalog(dstPlatform)
+
+	promoteCmdOptions, promoteCmd, _ := initializePromoteCmdOptions(t, &srcPlatform, &dstPlatform, &defaultIntegration, &defaultKit, &srcCatalog, &dstCatalog)
+	output, err := test.ExecuteCommand(promoteCmd, cmdPromote, "my-it-test", "--to", "prod-namespace", "-o", "yaml", "-n", "default")
+	assert.Equal(t, "yaml", promoteCmdOptions.OutputFormat)
+	require.NoError(t, err)
+	assert.Equal(t, `apiVersion: camel.apache.org/v1
+kind: IntegrationKit
+metadata:
+  creationTimestamp: null
+  labels:
+    camel.apache.org/cloned.from.kind: IntegrationKit
+    camel.apache.org/cloned.from.name: my-it-test-kit
+    camel.apache.org/cloned.from.namespace: default
+    camel.apache.org/cloned.from.version: "999"
+    camel.apache.org/kit.type: external
+  name: my-it-test-kit
+  namespace: prod-namespace
+spec:
+  image: my-special-image
+  traits: {}
+status: {}
+---
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  creationTimestamp: null
+  name: my-it-test
+  namespace: prod-namespace
+spec:
+  integrationKit:
+    kind: IntegrationKit
+    name: my-it-test-kit
+    namespace: prod-namespace
+  traits:
+    jvm:
+      classpath: /path/to/artifact-1/*:/path/to/artifact-2/*
+status: {}
+`, output)
+}
diff --git a/pkg/util/kubernetes/camel.go b/pkg/util/kubernetes/camel.go
index 8c069b375..c7bf020a1 100644
--- a/pkg/util/kubernetes/camel.go
+++ b/pkg/util/kubernetes/camel.go
@@ -29,11 +29,17 @@ import (
 
 const (
 	CamelCreatorLabelPrefix = "camel.apache.org/created.by"
+	CamelClonedLabelPrefix  = "camel.apache.org/cloned.from"
 
 	CamelCreatorLabelKind      = CamelCreatorLabelPrefix + ".kind"
 	CamelCreatorLabelName      = CamelCreatorLabelPrefix + ".name"
 	CamelCreatorLabelNamespace = CamelCreatorLabelPrefix + ".namespace"
 	CamelCreatorLabelVersion   = CamelCreatorLabelPrefix + ".version"
+
+	CamelClonedLabelKind      = CamelClonedLabelPrefix + ".kind"
+	CamelClonedLabelName      = CamelClonedLabelPrefix + ".name"
+	CamelClonedLabelNamespace = CamelClonedLabelPrefix + ".namespace"
+	CamelClonedLabelVersion   = CamelClonedLabelPrefix + ".version"
 )
 
 // FilterCamelCreatorLabels is used to inherit the creator information among resources.