Implement airshipctl config import
Adds clusters, contexts and credentials from a kube config file to the airship config. In case of duplicate, the existing airship config values will take precedence. Closes: #153 Change-Id: Id09489f7546d8836be5b436071fec43fb99b997e
This commit is contained in:
parent
f844596a05
commit
078f6b027a
@ -35,6 +35,7 @@ func NewConfigCommand(rootSettings *environment.AirshipCTLSettings) *cobra.Comma
|
||||
configRootCmd.AddCommand(NewSetAuthInfoCommand(rootSettings))
|
||||
configRootCmd.AddCommand(NewGetAuthInfoCommand(rootSettings))
|
||||
configRootCmd.AddCommand(NewUseContextCommand(rootSettings))
|
||||
configRootCmd.AddCommand(NewImportCommand(rootSettings))
|
||||
|
||||
return configRootCmd
|
||||
}
|
||||
|
58
cmd/config/import.go
Normal file
58
cmd/config/import.go
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
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 config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"opendev.org/airship/airshipctl/pkg/environment"
|
||||
)
|
||||
|
||||
const (
|
||||
useImportLong = `
|
||||
Merge the clusters, contexts, and users from an existing kubeConfig file into the airshipctl config file.
|
||||
`
|
||||
|
||||
useImportExample = `
|
||||
# Import from a kubeConfig file"
|
||||
airshipctl config import $HOME/.kube/config
|
||||
`
|
||||
)
|
||||
|
||||
// NewImportCommand creates a command that merges clusters, contexts, and
|
||||
// users from a kubeConfig file into the airshipctl config file.
|
||||
func NewImportCommand(rootSettings *environment.AirshipCTLSettings) *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "import <kubeConfig>",
|
||||
Short: "Merge information from a kubernetes config file",
|
||||
Long: useImportLong[1:],
|
||||
Example: useImportExample,
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
kubeConfigPath := args[0]
|
||||
err := rootSettings.Config.ImportFromKubeConfig(kubeConfigPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Fprintf(cmd.OutOrStdout(), "Updated airship config with content imported from %q.\n", kubeConfigPath)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
return cmd
|
||||
}
|
53
cmd/config/import_test.go
Normal file
53
cmd/config/import_test.go
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
|
||||
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
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
package config_test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
cmd "opendev.org/airship/airshipctl/cmd/config"
|
||||
"opendev.org/airship/airshipctl/pkg/environment"
|
||||
"opendev.org/airship/airshipctl/testutil"
|
||||
)
|
||||
|
||||
func TestConfigImport(t *testing.T) {
|
||||
settings := &environment.AirshipCTLSettings{Config: testutil.DummyConfig()}
|
||||
|
||||
cmdTests := []*testutil.CmdTest{
|
||||
{
|
||||
Name: "config-import-with-help",
|
||||
CmdLine: "--help",
|
||||
Cmd: cmd.NewImportCommand(nil),
|
||||
},
|
||||
{
|
||||
Name: "config-import-no-args",
|
||||
CmdLine: "",
|
||||
Cmd: cmd.NewImportCommand(settings),
|
||||
Error: errors.New("accepts 1 arg(s), received 0"),
|
||||
},
|
||||
{
|
||||
Name: "config-import-file-does-not-exist",
|
||||
CmdLine: "foo",
|
||||
Cmd: cmd.NewImportCommand(settings),
|
||||
Error: errors.New("stat foo: no such file or directory"),
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range cmdTests {
|
||||
testutil.RunTest(t, tt)
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ Available Commands:
|
||||
get-context Get context information from the airshipctl config
|
||||
get-credentials Get user credentials from the airshipctl config
|
||||
help Help about any command
|
||||
import Merge information from a kubernetes config file
|
||||
init Generate initial configuration files for airshipctl
|
||||
set-cluster Manage clusters
|
||||
set-context Manage contexts
|
||||
|
13
cmd/config/testdata/TestConfigImportGoldenOutput/config-import-file-does-not-exist.golden
vendored
Normal file
13
cmd/config/testdata/TestConfigImportGoldenOutput/config-import-file-does-not-exist.golden
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
Error: stat foo: no such file or directory
|
||||
Usage:
|
||||
import <kubeConfig> [flags]
|
||||
|
||||
Examples:
|
||||
|
||||
# Import from a kubeConfig file"
|
||||
airshipctl config import $HOME/.kube/config
|
||||
|
||||
|
||||
Flags:
|
||||
-h, --help help for import
|
||||
|
13
cmd/config/testdata/TestConfigImportGoldenOutput/config-import-no-args.golden
vendored
Normal file
13
cmd/config/testdata/TestConfigImportGoldenOutput/config-import-no-args.golden
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
Error: accepts 1 arg(s), received 0
|
||||
Usage:
|
||||
import <kubeConfig> [flags]
|
||||
|
||||
Examples:
|
||||
|
||||
# Import from a kubeConfig file"
|
||||
airshipctl config import $HOME/.kube/config
|
||||
|
||||
|
||||
Flags:
|
||||
-h, --help help for import
|
||||
|
13
cmd/config/testdata/TestConfigImportGoldenOutput/config-import-with-help.golden
vendored
Normal file
13
cmd/config/testdata/TestConfigImportGoldenOutput/config-import-with-help.golden
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
Merge the clusters, contexts, and users from an existing kubeConfig file into the airshipctl config file.
|
||||
|
||||
Usage:
|
||||
import <kubeConfig> [flags]
|
||||
|
||||
Examples:
|
||||
|
||||
# Import from a kubeConfig file"
|
||||
airshipctl config import $HOME/.kube/config
|
||||
|
||||
|
||||
Flags:
|
||||
-h, --help help for import
|
@ -764,6 +764,93 @@ func (c *Config) ModifyAuthInfo(authinfo *AuthInfo, theAuthInfo *AuthInfoOptions
|
||||
}
|
||||
}
|
||||
|
||||
// ImportFromKubeconfig absorbs the clusters, contexts and credentials from the
|
||||
// given kubeConfig
|
||||
func (c *Config) ImportFromKubeConfig(kubeConfigPath string) error {
|
||||
_, err := os.Stat(kubeConfigPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
kubeConfig, err := clientcmd.LoadFromFile(kubeConfigPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.importClusters(kubeConfig)
|
||||
c.importContexts(kubeConfig)
|
||||
c.importAuthInfos(kubeConfig)
|
||||
return c.PersistConfig()
|
||||
}
|
||||
|
||||
func (c *Config) importClusters(importKubeConfig *clientcmdapi.Config) {
|
||||
for clusterName, cluster := range importKubeConfig.Clusters {
|
||||
clusterComplexName := NewClusterComplexNameFromKubeClusterName(clusterName)
|
||||
if _, err := c.GetCluster(clusterComplexName.Name, clusterComplexName.Type); err == nil {
|
||||
// err == nil implies that we were successfully able to
|
||||
// get the cluster from the existing configuration.
|
||||
// Since existing clusters takes precedence, skip this cluster
|
||||
continue
|
||||
}
|
||||
|
||||
// Initialize the new cluster for the airship configuration
|
||||
airshipCluster := NewCluster()
|
||||
airshipCluster.NameInKubeconf = clusterComplexName.String()
|
||||
// Store the reference to the KubeConfig Cluster in the Airship Config
|
||||
airshipCluster.SetKubeCluster(cluster)
|
||||
|
||||
// Update the airship configuration
|
||||
if _, ok := c.Clusters[clusterComplexName.Name]; !ok {
|
||||
c.Clusters[clusterComplexName.Name] = NewClusterPurpose()
|
||||
}
|
||||
c.Clusters[clusterComplexName.Name].ClusterTypes[clusterComplexName.Type] = airshipCluster
|
||||
c.kubeConfig.Clusters[clusterComplexName.String()] = cluster
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Config) importContexts(importKubeConfig *clientcmdapi.Config) {
|
||||
// TODO(howell): This function doesn't handle the case when an incoming
|
||||
// context refers to a cluster that doesn't exist in the airship
|
||||
// configuration.
|
||||
for kubeContextName, kubeContext := range importKubeConfig.Contexts {
|
||||
if _, ok := c.kubeConfig.Contexts[kubeContextName]; ok {
|
||||
// Since existing contexts take precedence, skip this context
|
||||
continue
|
||||
}
|
||||
|
||||
clusterComplexName := NewClusterComplexNameFromKubeClusterName(kubeContext.Cluster)
|
||||
if kubeContext.Cluster != clusterComplexName.String() {
|
||||
// If the name of cluster from the kubeConfig doesn't
|
||||
// match the clusterComplexName, it needs to be updated
|
||||
kubeContext.Cluster = clusterComplexName.String()
|
||||
}
|
||||
|
||||
airshipContext, ok := c.Contexts[kubeContextName]
|
||||
if !ok {
|
||||
airshipContext = NewContext()
|
||||
}
|
||||
airshipContext.NameInKubeconf = kubeContext.Cluster
|
||||
airshipContext.Manifest = AirshipDefaultManifest
|
||||
airshipContext.SetKubeContext(kubeContext)
|
||||
|
||||
// Store the contexts in the airship configuration
|
||||
c.Contexts[kubeContextName] = airshipContext
|
||||
c.kubeConfig.Contexts[kubeContextName] = kubeContext
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Config) importAuthInfos(importKubeConfig *clientcmdapi.Config) {
|
||||
for key, authinfo := range importKubeConfig.AuthInfos {
|
||||
if _, ok := c.AuthInfos[key]; ok {
|
||||
// Since existing credentials take precedence, skip this credential
|
||||
continue
|
||||
}
|
||||
|
||||
c.AuthInfos[key] = NewAuthInfo()
|
||||
c.AuthInfos[key].SetKubeAuthInfo(authinfo)
|
||||
c.kubeConfig.AuthInfos[key] = authinfo
|
||||
}
|
||||
}
|
||||
|
||||
// CurrentContextBootstrapInfo returns bootstrap info for current context
|
||||
func (c *Config) CurrentContextBootstrapInfo() (*Bootstrap, error) {
|
||||
currentCluster, err := c.CurrentContextCluster()
|
||||
|
@ -159,6 +159,5 @@ func RunUseContext(desiredContext string, airconfig *Config) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -18,7 +18,9 @@ package config_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@ -602,3 +604,141 @@ func TestNewClusterComplexNameFromKubeClusterName(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestImport(t *testing.T) {
|
||||
conf, cleanupConfig := testutil.InitConfig(t)
|
||||
defer cleanupConfig(t)
|
||||
|
||||
kubeDir, cleanupKubeConfig := testutil.TempDir(t, "airship-import-tests")
|
||||
defer cleanupKubeConfig(t)
|
||||
|
||||
kubeConfigPath := filepath.Join(kubeDir, "config")
|
||||
//nolint: lll
|
||||
kubeConfigContent := `
|
||||
apiVersion: v1
|
||||
clusters:
|
||||
- cluster:
|
||||
server: https://1.2.3.4:9000
|
||||
name: cluster_target
|
||||
- cluster:
|
||||
server: https://1.2.3.4:9001
|
||||
name: dummycluster_ephemeral
|
||||
- cluster:
|
||||
server: https://1.2.3.4:9002
|
||||
name: def_target
|
||||
- cluster:
|
||||
server: https://1.2.3.4:9003
|
||||
name: noncomplex
|
||||
contexts:
|
||||
- context:
|
||||
cluster: cluster_target
|
||||
user: cluster-admin
|
||||
name: cluster-admin@cluster
|
||||
- context:
|
||||
cluster: dummycluster_ephemeral
|
||||
user: kubernetes-admin
|
||||
name: dummy_cluster
|
||||
- context:
|
||||
cluster: dummycluster_ephemeral
|
||||
user: kubernetes-admin
|
||||
name: def_target
|
||||
- context:
|
||||
cluster: noncomplex
|
||||
user: kubernetes-admin
|
||||
name: noncomplex
|
||||
current-context: dummy_cluster
|
||||
kind: Config
|
||||
preferences: {}
|
||||
users:
|
||||
- name: cluster-admin
|
||||
user:
|
||||
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQXhEdzk2RUY4SXN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T1RBNU1qa3hOekF6TURsYUZ3MHlNREE1TWpneE56QXpNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6R0pZdlBaNkRvaTQyMUQKSzhXSmFaQ25OQWQycXo1cC8wNDJvRnpRUGJyQWd6RTJxWVZrek9MOHhBVmVSN1NONXdXb1RXRXlGOEVWN3JyLwo0K0hoSEdpcTVQbXF1SUZ5enpuNi9JWmM4alU5eEVmenZpa2NpckxmVTR2UlhKUXdWd2dBU05sMkFXQUloMmRECmRUcmpCQ2ZpS1dNSHlqMFJiSGFsc0J6T3BnVC9IVHYzR1F6blVRekZLdjJkajVWMU5rUy9ESGp5UlJKK0VMNlEKQlltR3NlZzVQNE5iQzllYnVpcG1NVEFxL0p1bU9vb2QrRmpMMm5acUw2Zkk2ZkJ0RjVPR2xwQ0IxWUo4ZnpDdApHUVFaN0hUSWJkYjJ0cDQzRlZPaHlRYlZjSHFUQTA0UEoxNSswV0F5bVVKVXo4WEE1NDRyL2J2NzRKY0pVUkZoCmFyWmlRd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFMMmhIUmVibEl2VHJTMFNmUVg1RG9ueVVhNy84aTg1endVWApSd3dqdzFuS0U0NDJKbWZWRGZ5b0hRYUM4Ti9MQkxyUXM0U0lqU1JYdmFHU1dSQnRnT1RRV21Db1laMXdSbjdwCndDTXZQTERJdHNWWm90SEZpUFl2b1lHWFFUSXA3YlROMmg1OEJaaEZ3d25nWUovT04zeG1rd29IN1IxYmVxWEYKWHF1TTluekhESk41VlZub1lQR09yRHMwWlg1RnNxNGtWVU0wVExNQm9qN1ZIRDhmU0E5RjRYNU4yMldsZnNPMAo4aksrRFJDWTAyaHBrYTZQQ0pQS0lNOEJaMUFSMG9ZakZxT0plcXpPTjBqcnpYWHh4S2pHVFVUb1BldVA5dCtCCjJOMVA1TnI4a2oxM0lrend5Q1NZclFVN09ZM3ltZmJobHkrcXZxaFVFa014MlQ1SkpmQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
|
||||
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBdXpHSll2UFo2RG9pNDIxREs4V0phWkNuTkFkMnF6NXAvMDQyb0Z6UVBickFnekUyCnFZVmt6T0w4eEFWZVI3U041d1dvVFdFeUY4RVY3cnIvNCtIaEhHaXE1UG1xdUlGeXp6bjYvSVpjOGpVOXhFZnoKdmlrY2lyTGZVNHZSWEpRd1Z3Z0FTTmwyQVdBSWgyZERkVHJqQkNmaUtXTUh5ajBSYkhhbHNCek9wZ1QvSFR2MwpHUXpuVVF6Rkt2MmRqNVYxTmtTL0RIanlSUkorRUw2UUJZbUdzZWc1UDROYkM5ZWJ1aXBtTVRBcS9KdW1Pb29kCitGakwyblpxTDZmSTZmQnRGNU9HbHBDQjFZSjhmekN0R1FRWjdIVEliZGIydHA0M0ZWT2h5UWJWY0hxVEEwNFAKSjE1KzBXQXltVUpVejhYQTU0NHIvYnY3NEpjSlVSRmhhclppUXdJREFRQUJBb0lCQVFDU0pycjlaeVpiQ2dqegpSL3VKMFZEWCt2aVF4c01BTUZyUjJsOE1GV3NBeHk1SFA4Vk4xYmc5djN0YUVGYnI1U3hsa3lVMFJRNjNQU25DCm1uM3ZqZ3dVQWlScllnTEl5MGk0UXF5VFBOU1V4cnpTNHRxTFBjM3EvSDBnM2FrNGZ2cSsrS0JBUUlqQnloamUKbnVFc1JpMjRzT3NESlM2UDE5NGlzUC9yNEpIM1M5bFZGbkVuOGxUR2c0M1kvMFZoMXl0cnkvdDljWjR5ZUNpNwpjMHFEaTZZcXJZaFZhSW9RRW1VQjdsbHRFZkZzb3l4VDR6RTE5U3pVbkRoMmxjYTF1TzhqcmI4d2xHTzBoQ2JyClB1R1l2WFFQa3Q0VlNmalhvdGJ3d2lBNFRCVERCRzU1bHp6MmNKeS9zSS8zSHlYbEMxcTdXUmRuQVhhZ1F0VzkKOE9DZGRkb0JBb0dCQU5NcUNtSW94REtyckhZZFRxT1M1ZFN4cVMxL0NUN3ZYZ0pScXBqd2Y4WHA2WHo0KzIvTAozVXFaVDBEL3dGTkZkc1Z4eFYxMnNYMUdwMHFWZVlKRld5OVlCaHVSWGpTZ0ZEWldSY1Z1Y01sNVpPTmJsbmZGCjVKQ0xnNXFMZ1g5VTNSRnJrR3A0R241UDQxamg4TnhKVlhzZG5xWE9xNTFUK1RRT1UzdkpGQjc1QW9HQkFPTHcKalp1cnZtVkZyTHdaVGgvRDNpWll5SVV0ZUljZ2NKLzlzbTh6L0pPRmRIbFd4dGRHUFVzYVd1MnBTNEhvckFtbgpqTm4vSTluUXd3enZ3MWUzVVFPbUhMRjVBczk4VU5hbk5TQ0xNMW1yaXZHRXJ1VHFnTDM1bU41eFZPdTUxQU5JCm4yNkFtODBJT2JDeEtLa0R0ZXJSaFhHd3g5c1pONVJCbG9VRThZNGJBb0dBQ3ZsdVhMZWRxcng5VkE0bDNoNXUKVDJXRVUxYjgxZ1orcmtRc1I1S0lNWEw4cllBTElUNUpHKzFuendyN3BkaEFXZmFWdVV2SDRhamdYT0h6MUs5aQpFODNSVTNGMG9ldUg0V01PY1RwU0prWm0xZUlXcWRiaEVCb1FGdUlWTXRib1BsV0d4ZUhFRHJoOEtreGp4aThSCmdEcUQyajRwY1IzQ0g5QjJ5a0lqQjVFQ2dZRUExc0xXLys2enE1c1lNSm14K1JXZThhTXJmL3pjQnVTSU1LQWgKY0dNK0wwMG9RSHdDaUU4TVNqcVN1ajV3R214YUFuanhMb3ZwSFlRV1VmUEVaUW95UE1YQ2VhRVBLOU4xbk8xMwp0V2lHRytIZkIxaU5PazFCc0lhNFNDbndOM1FRVTFzeXBaeEgxT3hueS9LYmkvYmEvWEZ5VzNqMGFUK2YvVWxrCmJGV1ZVdWtDZ1lFQTBaMmRTTFlmTjV5eFNtYk5xMWVqZXdWd1BjRzQxR2hQclNUZEJxdHFac1doWGE3aDdLTWEKeHdvamh5SXpnTXNyK2tXODdlajhDQ2h0d21sQ1p5QU92QmdOZytncnJ1cEZLM3FOSkpKeU9YREdHckdpbzZmTQp5aXB3Q2tZVGVxRThpZ1J6UkI5QkdFUGY4eVpjMUtwdmZhUDVhM0lRZmxiV0czbGpUemNNZVZjPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
|
||||
- name: kubernetes-admin
|
||||
user:
|
||||
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQXhEdzk2RUY4SXN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T1RBNU1qa3hOekF6TURsYUZ3MHlNREE1TWpneE56QXpNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6R0pZdlBaNkRvaTQyMUQKSzhXSmFaQ25OQWQycXo1cC8wNDJvRnpRUGJyQWd6RTJxWVZrek9MOHhBVmVSN1NONXdXb1RXRXlGOEVWN3JyLwo0K0hoSEdpcTVQbXF1SUZ5enpuNi9JWmM4alU5eEVmenZpa2NpckxmVTR2UlhKUXdWd2dBU05sMkFXQUloMmRECmRUcmpCQ2ZpS1dNSHlqMFJiSGFsc0J6T3BnVC9IVHYzR1F6blVRekZLdjJkajVWMU5rUy9ESGp5UlJKK0VMNlEKQlltR3NlZzVQNE5iQzllYnVpcG1NVEFxL0p1bU9vb2QrRmpMMm5acUw2Zkk2ZkJ0RjVPR2xwQ0IxWUo4ZnpDdApHUVFaN0hUSWJkYjJ0cDQzRlZPaHlRYlZjSHFUQTA0UEoxNSswV0F5bVVKVXo4WEE1NDRyL2J2NzRKY0pVUkZoCmFyWmlRd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFMMmhIUmVibEl2VHJTMFNmUVg1RG9ueVVhNy84aTg1endVWApSd3dqdzFuS0U0NDJKbWZWRGZ5b0hRYUM4Ti9MQkxyUXM0U0lqU1JYdmFHU1dSQnRnT1RRV21Db1laMXdSbjdwCndDTXZQTERJdHNWWm90SEZpUFl2b1lHWFFUSXA3YlROMmg1OEJaaEZ3d25nWUovT04zeG1rd29IN1IxYmVxWEYKWHF1TTluekhESk41VlZub1lQR09yRHMwWlg1RnNxNGtWVU0wVExNQm9qN1ZIRDhmU0E5RjRYNU4yMldsZnNPMAo4aksrRFJDWTAyaHBrYTZQQ0pQS0lNOEJaMUFSMG9ZakZxT0plcXpPTjBqcnpYWHh4S2pHVFVUb1BldVA5dCtCCjJOMVA1TnI4a2oxM0lrend5Q1NZclFVN09ZM3ltZmJobHkrcXZxaFVFa014MlQ1SkpmQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
|
||||
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBdXpHSll2UFo2RG9pNDIxREs4V0phWkNuTkFkMnF6NXAvMDQyb0Z6UVBickFnekUyCnFZVmt6T0w4eEFWZVI3U041d1dvVFdFeUY4RVY3cnIvNCtIaEhHaXE1UG1xdUlGeXp6bjYvSVpjOGpVOXhFZnoKdmlrY2lyTGZVNHZSWEpRd1Z3Z0FTTmwyQVdBSWgyZERkVHJqQkNmaUtXTUh5ajBSYkhhbHNCek9wZ1QvSFR2MwpHUXpuVVF6Rkt2MmRqNVYxTmtTL0RIanlSUkorRUw2UUJZbUdzZWc1UDROYkM5ZWJ1aXBtTVRBcS9KdW1Pb29kCitGakwyblpxTDZmSTZmQnRGNU9HbHBDQjFZSjhmekN0R1FRWjdIVEliZGIydHA0M0ZWT2h5UWJWY0hxVEEwNFAKSjE1KzBXQXltVUpVejhYQTU0NHIvYnY3NEpjSlVSRmhhclppUXdJREFRQUJBb0lCQVFDU0pycjlaeVpiQ2dqegpSL3VKMFZEWCt2aVF4c01BTUZyUjJsOE1GV3NBeHk1SFA4Vk4xYmc5djN0YUVGYnI1U3hsa3lVMFJRNjNQU25DCm1uM3ZqZ3dVQWlScllnTEl5MGk0UXF5VFBOU1V4cnpTNHRxTFBjM3EvSDBnM2FrNGZ2cSsrS0JBUUlqQnloamUKbnVFc1JpMjRzT3NESlM2UDE5NGlzUC9yNEpIM1M5bFZGbkVuOGxUR2c0M1kvMFZoMXl0cnkvdDljWjR5ZUNpNwpjMHFEaTZZcXJZaFZhSW9RRW1VQjdsbHRFZkZzb3l4VDR6RTE5U3pVbkRoMmxjYTF1TzhqcmI4d2xHTzBoQ2JyClB1R1l2WFFQa3Q0VlNmalhvdGJ3d2lBNFRCVERCRzU1bHp6MmNKeS9zSS8zSHlYbEMxcTdXUmRuQVhhZ1F0VzkKOE9DZGRkb0JBb0dCQU5NcUNtSW94REtyckhZZFRxT1M1ZFN4cVMxL0NUN3ZYZ0pScXBqd2Y4WHA2WHo0KzIvTAozVXFaVDBEL3dGTkZkc1Z4eFYxMnNYMUdwMHFWZVlKRld5OVlCaHVSWGpTZ0ZEWldSY1Z1Y01sNVpPTmJsbmZGCjVKQ0xnNXFMZ1g5VTNSRnJrR3A0R241UDQxamg4TnhKVlhzZG5xWE9xNTFUK1RRT1UzdkpGQjc1QW9HQkFPTHcKalp1cnZtVkZyTHdaVGgvRDNpWll5SVV0ZUljZ2NKLzlzbTh6L0pPRmRIbFd4dGRHUFVzYVd1MnBTNEhvckFtbgpqTm4vSTluUXd3enZ3MWUzVVFPbUhMRjVBczk4VU5hbk5TQ0xNMW1yaXZHRXJ1VHFnTDM1bU41eFZPdTUxQU5JCm4yNkFtODBJT2JDeEtLa0R0ZXJSaFhHd3g5c1pONVJCbG9VRThZNGJBb0dBQ3ZsdVhMZWRxcng5VkE0bDNoNXUKVDJXRVUxYjgxZ1orcmtRc1I1S0lNWEw4cllBTElUNUpHKzFuendyN3BkaEFXZmFWdVV2SDRhamdYT0h6MUs5aQpFODNSVTNGMG9ldUg0V01PY1RwU0prWm0xZUlXcWRiaEVCb1FGdUlWTXRib1BsV0d4ZUhFRHJoOEtreGp4aThSCmdEcUQyajRwY1IzQ0g5QjJ5a0lqQjVFQ2dZRUExc0xXLys2enE1c1lNSm14K1JXZThhTXJmL3pjQnVTSU1LQWgKY0dNK0wwMG9RSHdDaUU4TVNqcVN1ajV3R214YUFuanhMb3ZwSFlRV1VmUEVaUW95UE1YQ2VhRVBLOU4xbk8xMwp0V2lHRytIZkIxaU5PazFCc0lhNFNDbndOM1FRVTFzeXBaeEgxT3hueS9LYmkvYmEvWEZ5VzNqMGFUK2YvVWxrCmJGV1ZVdWtDZ1lFQTBaMmRTTFlmTjV5eFNtYk5xMWVqZXdWd1BjRzQxR2hQclNUZEJxdHFac1doWGE3aDdLTWEKeHdvamh5SXpnTXNyK2tXODdlajhDQ2h0d21sQ1p5QU92QmdOZytncnJ1cEZLM3FOSkpKeU9YREdHckdpbzZmTQp5aXB3Q2tZVGVxRThpZ1J6UkI5QkdFUGY4eVpjMUtwdmZhUDVhM0lRZmxiV0czbGpUemNNZVZjPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
|
||||
- name: def-user
|
||||
user:
|
||||
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQXhEdzk2RUY4SXN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T1RBNU1qa3hOekF6TURsYUZ3MHlNREE1TWpneE56QXpNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6R0pZdlBaNkRvaTQyMUQKSzhXSmFaQ25OQWQycXo1cC8wNDJvRnpRUGJyQWd6RTJxWVZrek9MOHhBVmVSN1NONXdXb1RXRXlGOEVWN3JyLwo0K0hoSEdpcTVQbXF1SUZ5enpuNi9JWmM4alU5eEVmenZpa2NpckxmVTR2UlhKUXdWd2dBU05sMkFXQUloMmRECmRUcmpCQ2ZpS1dNSHlqMFJiSGFsc0J6T3BnVC9IVHYzR1F6blVRekZLdjJkajVWMU5rUy9ESGp5UlJKK0VMNlEKQlltR3NlZzVQNE5iQzllYnVpcG1NVEFxL0p1bU9vb2QrRmpMMm5acUw2Zkk2ZkJ0RjVPR2xwQ0IxWUo4ZnpDdApHUVFaN0hUSWJkYjJ0cDQzRlZPaHlRYlZjSHFUQTA0UEoxNSswV0F5bVVKVXo4WEE1NDRyL2J2NzRKY0pVUkZoCmFyWmlRd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFMMmhIUmVibEl2VHJTMFNmUVg1RG9ueVVhNy84aTg1endVWApSd3dqdzFuS0U0NDJKbWZWRGZ5b0hRYUM4Ti9MQkxyUXM0U0lqU1JYdmFHU1dSQnRnT1RRV21Db1laMXdSbjdwCndDTXZQTERJdHNWWm90SEZpUFl2b1lHWFFUSXA3YlROMmg1OEJaaEZ3d25nWUovT04zeG1rd29IN1IxYmVxWEYKWHF1TTluekhESk41VlZub1lQR09yRHMwWlg1RnNxNGtWVU0wVExNQm9qN1ZIRDhmU0E5RjRYNU4yMldsZnNPMAo4aksrRFJDWTAyaHBrYTZQQ0pQS0lNOEJaMUFSMG9ZakZxT0plcXpPTjBqcnpYWHh4S2pHVFVUb1BldVA5dCtCCjJOMVA1TnI4a2oxM0lrend5Q1NZclFVN09ZM3ltZmJobHkrcXZxaFVFa014MlQ1SkpmQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
|
||||
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBdXpHSll2UFo2RG9pNDIxREs4V0phWkNuTkFkMnF6NXAvMDQyb0Z6UVBickFnekUyCnFZVmt6T0w4eEFWZVI3U041d1dvVFdFeUY4RVY3cnIvNCtIaEhHaXE1UG1xdUlGeXp6bjYvSVpjOGpVOXhFZnoKdmlrY2lyTGZVNHZSWEpRd1Z3Z0FTTmwyQVdBSWgyZERkVHJqQkNmaUtXTUh5ajBSYkhhbHNCek9wZ1QvSFR2MwpHUXpuVVF6Rkt2MmRqNVYxTmtTL0RIanlSUkorRUw2UUJZbUdzZWc1UDROYkM5ZWJ1aXBtTVRBcS9KdW1Pb29kCitGakwyblpxTDZmSTZmQnRGNU9HbHBDQjFZSjhmekN0R1FRWjdIVEliZGIydHA0M0ZWT2h5UWJWY0hxVEEwNFAKSjE1KzBXQXltVUpVejhYQTU0NHIvYnY3NEpjSlVSRmhhclppUXdJREFRQUJBb0lCQVFDU0pycjlaeVpiQ2dqegpSL3VKMFZEWCt2aVF4c01BTUZyUjJsOE1GV3NBeHk1SFA4Vk4xYmc5djN0YUVGYnI1U3hsa3lVMFJRNjNQU25DCm1uM3ZqZ3dVQWlScllnTEl5MGk0UXF5VFBOU1V4cnpTNHRxTFBjM3EvSDBnM2FrNGZ2cSsrS0JBUUlqQnloamUKbnVFc1JpMjRzT3NESlM2UDE5NGlzUC9yNEpIM1M5bFZGbkVuOGxUR2c0M1kvMFZoMXl0cnkvdDljWjR5ZUNpNwpjMHFEaTZZcXJZaFZhSW9RRW1VQjdsbHRFZkZzb3l4VDR6RTE5U3pVbkRoMmxjYTF1TzhqcmI4d2xHTzBoQ2JyClB1R1l2WFFQa3Q0VlNmalhvdGJ3d2lBNFRCVERCRzU1bHp6MmNKeS9zSS8zSHlYbEMxcTdXUmRuQVhhZ1F0VzkKOE9DZGRkb0JBb0dCQU5NcUNtSW94REtyckhZZFRxT1M1ZFN4cVMxL0NUN3ZYZ0pScXBqd2Y4WHA2WHo0KzIvTAozVXFaVDBEL3dGTkZkc1Z4eFYxMnNYMUdwMHFWZVlKRld5OVlCaHVSWGpTZ0ZEWldSY1Z1Y01sNVpPTmJsbmZGCjVKQ0xnNXFMZ1g5VTNSRnJrR3A0R241UDQxamg4TnhKVlhzZG5xWE9xNTFUK1RRT1UzdkpGQjc1QW9HQkFPTHcKalp1cnZtVkZyTHdaVGgvRDNpWll5SVV0ZUljZ2NKLzlzbTh6L0pPRmRIbFd4dGRHUFVzYVd1MnBTNEhvckFtbgpqTm4vSTluUXd3enZ3MWUzVVFPbUhMRjVBczk4VU5hbk5TQ0xNMW1yaXZHRXJ1VHFnTDM1bU41eFZPdTUxQU5JCm4yNkFtODBJT2JDeEtLa0R0ZXJSaFhHd3g5c1pONVJCbG9VRThZNGJBb0dBQ3ZsdVhMZWRxcng5VkE0bDNoNXUKVDJXRVUxYjgxZ1orcmtRc1I1S0lNWEw4cllBTElUNUpHKzFuendyN3BkaEFXZmFWdVV2SDRhamdYT0h6MUs5aQpFODNSVTNGMG9ldUg0V01PY1RwU0prWm0xZUlXcWRiaEVCb1FGdUlWTXRib1BsV0d4ZUhFRHJoOEtreGp4aThSCmdEcUQyajRwY1IzQ0g5QjJ5a0lqQjVFQ2dZRUExc0xXLys2enE1c1lNSm14K1JXZThhTXJmL3pjQnVTSU1LQWgKY0dNK0wwMG9RSHdDaUU4TVNqcVN1ajV3R214YUFuanhMb3ZwSFlRV1VmUEVaUW95UE1YQ2VhRVBLOU4xbk8xMwp0V2lHRytIZkIxaU5PazFCc0lhNFNDbndOM1FRVTFzeXBaeEgxT3hueS9LYmkvYmEvWEZ5VzNqMGFUK2YvVWxrCmJGV1ZVdWtDZ1lFQTBaMmRTTFlmTjV5eFNtYk5xMWVqZXdWd1BjRzQxR2hQclNUZEJxdHFac1doWGE3aDdLTWEKeHdvamh5SXpnTXNyK2tXODdlajhDQ2h0d21sQ1p5QU92QmdOZytncnJ1cEZLM3FOSkpKeU9YREdHckdpbzZmTQp5aXB3Q2tZVGVxRThpZ1J6UkI5QkdFUGY4eVpjMUtwdmZhUDVhM0lRZmxiV0czbGpUemNNZVZjPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
|
||||
`
|
||||
err := ioutil.WriteFile(kubeConfigPath, []byte(kubeConfigContent), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = conf.ImportFromKubeConfig(kubeConfigPath)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("importClusters", func(t *testing.T) {
|
||||
// Verify that only 3 clusters have been added (original 5 plus 3 new clusters)
|
||||
// This is important since the above kubeconfig actually has 4
|
||||
// clusters, but one was already defined in the airship config
|
||||
assert.Len(t, conf.Clusters, 5+3)
|
||||
|
||||
// verify that the new clusters have been added to the config
|
||||
_, err := conf.GetCluster("cluster", config.Target)
|
||||
assert.NoError(t, err)
|
||||
_, err = conf.GetCluster("dummycluster", config.Ephemeral)
|
||||
assert.NoError(t, err)
|
||||
|
||||
// verify that the "noncomplex" cluster was added as a target cluster
|
||||
_, err = conf.GetCluster("noncomplex", config.Target)
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("importContexts", func(t *testing.T) {
|
||||
// Verify that only 3 contexts have been added (original 3 plus 3 new contexts)
|
||||
// This is important since the above kubeconfig actually has 4
|
||||
// contexts, but one was already defined in the airship config
|
||||
assert.Len(t, conf.Contexts, 3+3)
|
||||
|
||||
// verify that the new contexts have been added to the config
|
||||
_, err := conf.GetContext("cluster-admin@cluster")
|
||||
assert.NoError(t, err)
|
||||
_, err = conf.GetContext("dummy_cluster")
|
||||
assert.NoError(t, err)
|
||||
|
||||
// verify that the "noncomplex" context refers to the proper target "noncomplex" cluster
|
||||
noncomplex, err := conf.GetContext("noncomplex")
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "noncomplex_target", noncomplex.NameInKubeconf)
|
||||
})
|
||||
|
||||
t.Run("importAuthInfos", func(t *testing.T) {
|
||||
// Verify that only 2 users have been added (original 3 plus 2 new users)
|
||||
// This is important since the above kubeconfig actually has 3
|
||||
// users, but one was already defined in the airship config
|
||||
assert.Len(t, conf.AuthInfos, 3+2)
|
||||
|
||||
// verify that the new users have been added to the config
|
||||
_, err := conf.GetAuthInfo("cluster-admin")
|
||||
assert.NoError(t, err)
|
||||
_, err = conf.GetAuthInfo("kubernetes-admin")
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestImportErrors(t *testing.T) {
|
||||
conf, cleanupConfig := testutil.InitConfig(t)
|
||||
defer cleanupConfig(t)
|
||||
|
||||
t.Run("nonexistent kubeConfig", func(t *testing.T) {
|
||||
err := conf.ImportFromKubeConfig("./non/existent/file/path")
|
||||
assert.Contains(t, err.Error(), "no such file or directory")
|
||||
})
|
||||
|
||||
t.Run("malformed kubeConfig", func(t *testing.T) {
|
||||
kubeDir, cleanupKubeConfig := testutil.TempDir(t, "airship-import-tests")
|
||||
defer cleanupKubeConfig(t)
|
||||
|
||||
kubeConfigPath := filepath.Join(kubeDir, "config")
|
||||
//nolint: lll
|
||||
kubeConfigContent := "malformed content"
|
||||
|
||||
err := ioutil.WriteFile(kubeConfigPath, []byte(kubeConfigContent), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = conf.ImportFromKubeConfig(kubeConfigPath)
|
||||
assert.Contains(t, err.Error(), "json parse error")
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user