diff --git a/pkg/cmd/rebuild.go b/pkg/cmd/rebuild.go index 7ea4279233..bcdd3c96e6 100644 --- a/pkg/cmd/rebuild.go +++ b/pkg/cmd/rebuild.go @@ -34,18 +34,41 @@ func newCmdRebuild(rootCmdOptions *RootCmdOptions) (*cobra.Command, *rebuildCmdO RootCmdOptions: rootCmdOptions, } cmd := cobra.Command{ - Use: "rebuild [integration]", + Use: "rebuild [integration1] [integration2] ...", Short: "Clear the state of integrations to rebuild them", Long: `Clear the state of one or more integrations causing a rebuild.`, PreRunE: decode(&options), - RunE: options.rebuild, + RunE: func(cmd *cobra.Command, args []string) error { + if err := options.validate(args); err != nil { + return err + } + if err := options.rebuild(cmd, args); err != nil { + fmt.Fprintln(cmd.ErrOrStderr(), err.Error()) + } + + return nil + }, } + cmd.Flags().Bool("all", false, "Rebuild all integrations") + return &cmd, &options } type rebuildCmdOptions struct { *RootCmdOptions + RebuildAll bool `mapstructure:"all"` +} + +func (o *rebuildCmdOptions) validate(args []string) error { + if o.RebuildAll && len(args) > 0 { + return errors.New("invalid combination: both all flag and named integrations are set") + } + if !o.RebuildAll && len(args) == 0 { + return errors.New("invalid combination: neither all flag nor named integrations are set") + } + + return nil } func (o *rebuildCmdOptions) rebuild(cmd *cobra.Command, args []string) error { @@ -55,11 +78,11 @@ func (o *rebuildCmdOptions) rebuild(cmd *cobra.Command, args []string) error { } var integrations []v1.Integration - if len(args) == 0 { + if o.RebuildAll { if integrations, err = o.listAllIntegrations(c); err != nil { return err } - } else { + } else if len(args) > 0 { if integrations, err = o.getIntegrations(c, args); err != nil { return err } diff --git a/pkg/cmd/rebuild_test.go b/pkg/cmd/rebuild_test.go new file mode 100644 index 0000000000..e6e0c95a40 --- /dev/null +++ b/pkg/cmd/rebuild_test.go @@ -0,0 +1,66 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "testing" + + "github.com/apache/camel-k/pkg/util/test" + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" +) + +const cmdRebuild = "rebuild" + +// nolint: unparam +func initializeRebuildCmdOptions(t *testing.T) (*rebuildCmdOptions, *cobra.Command, RootCmdOptions) { + t.Helper() + + options, rootCmd := kamelTestPreAddCommandInit() + rebuildCmdOptions := addTestRebuildCmd(*options, rootCmd) + kamelTestPostAddCommandInit(t, rootCmd) + + return rebuildCmdOptions, rootCmd, *options +} + +func addTestRebuildCmd(options RootCmdOptions, rootCmd *cobra.Command) *rebuildCmdOptions { + // add a testing version of rebuild Command + rebuildCmd, rebuildOptions := newCmdRebuild(&options) + rebuildCmd.RunE = func(c *cobra.Command, args []string) error { + return nil + } + rebuildCmd.PostRunE = func(c *cobra.Command, args []string) error { + return nil + } + rebuildCmd.Args = test.ArbitraryArgs + rootCmd.AddCommand(rebuildCmd) + return rebuildOptions +} + +func TestRebuildNonExistingFlag(t *testing.T) { + _, rootCmd, _ := initializeRebuildCmdOptions(t) + _, err := test.ExecuteCommand(rootCmd, cmdRebuild, "--nonExistingFlag") + assert.NotNil(t, err) +} + +func TestRebuildAllFlag(t *testing.T) { + rebuildCmdOptions, rootCmd, _ := initializeRebuildCmdOptions(t) + _, err := test.ExecuteCommand(rootCmd, cmdRebuild, "--all") + assert.Nil(t, err) + assert.Equal(t, true, rebuildCmdOptions.RebuildAll) +}