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.
pull/3636/head
Maciej Kwiek 8 years ago committed by Adam Reese
parent 8057e83b18
commit 468f717075
No known key found for this signature in database
GPG Key ID: 06F35E60A7A18DD6

@ -22,6 +22,7 @@ import (
"time" "time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/api/v1"
@ -35,7 +36,8 @@ import (
const ( const (
experimentalTillerImage string = "nebril/tiller" 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 // 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 // BinaryHelmManager uses helm binary to work with helm server
type BinaryHelmManager struct { type BinaryHelmManager struct {
Clientset kubernetes.Interface Clientset kubernetes.Interface
Namespace string Namespace string
HelmBin string HelmBin string
KubectlBin string
} }
func (m *BinaryHelmManager) InstallTiller() error { func (m *BinaryHelmManager) InstallTiller() error {
arg := make([]string, 0, 5) arg := make([]string, 0, 5)
arg = append(arg, "init", "--tiller-namespace", m.Namespace) var err error
if enableRudder { 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 { if err != nil {
return err return err
} }
By("Waiting for tiller pod") By("Waiting for tiller pod")
waitTillerPod(m.Clientset, m.Namespace) waitTillerPod(m.Clientset, m.Namespace)
if enableRudder {
By("Enabling rudder pod")
prepareRudder(m.Clientset, m.Namespace)
}
return nil return nil
} }
@ -92,9 +94,6 @@ func (m *BinaryHelmManager) DeleteTiller(removeHelmHome bool) error {
if err != nil { if err != nil {
return err return err
} }
if enableRudder {
return deleteRudder(m.Clientset, m.Namespace)
}
return nil return nil
} }
@ -147,12 +146,25 @@ func (m *BinaryHelmManager) executeUsingHelmInNamespace(arg ...string) (string,
} }
func (m *BinaryHelmManager) executeUsingHelm(arg ...string) (string, error) { 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) Logf("Running command %+v\n", cmd.Args)
stdout, err := cmd.Output() stdout, err := cmd.Output()
if err != nil { if err != nil {
stderr := err.(*exec.ExitError) switch err.(type) {
Logf("Command %+v, Err %s\n", cmd.Args, stderr.Stderr) 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 "", err
} }
return string(stdout), nil return string(stdout), nil
@ -186,8 +198,8 @@ func regexpKeyFromStructuredOutput(key, output string) string {
func prepareRudder(clientset kubernetes.Interface, namespace string) { func prepareRudder(clientset kubernetes.Interface, namespace string) {
rudder := &v1.Pod{ rudder := &v1.Pod{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: rudderAppcontroller, Name: rudderPodName,
}, },
Spec: v1.PodSpec{ Spec: v1.PodSpec{
RestartPolicy: "Always", RestartPolicy: "Always",
@ -202,11 +214,11 @@ func prepareRudder(clientset kubernetes.Interface, namespace string) {
} }
_, err := clientset.Core().Pods(namespace).Create(rudder) _, err := clientset.Core().Pods(namespace).Create(rudder)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
WaitForPod(clientset, namespace, rudderAppcontroller, v1.PodRunning) WaitForPod(clientset, namespace, rudderPodName, v1.PodRunning)
} }
func deleteRudder(clientset kubernetes.Interface, namespace string) error { 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 { func getNameFromHelmOutput(output string) string {
@ -219,7 +231,7 @@ func getStatusFromHelmOutput(output string) string {
func waitTillerPod(clientset kubernetes.Interface, namespace string) { func waitTillerPod(clientset kubernetes.Interface, namespace string) {
Eventually(func() bool { Eventually(func() bool {
pods, err := clientset.Core().Pods(namespace).List(v1.ListOptions{}) pods, err := clientset.Core().Pods(namespace).List(metav1.ListOptions{})
if err != nil { if err != nil {
return false return false
} }

@ -23,6 +23,7 @@ import (
"time" "time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/api/v1"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
@ -53,7 +54,7 @@ func KubeClient() (*kubernetes.Clientset, error) {
func DeleteNS(clientset kubernetes.Interface, namespace *v1.Namespace) { func DeleteNS(clientset kubernetes.Interface, namespace *v1.Namespace) {
defer GinkgoRecover() 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()) Expect(err).NotTo(HaveOccurred())
for _, pod := range pods.Items { for _, pod := range pods.Items {
clientset.Core().Pods(namespace.Name).Delete(pod.Name, nil) 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() defer GinkgoRecover()
var podUpdated *v1.Pod var podUpdated *v1.Pod
Eventually(func() error { Eventually(func() error {
podUpdated, err := clientset.Core().Pods(namespace).Get(name) podUpdated, err := clientset.Core().Pods(namespace).Get(name, metav1.GetOptions{})
if err != nil { if err != nil {
return err return err
} }
Loading…
Cancel
Save