diff --git a/cmd/cluster/cluster.go b/cmd/cluster/cluster.go index 9ae19eb9a..d615359f5 100644 --- a/cmd/cluster/cluster.go +++ b/cmd/cluster/cluster.go @@ -18,7 +18,6 @@ import ( "github.com/spf13/cobra" "opendev.org/airship/airshipctl/pkg/config" - "opendev.org/airship/airshipctl/pkg/k8s/client" ) const ( @@ -39,7 +38,7 @@ func NewClusterCommand(cfgFactory config.Factory) *cobra.Command { clusterRootCmd.AddCommand(NewInitCommand(cfgFactory)) clusterRootCmd.AddCommand(NewMoveCommand(cfgFactory)) - clusterRootCmd.AddCommand(NewStatusCommand(cfgFactory, client.DefaultClient)) + clusterRootCmd.AddCommand(NewStatusCommand(cfgFactory)) return clusterRootCmd } diff --git a/cmd/cluster/init.go b/cmd/cluster/init.go index 293d3de0b..ad98e05ad 100644 --- a/cmd/cluster/init.go +++ b/cmd/cluster/init.go @@ -70,18 +70,26 @@ airshipctl cluster init // NewInitCommand creates a command to deploy cluster-api func NewInitCommand(cfgFactory config.Factory) *cobra.Command { + var kubeconfig string initCmd := &cobra.Command{ Use: "init", Short: "Deploy cluster-api provider components", Long: initLong, Example: initExample, RunE: func(cmd *cobra.Command, args []string) error { - command, err := clusterctlcmd.NewCommand(cfgFactory) + command, err := clusterctlcmd.NewCommand(cfgFactory, kubeconfig) if err != nil { return err } return command.Init() }, } + + initCmd.Flags().StringVar( + &kubeconfig, + "kubeconfig", + "", + "Path to kubeconfig associated with cluster being managed") + return initCmd } diff --git a/cmd/cluster/move.go b/cmd/cluster/move.go index e8e06a83f..2b4dac836 100644 --- a/cmd/cluster/move.go +++ b/cmd/cluster/move.go @@ -37,14 +37,14 @@ Move Cluster API objects, provider specific objects and all dependencies to the // NewMoveCommand creates a command to move capi and bmo resources to the target cluster func NewMoveCommand(cfgFactory config.Factory) *cobra.Command { - var toKubeconfigContext string + var toKubeconfigContext, kubeconfig string moveCmd := &cobra.Command{ Use: "move", Short: "Move Cluster API objects, provider specific objects and all dependencies to the target cluster", Long: moveLong[1:], Example: moveExample, RunE: func(cmd *cobra.Command, args []string) error { - command, err := clusterctlcmd.NewCommand(cfgFactory) + command, err := clusterctlcmd.NewCommand(cfgFactory, kubeconfig) if err != nil { return err } @@ -52,6 +52,11 @@ func NewMoveCommand(cfgFactory config.Factory) *cobra.Command { }, } + moveCmd.Flags().StringVar( + &kubeconfig, + "kubeconfig", + "", + "Path to kubeconfig associated with cluster being managed") moveCmd.Flags().StringVar(&toKubeconfigContext, "target-context", "", "Context to be used within the kubeconfig file for the target cluster. If empty, current context will be used.") return moveCmd diff --git a/cmd/cluster/status.go b/cmd/cluster/status.go index ecc9fb4b6..b8b91427e 100644 --- a/cmd/cluster/status.go +++ b/cmd/cluster/status.go @@ -23,18 +23,25 @@ import ( ) // NewStatusCommand creates a command which reports the statuses of a cluster's deployed components. -func NewStatusCommand(cfgFactory config.Factory, factory client.Factory) *cobra.Command { - o := cluster.NewStatusOptions(cfgFactory, factory) - cmd := &cobra.Command{ +func NewStatusCommand(cfgFactory config.Factory) *cobra.Command { + var kubeconfig string + statusCmd := &cobra.Command{ Use: "status", Short: "Retrieve statuses of deployed cluster components", - RunE: clusterStatusRunE(o), + RunE: clusterStatusRunE(cfgFactory, kubeconfig), } - return cmd + + statusCmd.Flags().StringVar( + &kubeconfig, + "kubeconfig", + "", + "Path to kubeconfig associated with cluster being managed") + + return statusCmd } -func clusterStatusRunE(o cluster.StatusOptions) func(cmd *cobra.Command, args []string) error { +func clusterStatusRunE(cfgFactory config.Factory, kubeconfig string) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - return cluster.StatusRunner(o, cmd.OutOrStdout()) + return cluster.StatusRunner(cluster.NewStatusOptions(cfgFactory, client.DefaultClient, kubeconfig), cmd.OutOrStdout()) } } diff --git a/cmd/cluster/status_test.go b/cmd/cluster/status_test.go index 36d7bd522..40806033b 100644 --- a/cmd/cluster/status_test.go +++ b/cmd/cluster/status_test.go @@ -26,7 +26,7 @@ func TestNewClusterStatusCmd(t *testing.T) { { Name: "cluster-status-cmd-with-help", CmdLine: "--help", - Cmd: cluster.NewStatusCommand(nil, nil), + Cmd: cluster.NewStatusCommand(nil), }, } for _, testcase := range tests { diff --git a/cmd/cluster/testdata/TestNewClusterInitCmdGoldenOutput/cluster-init-cmd-with-help.golden b/cmd/cluster/testdata/TestNewClusterInitCmdGoldenOutput/cluster-init-cmd-with-help.golden index 688373a41..097566a1a 100644 --- a/cmd/cluster/testdata/TestNewClusterInitCmdGoldenOutput/cluster-init-cmd-with-help.golden +++ b/cmd/cluster/testdata/TestNewClusterInitCmdGoldenOutput/cluster-init-cmd-with-help.golden @@ -47,4 +47,5 @@ airshipctl cluster init Flags: - -h, --help help for init + -h, --help help for init + --kubeconfig string Path to kubeconfig associated with cluster being managed diff --git a/cmd/cluster/testdata/TestNewClusterMoveCmdGoldenOutput/cluster-move-cmd-with-help.golden b/cmd/cluster/testdata/TestNewClusterMoveCmdGoldenOutput/cluster-move-cmd-with-help.golden index b803f3408..ff99a15ce 100644 --- a/cmd/cluster/testdata/TestNewClusterMoveCmdGoldenOutput/cluster-move-cmd-with-help.golden +++ b/cmd/cluster/testdata/TestNewClusterMoveCmdGoldenOutput/cluster-move-cmd-with-help.golden @@ -14,4 +14,5 @@ Move Cluster API objects, provider specific objects and all dependencies to the Flags: -h, --help help for move + --kubeconfig string Path to kubeconfig associated with cluster being managed --target-context string Context to be used within the kubeconfig file for the target cluster. If empty, current context will be used. diff --git a/cmd/cluster/testdata/TestNewClusterStatusCmdGoldenOutput/cluster-status-cmd-with-help.golden b/cmd/cluster/testdata/TestNewClusterStatusCmdGoldenOutput/cluster-status-cmd-with-help.golden index e02d48fe1..12df09777 100644 --- a/cmd/cluster/testdata/TestNewClusterStatusCmdGoldenOutput/cluster-status-cmd-with-help.golden +++ b/cmd/cluster/testdata/TestNewClusterStatusCmdGoldenOutput/cluster-status-cmd-with-help.golden @@ -4,4 +4,5 @@ Usage: status [flags] Flags: - -h, --help help for status + -h, --help help for status + --kubeconfig string Path to kubeconfig associated with cluster being managed diff --git a/cmd/config/init.go b/cmd/config/init.go index cf3a991c4..d746fecdc 100644 --- a/cmd/config/init.go +++ b/cmd/config/init.go @@ -47,11 +47,7 @@ func NewInitCommand() *cobra.Command { airshipConfigPath = "" } - kubeConfigPath, err := cmd.Flags().GetString("kubeconfig") - if err != nil { - kubeConfigPath = "" - } - return config.CreateConfig(airshipConfigPath, kubeConfigPath) + return config.CreateConfig(airshipConfigPath) }, } diff --git a/cmd/config/set_management_configuration.go b/cmd/config/set_management_configuration.go index 871bf81d9..82a899ba7 100644 --- a/cmd/config/set_management_configuration.go +++ b/cmd/config/set_management_configuration.go @@ -92,11 +92,7 @@ func NewSetManagementConfigCommand(cfgFactory config.Factory) *cobra.Command { return nil } - if err = cfg.PersistConfig(true); err != nil { - return err - } - - return nil + return cfg.PersistConfig() }, } diff --git a/cmd/phase/run.go b/cmd/phase/run.go index 6141f952a..7838aba2c 100644 --- a/cmd/phase/run.go +++ b/cmd/phase/run.go @@ -34,8 +34,8 @@ airshipctl phase run ephemeral-control-plane // NewRunCommand creates a command to run specific phase func NewRunCommand(cfgFactory config.Factory) *cobra.Command { p := &phase.RunCommand{ - Options: phase.RunFlags{}, Factory: cfgFactory, + Options: phase.RunFlags{}, } runCmd := &cobra.Command{ @@ -60,5 +60,10 @@ func NewRunCommand(cfgFactory config.Factory) *cobra.Command { "wait-timeout", 0, "wait timeout") + flags.StringVar( + &p.Options.Kubeconfig, + "kubeconfig", + "", + "Path to kubeconfig associated with site being managed") return runCmd } diff --git a/cmd/phase/testdata/TestRunGoldenOutput/run-with-help.golden b/cmd/phase/testdata/TestRunGoldenOutput/run-with-help.golden index 229e1dd2f..ba86eb730 100644 --- a/cmd/phase/testdata/TestRunGoldenOutput/run-with-help.golden +++ b/cmd/phase/testdata/TestRunGoldenOutput/run-with-help.golden @@ -12,4 +12,5 @@ airshipctl phase run ephemeral-control-plane Flags: --dry-run simulate phase execution -h, --help help for run + --kubeconfig string Path to kubeconfig associated with site being managed --wait-timeout duration wait timeout diff --git a/cmd/root.go b/cmd/root.go index 145a01b72..6fc47ab45 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -19,8 +19,6 @@ import ( "path/filepath" "github.com/spf13/cobra" - "k8s.io/client-go/tools/clientcmd" - // Import to initialize client auth plugins. _ "k8s.io/client-go/plugin/pkg/client/auth" @@ -40,14 +38,13 @@ import ( type RootOptions struct { Debug bool AirshipConfigPath string - KubeConfigPath string } // NewAirshipCTLCommand creates a root `airshipctl` command with the default commands attached func NewAirshipCTLCommand(out io.Writer) *cobra.Command { rootCmd, settings := NewRootCommand(out) return AddDefaultAirshipCTLCommands(rootCmd, - cfg.CreateFactory(&settings.AirshipConfigPath, &settings.KubeConfigPath)) + cfg.CreateFactory(&settings.AirshipConfigPath)) } // NewRootCommand creates the root `airshipctl` command. All other commands are @@ -97,11 +94,4 @@ func initFlags(options *RootOptions, cmd *cobra.Command) { "airshipconf", "", `Path to file for airshipctl configuration. (default "`+defaultAirshipConfigPath+`")`) - - defaultKubeConfigPath := filepath.Join(defaultAirshipConfigDir, cfg.AirshipKubeConfig) - flags.StringVar( - &options.KubeConfigPath, - clientcmd.RecommendedConfigPathFlag, - "", - `Path to kubeconfig associated with airshipctl configuration. (default "`+defaultKubeConfigPath+`")`) } diff --git a/cmd/testdata/TestRootGoldenOutput/rootCmd-with-default-subcommands.golden b/cmd/testdata/TestRootGoldenOutput/rootCmd-with-default-subcommands.golden index 11dcece40..98df51433 100644 --- a/cmd/testdata/TestRootGoldenOutput/rootCmd-with-default-subcommands.golden +++ b/cmd/testdata/TestRootGoldenOutput/rootCmd-with-default-subcommands.golden @@ -19,6 +19,5 @@ Flags: --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output -h, --help help for airshipctl - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") Use "airshipctl [command] --help" for more information about a command. diff --git a/cmd/testdata/TestRootGoldenOutput/specialized-rootCmd-with-bootstrap.golden b/cmd/testdata/TestRootGoldenOutput/specialized-rootCmd-with-bootstrap.golden index 8100b62d6..a83284cb9 100644 --- a/cmd/testdata/TestRootGoldenOutput/specialized-rootCmd-with-bootstrap.golden +++ b/cmd/testdata/TestRootGoldenOutput/specialized-rootCmd-with-bootstrap.golden @@ -11,6 +11,5 @@ Flags: --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output -h, --help help for airshipctl - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") Use "airshipctl [command] --help" for more information about a command. diff --git a/docs/source/cli/airshipctl.md b/docs/source/cli/airshipctl.md index 847411b9a..83f9bd53f 100644 --- a/docs/source/cli/airshipctl.md +++ b/docs/source/cli/airshipctl.md @@ -12,7 +12,6 @@ A unified entrypoint to various airship components --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output -h, --help help for airshipctl - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_baremetal.md b/docs/source/cli/airshipctl_baremetal.md index 8449596fd..8e7e635ff 100644 --- a/docs/source/cli/airshipctl_baremetal.md +++ b/docs/source/cli/airshipctl_baremetal.md @@ -17,7 +17,6 @@ Perform actions on baremetal hosts ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_baremetal_ejectmedia.md b/docs/source/cli/airshipctl_baremetal_ejectmedia.md index 91ac6a4c2..40698d260 100644 --- a/docs/source/cli/airshipctl_baremetal_ejectmedia.md +++ b/docs/source/cli/airshipctl_baremetal_ejectmedia.md @@ -24,7 +24,6 @@ airshipctl baremetal ejectmedia [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_baremetal_poweroff.md b/docs/source/cli/airshipctl_baremetal_poweroff.md index 2b253f9b6..edee71ec7 100644 --- a/docs/source/cli/airshipctl_baremetal_poweroff.md +++ b/docs/source/cli/airshipctl_baremetal_poweroff.md @@ -24,7 +24,6 @@ airshipctl baremetal poweroff [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_baremetal_poweron.md b/docs/source/cli/airshipctl_baremetal_poweron.md index 6fe8f4057..bc0cc6e6a 100644 --- a/docs/source/cli/airshipctl_baremetal_poweron.md +++ b/docs/source/cli/airshipctl_baremetal_poweron.md @@ -24,7 +24,6 @@ airshipctl baremetal poweron [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_baremetal_powerstatus.md b/docs/source/cli/airshipctl_baremetal_powerstatus.md index 7af252349..888fb6017 100644 --- a/docs/source/cli/airshipctl_baremetal_powerstatus.md +++ b/docs/source/cli/airshipctl_baremetal_powerstatus.md @@ -24,7 +24,6 @@ airshipctl baremetal powerstatus [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_baremetal_reboot.md b/docs/source/cli/airshipctl_baremetal_reboot.md index bbf3f8979..468bd4ceb 100644 --- a/docs/source/cli/airshipctl_baremetal_reboot.md +++ b/docs/source/cli/airshipctl_baremetal_reboot.md @@ -24,7 +24,6 @@ airshipctl baremetal reboot [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_baremetal_remotedirect.md b/docs/source/cli/airshipctl_baremetal_remotedirect.md index e3b8670ea..276ed5bbd 100644 --- a/docs/source/cli/airshipctl_baremetal_remotedirect.md +++ b/docs/source/cli/airshipctl_baremetal_remotedirect.md @@ -21,7 +21,6 @@ airshipctl baremetal remotedirect [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_cluster.md b/docs/source/cli/airshipctl_cluster.md index f6ab19cda..4a71842ac 100644 --- a/docs/source/cli/airshipctl_cluster.md +++ b/docs/source/cli/airshipctl_cluster.md @@ -19,7 +19,6 @@ such as getting status and deploying initial infrastructure. ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_cluster_init.md b/docs/source/cli/airshipctl_cluster_init.md index 2aeb88c98..827e31862 100644 --- a/docs/source/cli/airshipctl_cluster_init.md +++ b/docs/source/cli/airshipctl_cluster_init.md @@ -60,7 +60,8 @@ airshipctl cluster init ### Options ``` - -h, --help help for init + -h, --help help for init + --kubeconfig string Path to kubeconfig associated with cluster being managed ``` ### Options inherited from parent commands @@ -68,7 +69,6 @@ airshipctl cluster init ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_cluster_move.md b/docs/source/cli/airshipctl_cluster_move.md index 14662ca6b..83eed598b 100644 --- a/docs/source/cli/airshipctl_cluster_move.md +++ b/docs/source/cli/airshipctl_cluster_move.md @@ -27,6 +27,7 @@ Move Cluster API objects, provider specific objects and all dependencies to the ``` -h, --help help for move + --kubeconfig string Path to kubeconfig associated with cluster being managed --target-context string Context to be used within the kubeconfig file for the target cluster. If empty, current context will be used. ``` @@ -35,7 +36,6 @@ Move Cluster API objects, provider specific objects and all dependencies to the ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_cluster_status.md b/docs/source/cli/airshipctl_cluster_status.md index 547701c76..4f0271a82 100644 --- a/docs/source/cli/airshipctl_cluster_status.md +++ b/docs/source/cli/airshipctl_cluster_status.md @@ -13,7 +13,8 @@ airshipctl cluster status [flags] ### Options ``` - -h, --help help for status + -h, --help help for status + --kubeconfig string Path to kubeconfig associated with cluster being managed ``` ### Options inherited from parent commands @@ -21,7 +22,6 @@ airshipctl cluster status [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_completion.md b/docs/source/cli/airshipctl_completion.md index 0d1da69b0..e54bbdbe6 100644 --- a/docs/source/cli/airshipctl_completion.md +++ b/docs/source/cli/airshipctl_completion.md @@ -34,7 +34,6 @@ source <(airshipctl completion bash) ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config.md b/docs/source/cli/airshipctl_config.md index 68c010701..23e06f4d1 100644 --- a/docs/source/cli/airshipctl_config.md +++ b/docs/source/cli/airshipctl_config.md @@ -17,7 +17,6 @@ Manage the airshipctl config file ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_get-context.md b/docs/source/cli/airshipctl_config_get-context.md index 7d5df5bb5..5e2b61297 100644 --- a/docs/source/cli/airshipctl_config_get-context.md +++ b/docs/source/cli/airshipctl_config_get-context.md @@ -38,7 +38,6 @@ airshipctl config get-context exampleContext ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_get-encryption-config.md b/docs/source/cli/airshipctl_config_get-encryption-config.md index 0a7579484..fdd02dcc7 100644 --- a/docs/source/cli/airshipctl_config_get-encryption-config.md +++ b/docs/source/cli/airshipctl_config_get-encryption-config.md @@ -34,7 +34,6 @@ airshipctl config get-encryption-config exampleConfig ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_get-management-config.md b/docs/source/cli/airshipctl_config_get-management-config.md index db5ef8e64..7f2731eed 100644 --- a/docs/source/cli/airshipctl_config_get-management-config.md +++ b/docs/source/cli/airshipctl_config_get-management-config.md @@ -33,7 +33,6 @@ airshipctl config get-management-config default ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_get-manifest.md b/docs/source/cli/airshipctl_config_get-manifest.md index e0590d9a2..ba5062b7a 100644 --- a/docs/source/cli/airshipctl_config_get-manifest.md +++ b/docs/source/cli/airshipctl_config_get-manifest.md @@ -34,7 +34,6 @@ airshipctl config get-manifest e2e ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_init.md b/docs/source/cli/airshipctl_config_init.md index c3c536e39..44fff0ca5 100644 --- a/docs/source/cli/airshipctl_config_init.md +++ b/docs/source/cli/airshipctl_config_init.md @@ -26,7 +26,6 @@ airshipctl config init [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_set-context.md b/docs/source/cli/airshipctl_config_set-context.md index 83c56b44f..f7d31eb2e 100644 --- a/docs/source/cli/airshipctl_config_set-context.md +++ b/docs/source/cli/airshipctl_config_set-context.md @@ -42,7 +42,6 @@ airshipctl config set-context \ ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_set-encryption-config.md b/docs/source/cli/airshipctl_config_set-encryption-config.md index 623c8db09..efff19c2c 100644 --- a/docs/source/cli/airshipctl_config_set-encryption-config.md +++ b/docs/source/cli/airshipctl_config_set-encryption-config.md @@ -44,7 +44,6 @@ airshipctl config set-encryption-config exampleConfig \ ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_set-management-config.md b/docs/source/cli/airshipctl_config_set-management-config.md index ec57367bf..87c8b413a 100644 --- a/docs/source/cli/airshipctl_config_set-management-config.md +++ b/docs/source/cli/airshipctl_config_set-management-config.md @@ -24,7 +24,6 @@ airshipctl config set-management-config NAME [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_set-manifest.md b/docs/source/cli/airshipctl_config_set-manifest.md index 86a55ea11..07cfb9e56 100644 --- a/docs/source/cli/airshipctl_config_set-manifest.md +++ b/docs/source/cli/airshipctl_config_set-manifest.md @@ -60,7 +60,6 @@ airshipctl config set-manifest e2e \ ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_config_use-context.md b/docs/source/cli/airshipctl_config_use-context.md index 0f14255d1..29a00253c 100644 --- a/docs/source/cli/airshipctl_config_use-context.md +++ b/docs/source/cli/airshipctl_config_use-context.md @@ -32,7 +32,6 @@ airshipctl config use-context exampleContext ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_document.md b/docs/source/cli/airshipctl_document.md index efdbf2efc..84e6cf69a 100644 --- a/docs/source/cli/airshipctl_document.md +++ b/docs/source/cli/airshipctl_document.md @@ -17,7 +17,6 @@ Manage deployment documents ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_document_plugin.md b/docs/source/cli/airshipctl_document_plugin.md index 7fd39ae80..afb6e7d0c 100644 --- a/docs/source/cli/airshipctl_document_plugin.md +++ b/docs/source/cli/airshipctl_document_plugin.md @@ -55,7 +55,6 @@ airshipctl document plugin /tmp/replacement.yaml ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_document_pull.md b/docs/source/cli/airshipctl_document_pull.md index 71e6894d4..e2397be01 100644 --- a/docs/source/cli/airshipctl_document_pull.md +++ b/docs/source/cli/airshipctl_document_pull.md @@ -22,7 +22,6 @@ airshipctl document pull [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_image.md b/docs/source/cli/airshipctl_image.md index 9365ac684..b17721a20 100644 --- a/docs/source/cli/airshipctl_image.md +++ b/docs/source/cli/airshipctl_image.md @@ -17,7 +17,6 @@ Manage ISO image creation ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_image_build.md b/docs/source/cli/airshipctl_image_build.md index 52ee3e816..80534bd59 100644 --- a/docs/source/cli/airshipctl_image_build.md +++ b/docs/source/cli/airshipctl_image_build.md @@ -22,7 +22,6 @@ airshipctl image build [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_phase.md b/docs/source/cli/airshipctl_phase.md index c58e47caf..c11803496 100644 --- a/docs/source/cli/airshipctl_phase.md +++ b/docs/source/cli/airshipctl_phase.md @@ -19,7 +19,6 @@ such as getting list and applying specific one. ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_phase_plan.md b/docs/source/cli/airshipctl_phase_plan.md index 3704123e8..e5dd6cff7 100644 --- a/docs/source/cli/airshipctl_phase_plan.md +++ b/docs/source/cli/airshipctl_phase_plan.md @@ -24,7 +24,6 @@ airshipctl phase plan [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_phase_render.md b/docs/source/cli/airshipctl_phase_render.md index e21c269d3..4300bfa18 100644 --- a/docs/source/cli/airshipctl_phase_render.md +++ b/docs/source/cli/airshipctl_phase_render.md @@ -39,7 +39,6 @@ airshipctl phase render initinfra -l app=helm,service=tiller -k Deployment ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_phase_run.md b/docs/source/cli/airshipctl_phase_run.md index 5f8f793da..0ff629f96 100644 --- a/docs/source/cli/airshipctl_phase_run.md +++ b/docs/source/cli/airshipctl_phase_run.md @@ -24,6 +24,7 @@ airshipctl phase run ephemeral-control-plane ``` --dry-run simulate phase execution -h, --help help for run + --kubeconfig string Path to kubeconfig associated with site being managed --wait-timeout duration wait timeout ``` @@ -32,7 +33,6 @@ airshipctl phase run ephemeral-control-plane ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_secret.md b/docs/source/cli/airshipctl_secret.md index 02812df4c..781dbd6d5 100644 --- a/docs/source/cli/airshipctl_secret.md +++ b/docs/source/cli/airshipctl_secret.md @@ -17,7 +17,6 @@ Manage secrets ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_secret_generate.md b/docs/source/cli/airshipctl_secret_generate.md index 342940939..144eee7a8 100644 --- a/docs/source/cli/airshipctl_secret_generate.md +++ b/docs/source/cli/airshipctl_secret_generate.md @@ -17,7 +17,6 @@ Generate various secrets ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_secret_generate_masterpassphrase.md b/docs/source/cli/airshipctl_secret_generate_masterpassphrase.md index 2d2c2a157..d4ae880ff 100644 --- a/docs/source/cli/airshipctl_secret_generate_masterpassphrase.md +++ b/docs/source/cli/airshipctl_secret_generate_masterpassphrase.md @@ -21,7 +21,6 @@ airshipctl secret generate masterpassphrase [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/docs/source/cli/airshipctl_version.md b/docs/source/cli/airshipctl_version.md index 86404889f..228f64c40 100644 --- a/docs/source/cli/airshipctl_version.md +++ b/docs/source/cli/airshipctl_version.md @@ -21,7 +21,6 @@ airshipctl version [flags] ``` --airshipconf string Path to file for airshipctl configuration. (default "$HOME/.airship/config") --debug enable verbose output - --kubeconfig string Path to kubeconfig associated with airshipctl configuration. (default "$HOME/.airship/kubeconfig") ``` ### SEE ALSO diff --git a/go.sum b/go.sum index 64fd266dd..75020ae45 100644 --- a/go.sum +++ b/go.sum @@ -723,6 +723,7 @@ golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMx golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -842,6 +843,7 @@ golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDq golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff h1:XdBG6es/oFDr1HwaxkxgVve7NB281QhxgK/i4voubFs= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/bootstrap/isogen/command_test.go b/pkg/bootstrap/isogen/command_test.go index 75ff62514..c8e197669 100644 --- a/pkg/bootstrap/isogen/command_test.go +++ b/pkg/bootstrap/isogen/command_test.go @@ -256,10 +256,9 @@ func TestVerifyInputs(t *testing.T) { func TestGenerateBootstrapIso(t *testing.T) { airshipConfigPath := "testdata/config/config" - kubeConfigPath := "testdata/config/kubeconfig" t.Run("ContextEntryPointError", func(t *testing.T) { - cfg, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + cfg, err := config.CreateFactory(&airshipConfigPath)() require.NoError(t, err) cfg.Manifests["default"].Repositories = make(map[string]*config.Repository) settings := func() (*config.Config, error) { @@ -271,7 +270,7 @@ func TestGenerateBootstrapIso(t *testing.T) { }) t.Run("NewBundleByPathError", func(t *testing.T) { - cfg, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + cfg, err := config.CreateFactory(&airshipConfigPath)() require.NoError(t, err) cfg.Manifests["default"].TargetPath = "/nonexistent" settings := func() (*config.Config, error) { @@ -283,7 +282,7 @@ func TestGenerateBootstrapIso(t *testing.T) { }) t.Run("SelectOneError", func(t *testing.T) { - cfg, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + cfg, err := config.CreateFactory(&airshipConfigPath)() require.NoError(t, err) cfg.Manifests["default"].SubPath = "missingkinddoc/site/test-site" settings := func() (*config.Config, error) { @@ -296,7 +295,7 @@ func TestGenerateBootstrapIso(t *testing.T) { }) t.Run("ToObjectError", func(t *testing.T) { - cfg, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + cfg, err := config.CreateFactory(&airshipConfigPath)() require.NoError(t, err) cfg.Manifests["default"].SubPath = "missingmetadoc/site/test-site" settings := func() (*config.Config, error) { @@ -304,11 +303,12 @@ func TestGenerateBootstrapIso(t *testing.T) { } expectedErrMessage := "missing metadata.name in object" actualErr := GenerateBootstrapIso(settings, false) + require.NotNil(t, actualErr) assert.Contains(t, actualErr.Error(), expectedErrMessage) }) t.Run("verifyInputsError", func(t *testing.T) { - cfg, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + cfg, err := config.CreateFactory(&airshipConfigPath)() require.NoError(t, err) cfg.Manifests["default"].SubPath = "missingvoldoc/site/test-site" settings := func() (*config.Config, error) { diff --git a/pkg/cluster/status.go b/pkg/cluster/status.go index 438f9d946..c05442135 100644 --- a/pkg/cluster/status.go +++ b/pkg/cluster/status.go @@ -43,18 +43,19 @@ type StatusOptions interface { } type statusOptions struct { - ConfigFactory config.Factory + CfgFactory config.Factory ClientFactory client.Factory + Kubeconfig string } // NewStatusOptions constructs a new StatusOptions interface based on inner struct -func NewStatusOptions(cfgFactory config.Factory, clientFactory client.Factory) StatusOptions { - return &statusOptions{ConfigFactory: cfgFactory, ClientFactory: clientFactory} +func NewStatusOptions(cfgFactory config.Factory, clientFactory client.Factory, kubeconfig string) StatusOptions { + return &statusOptions{CfgFactory: cfgFactory, ClientFactory: clientFactory, Kubeconfig: kubeconfig} } // GetStatusMapDocs returns status map within all the documents in the bundle func (o *statusOptions) GetStatusMapDocs() (*StatusMap, []document.Document, error) { - conf, err := o.ConfigFactory() + conf, err := o.CfgFactory() if err != nil { return nil, nil, err } @@ -74,7 +75,7 @@ func (o *statusOptions) GetStatusMapDocs() (*StatusMap, []document.Document, err return nil, nil, err } - client, err := o.ClientFactory(conf) + client, err := o.ClientFactory(conf.LoadedConfigPath(), o.Kubeconfig) if err != nil { return nil, nil, err } diff --git a/pkg/cluster/status_test.go b/pkg/cluster/status_test.go index d1cfd8068..1b02d3f61 100644 --- a/pkg/cluster/status_test.go +++ b/pkg/cluster/status_test.go @@ -63,11 +63,12 @@ func TestGetStatusMapDocs(t *testing.T) { fakeClient := fake.NewClient( fake.WithDynamicObjects(tt.resources...), fake.WithCRDs(tt.CRDs...)) + clientFactory := func(_ string, _ string) (client.Interface, error) { + return fakeClient, nil + } statusOptions := cluster.NewStatusOptions(func() (*config.Config, error) { return settings, nil - }, func(_ *config.Config) (client.Interface, error) { - return fakeClient, nil - }) + }, clientFactory, "") expectedSM, err := cluster.NewStatusMap(fakeClient) require.NoError(t, err) diff --git a/pkg/clusterctl/cmd/command.go b/pkg/clusterctl/cmd/command.go index c1db5a369..d749ff732 100644 --- a/pkg/clusterctl/cmd/command.go +++ b/pkg/clusterctl/cmd/command.go @@ -32,7 +32,7 @@ type Command struct { } // NewCommand returns instance of Command -func NewCommand(cfgFactory config.Factory) (*Command, error) { +func NewCommand(cfgFactory config.Factory, kubeconfig string) (*Command, error) { cfg, err := cfgFactory() if err != nil { return nil, err @@ -53,10 +53,9 @@ func NewCommand(cfgFactory config.Factory) (*Command, error) { if err != nil { return nil, err } - kubeConfigPath := cfg.KubeConfigPath() return &Command{ - kubeconfigPath: kubeConfigPath, + kubeconfigPath: kubeconfig, documentRoot: root, client: client, options: options, diff --git a/pkg/clusterctl/cmd/command_test.go b/pkg/clusterctl/cmd/command_test.go index 96fa3bd89..10c311d18 100644 --- a/pkg/clusterctl/cmd/command_test.go +++ b/pkg/clusterctl/cmd/command_test.go @@ -31,8 +31,7 @@ const ( // TODO (kkalynovskyi) expand test cases func TestNewCommand(t *testing.T) { airshipConfigPath := "testdata/airshipconfig.yaml" - kubeConfigPath := "testdata/kubeconfig.yaml" - cfg, err := config.CreateFactory(&airshipConfigPath, &kubeConfigPath)() + cfg, err := config.CreateFactory(&airshipConfigPath)() require.NoError(t, err) tests := []struct { @@ -120,7 +119,7 @@ func TestNewCommand(t *testing.T) { cfg.CurrentContext = context command, err := NewCommand(func() (*config.Config, error) { return cfg, nil - }) + }, "") if expectErr { assert.Error(t, err) assert.Nil(t, command) diff --git a/pkg/config/config.go b/pkg/config/config.go index d9ef1f101..34ff376c0 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -15,7 +15,6 @@ limitations under the License. package config import ( - "errors" "fmt" "io/ioutil" "os" @@ -23,8 +22,6 @@ import ( "path/filepath" "sort" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" "sigs.k8s.io/yaml" "opendev.org/airship/airshipctl/pkg/log" @@ -36,8 +33,7 @@ import ( // Any truly optional piece of config is allowed to be omitted. // Config holds the information required by airshipctl commands -// It is somewhat a superset of what a kubeconfig looks like, we allow for this overlaps by providing -// a mechanism to consume or produce a kubeconfig into / from the airship config. +// It is somewhat a superset of what a kubeconfig looks like type Config struct { // +optional Kind string `json:"kind,omitempty"` @@ -67,14 +63,6 @@ type Config struct { // file from which this config was loaded // +not persisted in file loadedConfigPath string - - // kubeConfigPath is the full path to the the location of the - // kubeconfig file associated with this airship config instance - // +not persisted in file - kubeConfigPath string - - // Private instance of Kube Config content as an object - kubeConfig *clientcmdapi.Config } // Permissions has the permissions for file and directory @@ -87,21 +75,17 @@ type Permissions struct { type Factory func() (*Config, error) // CreateFactory returns function which creates ready to use Config object -func CreateFactory(airshipConfigPath *string, kubeConfigPath *string) Factory { +func CreateFactory(airshipConfigPath *string) Factory { return func() (*Config, error) { cfg := NewConfig() - cfg.kubeConfig = NewKubeConfig() - var acp, kcp string + var acp string if airshipConfigPath != nil { acp = *airshipConfigPath } - if kubeConfigPath != nil { - kcp = *kubeConfigPath - } - cfg.initConfigPath(acp, kcp) - err := cfg.LoadConfig(cfg.loadedConfigPath, cfg.kubeConfigPath, false) + cfg.initConfigPath(acp) + err := cfg.LoadConfig() if err != nil { // Should stop airshipctl log.Fatal("Failed to load or initialize config: ", err) @@ -112,15 +96,14 @@ func CreateFactory(airshipConfigPath *string, kubeConfigPath *string) Factory { } // CreateConfig saves default config to specified paths -func CreateConfig(airshipConfigPath string, kubeConfigPath string) error { +func CreateConfig(airshipConfigPath string) error { cfg := NewConfig() - cfg.kubeConfig = NewKubeConfig() - cfg.initConfigPath(airshipConfigPath, kubeConfigPath) - return cfg.PersistConfig(true) + cfg.initConfigPath(airshipConfigPath) + return cfg.PersistConfig() } -// initConfigPath - Initializes loadedConfigPath and kubeConfigPath variable for Config object -func (c *Config) initConfigPath(airshipConfigPath string, kubeConfigPath string) { +// initConfigPath - Initializes loadedConfigPath variable for Config object +func (c *Config) initConfigPath(airshipConfigPath string) { switch { case airshipConfigPath != "": // The loadedConfigPath may already have been received as a command line argument @@ -132,77 +115,22 @@ func (c *Config) initConfigPath(airshipConfigPath string, kubeConfigPath string) // Otherwise, we'll try putting it in the home directory c.loadedConfigPath = filepath.Join(util.UserHomeDir(), AirshipConfigDir, AirshipConfig) } - - switch { - case kubeConfigPath != "": - // The kubeConfigPath may already have been received as a command line argument - c.kubeConfigPath = kubeConfigPath - case os.Getenv(AirshipKubeConfigEnv) != "": - // Otherwise, we can check if we got the path via ENVIRONMENT variable - c.kubeConfigPath = os.Getenv(AirshipKubeConfigEnv) - default: - // Otherwise, we'll try putting it in the home directory - c.kubeConfigPath = filepath.Join(util.UserHomeDir(), AirshipConfigDir, AirshipKubeConfig) - } } -// LoadConfig populates the Config object using the files found at -// airshipConfigPath and kubeConfigPath -func (c *Config) LoadConfig(airshipConfigPath, kubeConfigPath string, create bool) error { - err := c.loadFromAirConfig(airshipConfigPath, create) - if err != nil { - return err - } - - err = c.loadKubeConfig(kubeConfigPath, create) - if err != nil { - return err - } - - return nil -} - -// loadFromAirConfig populates the Config from the file found at airshipConfigPath. +// LoadConfig populates the Config from the file found at airshipConfigPath. // If there is no file at airshipConfigPath, this function does nothing. // An error is returned if: // * airshipConfigPath is the empty string // * the file at airshipConfigPath is inaccessible // * the file at airshipConfigPath cannot be marshaled into Config -func (c *Config) loadFromAirConfig(airshipConfigPath string, create bool) error { - if airshipConfigPath == "" { - return errors.New("configuration file location was not provided") - } - - // Remember where I loaded the Config from - c.loadedConfigPath = airshipConfigPath - +func (c *Config) LoadConfig() error { // If I can read from the file, load from it // throw an error otherwise - if _, err := os.Stat(airshipConfigPath); os.IsNotExist(err) && create { - return nil - } else if err != nil { + if _, err := os.Stat(c.loadedConfigPath); err != nil { return err } - return util.ReadYAMLFile(airshipConfigPath, c) -} - -func (c *Config) loadKubeConfig(kubeConfigPath string, create bool) error { - // Will need this for persisting the changes - c.kubeConfigPath = kubeConfigPath - - // If I can read from the file, load from it - var err error - if _, err = os.Stat(kubeConfigPath); os.IsNotExist(err) && create { - // Default kubeconfig matching Airship target cluster - c.kubeConfig = NewKubeConfig() - return nil - } else if err != nil { - return err - } - - c.kubeConfig, err = clientcmd.LoadFromFile(kubeConfigPath) - return err + return util.ReadYAMLFile(c.loadedConfigPath, c) } // EnsureComplete verifies that a Config object is ready to use. @@ -247,11 +175,11 @@ func (c *Config) EnsureComplete() error { return nil } -// PersistConfig updates the airshipctl config and kubeconfig files to match -// the current Config and KubeConfig objects. -// If either file did not previously exist, the file will be created. +// PersistConfig updates the airshipctl config file to match +// the current Config object. +// If file did not previously exist, the file will be created. // Otherwise, the file will be overwritten -func (c *Config) PersistConfig(persistKubeConfig bool) error { +func (c *Config) PersistConfig() error { airshipConfigYaml, err := c.ToYaml() if err != nil { return err @@ -282,13 +210,6 @@ func (c *Config) PersistConfig(persistKubeConfig bool) error { return err } - if persistKubeConfig { - // Persist the kubeconfig file referenced - if err := clientcmd.WriteToFile(*c.kubeConfig, c.kubeConfigPath); err != nil { - return err - } - } - return nil } @@ -319,29 +240,6 @@ func (c *Config) SetLoadedConfigPath(lcp string) { c.loadedConfigPath = lcp } -// KubeConfigPath returns the file path of the kube config -// from Config object -func (c *Config) KubeConfigPath() string { - return c.kubeConfigPath -} - -// SetKubeConfigPath updates the file path of the kubeconfig -// in Config object -func (c *Config) SetKubeConfigPath(kubeConfigPath string) { - c.kubeConfigPath = kubeConfigPath -} - -// KubeConfig returns kube config object from the -// context of current Config object -func (c *Config) KubeConfig() *clientcmdapi.Config { - return c.kubeConfig -} - -// SetKubeConfig updates kube config in Config object -func (c *Config) SetKubeConfig(kubeConfig *clientcmdapi.Config) { - c.kubeConfig = kubeConfig -} - // GetContext returns a context instance func (c *Config) GetContext(cName string) (*Context, error) { context, exists := c.Contexts[cName] diff --git a/pkg/config/config_helper.go b/pkg/config/config_helper.go index 908d69bea..8b9de108f 100644 --- a/pkg/config/config_helper.go +++ b/pkg/config/config_helper.go @@ -60,7 +60,7 @@ func RunSetContext(o *ContextOptions, airconfig *Config, writeToStorage bool) (b } // Update configuration file just in time persistence approach if writeToStorage { - if err := airconfig.PersistConfig(true); err != nil { + if err := airconfig.PersistConfig(); err != nil { // Error that it didnt persist the changes return modified, ErrConfigFailed{} } @@ -77,7 +77,7 @@ func RunUseContext(desiredContext string, airconfig *Config) error { if airconfig.CurrentContext != desiredContext { airconfig.CurrentContext = desiredContext - if err := airconfig.PersistConfig(false); err != nil { + if err := airconfig.PersistConfig(); err != nil { return err } } @@ -107,7 +107,7 @@ func RunSetManifest(o *ManifestOptions, airconfig *Config, writeToStorage bool) } // Update configuration file just in time persistence approach if writeToStorage { - if err := airconfig.PersistConfig(true); err != nil { + if err := airconfig.PersistConfig(); err != nil { // Error that it didnt persist the changes return modified, ErrConfigFailed{} } @@ -138,7 +138,7 @@ func RunSetEncryptionConfig(o *EncryptionConfigOptions, airconfig *Config, write } // Update configuration file just in time persistence approach if writeToStorage { - if err := airconfig.PersistConfig(false); err != nil { + if err := airconfig.PersistConfig(); err != nil { // Error that it didnt persist the changes return modified, ErrConfigFailed{} } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 2cee66f2f..bfd1ef553 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -98,16 +98,12 @@ func TestPersistConfig(t *testing.T) { defer cleanup(t) conf.SetLoadedConfigPath(conf.LoadedConfigPath() + ".new") - conf.SetKubeConfigPath(conf.KubeConfigPath() + ".new") - err := conf.PersistConfig(true) + err := conf.PersistConfig() require.NoError(t, err) // Check that the files were created assert.FileExists(t, conf.LoadedConfigPath()) - assert.FileExists(t, conf.KubeConfigPath()) - // Check that the invalid name was changed to a valid one - assert.Contains(t, conf.KubeConfig().Clusters, "def_ephemeral") } func TestEnsureComplete(t *testing.T) { @@ -208,7 +204,7 @@ func TestPurge(t *testing.T) { defer cleanup(t) // Store it - err := conf.PersistConfig(true) + err := conf.PersistConfig() assert.NoErrorf(t, err, "Unable to persist configuration expected at %v", conf.LoadedConfigPath()) // Verify that the file is there @@ -236,17 +232,6 @@ func TestSetLoadedConfigPath(t *testing.T) { assert.Equal(t, testPath, conf.LoadedConfigPath()) } -func TestSetKubeConfigPath(t *testing.T) { - conf, cleanup := testutil.InitConfig(t) - defer cleanup(t) - - testPath := "/tmp/kubeconfig" - - assert.NotEqual(t, testPath, conf.KubeConfigPath()) - conf.SetKubeConfigPath(testPath) - assert.Equal(t, testPath, conf.KubeConfigPath()) -} - func TestGetContexts(t *testing.T) { conf, cleanup := testutil.InitConfig(t) defer cleanup(t) @@ -297,14 +282,10 @@ func TestGetCurrentContext(t *testing.T) { conf, cleanup := testutil.InitConfig(t) defer cleanup(t) - context, err := conf.GetCurrentContext() - require.Error(t, err) - assert.Nil(t, context) - conf.CurrentContext = currentContextName conf.Contexts[currentContextName].Manifest = defaultString - context, err = conf.GetCurrentContext() + context, err := conf.GetCurrentContext() require.NoError(t, err) assert.Equal(t, conf.Contexts[currentContextName], context) }) @@ -314,14 +295,10 @@ func TestCurrentContextManifest(t *testing.T) { conf, cleanup := testutil.InitConfig(t) defer cleanup(t) - manifest, err := conf.CurrentContextManifest() - require.Error(t, err) - assert.Nil(t, manifest) - conf.CurrentContext = currentContextName conf.Contexts[currentContextName].Manifest = defaultString - manifest, err = conf.CurrentContextManifest() + manifest, err := conf.CurrentContextManifest() require.NoError(t, err) assert.Equal(t, conf.Manifests[defaultString], manifest) } @@ -330,10 +307,6 @@ func TestCurrentTargetPath(t *testing.T) { conf, cleanup := testutil.InitConfig(t) defer cleanup(t) - manifest, err := conf.CurrentContextManifest() - require.Error(t, err) - assert.Nil(t, manifest) - conf.CurrentContext = currentContextName conf.Contexts[currentContextName].Manifest = defaultString @@ -364,10 +337,6 @@ func TestCurrentContextClusterType(t *testing.T) { expectedClusterType := "ephemeral" - clusterTypeEmpty, err := conf.CurrentContextClusterType() - require.Error(t, err) - assert.Equal(t, "", clusterTypeEmpty) - conf.CurrentContext = currentContextName conf.Contexts[currentContextName].Manifest = defaultString @@ -382,10 +351,6 @@ func TestCurrentContextClusterName(t *testing.T) { expectedClusterName := "def" - clusterNameEmpty, err := conf.CurrentContextClusterName() - require.Error(t, err) - assert.Equal(t, "", clusterNameEmpty) - conf.CurrentContext = currentContextName conf.Contexts[currentContextName].Manifest = defaultString diff --git a/pkg/k8s/client/client.go b/pkg/k8s/client/client.go index 2f0a140dd..671cc414e 100644 --- a/pkg/k8s/client/client.go +++ b/pkg/k8s/client/client.go @@ -22,7 +22,6 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" - "opendev.org/airship/airshipctl/pkg/config" "opendev.org/airship/airshipctl/pkg/k8s/kubectl" k8sutils "opendev.org/airship/airshipctl/pkg/k8s/utils" ) @@ -55,20 +54,20 @@ type Client struct { var _ Interface = &Client{} // Factory is a function which creates Interfaces -type Factory func(*config.Config) (Interface, error) +type Factory func(airshipConfigPath string, kubeconfig string) (Interface, error) // DefaultClient is a factory which generates a default client var DefaultClient Factory = NewClient // NewClient creates a Client initialized from the passed in settings -func NewClient(cfg *config.Config) (Interface, error) { +func NewClient(airshipConfigPath string, kubeconfig string) (Interface, error) { client := new(Client) var err error // TODO add support for kubeconfig context, for now use current context - f := k8sutils.FactoryFromKubeConfig(cfg.KubeConfigPath(), "") + f := k8sutils.FactoryFromKubeConfig(kubeconfig, "") - pathToBufferDir := filepath.Dir(cfg.LoadedConfigPath()) + pathToBufferDir := filepath.Dir(airshipConfigPath) client.kubectl = kubectl.NewKubectl(f).WithBufferDir(pathToBufferDir) client.clientSet, err = f.KubernetesClientSet() @@ -82,7 +81,7 @@ func NewClient(cfg *config.Config) (Interface, error) { } // kubectl factories can't create CRD clients... - kubeConfig, err := clientcmd.BuildConfigFromFlags("", cfg.KubeConfigPath()) + kubeConfig, err := clientcmd.BuildConfigFromFlags("", kubeconfig) if err != nil { return nil, err } diff --git a/pkg/k8s/client/client_test.go b/pkg/k8s/client/client_test.go index 926e6d6dd..f5eba96ce 100644 --- a/pkg/k8s/client/client_test.go +++ b/pkg/k8s/client/client_test.go @@ -41,9 +41,8 @@ func TestNewClient(t *testing.T) { require.NoError(t, err) conf.SetLoadedConfigPath(adir) - conf.SetKubeConfigPath(akp) - client, err := client.NewClient(conf) + client, err := client.NewClient(conf.LoadedConfigPath(), akp) assert.NoError(t, err) assert.NotNil(t, client) assert.NotNil(t, client.ClientSet()) diff --git a/pkg/phase/client.go b/pkg/phase/client.go index a9c674845..a7a2cbf0c 100644 --- a/pkg/phase/client.go +++ b/pkg/phase/client.go @@ -55,10 +55,11 @@ var _ ifc.Phase = &phase{} // Phase implements phase interface type phase struct { - helper ifc.Helper - apiObj *v1alpha1.Phase - registry ExecutorRegistry - processor events.EventProcessor + helper ifc.Helper + apiObj *v1alpha1.Phase + registry ExecutorRegistry + processor events.EventProcessor + kubeconfig string } // Executor returns executor interface associated with the phase @@ -96,6 +97,7 @@ func (p *phase) Executor() (ifc.Executor, error) { WithBundle(p.helper.PhaseRoot()). WithClusterMap(cMap). WithClusterName(p.apiObj.ClusterName). + WithPath(p.kubeconfig). WithTempRoot(wd). Build() @@ -169,6 +171,7 @@ type client struct { registry ExecutorRegistry processorFunc ProcessorFunc + kubeconfig string } // ProcessorFunc that returns processor interface @@ -191,6 +194,13 @@ func InjectRegistry(registry ExecutorRegistry) Option { } } +// InjectKubeconfigPath is an option that allows to inject path to kubeconfig into phase client +func InjectKubeconfigPath(path string) Option { + return func(c *client) { + c.kubeconfig = path + } +} + // NewClient returns implementation of phase Client interface func NewClient(helper ifc.Helper, opts ...Option) ifc.Client { c := &client{Helper: helper} diff --git a/pkg/phase/command.go b/pkg/phase/command.go index 3a99db012..17f9236a8 100644 --- a/pkg/phase/command.go +++ b/pkg/phase/command.go @@ -24,9 +24,10 @@ import ( // RunFlags options for phase run command type RunFlags struct { - DryRun bool - Timeout time.Duration - PhaseID ifc.ID + DryRun bool + Timeout time.Duration + PhaseID ifc.ID + Kubeconfig string } // RunCommand phase run command @@ -47,7 +48,8 @@ func (c *RunCommand) RunE() error { return err } - client := NewClient(helper) + kubeconfigOption := InjectKubeconfigPath(c.Options.Kubeconfig) + client := NewClient(helper, kubeconfigOption) phase, err := client.PhaseByID(c.Options.PhaseID) if err != nil { diff --git a/pkg/phase/ifc/executor.go b/pkg/phase/ifc/executor.go index b488cdca2..a1f6f8fde 100644 --- a/pkg/phase/ifc/executor.go +++ b/pkg/phase/ifc/executor.go @@ -34,7 +34,6 @@ type Executor interface { // RunOptions holds options for run method type RunOptions struct { - Debug bool DryRun bool Timeout time.Duration diff --git a/testutil/testconfig.go b/testutil/testconfig.go index 7e68f5a29..acd8efc30 100644 --- a/testutil/testconfig.go +++ b/testutil/testconfig.go @@ -1,17 +1,15 @@ /* -Copyright 2014 The Kubernetes Authors. + Licensed 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 -Licensed 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 + https://www.apache.org/licenses/LICENSE-2.0 - 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. + 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 testutil @@ -21,8 +19,6 @@ import ( "path/filepath" "testing" - kubeconfig "k8s.io/client-go/tools/clientcmd/api" - "github.com/stretchr/testify/require" "opendev.org/airship/airshipctl/pkg/config" @@ -54,7 +50,6 @@ func DummyConfig() *config.Config { }, CurrentContext: "dummy_context", } - conf.SetKubeConfig(kubeconfig.NewConfig()) return conf } @@ -124,16 +119,12 @@ func InitConfig(t *testing.T) (conf *config.Config, cleanup func(*testing.T)) { err := ioutil.WriteFile(configPath, []byte(testConfigYAML), 0600) require.NoError(t, err) - kubeConfigPath := filepath.Join(testDir, "kubeconfig") - err = ioutil.WriteFile(kubeConfigPath, []byte(testKubeConfigYAML), 0600) - require.NoError(t, err) - conf = config.NewConfig() - err = conf.LoadConfig(configPath, kubeConfigPath, false) + cfg, err := config.CreateFactory(&configPath)() require.NoError(t, err) - return conf, cleanup + return cfg, cleanup } // DummyContextOptions creates ContextOptions config object @@ -197,70 +188,14 @@ const ( contexts: def_ephemeral: contextKubeconf: def_ephemeral + manifest: dummy_manifest def_target: contextKubeconf: def_target onlyink: contextKubeconf: onlyinkubeconf_target encryptionConfigs: {} -currentContext: "" +currentContext: def_ephemeral kind: Config -manifests: {}` - - //nolint:lll - testKubeConfigYAML = `apiVersion: v1 -clusters: -- cluster: - insecure-skip-tls-verify: true - server: http://5.6.7.8 - name: def_ephemeral -- cluster: - insecure-skip-tls-verify: true - server: http://1.2.3.4 - name: def_target -- cluster: - insecure-skip-tls-verify: true - server: http://9.10.11.12 - name: onlyinkubeconf_target -- cluster: - certificate-authority: cert_file - server: "" - name: wrongonlyinkubeconf_target -- cluster: - insecure-skip-tls-verify: true - server: http://9.10.11.12 - name: invalidName -- cluster: - insecure-skip-tls-verify: true - server: http://9.10.11.12 - name: clustertypenil_target -contexts: -- context: - cluster: def_ephemeral - user: k-admin - name: def_ephemeral -- context: - cluster: def_target - user: k-admin - name: def_target -- context: - cluster: onlyinkubeconf_target - user: k-other - name: onlyink -current-context: "" -kind: Config -preferences: {} -users: -users: -- name: def-user - user: - username: dummy_username - password: ZHVtbXlfcGFzc3dvcmQK -- name: k-admin - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQXhEdzk2RUY4SXN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T1RBNU1qa3hOekF6TURsYUZ3MHlNREE1TWpneE56QXpNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6R0pZdlBaNkRvaTQyMUQKSzhXSmFaQ25OQWQycXo1cC8wNDJvRnpRUGJyQWd6RTJxWVZrek9MOHhBVmVSN1NONXdXb1RXRXlGOEVWN3JyLwo0K0hoSEdpcTVQbXF1SUZ5enpuNi9JWmM4alU5eEVmenZpa2NpckxmVTR2UlhKUXdWd2dBU05sMkFXQUloMmRECmRUcmpCQ2ZpS1dNSHlqMFJiSGFsc0J6T3BnVC9IVHYzR1F6blVRekZLdjJkajVWMU5rUy9ESGp5UlJKK0VMNlEKQlltR3NlZzVQNE5iQzllYnVpcG1NVEFxL0p1bU9vb2QrRmpMMm5acUw2Zkk2ZkJ0RjVPR2xwQ0IxWUo4ZnpDdApHUVFaN0hUSWJkYjJ0cDQzRlZPaHlRYlZjSHFUQTA0UEoxNSswV0F5bVVKVXo4WEE1NDRyL2J2NzRKY0pVUkZoCmFyWmlRd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFMMmhIUmVibEl2VHJTMFNmUVg1RG9ueVVhNy84aTg1endVWApSd3dqdzFuS0U0NDJKbWZWRGZ5b0hRYUM4Ti9MQkxyUXM0U0lqU1JYdmFHU1dSQnRnT1RRV21Db1laMXdSbjdwCndDTXZQTERJdHNWWm90SEZpUFl2b1lHWFFUSXA3YlROMmg1OEJaaEZ3d25nWUovT04zeG1rd29IN1IxYmVxWEYKWHF1TTluekhESk41VlZub1lQR09yRHMwWlg1RnNxNGtWVU0wVExNQm9qN1ZIRDhmU0E5RjRYNU4yMldsZnNPMAo4aksrRFJDWTAyaHBrYTZQQ0pQS0lNOEJaMUFSMG9ZakZxT0plcXpPTjBqcnpYWHh4S2pHVFVUb1BldVA5dCtCCjJOMVA1TnI4a2oxM0lrend5Q1NZclFVN09ZM3ltZmJobHkrcXZxaFVFa014MlQ1SkpmQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBdXpHSll2UFo2RG9pNDIxREs4V0phWkNuTkFkMnF6NXAvMDQyb0Z6UVBickFnekUyCnFZVmt6T0w4eEFWZVI3U041d1dvVFdFeUY4RVY3cnIvNCtIaEhHaXE1UG1xdUlGeXp6bjYvSVpjOGpVOXhFZnoKdmlrY2lyTGZVNHZSWEpRd1Z3Z0FTTmwyQVdBSWgyZERkVHJqQkNmaUtXTUh5ajBSYkhhbHNCek9wZ1QvSFR2MwpHUXpuVVF6Rkt2MmRqNVYxTmtTL0RIanlSUkorRUw2UUJZbUdzZWc1UDROYkM5ZWJ1aXBtTVRBcS9KdW1Pb29kCitGakwyblpxTDZmSTZmQnRGNU9HbHBDQjFZSjhmekN0R1FRWjdIVEliZGIydHA0M0ZWT2h5UWJWY0hxVEEwNFAKSjE1KzBXQXltVUpVejhYQTU0NHIvYnY3NEpjSlVSRmhhclppUXdJREFRQUJBb0lCQVFDU0pycjlaeVpiQ2dqegpSL3VKMFZEWCt2aVF4c01BTUZyUjJsOE1GV3NBeHk1SFA4Vk4xYmc5djN0YUVGYnI1U3hsa3lVMFJRNjNQU25DCm1uM3ZqZ3dVQWlScllnTEl5MGk0UXF5VFBOU1V4cnpTNHRxTFBjM3EvSDBnM2FrNGZ2cSsrS0JBUUlqQnloamUKbnVFc1JpMjRzT3NESlM2UDE5NGlzUC9yNEpIM1M5bFZGbkVuOGxUR2c0M1kvMFZoMXl0cnkvdDljWjR5ZUNpNwpjMHFEaTZZcXJZaFZhSW9RRW1VQjdsbHRFZkZzb3l4VDR6RTE5U3pVbkRoMmxjYTF1TzhqcmI4d2xHTzBoQ2JyClB1R1l2WFFQa3Q0VlNmalhvdGJ3d2lBNFRCVERCRzU1bHp6MmNKeS9zSS8zSHlYbEMxcTdXUmRuQVhhZ1F0VzkKOE9DZGRkb0JBb0dCQU5NcUNtSW94REtyckhZZFRxT1M1ZFN4cVMxL0NUN3ZYZ0pScXBqd2Y4WHA2WHo0KzIvTAozVXFaVDBEL3dGTkZkc1Z4eFYxMnNYMUdwMHFWZVlKRld5OVlCaHVSWGpTZ0ZEWldSY1Z1Y01sNVpPTmJsbmZGCjVKQ0xnNXFMZ1g5VTNSRnJrR3A0R241UDQxamg4TnhKVlhzZG5xWE9xNTFUK1RRT1UzdkpGQjc1QW9HQkFPTHcKalp1cnZtVkZyTHdaVGgvRDNpWll5SVV0ZUljZ2NKLzlzbTh6L0pPRmRIbFd4dGRHUFVzYVd1MnBTNEhvckFtbgpqTm4vSTluUXd3enZ3MWUzVVFPbUhMRjVBczk4VU5hbk5TQ0xNMW1yaXZHRXJ1VHFnTDM1bU41eFZPdTUxQU5JCm4yNkFtODBJT2JDeEtLa0R0ZXJSaFhHd3g5c1pONVJCbG9VRThZNGJBb0dBQ3ZsdVhMZWRxcng5VkE0bDNoNXUKVDJXRVUxYjgxZ1orcmtRc1I1S0lNWEw4cllBTElUNUpHKzFuendyN3BkaEFXZmFWdVV2SDRhamdYT0h6MUs5aQpFODNSVTNGMG9ldUg0V01PY1RwU0prWm0xZUlXcWRiaEVCb1FGdUlWTXRib1BsV0d4ZUhFRHJoOEtreGp4aThSCmdEcUQyajRwY1IzQ0g5QjJ5a0lqQjVFQ2dZRUExc0xXLys2enE1c1lNSm14K1JXZThhTXJmL3pjQnVTSU1LQWgKY0dNK0wwMG9RSHdDaUU4TVNqcVN1ajV3R214YUFuanhMb3ZwSFlRV1VmUEVaUW95UE1YQ2VhRVBLOU4xbk8xMwp0V2lHRytIZkIxaU5PazFCc0lhNFNDbndOM1FRVTFzeXBaeEgxT3hueS9LYmkvYmEvWEZ5VzNqMGFUK2YvVWxrCmJGV1ZVdWtDZ1lFQTBaMmRTTFlmTjV5eFNtYk5xMWVqZXdWd1BjRzQxR2hQclNUZEJxdHFac1doWGE3aDdLTWEKeHdvamh5SXpnTXNyK2tXODdlajhDQ2h0d21sQ1p5QU92QmdOZytncnJ1cEZLM3FOSkpKeU9YREdHckdpbzZmTQp5aXB3Q2tZVGVxRThpZ1J6UkI5QkdFUGY4eVpjMUtwdmZhUDVhM0lRZmxiV0czbGpUemNNZVZjPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= -- name: k-other - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQXhEdzk2RUY4SXN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T1RBNU1qa3hOekF6TURsYUZ3MHlNREE1TWpneE56QXpNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6R0pZdlBaNkRvaTQyMUQKSzhXSmFaQ25OQWQycXo1cC8wNDJvRnpRUGJyQWd6RTJxWVZrek9MOHhBVmVSN1NONXdXb1RXRXlGOEVWN3JyLwo0K0hoSEdpcTVQbXF1SUZ5enpuNi9JWmM4alU5eEVmenZpa2NpckxmVTR2UlhKUXdWd2dBU05sMkFXQUloMmRECmRUcmpCQ2ZpS1dNSHlqMFJiSGFsc0J6T3BnVC9IVHYzR1F6blVRekZLdjJkajVWMU5rUy9ESGp5UlJKK0VMNlEKQlltR3NlZzVQNE5iQzllYnVpcG1NVEFxL0p1bU9vb2QrRmpMMm5acUw2Zkk2ZkJ0RjVPR2xwQ0IxWUo4ZnpDdApHUVFaN0hUSWJkYjJ0cDQzRlZPaHlRYlZjSHFUQTA0UEoxNSswV0F5bVVKVXo4WEE1NDRyL2J2NzRKY0pVUkZoCmFyWmlRd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFMMmhIUmVibEl2VHJTMFNmUVg1RG9ueVVhNy84aTg1endVWApSd3dqdzFuS0U0NDJKbWZWRGZ5b0hRYUM4Ti9MQkxyUXM0U0lqU1JYdmFHU1dSQnRnT1RRV21Db1laMXdSbjdwCndDTXZQTERJdHNWWm90SEZpUFl2b1lHWFFUSXA3YlROMmg1OEJaaEZ3d25nWUovT04zeG1rd29IN1IxYmVxWEYKWHF1TTluekhESk41VlZub1lQR09yRHMwWlg1RnNxNGtWVU0wVExNQm9qN1ZIRDhmU0E5RjRYNU4yMldsZnNPMAo4aksrRFJDWTAyaHBrYTZQQ0pQS0lNOEJaMUFSMG9ZakZxT0plcXpPTjBqcnpYWHh4S2pHVFVUb1BldVA5dCtCCjJOMVA1TnI4a2oxM0lrend5Q1NZclFVN09ZM3ltZmJobHkrcXZxaFVFa014MlQ1SkpmQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBdXpHSll2UFo2RG9pNDIxREs4V0phWkNuTkFkMnF6NXAvMDQyb0Z6UVBickFnekUyCnFZVmt6T0w4eEFWZVI3U041d1dvVFdFeUY4RVY3cnIvNCtIaEhHaXE1UG1xdUlGeXp6bjYvSVpjOGpVOXhFZnoKdmlrY2lyTGZVNHZSWEpRd1Z3Z0FTTmwyQVdBSWgyZERkVHJqQkNmaUtXTUh5ajBSYkhhbHNCek9wZ1QvSFR2MwpHUXpuVVF6Rkt2MmRqNVYxTmtTL0RIanlSUkorRUw2UUJZbUdzZWc1UDROYkM5ZWJ1aXBtTVRBcS9KdW1Pb29kCitGakwyblpxTDZmSTZmQnRGNU9HbHBDQjFZSjhmekN0R1FRWjdIVEliZGIydHA0M0ZWT2h5UWJWY0hxVEEwNFAKSjE1KzBXQXltVUpVejhYQTU0NHIvYnY3NEpjSlVSRmhhclppUXdJREFRQUJBb0lCQVFDU0pycjlaeVpiQ2dqegpSL3VKMFZEWCt2aVF4c01BTUZyUjJsOE1GV3NBeHk1SFA4Vk4xYmc5djN0YUVGYnI1U3hsa3lVMFJRNjNQU25DCm1uM3ZqZ3dVQWlScllnTEl5MGk0UXF5VFBOU1V4cnpTNHRxTFBjM3EvSDBnM2FrNGZ2cSsrS0JBUUlqQnloamUKbnVFc1JpMjRzT3NESlM2UDE5NGlzUC9yNEpIM1M5bFZGbkVuOGxUR2c0M1kvMFZoMXl0cnkvdDljWjR5ZUNpNwpjMHFEaTZZcXJZaFZhSW9RRW1VQjdsbHRFZkZzb3l4VDR6RTE5U3pVbkRoMmxjYTF1TzhqcmI4d2xHTzBoQ2JyClB1R1l2WFFQa3Q0VlNmalhvdGJ3d2lBNFRCVERCRzU1bHp6MmNKeS9zSS8zSHlYbEMxcTdXUmRuQVhhZ1F0VzkKOE9DZGRkb0JBb0dCQU5NcUNtSW94REtyckhZZFRxT1M1ZFN4cVMxL0NUN3ZYZ0pScXBqd2Y4WHA2WHo0KzIvTAozVXFaVDBEL3dGTkZkc1Z4eFYxMnNYMUdwMHFWZVlKRld5OVlCaHVSWGpTZ0ZEWldSY1Z1Y01sNVpPTmJsbmZGCjVKQ0xnNXFMZ1g5VTNSRnJrR3A0R241UDQxamg4TnhKVlhzZG5xWE9xNTFUK1RRT1UzdkpGQjc1QW9HQkFPTHcKalp1cnZtVkZyTHdaVGgvRDNpWll5SVV0ZUljZ2NKLzlzbTh6L0pPRmRIbFd4dGRHUFVzYVd1MnBTNEhvckFtbgpqTm4vSTluUXd3enZ3MWUzVVFPbUhMRjVBczk4VU5hbk5TQ0xNMW1yaXZHRXJ1VHFnTDM1bU41eFZPdTUxQU5JCm4yNkFtODBJT2JDeEtLa0R0ZXJSaFhHd3g5c1pONVJCbG9VRThZNGJBb0dBQ3ZsdVhMZWRxcng5VkE0bDNoNXUKVDJXRVUxYjgxZ1orcmtRc1I1S0lNWEw4cllBTElUNUpHKzFuendyN3BkaEFXZmFWdVV2SDRhamdYT0h6MUs5aQpFODNSVTNGMG9ldUg0V01PY1RwU0prWm0xZUlXcWRiaEVCb1FGdUlWTXRib1BsV0d4ZUhFRHJoOEtreGp4aThSCmdEcUQyajRwY1IzQ0g5QjJ5a0lqQjVFQ2dZRUExc0xXLys2enE1c1lNSm14K1JXZThhTXJmL3pjQnVTSU1LQWgKY0dNK0wwMG9RSHdDaUU4TVNqcVN1ajV3R214YUFuanhMb3ZwSFlRV1VmUEVaUW95UE1YQ2VhRVBLOU4xbk8xMwp0V2lHRytIZkIxaU5PazFCc0lhNFNDbndOM1FRVTFzeXBaeEgxT3hueS9LYmkvYmEvWEZ5VzNqMGFUK2YvVWxrCmJGV1ZVdWtDZ1lFQTBaMmRTTFlmTjV5eFNtYk5xMWVqZXdWd1BjRzQxR2hQclNUZEJxdHFac1doWGE3aDdLTWEKeHdvamh5SXpnTXNyK2tXODdlajhDQ2h0d21sQ1p5QU92QmdOZytncnJ1cEZLM3FOSkpKeU9YREdHckdpbzZmTQp5aXB3Q2tZVGVxRThpZ1J6UkI5QkdFUGY4eVpjMUtwdmZhUDVhM0lRZmxiV0czbGpUemNNZVZjPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=` +manifests: + dummy_manifest: {}` ) diff --git a/testutil/testdatafs.go b/testutil/testdatafs.go index 2667910e4..3c08875da 100644 --- a/testutil/testdatafs.go +++ b/testutil/testdatafs.go @@ -1,3 +1,17 @@ +/* + Licensed 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 + + https://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 testutil import ( diff --git a/tools/document/validate_site_docs.sh b/tools/document/validate_site_docs.sh index 91d003ffe..9be328c18 100755 --- a/tools/document/validate_site_docs.sh +++ b/tools/document/validate_site_docs.sh @@ -115,7 +115,7 @@ for cluster in ephemeral target; do # step 1: actually apply all crds in the phase # TODO: will need to loop through phases in order, eventually # e.g., load CRDs from initinfra first, so they're present when validating later phases - ${ACTL} phase render ${phase} -k CustomResourceDefinition > ${TMP}/${phase}-crds.yaml + ${AIRSHIPCTL} --airshipconf ${AIRSHIPCONFIG} phase render ${phase} -k CustomResourceDefinition > ${TMP}/${phase}-crds.yaml if [ -s ${TMP}/${phase}-crds.yaml ]; then ${KUBECTL} --context ${CONTEXT} --kubeconfig ${KUBECONFIG} apply -f ${TMP}/${phase}-crds.yaml fi