This is an automated email from the ASF dual-hosted git repository. astefanutti pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 417b7b873f4aea59488cddfcc9ddf2f548248194 Author: Christoph Deppisch <cdeppi...@redhat.com> AuthorDate: Thu Jun 2 16:53:53 2022 +0200 Fix #2177: Ensure valid operator id when running integrations - Make sure to use a known operator id when running an integration - Check performs a cluster wide search for integration platforms and verifies that the platform name exists - Users may use --force option to skip the check --- pkg/cmd/root_test.go | 11 ++++++++--- pkg/cmd/run.go | 20 +++++++++++++++++++- pkg/cmd/run_test.go | 6 +++++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/pkg/cmd/root_test.go b/pkg/cmd/root_test.go index 8fe884d0d..d2b4eb7d5 100644 --- a/pkg/cmd/root_test.go +++ b/pkg/cmd/root_test.go @@ -23,6 +23,7 @@ import ( "os" "testing" + "github.com/apache/camel-k/pkg/client" "github.com/apache/camel-k/pkg/util/test" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -37,17 +38,21 @@ func kamelTestPostAddCommandInit(t *testing.T, rootCmd *cobra.Command) { } } -func kamelTestPreAddCommandInit() (*RootCmdOptions, *cobra.Command) { - fakeClient, _ := test.NewFakeClient() +func kamelTestPreAddCommandInitWithClient(client client.Client) (*RootCmdOptions, *cobra.Command) { options := RootCmdOptions{ Context: context.Background(), - _client: fakeClient, + _client: client, } rootCmd := kamelPreAddCommandInit(&options) rootCmd.Run = test.EmptyRun return &options, rootCmd } +func kamelTestPreAddCommandInit() (*RootCmdOptions, *cobra.Command) { + fakeClient, _ := test.NewFakeClient() + return kamelTestPreAddCommandInitWithClient(fakeClient) +} + func TestLoadFromEnvVar(t *testing.T) { defer teardown(t) // shows how to include a "," character inside an env value see VAR1 value diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index fd1e5c53f..a3ad6b6e1 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -118,6 +118,7 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions) cmd.Flags().StringArray("label", nil, "Add a label to the integration. E.g. \"--label my.company=hello\"") cmd.Flags().StringArray("source", nil, "Add source file to your integration, this is added to the list of files listed as arguments of the command") cmd.Flags().String("pod-template", "", "The path of the YAML file containing a PodSpec template to be used for the Integration pods") + cmd.Flags().Bool("force", false, "Force creation of integration regardless of potential misconfiguration.") cmd.Flags().Bool("save", false, "Save the run parameters into the default kamel configuration file (kamel-config.yaml)") @@ -157,11 +158,12 @@ type runCmdOptions struct { Annotations []string `mapstructure:"annotations" yaml:",omitempty"` Sources []string `mapstructure:"sources" yaml:",omitempty"` RegistryOptions url.Values + Force bool `mapstructure:"force" yaml:",omitempty"` } func (o *runCmdOptions) preRunE(cmd *cobra.Command, args []string) error { if o.OutputFormat != "" { - // let the command to work in offline mode + // let the command work in offline mode cmd.Annotations[offlineCommandLabel] = "true" } return o.RootCmdOptions.preRun(cmd, args) @@ -550,6 +552,22 @@ func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.C integration.Annotations = make(map[string]string) } + if o.OperatorId != "" { + if pl, err := platformutil.LookupForPlatformName(o.Context, c, o.OperatorId); err != nil { + if k8serrors.IsForbidden(err) { + o.PrintfVerboseOutf(cmd, "Unable to verify existence of operator id [%s] due to lack of user privileges\n", o.OperatorId) + } else { + return nil, err + } + } else if pl == nil { + if o.Force { + o.PrintfVerboseOutf(cmd, "Unable to find operator with given id [%s] - integration may not be reconciled and get stuck in waiting state\n", o.OperatorId) + } else { + return nil, errors.New(fmt.Sprintf("unable to find integration platform for given operator id '%s', use --force option or make sure to use a proper operator id", o.OperatorId)) + } + } + } + // --operator-id={id} is a syntax sugar for '--annotation camel.apache.org/operator.id={id}' integration.SetOperatorID(strings.TrimSpace(o.OperatorId)) diff --git a/pkg/cmd/run_test.go b/pkg/cmd/run_test.go index fff96f88d..d53516400 100644 --- a/pkg/cmd/run_test.go +++ b/pkg/cmd/run_test.go @@ -27,6 +27,7 @@ import ( v1 "github.com/apache/camel-k/pkg/apis/camel/v1" traitv1 "github.com/apache/camel-k/pkg/apis/camel/v1/trait" + "github.com/apache/camel-k/pkg/platform" "github.com/apache/camel-k/pkg/trait" "github.com/apache/camel-k/pkg/util/test" @@ -55,7 +56,10 @@ func initializeRunCmdOptions(t *testing.T) (*runCmdOptions, *cobra.Command, Root func initializeRunCmdOptionsWithOutput(t *testing.T) (*runCmdOptions, *cobra.Command, RootCmdOptions) { t.Helper() - options, rootCmd := kamelTestPreAddCommandInit() + defaultIntegrationPlatform := v1.NewIntegrationPlatform("default", platform.DefaultPlatformName) + fakeClient, _ := test.NewFakeClient(&defaultIntegrationPlatform) + + options, rootCmd := kamelTestPreAddCommandInitWithClient(fakeClient) runCmdOptions := addTestRunCmdWithOutput(*options, rootCmd) kamelTestPostAddCommandInit(t, rootCmd)