From d1dcc5963f11b841e76c59a0261c25f1a4530655 Mon Sep 17 00:00:00 2001 From: Maciej Kwiek Date: Mon, 31 Jul 2017 16:32:09 +0200 Subject: [PATCH] E2E test suite AppController rudder test suite adapted for federation. Uses https://github.com/lukaszo/kubernetes-dind-federation to start up a federated cluster. `make e2e` to run tests. --- helm_client.go => e2e/helm_client.go | 56 +++++++++++++++++----------- utils.go => e2e/utils.go | 5 ++- 2 files changed, 37 insertions(+), 24 deletions(-) rename helm_client.go => e2e/helm_client.go (83%) rename utils.go => e2e/utils.go (91%) diff --git a/helm_client.go b/e2e/helm_client.go similarity index 83% rename from helm_client.go rename to e2e/helm_client.go index 39c4fa1e6..183472415 100644 --- a/helm_client.go +++ b/e2e/helm_client.go @@ -22,6 +22,7 @@ import ( "time" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/pkg/api/v1" @@ -35,7 +36,8 @@ import ( const ( experimentalTillerImage string = "nebril/tiller" - rudderAppcontroller string = "rudder" + rudderPodName string = "rudder" + rudderImage string = "nebril/rudder-fed" ) // HelmManager provides functionality to install client/server helm and use it @@ -58,27 +60,27 @@ type HelmManager interface { // BinaryHelmManager uses helm binary to work with helm server type BinaryHelmManager struct { - Clientset kubernetes.Interface - Namespace string - HelmBin string + Clientset kubernetes.Interface + Namespace string + HelmBin string + KubectlBin string } func (m *BinaryHelmManager) InstallTiller() error { arg := make([]string, 0, 5) - arg = append(arg, "init", "--tiller-namespace", m.Namespace) + var err error if enableRudder { - arg = append(arg, "--tiller-image", experimentalTillerImage) + arg = append(arg, "create", "-f", "manifests/", "-n", m.Namespace) + _, err = m.executeUsingKubectl(arg...) + } else { + arg = append(arg, "init", "--tiller-namespace", m.Namespace) + _, err = m.executeUsingHelm(arg...) } - _, err := m.executeUsingHelm(arg...) if err != nil { return err } By("Waiting for tiller pod") waitTillerPod(m.Clientset, m.Namespace) - if enableRudder { - By("Enabling rudder pod") - prepareRudder(m.Clientset, m.Namespace) - } return nil } @@ -92,9 +94,6 @@ func (m *BinaryHelmManager) DeleteTiller(removeHelmHome bool) error { if err != nil { return err } - if enableRudder { - return deleteRudder(m.Clientset, m.Namespace) - } return nil } @@ -147,12 +146,25 @@ func (m *BinaryHelmManager) executeUsingHelmInNamespace(arg ...string) (string, } func (m *BinaryHelmManager) executeUsingHelm(arg ...string) (string, error) { - cmd := exec.Command(m.HelmBin, arg...) + return m.executeUsingBinary(m.HelmBin, arg...) +} + +func (m *BinaryHelmManager) executeUsingKubectl(arg ...string) (string, error) { + return m.executeUsingBinary(m.KubectlBin, arg...) +} + +func (m *BinaryHelmManager) executeUsingBinary(binary string, arg ...string) (string, error) { + cmd := exec.Command(binary, arg...) Logf("Running command %+v\n", cmd.Args) stdout, err := cmd.Output() if err != nil { - stderr := err.(*exec.ExitError) - Logf("Command %+v, Err %s\n", cmd.Args, stderr.Stderr) + switch err.(type) { + case *exec.ExitError: + stderr := err.(*exec.ExitError) + Logf("Command %+v, Err %s\n", cmd.Args, stderr.Stderr) + case *exec.Error: + Logf("Command %+v, Err %s\n", cmd.Args, err) + } return "", err } return string(stdout), nil @@ -186,8 +198,8 @@ func regexpKeyFromStructuredOutput(key, output string) string { func prepareRudder(clientset kubernetes.Interface, namespace string) { rudder := &v1.Pod{ - ObjectMeta: v1.ObjectMeta{ - Name: rudderAppcontroller, + ObjectMeta: metav1.ObjectMeta{ + Name: rudderPodName, }, Spec: v1.PodSpec{ RestartPolicy: "Always", @@ -202,11 +214,11 @@ func prepareRudder(clientset kubernetes.Interface, namespace string) { } _, err := clientset.Core().Pods(namespace).Create(rudder) Expect(err).NotTo(HaveOccurred()) - WaitForPod(clientset, namespace, rudderAppcontroller, v1.PodRunning) + WaitForPod(clientset, namespace, rudderPodName, v1.PodRunning) } func deleteRudder(clientset kubernetes.Interface, namespace string) error { - return clientset.Core().Pods(namespace).Delete(rudderAppcontroller, nil) + return clientset.Core().Pods(namespace).Delete(rudderPodName, nil) } func getNameFromHelmOutput(output string) string { @@ -219,7 +231,7 @@ func getStatusFromHelmOutput(output string) string { func waitTillerPod(clientset kubernetes.Interface, namespace string) { Eventually(func() bool { - pods, err := clientset.Core().Pods(namespace).List(v1.ListOptions{}) + pods, err := clientset.Core().Pods(namespace).List(metav1.ListOptions{}) if err != nil { return false } diff --git a/utils.go b/e2e/utils.go similarity index 91% rename from utils.go rename to e2e/utils.go index 850b16974..fb37b60ab 100644 --- a/utils.go +++ b/e2e/utils.go @@ -23,6 +23,7 @@ import ( "time" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/rest" @@ -53,7 +54,7 @@ func KubeClient() (*kubernetes.Clientset, error) { func DeleteNS(clientset kubernetes.Interface, namespace *v1.Namespace) { defer GinkgoRecover() - pods, err := clientset.Core().Pods(namespace.Name).List(v1.ListOptions{}) + pods, err := clientset.Core().Pods(namespace.Name).List(metav1.ListOptions{}) Expect(err).NotTo(HaveOccurred()) for _, pod := range pods.Items { clientset.Core().Pods(namespace.Name).Delete(pod.Name, nil) @@ -69,7 +70,7 @@ func WaitForPod(clientset kubernetes.Interface, namespace string, name string, p defer GinkgoRecover() var podUpdated *v1.Pod Eventually(func() error { - podUpdated, err := clientset.Core().Pods(namespace).Get(name) + podUpdated, err := clientset.Core().Pods(namespace).Get(name, metav1.GetOptions{}) if err != nil { return err }