Add management configuration module

Some management options are not directly related to the remote direct
functionality, and the remote direct config should not be validated when
they are needed. This change moves those management options to a
dedicated configuration module.

Change-Id: If4388bccbc70b2c77d7804cb4c38644775404242
Signed-off-by: Drew Walters <andrew.walters@att.com>
This commit is contained in:
Drew Walters 2020-04-17 19:59:38 +00:00
parent f555af3bf6
commit 0986773bdd
16 changed files with 126 additions and 3 deletions

View File

@ -2,6 +2,7 @@ Cluster: clusterBar
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBar_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -11,6 +12,7 @@ Cluster: clusterBar
target:
bootstrapInfo: ""
clusterKubeconf: clusterBar_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -20,6 +22,7 @@ Cluster: clusterBaz
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -29,6 +32,7 @@ Cluster: clusterBaz
target:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -38,6 +42,7 @@ Cluster: clusterFoo
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -47,6 +52,7 @@ Cluster: clusterFoo
target:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true

View File

@ -2,6 +2,7 @@ Cluster: clusterBar
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBar_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -11,6 +12,7 @@ Cluster: clusterBar
target:
bootstrapInfo: ""
clusterKubeconf: clusterBar_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -20,6 +22,7 @@ Cluster: clusterBaz
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -29,6 +32,7 @@ Cluster: clusterBaz
target:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -38,6 +42,7 @@ Cluster: clusterFoo
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -47,6 +52,7 @@ Cluster: clusterFoo
target:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true

View File

@ -2,6 +2,7 @@ Cluster: clusterFoo
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true

View File

@ -2,6 +2,7 @@ Cluster: clusterBar
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBar_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -11,6 +12,7 @@ Cluster: clusterBar
target:
bootstrapInfo: ""
clusterKubeconf: clusterBar_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -20,6 +22,7 @@ Cluster: clusterBaz
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -29,6 +32,7 @@ Cluster: clusterBaz
target:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -38,6 +42,7 @@ Cluster: clusterFoo
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -47,6 +52,7 @@ Cluster: clusterFoo
target:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true

View File

@ -2,6 +2,7 @@ Cluster: clusterBar
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBar_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -11,6 +12,7 @@ Cluster: clusterBar
target:
bootstrapInfo: ""
clusterKubeconf: clusterBar_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -20,6 +22,7 @@ Cluster: clusterBaz
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -29,6 +32,7 @@ Cluster: clusterBaz
target:
bootstrapInfo: ""
clusterKubeconf: clusterBaz_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -38,6 +42,7 @@ Cluster: clusterFoo
ephemeral:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_ephemeral
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true
@ -47,6 +52,7 @@ Cluster: clusterFoo
target:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true

View File

@ -2,6 +2,7 @@ Cluster: clusterFoo
target:
bootstrapInfo: ""
clusterKubeconf: clusterFoo_target
managementConfiguration: ""
LocationOfOrigin: ""
insecure-skip-tls-verify: true

View File

@ -727,6 +727,27 @@ func (c *Config) CurrentContextBootstrapInfo() (*Bootstrap, error) {
return bootstrap, nil
}
// CurrentContextManagementConfig returns the management options for the current context
func (c *Config) CurrentContextManagementConfig() (*ManagementConfiguration, error) {
currentCluster, err := c.CurrentContextCluster()
if err != nil {
return nil, err
}
if currentCluster.ManagementConfiguration == "" {
return nil, ErrMissingConfig{
What: fmt.Sprintf("No management config listed for cluster %s", currentCluster.NameInKubeconf),
}
}
managementCfg, exists := c.ManagementConfiguration[currentCluster.ManagementConfiguration]
if !exists {
return nil, ErrMissingManagementConfiguration{cluster: currentCluster}
}
return managementCfg, nil
}
// Purge removes the config file
func (c *Config) Purge() error {
return os.Remove(c.loadedConfigPath)
@ -824,6 +845,15 @@ func (b *Bootstrap) String() string {
return string(yamlData)
}
// Management Configuration functions
func (m *ManagementConfiguration) String() string {
yamlData, err := yaml.Marshal(&m)
if err != nil {
return ""
}
return string(yamlData)
}
// Container functions
func (c *Container) String() string {
yamlData, err := yaml.Marshal(&c)

View File

@ -77,6 +77,10 @@ func TestString(t *testing.T) {
name: "bootstrapinfo",
stringer: testutil.DummyBootstrapInfo(),
},
{
name: "managementconfiguration",
stringer: testutil.DummyManagementConfiguration(),
},
{
name: "builder",
stringer: &config.Builder{

View File

@ -111,6 +111,16 @@ func (e ErrMissingCurrentContext) Error() string {
return "Current context must be set before using --current flag"
}
// ErrMissingManagementConfiguration means the management configuration was not defined for the active cluster.
type ErrMissingManagementConfiguration struct {
cluster *Cluster
}
func (e ErrMissingManagementConfiguration) Error() string {
return fmt.Sprintf("Management configuration %s for cluster %s undefined.", e.cluster.ManagementConfiguration,
e.cluster.NameInKubeconf)
}
// ErrMissingPrimaryRepo returned when Primary Repository is not set in context manifest
type ErrMissingPrimaryRepo struct {
}

View File

@ -1,5 +1,6 @@
bootstrapInfo: dummy_bootstrap_config
clusterKubeconf: dummy_cluster_target
managementConfiguration: dummy_management_config
LocationOfOrigin: ""
certificate-authority: dummy_ca

View File

@ -15,15 +15,21 @@ clusters:
ephemeral:
bootstrapInfo: dummy_bootstrap_config
clusterKubeconf: dummy_cluster_ephemeral
managementConfiguration: dummy_management_config
target:
bootstrapInfo: dummy_bootstrap_config
clusterKubeconf: dummy_cluster_target
managementConfiguration: dummy_management_config
contexts:
dummy_context:
contextKubeconf: dummy_cluster_ephemeral
manifest: dummy_manifest
currentContext: dummy_context
kind: Config
managementConfiguration:
dummy_management_config:
insecure: true
type: redfish
manifests:
dummy_manifest:
primaryRepositoryName: primary

View File

@ -0,0 +1,2 @@
insecure: true
type: redfish

View File

@ -2,6 +2,7 @@ Cluster: dummy_cluster
target:
bootstrapInfo: dummy_bootstrap_config
clusterKubeconf: dummy_cluster_target
managementConfiguration: dummy_management_config
LocationOfOrigin: ""
certificate-authority: dummy_ca

View File

@ -49,6 +49,9 @@ type Config struct {
// CurrentContext is the name of the context that you would like to use by default
CurrentContext string `json:"currentContext"`
// Management configuration defines management information for all baremetal hosts in a cluster.
ManagementConfiguration map[string]*ManagementConfiguration `json:"managementConfiguration"`
// BootstrapInfo is the configuration for container runtime, ISO builder and remote management
BootstrapInfo map[string]*Bootstrap `json:"bootstrapInfo"`
@ -80,6 +83,9 @@ type Cluster struct {
// KubeConfig Cluster Object
cluster *kubeconfig.Cluster
// Management configuration which will be used for all hosts in the cluster
ManagementConfiguration string `json:"managementConfiguration"`
// Bootstrap configuration this clusters ephemeral hosts will rely on
Bootstrap string `json:"bootstrapInfo"`
}
@ -176,6 +182,18 @@ type ClusterComplexName struct {
Type string
}
// ManagementConfiguration defines configuration data for all remote systems within a context.
type ManagementConfiguration struct {
// Insecure indicates whether the SSL certificate should be checked on remote management requests.
Insecure bool `json:"insecure,omitempty"`
// Type indicates the type of out-of-band management that will be used for baremetal orchestration, e.g.
// redfish.
Type string `json:"type"`
// UseProxy indicates whether airshipctl should transmit remote management requests through a proxy server when
// one is configured in an environment.
UseProxy bool `json:"useproxy,omitempty"`
}
// Bootstrap holds configurations for bootstrap steps
type Bootstrap struct {
// Configuration parameters for container

View File

@ -16,7 +16,11 @@ limitations under the License.
package config
import "strings"
import (
"strings"
"opendev.org/airship/airshipctl/pkg/remote/redfish"
)
const (
DefaultTestPrimaryRepo = "primary"
@ -52,6 +56,13 @@ func NewConfig() *Config {
Manifest: AirshipDefaultManifest,
},
},
ManagementConfiguration: map[string]*ManagementConfiguration{
AirshipDefaultContext: {
Type: redfish.ClientType,
Insecure: true,
UseProxy: false,
},
},
Manifests: map[string]*Manifest{
AirshipDefaultManifest: {
Repositories: map[string]*Repository{

View File

@ -26,6 +26,7 @@ import (
"github.com/stretchr/testify/require"
"opendev.org/airship/airshipctl/pkg/config"
"opendev.org/airship/airshipctl/pkg/remote/redfish"
)
// types cloned directory from pkg/config/types to prevent circular import
@ -41,14 +42,17 @@ func DummyConfig() *config.Config {
AuthInfos: map[string]*config.AuthInfo{
"dummy_user": DummyAuthInfo(),
},
BootstrapInfo: map[string]*config.Bootstrap{
"dummy_bootstrap_config": DummyBootstrapInfo(),
},
Contexts: map[string]*config.Context{
"dummy_context": DummyContext(),
},
Manifests: map[string]*config.Manifest{
"dummy_manifest": DummyManifest(),
},
BootstrapInfo: map[string]*config.Bootstrap{
"dummy_bootstrap_config": DummyBootstrapInfo(),
ManagementConfiguration: map[string]*config.ManagementConfiguration{
"dummy_management_config": DummyManagementConfiguration(),
},
CurrentContext: "dummy_context",
}
@ -85,6 +89,7 @@ func DummyCluster() *config.Cluster {
c.SetKubeCluster(cluster)
c.NameInKubeconf = "dummy_cluster_target"
c.Bootstrap = "dummy_bootstrap_config"
c.ManagementConfiguration = "dummy_management_config"
return c
}
@ -248,6 +253,15 @@ func DummyBootstrapInfo() *config.Bootstrap {
return bs
}
// DummyManagementConfiguration creates a management configuration for unit testing
func DummyManagementConfiguration() *config.ManagementConfiguration {
return &config.ManagementConfiguration{
Type: redfish.ClientType,
Insecure: true,
UseProxy: false,
}
}
const (
testConfigYAML = `apiVersion: airshipit.org/v1alpha1
bootstrapInfo: