diff --git a/cmd/image/build.go b/cmd/image/build.go index f4aca7b57..5b4a15109 100644 --- a/cmd/image/build.go +++ b/cmd/image/build.go @@ -18,16 +18,16 @@ import ( "github.com/spf13/cobra" "opendev.org/airship/airshipctl/pkg/bootstrap/isogen" - "opendev.org/airship/airshipctl/pkg/environment" + "opendev.org/airship/airshipctl/pkg/config" ) // NewImageBuildCommand creates a new command with the capability to build an ISO image. -func NewImageBuildCommand(rootSettings *environment.AirshipCTLSettings) *cobra.Command { +func NewImageBuildCommand(cfgFactory config.Factory) *cobra.Command { cmd := &cobra.Command{ Use: "build", Short: "Build ISO image", RunE: func(cmd *cobra.Command, args []string) error { - return isogen.GenerateBootstrapIso(rootSettings) + return isogen.GenerateBootstrapIso(cfgFactory) }, } diff --git a/cmd/image/image.go b/cmd/image/image.go index ab964074a..10960e710 100644 --- a/cmd/image/image.go +++ b/cmd/image/image.go @@ -17,6 +17,7 @@ package image import ( "github.com/spf13/cobra" + "opendev.org/airship/airshipctl/pkg/config" "opendev.org/airship/airshipctl/pkg/environment" ) @@ -25,18 +26,11 @@ func NewImageCommand(rootSettings *environment.AirshipCTLSettings) *cobra.Comman imageRootCmd := &cobra.Command{ Use: "image", Short: "Manage ISO image creation", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - if parentPreRun := cmd.Root().PersistentPreRun; parentPreRun != nil { - parentPreRun(cmd.Root(), args) - } - - // Load or Initialize airship Config - rootSettings.InitConfig() - }, } - imageBuildCmd := NewImageBuildCommand(rootSettings) - imageRootCmd.AddCommand(imageBuildCmd) + cfgFactory := config.CreateFactory(&rootSettings.AirshipConfigPath, &rootSettings.KubeConfigPath) + + imageRootCmd.AddCommand(NewImageBuildCommand(cfgFactory)) return imageRootCmd } diff --git a/cmd/image/image_test.go b/cmd/image/image_test.go index 5d919d878..2582a3f28 100644 --- a/cmd/image/image_test.go +++ b/cmd/image/image_test.go @@ -18,6 +18,7 @@ import ( "testing" "opendev.org/airship/airshipctl/cmd/image" + "opendev.org/airship/airshipctl/pkg/environment" "opendev.org/airship/airshipctl/testutil" ) @@ -26,7 +27,7 @@ func TestImage(t *testing.T) { { Name: "image-with-help", CmdLine: "-h", - Cmd: image.NewImageCommand(nil), + Cmd: image.NewImageCommand(&environment.AirshipCTLSettings{}), }, } diff --git a/pkg/bootstrap/isogen/command.go b/pkg/bootstrap/isogen/command.go index ef3ca1db8..e1f4e3926 100644 --- a/pkg/bootstrap/isogen/command.go +++ b/pkg/bootstrap/isogen/command.go @@ -26,7 +26,6 @@ import ( "opendev.org/airship/airshipctl/pkg/config" "opendev.org/airship/airshipctl/pkg/container" "opendev.org/airship/airshipctl/pkg/document" - "opendev.org/airship/airshipctl/pkg/environment" "opendev.org/airship/airshipctl/pkg/log" "opendev.org/airship/airshipctl/pkg/util" ) @@ -36,11 +35,11 @@ const ( ) // GenerateBootstrapIso will generate data for cloud init and start ISO builder container -func GenerateBootstrapIso(settings *environment.AirshipCTLSettings) error { +func GenerateBootstrapIso(cfgFactory config.Factory) error { ctx := context.Background() - globalConf := settings.Config - if err := globalConf.EnsureComplete(); err != nil { + globalConf, err := cfgFactory() + if err != nil { return err } diff --git a/pkg/bootstrap/isogen/command_test.go b/pkg/bootstrap/isogen/command_test.go index 30c9b209e..7a0a27498 100644 --- a/pkg/bootstrap/isogen/command_test.go +++ b/pkg/bootstrap/isogen/command_test.go @@ -21,8 +21,6 @@ import ( "strings" "testing" - "opendev.org/airship/airshipctl/pkg/environment" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -232,82 +230,72 @@ func TestVerifyInputs(t *testing.T) { } func TestGenerateBootstrapIso(t *testing.T) { + airshipConfigPath := "testdata/config/config" + kubeConfigPath := "testdata/config/kubeconfig" t.Run("EnsureCompleteError", func(t *testing.T) { - settings := &environment.AirshipCTLSettings{ - AirshipConfigPath: "testdata/config/config", - KubeConfigPath: "testdata/config/kubeconfig", - Config: &config.Config{}, - } - expectedErr := config.ErrMissingConfig{What: "Current Context is not defined"} - settings.InitConfig() - settings.Config.CurrentContext = "" - actualErr := GenerateBootstrapIso(settings) + settings, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + require.NoError(t, err) + expectedErr := config.ErrMissingConfig{What: "Context with name ''"} + settings.CurrentContext = "" + actualErr := GenerateBootstrapIso(func() (*config.Config, error) { + return settings, nil + }) assert.Equal(t, expectedErr, actualErr) }) t.Run("ContextEntryPointError", func(t *testing.T) { - settings := &environment.AirshipCTLSettings{ - AirshipConfigPath: "testdata/config/config", - KubeConfigPath: "testdata/config/kubeconfig", - Config: &config.Config{}, - } + settings, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + require.NoError(t, err) expectedErr := config.ErrMissingPrimaryRepo{} - settings.InitConfig() - settings.Config.Manifests["default"].Repositories = make(map[string]*config.Repository) - actualErr := GenerateBootstrapIso(settings) + settings.Manifests["default"].Repositories = make(map[string]*config.Repository) + actualErr := GenerateBootstrapIso(func() (*config.Config, error) { + return settings, nil + }) assert.Equal(t, expectedErr, actualErr) }) t.Run("NewBundleByPathError", func(t *testing.T) { - settings := &environment.AirshipCTLSettings{ - AirshipConfigPath: "testdata/config/config", - KubeConfigPath: "testdata/config/kubeconfig", - Config: &config.Config{}, - } + settings, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + require.NoError(t, err) expectedErr := config.ErrMissingPhaseDocument{PhaseName: "bootstrap"} - settings.InitConfig() - settings.Config.Manifests["default"].TargetPath = "/nonexistent" - actualErr := GenerateBootstrapIso(settings) + settings.Manifests["default"].TargetPath = "/nonexistent" + actualErr := GenerateBootstrapIso(func() (*config.Config, error) { + return settings, nil + }) assert.Equal(t, expectedErr, actualErr) }) t.Run("SelectOneError", func(t *testing.T) { - settings := &environment.AirshipCTLSettings{ - AirshipConfigPath: "testdata/config/config", - KubeConfigPath: "testdata/config/kubeconfig", - Config: &config.Config{}, - } + settings, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + require.NoError(t, err) expectedErr := document.ErrDocNotFound{ Selector: document.NewSelector().ByGvk("airshipit.org", "v1alpha1", "ImageConfiguration")} - settings.InitConfig() - settings.Config.Manifests["default"].SubPath = "missingkinddoc/site/test-site" - actualErr := GenerateBootstrapIso(settings) + settings.Manifests["default"].SubPath = "missingkinddoc/site/test-site" + actualErr := GenerateBootstrapIso(func() (*config.Config, error) { + return settings, nil + }) assert.Equal(t, expectedErr, actualErr) }) t.Run("ToObjectError", func(t *testing.T) { - settings := &environment.AirshipCTLSettings{ - AirshipConfigPath: "testdata/config/config", - KubeConfigPath: "testdata/config/kubeconfig", - Config: &config.Config{}, - } + settings, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + require.NoError(t, err) expectedErrMessage := "missing metadata.name in object" - settings.InitConfig() - settings.Config.Manifests["default"].SubPath = "missingmetadoc/site/test-site" - actualErr := GenerateBootstrapIso(settings) + settings.Manifests["default"].SubPath = "missingmetadoc/site/test-site" + actualErr := GenerateBootstrapIso(func() (*config.Config, error) { + return settings, nil + }) assert.Contains(t, actualErr.Error(), expectedErrMessage) }) t.Run("verifyInputsError", func(t *testing.T) { - settings := &environment.AirshipCTLSettings{ - AirshipConfigPath: "testdata/config/config", - KubeConfigPath: "testdata/config/kubeconfig", - Config: &config.Config{}, - } + settings, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + require.NoError(t, err) expectedErr := config.ErrMissingConfig{What: "Must specify volume bind for ISO builder container"} - settings.InitConfig() - settings.Config.Manifests["default"].SubPath = "missingvoldoc/site/test-site" - actualErr := GenerateBootstrapIso(settings) + settings.Manifests["default"].SubPath = "missingvoldoc/site/test-site" + actualErr := GenerateBootstrapIso(func() (*config.Config, error) { + return settings, nil + }) assert.Equal(t, expectedErr, actualErr) }) }