This commit prevents NewConfig from returning errors

Prior to this commit, NewConfig was setting up a new Config object and
filling it with a new kubeconfig object. The process for creating a
kubeconfig object has the potential to return an error. This commit
removes the creation of that object from NewConfig, delegating creation
of kubeconfig objects to more appropriate functions, such as LoadConfig.

Change-Id: I57a040f2e76bbc003eb82171f382e80425b37870
This commit is contained in:
Ian Howell 2019-11-07 10:28:59 -06:00
parent 915c47506b
commit e48b436680
4 changed files with 41 additions and 42 deletions

View File

@ -37,7 +37,6 @@ import (
// Called from root to Load the initial configuration // Called from root to Load the initial configuration
func (c *Config) LoadConfig(configFileArg string, kPathOptions *clientcmd.PathOptions) error { func (c *Config) LoadConfig(configFileArg string, kPathOptions *clientcmd.PathOptions) error {
err := c.loadFromAirConfig(configFileArg) err := c.loadFromAirConfig(configFileArg)
if err != nil { if err != nil {
return err return err
@ -49,9 +48,8 @@ func (c *Config) LoadConfig(configFileArg string, kPathOptions *clientcmd.PathOp
return err return err
} }
// Lets navigate through the kConfig to populate the references in airship config // Lets navigate through the kubeconfig to populate the references in airship config
return c.reconcileConfig() return c.reconcileConfig()
} }
func (c *Config) loadFromAirConfig(configFileArg string) error { func (c *Config) loadFromAirConfig(configFileArg string) error {

View File

@ -37,18 +37,28 @@ const (
// DummyConfig used by tests, to initialize min set of data // DummyConfig used by tests, to initialize min set of data
func DummyConfig() *Config { func DummyConfig() *Config {
conf := NewConfig() conf := &Config{
// Make sure the .airship directory is created Kind: AirshipConfigKind,
//conf.ConfigFilePath() APIVersion: AirshipConfigApiVersion,
conf.Clusters["dummy_cluster"] = DummyClusterPurpose() Clusters: map[string]*ClusterPurpose{
conf.KubeConfig().Clusters["dummycluster_target"] = conf.Clusters["dummy_cluster"].ClusterTypes[Target].KubeCluster() "dummy_cluster": DummyClusterPurpose(),
conf.KubeConfig().Clusters["dummycluster_ephemeral"] = },
conf.Clusters["dummy_cluster"].ClusterTypes[Ephemeral].KubeCluster() AuthInfos: map[string]*AuthInfo{
conf.AuthInfos["dummy_user"] = DummyAuthInfo() "dummy_user": DummyAuthInfo(),
conf.Contexts["dummy_context"] = DummyContext() },
conf.Manifests["dummy_manifest"] = DummyManifest() Contexts: map[string]*Context{
conf.ModulesConfig = DummyModules() "dummy_context": DummyContext(),
conf.CurrentContext = "dummy_context" },
Manifests: map[string]*Manifest{
"dummy_manifest": DummyManifest(),
},
ModulesConfig: DummyModules(),
CurrentContext: "dummy_context",
kubeConfig: kubeconfig.NewConfig(),
}
dummyCluster := conf.Clusters["dummy_cluster"]
conf.KubeConfig().Clusters["dummycluster_target"] = dummyCluster.ClusterTypes[Target].KubeCluster()
conf.KubeConfig().Clusters["dummycluster_ephemeral"] = dummyCluster.ClusterTypes[Ephemeral].KubeCluster()
return conf return conf
} }
@ -111,10 +121,13 @@ func DummyClusterPurpose() *ClusterPurpose {
func InitConfigAt(t *testing.T, airConfigFile, kConfigFile string) *Config { func InitConfigAt(t *testing.T, airConfigFile, kConfigFile string) *Config {
conf := NewConfig() conf := NewConfig()
kubePathOptions := clientcmd.NewDefaultPathOptions() kubePathOptions := clientcmd.NewDefaultPathOptions()
kubePathOptions.GlobalFile = kConfigFile kubePathOptions.GlobalFile = kConfigFile
err := conf.LoadConfig(airConfigFile, kubePathOptions) err := conf.LoadConfig(airConfigFile, kubePathOptions)
require.NoError(t, err) require.NoError(t, err)
return conf return conf
} }
func InitConfig(t *testing.T) *Config { func InitConfig(t *testing.T) *Config {

View File

@ -16,30 +16,17 @@ limitations under the License.
package config package config
import ( // NewConfig returns a newly initialized Config object
"path/filepath"
"k8s.io/client-go/tools/clientcmd"
)
// NewConfig is a convenience function that returns a new Config
// object with non-nill maps
func NewConfig() *Config { func NewConfig() *Config {
conf := &Config{ return &Config{
Clusters: make(map[string]*ClusterPurpose), Kind: AirshipConfigKind,
Contexts: make(map[string]*Context), APIVersion: AirshipConfigApiVersion,
AuthInfos: make(map[string]*AuthInfo), Clusters: make(map[string]*ClusterPurpose),
Manifests: make(map[string]*Manifest), Contexts: make(map[string]*Context),
AuthInfos: make(map[string]*AuthInfo),
Manifests: make(map[string]*Manifest),
ModulesConfig: NewModules(),
} }
conf.ModulesConfig = NewModules()
conf.Kind = AirshipConfigKind
conf.APIVersion = AirshipConfigApiVersion
conf.loadedConfigPath = filepath.Join(AirshipConfigDir, AirshipConfig)
conf.loadedPathOptions = clientcmd.NewDefaultPathOptions()
conf.kubeConfig, _ = conf.loadedPathOptions.GetStartingConfig()
return conf
} }
// NewContext is a convenience function that returns a new Context // NewContext is a convenience function that returns a new Context

View File

@ -34,12 +34,12 @@ func (a *AirshipCTLSettings) InitFlags(cmd *cobra.Command) {
flags.StringVar(&a.kubeConfigPath, clientcmd.RecommendedConfigPathFlag, flags.StringVar(&a.kubeConfigPath, clientcmd.RecommendedConfigPathFlag,
filepath.Join(HomePlaceholder, config.AirshipConfigDir, config.AirshipKubeConfig), filepath.Join(HomePlaceholder, config.AirshipConfigDir, config.AirshipKubeConfig),
"Path to kubeconfig associated with airshipctl configuration.") "Path to kubeconfig associated with airshipctl configuration.")
} }
func (a *AirshipCTLSettings) Config() *config.Config { func (a *AirshipCTLSettings) Config() *config.Config {
return a.config return a.config
} }
func (a *AirshipCTLSettings) SetConfig(conf *config.Config) { func (a *AirshipCTLSettings) SetConfig(conf *config.Config) {
a.config = conf a.config = conf
} }
@ -47,30 +47,31 @@ func (a *AirshipCTLSettings) SetConfig(conf *config.Config) {
func (a *AirshipCTLSettings) AirshipConfigPath() string { func (a *AirshipCTLSettings) AirshipConfigPath() string {
return a.airshipConfigPath return a.airshipConfigPath
} }
func (a *AirshipCTLSettings) SetAirshipConfigPath(acp string) { func (a *AirshipCTLSettings) SetAirshipConfigPath(acp string) {
a.airshipConfigPath = acp a.airshipConfigPath = acp
} }
func (a *AirshipCTLSettings) KubeConfigPath() string { func (a *AirshipCTLSettings) KubeConfigPath() string {
return a.kubeConfigPath return a.kubeConfigPath
} }
func (a *AirshipCTLSettings) SetKubeConfigPath(kcp string) { func (a *AirshipCTLSettings) SetKubeConfigPath(kcp string) {
a.kubeConfigPath = kcp a.kubeConfigPath = kcp
} }
// InitConfig - Initializes and loads Config it exists. // InitConfig - Initializes and loads Config it exists.
func (a *AirshipCTLSettings) InitConfig() { func (a *AirshipCTLSettings) InitConfig() {
// Raw - Empty Config object
a.SetConfig(config.NewConfig()) a.SetConfig(config.NewConfig())
a.setAirshipConfigPath() a.setAirshipConfigPath()
//Pass the airshipConfigPath and kubeConfig object //Pass the airshipConfigPath and kubeConfig object
err := a.Config().LoadConfig(a.AirshipConfigPath(), a.setKubePathOptions()) err := a.Config().LoadConfig(a.AirshipConfigPath(), a.setKubePathOptions())
if err != nil { if err != nil {
// Should stop airshipctl // Should stop airshipctl
log.Fatal(err) log.Fatal(err)
} }
} }
func (a *AirshipCTLSettings) setAirshipConfigPath() { func (a *AirshipCTLSettings) setAirshipConfigPath() {
@ -113,8 +114,8 @@ func (a *AirshipCTLSettings) setKubePathOptions() *clientcmd.PathOptions {
kubePathOptions.GlobalFileSubpath = a.kubeConfigPath kubePathOptions.GlobalFileSubpath = a.kubeConfigPath
return kubePathOptions return kubePathOptions
} }
func (a *AirshipCTLSettings) replaceHomePlaceholder(configPath string) (string, string) { func (a *AirshipCTLSettings) replaceHomePlaceholder(configPath string) (string, string) {
home, err := os.UserHomeDir() home, err := os.UserHomeDir()
if err != nil { if err != nil {