diff --git a/e2e/addons_test.go b/e2e/addons_test.go index 9b1a5a370e..5620677b6a 100644 --- a/e2e/addons_test.go +++ b/e2e/addons_test.go @@ -27,21 +27,42 @@ import ( . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" + + _ "github.com/apache/camel-k/addons" ) func TestAddons(t *testing.T) { withNewTestNamespace(t, func(ns string) { Expect(kamel("install", "-n", ns).Execute()).Should(BeNil()) - t.Run("master addon", func(t *testing.T) { + t.Run("master works", func(t *testing.T) { RegisterTestingT(t) - Expect(kamel("run", "-n", ns, "files/Master.java", "-t", `master.label-key=""`).Execute()).Should(BeNil()) + Expect(kamel("run", "-n", ns, "files/Master.java").Execute()).Should(BeNil()) Eventually(integrationPodPhase(ns, "master"), 5*time.Minute).Should(Equal(v1.PodRunning)) Eventually(integrationLogs(ns, "master"), 1*time.Minute).Should(ContainSubstring("Magicstring!")) Eventually(configMap(ns, "master-lock"), 30*time.Second).ShouldNot(BeNil()) + Expect(kamel("delete", "--all", "-n", ns).Execute()).Should(BeNil()) + }) + + t.Run("only one integration with master runs", func(t *testing.T) { + RegisterTestingT(t) + Expect(kamel("run", "-n", ns, "files/Master.java", + "--name", "first", + "--label", "leader-group=same", + "-t", "master.label-key=leader-group", + "-t", "master.label-value=same", + "-t", "owner.target-labels=leader-group").Execute()).Should(BeNil()) + Eventually(integrationPodPhase(ns, "first"), 5*time.Minute).Should(Equal(v1.PodRunning)) + Eventually(integrationLogs(ns, "first"), 1*time.Minute).Should(ContainSubstring("Magicstring!")) + Eventually(configMap(ns, "first-lock"), 30*time.Second).ShouldNot(BeNil()) // Start a second integration with the same lock (it should not start the route) - Expect(kamel("run", "-n", ns, "files/Master.java", "--name", "second", - "-t", "master.configmap=master-lock", "-t", `master.label-key=""`).Execute()).Should(BeNil()) + Expect(kamel("run", "-n", ns, "files/Master.java", + "--name", "second", + "--label", "leader-group=same", + "-t", "master.label-key=leader-group", + "-t", "master.label-value=same", + "-t", "master.configmap=first-lock", + "-t", "owner.target-labels=leader-group").Execute()).Should(BeNil()) Eventually(integrationPodPhase(ns, "second"), 5*time.Minute).Should(Equal(v1.PodRunning)) Eventually(integrationLogs(ns, "second"), 1*time.Minute).Should(ContainSubstring("started in")) Eventually(integrationLogs(ns, "second"), 30*time.Second).ShouldNot(ContainSubstring("Magicstring!")) diff --git a/e2e/files/Master.java b/e2e/files/Master.java index ff28451da7..84fdeeb053 100644 --- a/e2e/files/Master.java +++ b/e2e/files/Master.java @@ -17,7 +17,7 @@ import org.apache.camel.builder.RouteBuilder; -public class Java extends RouteBuilder { +public class Master extends RouteBuilder { @Override public void configure() throws Exception { from("master:lock:timer:tick") diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index dd35f72c90..5214ba7b4d 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -87,6 +87,7 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions) cmd.Flags().StringArrayP("volume", "v", nil, "Mount a volume into the integration container. E.g \"-v pvcname:/container/path\"") cmd.Flags().StringArrayP("env", "e", nil, "Set an environment variable in the integration container. E.g \"-e MY_VAR=my-value\"") cmd.Flags().StringArrayP("property-file", "", nil, "Bind a property file to the integration. E.g. \"--property-file integration.properties\"") + cmd.Flags().StringArrayP("label", "", nil, "Add a label to the integration. E.g. \"--label my.company=hello\"") cmd.Flags().Bool("save", false, "Save the run parameters into the default kamel configuration file (kamel-config.yaml)") @@ -120,6 +121,7 @@ type runCmdOptions struct { Volumes []string `mapstructure:"volumes"` EnvVars []string `mapstructure:"envs"` PropertyFiles []string `mapstructure:"property-files"` + Labels []string `mapstructure:"labels"` } func (o *runCmdOptions) decode(cmd *cobra.Command, args []string) error { @@ -188,6 +190,13 @@ func (o *runCmdOptions) validateArgs(_ *cobra.Command, args []string) error { } } + for _, label := range o.Labels { + parts := strings.Split(label, "=") + if len(parts) != 2 { + return fmt.Errorf(`invalid label specification %s. Expected "="`, label) + } + } + return nil } @@ -378,6 +387,16 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string) }, } + for _, label := range o.Labels { + parts := strings.Split(label, "=") + if len(parts) == 2 { + if integration.Labels == nil { + integration.Labels = make(map[string]string) + } + integration.Labels[parts[0]] = parts[1] + } + } + for _, source := range sources { data, err := o.loadData(source, o.Compression) if err != nil {