func TestJoinFederation(t *testing.T) { cmdErrMsg := "" cmdutil.BehaviorOnFatal(func(str string, code int) { cmdErrMsg = str }) fakeKubeFiles, err := kubefedtesting.FakeKubeconfigFiles() if err != nil { t.Fatalf("unexpected error: %v", err) } defer kubefedtesting.RemoveFakeKubeconfigFiles(fakeKubeFiles) testCases := []struct { cluster string clusterCtx string secret string server string token string kubeconfigGlobal string kubeconfigExplicit string expectedServer string expectedErr string }{ { cluster: "syndicate", clusterCtx: "", secret: "", server: "https://10.20.30.40", token: "badge", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: "", expectedServer: "https://10.20.30.40", expectedErr: "", }, { cluster: "ally", clusterCtx: "", secret: "", server: "ally256.example.com:80", token: "souvenir", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: fakeKubeFiles[1], expectedServer: "https://ally256.example.com:80", expectedErr: "", }, { cluster: "confederate", clusterCtx: "", secret: "", server: "10.8.8.8", token: "totem", kubeconfigGlobal: fakeKubeFiles[1], kubeconfigExplicit: fakeKubeFiles[2], expectedServer: "https://10.8.8.8", expectedErr: "", }, { cluster: "associate", clusterCtx: "confederate", secret: "confidential", server: "10.8.8.8", token: "totem", kubeconfigGlobal: fakeKubeFiles[1], kubeconfigExplicit: fakeKubeFiles[2], expectedServer: "https://10.8.8.8", expectedErr: "", }, { cluster: "affiliate", clusterCtx: "", secret: "", server: "https://10.20.30.40", token: "badge", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: "", expectedServer: "https://10.20.30.40", expectedErr: fmt.Sprintf("error: cluster context %q not found", "affiliate"), }, } for i, tc := range testCases { cmdErrMsg = "" f := testJoinFederationFactory(tc.cluster, tc.secret, tc.expectedServer) buf := bytes.NewBuffer([]byte{}) hostFactory, err := fakeJoinHostFactory(tc.cluster, tc.clusterCtx, tc.secret, tc.server, tc.token) if err != nil { t.Fatalf("[%d] unexpected error: %v", i, err) } adminConfig, err := kubefedtesting.NewFakeAdminConfig(hostFactory, tc.kubeconfigGlobal) if err != nil { t.Fatalf("[%d] unexpected error: %v", i, err) } cmd := NewCmdJoin(f, buf, adminConfig) cmd.Flags().Set("kubeconfig", tc.kubeconfigExplicit) cmd.Flags().Set("host-cluster-context", "substrate") if tc.clusterCtx != "" { cmd.Flags().Set("cluster-context", tc.clusterCtx) } if tc.secret != "" { cmd.Flags().Set("secret-name", tc.secret) } cmd.Run(cmd, []string{tc.cluster}) if tc.expectedErr == "" { // uses the name from the cluster, not the response // Actual data passed are tested in the fake secret and cluster // REST clients. if msg := buf.String(); msg != fmt.Sprintf("cluster %q created\n", tc.cluster) { t.Errorf("[%d] unexpected output: %s", i, msg) if cmdErrMsg != "" { t.Errorf("[%d] unexpected error message: %s", i, cmdErrMsg) } } } else { if cmdErrMsg != tc.expectedErr { t.Errorf("[%d] expected error: %s, got: %s, output: %s", i, tc.expectedErr, cmdErrMsg, buf.String()) } } } }
func TestInitFederation(t *testing.T) { cmdErrMsg := "" dnsProvider := "" cmdutil.BehaviorOnFatal(func(str string, code int) { cmdErrMsg = str }) fakeKubeFiles, err := kubefedtesting.FakeKubeconfigFiles() if err != nil { t.Fatalf("unexpected error: %v", err) } defer kubefedtesting.RemoveFakeKubeconfigFiles(fakeKubeFiles) testCases := []struct { federation string kubeconfigGlobal string kubeconfigExplicit string dnsZoneName string lbIP string image string expectedErr string dnsProvider string }{ { federation: "union", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: "", dnsZoneName: "example.test.", lbIP: "10.20.30.40", image: "example.test/foo:bar", expectedErr: "", dnsProvider: "test-dns-provider", }, { federation: "union", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: "", dnsZoneName: "example.test.", lbIP: "10.20.30.40", image: "example.test/foo:bar", expectedErr: "", dnsProvider: "", //test for default value of dns provider }, } for i, tc := range testCases { cmdErrMsg = "" dnsProvider = "" buf := bytes.NewBuffer([]byte{}) if "" != tc.dnsProvider { dnsProvider = tc.dnsProvider } else { dnsProvider = "google-clouddns" //default value of dns-provider } hostFactory, err := fakeInitHostFactory(tc.federation, util.DefaultFederationSystemNamespace, tc.lbIP, tc.dnsZoneName, tc.image, dnsProvider) if err != nil { t.Fatalf("[%d] unexpected error: %v", i, err) } adminConfig, err := kubefedtesting.NewFakeAdminConfig(hostFactory, tc.kubeconfigGlobal) if err != nil { t.Fatalf("[%d] unexpected error: %v", i, err) } cmd := NewCmdInit(buf, adminConfig) cmd.Flags().Set("kubeconfig", tc.kubeconfigExplicit) cmd.Flags().Set("host-cluster-context", "substrate") cmd.Flags().Set("dns-zone-name", tc.dnsZoneName) cmd.Flags().Set("image", tc.image) if "" != tc.dnsProvider { cmd.Flags().Set("dns-provider", tc.dnsProvider) } cmd.Run(cmd, []string{tc.federation}) if tc.expectedErr == "" { // uses the name from the federation, not the response // Actual data passed are tested in the fake secret and cluster // REST clients. want := fmt.Sprintf("Federation API server is running at: %s\n", tc.lbIP) if got := buf.String(); got != want { t.Errorf("[%d] unexpected output: got: %s, want: %s", i, got, want) if cmdErrMsg != "" { t.Errorf("[%d] unexpected error message: %s", i, cmdErrMsg) } } } else { if cmdErrMsg != tc.expectedErr { t.Errorf("[%d] expected error: %s, got: %s, output: %s", i, tc.expectedErr, cmdErrMsg, buf.String()) } } testKubeconfigUpdate(t, tc.federation, tc.lbIP, tc.kubeconfigGlobal, tc.kubeconfigExplicit) } }
func TestUnjoinFederation(t *testing.T) { cmdErrMsg := "" cmdutil.BehaviorOnFatal(func(str string, code int) { cmdErrMsg = str }) fakeKubeFiles, err := kubefedtesting.FakeKubeconfigFiles() if err != nil { t.Fatalf("unexpected error: %v", err) } defer kubefedtesting.RemoveFakeKubeconfigFiles(fakeKubeFiles) testCases := []struct { cluster string wantCluster string wantSecret string kubeconfigGlobal string kubeconfigExplicit string expectedServer string expectedErr string }{ // Tests that the contexts and credentials are read from the // global, default kubeconfig and the correct cluster resource // is deregisterd. { cluster: "syndicate", wantCluster: "syndicate", wantSecret: "", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: "", expectedServer: "https://10.20.30.40", expectedErr: "", }, // Tests that the contexts and credentials are read from the // explicit kubeconfig file specified and the correct cluster // resource is deregisterd. kubeconfig contains a single // cluster and context. { cluster: "ally", wantCluster: "ally", wantSecret: "", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: fakeKubeFiles[1], expectedServer: "http://ally256.example.com:80", expectedErr: "", }, // Tests that the contexts and credentials are read from the // explicit kubeconfig file specified and the correct cluster // resource is deregisterd. kubeconfig consists of multiple // clusters and contexts. { cluster: "confederate", wantCluster: "confederate", wantSecret: "", kubeconfigGlobal: fakeKubeFiles[1], kubeconfigExplicit: fakeKubeFiles[2], expectedServer: "https://10.8.8.8", expectedErr: "", }, // Negative test to ensure that we get the right warning // when the specified cluster to deregister is not found. { cluster: "noexist", wantCluster: "affiliate", wantSecret: "", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: "", expectedServer: "https://10.20.30.40", expectedErr: fmt.Sprintf("WARNING: cluster %q not found in federation, so its credentials' secret couldn't be deleted", "affiliate"), }, // Negative test to ensure that we get the right warning // when the specified cluster's credentials secret is not // found. { cluster: "affiliate", wantCluster: "affiliate", wantSecret: "noexist", kubeconfigGlobal: fakeKubeFiles[0], kubeconfigExplicit: "", expectedServer: "https://10.20.30.40", expectedErr: fmt.Sprintf("WARNING: secret %q not found in the host cluster, so it couldn't be deleted", "noexist"), }, } for i, tc := range testCases { cmdErrMsg = "" f := testUnjoinFederationFactory(tc.cluster, tc.expectedServer, tc.wantSecret) buf := bytes.NewBuffer([]byte{}) errBuf := bytes.NewBuffer([]byte{}) hostFactory := fakeUnjoinHostFactory(tc.cluster) adminConfig, err := kubefedtesting.NewFakeAdminConfig(hostFactory, tc.kubeconfigGlobal) if err != nil { t.Fatalf("[%d] unexpected error: %v", i, err) } cmd := NewCmdUnjoin(f, buf, errBuf, adminConfig) cmd.Flags().Set("kubeconfig", tc.kubeconfigExplicit) cmd.Flags().Set("host", "substrate") cmd.Run(cmd, []string{tc.wantCluster}) if tc.expectedErr == "" { // uses the name from the cluster, not the response // Actual data passed are tested in the fake secret and cluster // REST clients. if msg := buf.String(); msg != fmt.Sprintf("Successfully removed cluster %q from federation\n", tc.cluster) { t.Errorf("[%d] unexpected output: %s", i, msg) if cmdErrMsg != "" { t.Errorf("[%d] unexpected error message: %s", i, cmdErrMsg) } } } else { if errMsg := errBuf.String(); errMsg != tc.expectedErr { t.Errorf("[%d] expected warning: %s, got: %s, output: %s", i, tc.expectedErr, errMsg, buf.String()) } } } }