cover merging, improve errors

This commit is contained in:
Benjamin Elder
2019-10-30 17:29:39 -07:00
parent 5d1fdeb473
commit b3cfb4f5a1
2 changed files with 223 additions and 3 deletions

View File

@@ -29,13 +29,13 @@ func KINDClusterKey(clusterName string) string {
// our expectations, namely on the number of entries
func checkKubeadmExpectations(cfg *Config) error {
if len(cfg.Clusters) != 1 {
return errors.Errorf("kubeadm KUBECONFIG should only have one cluster, but read %d", len(cfg.Clusters))
return errors.Errorf("kubeadm KUBECONFIG should have one cluster, but read %d", len(cfg.Clusters))
}
if len(cfg.Users) != 1 {
return errors.Errorf("kubeadm KUBECONFIG should only have one user, but read %d", len(cfg.Users))
return errors.Errorf("kubeadm KUBECONFIG should have one user, but read %d", len(cfg.Users))
}
if len(cfg.Contexts) != 1 {
return errors.Errorf("kubeadm KUBECONFIG should only have one context, but read %d", len(cfg.Contexts))
return errors.Errorf("kubeadm KUBECONFIG should have one context, but read %d", len(cfg.Contexts))
}
return nil
}

View File

@@ -17,6 +17,9 @@ limitations under the License.
package kubeconfig
import (
"io/ioutil"
"os"
"path/filepath"
"reflect"
"testing"
@@ -220,3 +223,220 @@ func TestMerge(t *testing.T) {
})
}
}
func TestWriteMerged(t *testing.T) {
t.Run("normal merge", testWriteMergedNormal)
t.Run("bad kind config", testWriteMergedBogusConfig)
t.Run("merge into non-existent file", testWriteMergedNoExistingFile)
}
func testWriteMergedNormal(t *testing.T) {
t.Parallel()
dir, err := ioutil.TempDir("", "kind-testwritemerged")
if err != nil {
t.Fatalf("Failed to create tempdir: %d", err)
}
defer os.RemoveAll(dir)
// create an existing kubeconfig
const existingConfig = `clusters:
- cluster:
certificate-authority-data: definitelyacert
server: https://192.168.9.4:6443
name: kind-foo
contexts:
- context:
cluster: kind-foo
user: kind-foo
name: kind-foo
current-context: kind-foo
kind: Config
apiVersion: v1
preferences: {}
users:
- name: kind-foo
user:
client-certificate-data: seemslegit
client-key-data: yep
`
existingConfigPath := filepath.Join(dir, "existing-kubeconfig")
if err := ioutil.WriteFile(existingConfigPath, []byte(existingConfig), os.ModePerm); err != nil {
t.Fatalf("Failed to create existing kubeconfig: %d", err)
}
kindConfig := &Config{
Clusters: []NamedCluster{
{
Name: "kind-kind",
Cluster: Cluster{
Server: "https://127.0.0.1:6443",
OtherFields: map[string]interface{}{
"certificate-authority-data": "definitelyacert",
},
},
},
},
Contexts: []NamedContext{
{
Name: "kind-kind",
Context: Context{
User: "kind-kind",
Cluster: "kind-kind",
},
},
},
Users: []NamedUser{
{
Name: "kind-kind",
User: map[string]interface{}{
"client-certificate-data": "seemslegit",
"client-key-data": "yep",
},
},
},
CurrentContext: "kind-kind",
OtherFields: map[string]interface{}{
"apiVersion": "v1",
"kind": "Config",
"preferences": map[string]interface{}{},
},
}
// ensure that we can write this merged config
if err := WriteMerged(kindConfig, existingConfigPath); err != nil {
t.Fatalf("Failed to write merged kubeconfig: %v", err)
}
// ensure the output matches expected
f, err := os.Open(existingConfigPath)
if err != nil {
t.Fatalf("Failed to open merged kubeconfig: %v", err)
}
contents, err := ioutil.ReadAll(f)
if err != nil {
t.Fatalf("Failed to read merged kubeconfig: %v", err)
}
expected := `apiVersion: v1
clusters:
- cluster:
certificate-authority-data: definitelyacert
server: https://192.168.9.4:6443
name: kind-foo
- cluster:
certificate-authority-data: definitelyacert
server: https://127.0.0.1:6443
name: kind-kind
contexts:
- context:
cluster: kind-foo
user: kind-foo
name: kind-foo
- context:
cluster: kind-kind
user: kind-kind
name: kind-kind
current-context: kind-kind
kind: Config
preferences: {}
users:
- name: kind-foo
user:
client-certificate-data: seemslegit
client-key-data: yep
- name: kind-kind
user:
client-certificate-data: seemslegit
client-key-data: yep
`
assert.StringEqual(t, expected, string(contents))
}
func testWriteMergedBogusConfig(t *testing.T) {
t.Parallel()
dir, err := ioutil.TempDir("", "kind-testwritemerged")
if err != nil {
t.Fatalf("Failed to create tempdir: %d", err)
}
defer os.RemoveAll(dir)
err = WriteMerged(&Config{}, filepath.Join(dir, "bogus"))
assert.ExpectError(t, true, err)
}
func testWriteMergedNoExistingFile(t *testing.T) {
t.Parallel()
dir, err := ioutil.TempDir("", "kind-testwritemerged")
if err != nil {
t.Fatalf("Failed to create tempdir: %d", err)
}
defer os.RemoveAll(dir)
kindConfig := &Config{
Clusters: []NamedCluster{
{
Name: "kind-kind",
Cluster: Cluster{
Server: "https://127.0.0.1:6443",
OtherFields: map[string]interface{}{
"certificate-authority-data": "definitelyacert",
},
},
},
},
Contexts: []NamedContext{
{
Name: "kind-kind",
Context: Context{
User: "kind-kind",
Cluster: "kind-kind",
},
},
},
Users: []NamedUser{
{
Name: "kind-kind",
User: map[string]interface{}{
"client-certificate-data": "seemslegit",
"client-key-data": "yep",
},
},
},
CurrentContext: "kind-kind",
OtherFields: map[string]interface{}{
"apiVersion": "v1",
"kind": "Config",
"preferences": map[string]interface{}{},
},
}
nonExistentPath := filepath.Join(dir, "bogus")
err = WriteMerged(kindConfig, nonExistentPath)
assert.ExpectError(t, false, err)
// ensure the output matches expected
f, err := os.Open(nonExistentPath)
if err != nil {
t.Fatalf("Failed to open merged kubeconfig: %v", err)
}
contents, err := ioutil.ReadAll(f)
if err != nil {
t.Fatalf("Failed to read merged kubeconfig: %v", err)
}
expected := `clusters:
- cluster:
certificate-authority-data: definitelyacert
server: https://127.0.0.1:6443
name: kind-kind
contexts:
- context:
cluster: kind-kind
user: kind-kind
name: kind-kind
current-context: kind-kind
users:
- name: kind-kind
user:
client-certificate-data: seemslegit
client-key-data: yep
`
assert.StringEqual(t, expected, string(contents))
}