[#6] Add config init subcommand

This change introduces logic for the config init subcommand, which
generates an airshipctl configuration file with default values. The
default values are extracted from constants and change when the source
code is updated.

Closes #6

Change-Id: I452e26bc5a924f0cdcd3153a9b124d23e2e5b1f0
Signed-off-by: Drew Walters <andrew.walters@att.com>
This commit is contained in:
Drew Walters 2020-02-10 17:44:40 -06:00
parent f8a9a471d3
commit 5d83122b17
7 changed files with 85 additions and 17 deletions

1
.gitignore vendored
View File

@ -8,6 +8,7 @@ bin/
# Test binary, build wiith `go test -c` # Test binary, build wiith `go test -c`
*.test *.test
*.example
# Output of the go coverage tool # Output of the go coverage tool
*.out *.out

View File

@ -1,4 +1,4 @@
/*l /*
Copyright 2014 The Kubernetes Authors. Copyright 2014 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
@ -20,7 +20,6 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"opendev.org/airship/airshipctl/pkg/environment" "opendev.org/airship/airshipctl/pkg/environment"
"opendev.org/airship/airshipctl/pkg/errors"
) )
var ( var (
@ -33,7 +32,14 @@ func NewCmdConfigInit(rootSettings *environment.AirshipCTLSettings) *cobra.Comma
Use: "init", Use: "init",
Short: configInitLong, Short: configInitLong,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
return errors.ErrNotImplemented{} c := rootSettings.Config()
err := c.PersistConfig()
if err != nil {
return err
}
return nil
}, },
} }

View File

@ -19,17 +19,15 @@ package config
import ( import (
"testing" "testing"
"opendev.org/airship/airshipctl/pkg/errors"
"opendev.org/airship/airshipctl/testutil" "opendev.org/airship/airshipctl/testutil"
) )
func TestConfigInit(t *testing.T) { func TestConfigInit(t *testing.T) {
cmdTests := []*testutil.CmdTest{ cmdTests := []*testutil.CmdTest{
{ {
Name: "config-init", Name: "config-init-help",
CmdLine: "", CmdLine: "-h",
Cmd: NewCmdConfigInit(nil), Cmd: NewCmdConfigInit(nil),
Error: errors.ErrNotImplemented{},
}, },
} }

View File

@ -1,7 +1,7 @@
Error: Not implemented Generate initial configuration files for airshipctl
Usage: Usage:
init [flags] init [flags]
Flags: Flags:
-h, --help help for init -h, --help help for init

View File

@ -82,7 +82,25 @@ func (c *Config) loadKubeConfig(kubeConfigPath string) error {
// If I can read from the file, load from it // If I can read from the file, load from it
var err error var err error
if _, err = os.Stat(kubeConfigPath); os.IsNotExist(err) { if _, err = os.Stat(kubeConfigPath); os.IsNotExist(err) {
c.kubeConfig = clientcmdapi.NewConfig() // Default kubeconfig matching Airship target cluster
c.kubeConfig = &clientcmdapi.Config{
Clusters: map[string]*clientcmdapi.Cluster{
AirshipDefaultContext: {
Server: "https://172.17.0.1:6443",
},
},
AuthInfos: map[string]*clientcmdapi.AuthInfo{
"admin": {
Username: "airship-admin",
},
},
Contexts: map[string]*clientcmdapi.Context{
AirshipDefaultContext: {
Cluster: AirshipDefaultContext,
AuthInfo: "admin",
},
},
}
return nil return nil
} else if err != nil { } else if err != nil {
return err return err

View File

@ -27,6 +27,16 @@ const (
AirshipConfigEnv = "AIRSHIPCONFIG" AirshipConfigEnv = "AIRSHIPCONFIG"
AirshipKubeConfigEnv = "AIRSHIP_KUBECONFIG" AirshipKubeConfigEnv = "AIRSHIP_KUBECONFIG"
AirshipDefaultContext = "default"
AirshipDefaultManifest = "default"
AirshipDefaultManifestRepo = "treasuremap"
AirshipDefaultManifestRepoLocation = "https://opendev.org/airship/" + AirshipDefaultManifestRepo
// Modules
AirshipDefaultBootstrapImage = "quay.io/airshipit/isogen:latest"
AirshipDefaultIsoURL = "http://localhost:8099/debian-custom.iso"
AirshipDefaultRemoteType = "redfish"
) )
// Constants defining CLI flags // Constants defining CLI flags

View File

@ -19,13 +19,48 @@ package config
// NewConfig returns a newly initialized Config object // NewConfig returns a newly initialized Config object
func NewConfig() *Config { func NewConfig() *Config {
return &Config{ return &Config{
Kind: AirshipConfigKind, Kind: AirshipConfigKind,
APIVersion: AirshipConfigApiVersion, APIVersion: AirshipConfigApiVersion,
Clusters: make(map[string]*ClusterPurpose), Clusters: make(map[string]*ClusterPurpose),
Contexts: make(map[string]*Context), AuthInfos: make(map[string]*AuthInfo),
AuthInfos: make(map[string]*AuthInfo), Contexts: map[string]*Context{
Manifests: make(map[string]*Manifest), AirshipDefaultContext: {
ModulesConfig: NewModules(), Manifest: AirshipDefaultManifest,
},
},
Manifests: map[string]*Manifest{
AirshipDefaultManifest: {
Repository: &Repository{
URLString: AirshipDefaultManifestRepoLocation,
CheckoutOptions: &RepoCheckout{
CommitHash: "master",
Branch: "master",
RemoteRef: "master",
},
},
TargetPath: "/tmp/" + AirshipDefaultManifest,
},
},
ModulesConfig: &Modules{
BootstrapInfo: map[string]*Bootstrap{
AirshipDefaultContext: {
Container: &Container{
Volume: "/srv/iso:/config",
Image: AirshipDefaultBootstrapImage,
ContainerRuntime: "docker",
},
Builder: &Builder{
UserDataFileName: "user-data",
NetworkConfigFileName: "network-config",
OutputMetadataFileName: "output-metadata.yaml",
},
RemoteDirect: &RemoteDirect{
RemoteType: AirshipDefaultRemoteType,
IsoURL: AirshipDefaultIsoURL,
},
},
},
},
} }
} }