Refactor debug logging methods.
This commit is contained in:
		@@ -74,7 +74,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			expectedOnSentinel := "+monitor master"
 | 
								expectedOnSentinel := "+monitor master"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting redis bootstrap")
 | 
								By("starting redis bootstrap")
 | 
				
			||||||
			runKubectl("create", "-f", bootstrapYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", bootstrapYaml, nsFlag)
 | 
				
			||||||
			err := waitForPodRunningInNamespace(c, bootstrapPodName, ns)
 | 
								err := waitForPodRunningInNamespace(c, bootstrapPodName, ns)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -84,13 +84,13 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("setting up services and controllers")
 | 
								By("setting up services and controllers")
 | 
				
			||||||
			runKubectl("create", "-f", sentinelServiceYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", sentinelServiceYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", sentinelControllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", sentinelControllerYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", controllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", controllerYaml, nsFlag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("scaling up the deployment")
 | 
								By("scaling up the deployment")
 | 
				
			||||||
			runKubectl("scale", "rc", redisRC, "--replicas=3", nsFlag)
 | 
								runKubectlOrDie("scale", "rc", redisRC, "--replicas=3", nsFlag)
 | 
				
			||||||
			runKubectl("scale", "rc", sentinelRC, "--replicas=3", nsFlag)
 | 
								runKubectlOrDie("scale", "rc", sentinelRC, "--replicas=3", nsFlag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("checking up the services")
 | 
								By("checking up the services")
 | 
				
			||||||
			checkAllLogs := func() {
 | 
								checkAllLogs := func() {
 | 
				
			||||||
@@ -110,7 +110,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			checkAllLogs()
 | 
								checkAllLogs()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("turning down bootstrap")
 | 
								By("turning down bootstrap")
 | 
				
			||||||
			runKubectl("delete", "-f", bootstrapYaml, nsFlag)
 | 
								runKubectlOrDie("delete", "-f", bootstrapYaml, nsFlag)
 | 
				
			||||||
			err = waitForRCPodToDisappear(c, ns, redisRC, bootstrapPodName)
 | 
								err = waitForRCPodToDisappear(c, ns, redisRC, bootstrapPodName)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			By("waiting for the new master election")
 | 
								By("waiting for the new master election")
 | 
				
			||||||
@@ -131,8 +131,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting rabbitmq")
 | 
								By("starting rabbitmq")
 | 
				
			||||||
			runKubectl("create", "-f", rabbitmqServiceYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", rabbitmqServiceYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", rabbitmqControllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", rabbitmqControllerYaml, nsFlag)
 | 
				
			||||||
			forEachPod(c, ns, "component", "rabbitmq", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "component", "rabbitmq", func(pod api.Pod) {
 | 
				
			||||||
				_, err := lookForStringInLog(ns, pod.Name, "rabbitmq", "Server startup complete", serverStartTimeout)
 | 
									_, err := lookForStringInLog(ns, pod.Name, "rabbitmq", "Server startup complete", serverStartTimeout)
 | 
				
			||||||
				Expect(err).NotTo(HaveOccurred())
 | 
									Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -141,15 +141,15 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting celery")
 | 
								By("starting celery")
 | 
				
			||||||
			runKubectl("create", "-f", celeryControllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", celeryControllerYaml, nsFlag)
 | 
				
			||||||
			forEachPod(c, ns, "component", "celery", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "component", "celery", func(pod api.Pod) {
 | 
				
			||||||
				_, err := lookForStringInFile(ns, pod.Name, "celery", "/data/celery.log", " ready.", serverStartTimeout)
 | 
									_, err := lookForStringInFile(ns, pod.Name, "celery", "/data/celery.log", " ready.", serverStartTimeout)
 | 
				
			||||||
				Expect(err).NotTo(HaveOccurred())
 | 
									Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting flower")
 | 
								By("starting flower")
 | 
				
			||||||
			runKubectl("create", "-f", flowerServiceYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", flowerServiceYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", flowerControllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", flowerControllerYaml, nsFlag)
 | 
				
			||||||
			forEachPod(c, ns, "component", "flower", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "component", "flower", func(pod api.Pod) {
 | 
				
			||||||
				// Do nothing. just wait for it to be up and running.
 | 
									// Do nothing. just wait for it to be up and running.
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@@ -173,9 +173,9 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting master")
 | 
								By("starting master")
 | 
				
			||||||
			runKubectl("create", "-f", serviceJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", serviceJson, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", masterJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", masterJson, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", driverJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", driverJson, nsFlag)
 | 
				
			||||||
			err := waitForPodRunningInNamespace(c, "spark-master", ns)
 | 
								err := waitForPodRunningInNamespace(c, "spark-master", ns)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			_, err = lookForStringInLog(ns, "spark-master", "spark-master", "Starting Spark master at", serverStartTimeout)
 | 
								_, err = lookForStringInLog(ns, "spark-master", "spark-master", "Starting Spark master at", serverStartTimeout)
 | 
				
			||||||
@@ -188,7 +188,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting workers")
 | 
								By("starting workers")
 | 
				
			||||||
			runKubectl("create", "-f", workerControllerJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", workerControllerJson, nsFlag)
 | 
				
			||||||
			ScaleRC(c, ns, "spark-worker-controller", 2, true)
 | 
								ScaleRC(c, ns, "spark-worker-controller", 2, true)
 | 
				
			||||||
			forEachPod(c, ns, "name", "spark-worker", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "name", "spark-worker", func(pod api.Pod) {
 | 
				
			||||||
				_, err := lookForStringInLog(ns, pod.Name, "spark-worker", "Successfully registered with master", serverStartTimeout)
 | 
									_, err := lookForStringInLog(ns, pod.Name, "spark-worker", "Successfully registered with master", serverStartTimeout)
 | 
				
			||||||
@@ -208,8 +208,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting service and pod")
 | 
								By("starting service and pod")
 | 
				
			||||||
			runKubectl("create", "-f", serviceYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", serviceYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", podYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", podYaml, nsFlag)
 | 
				
			||||||
			err := waitForPodRunningInNamespace(c, "cassandra", ns)
 | 
								err := waitForPodRunningInNamespace(c, "cassandra", ns)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -220,7 +220,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("create and scale rc")
 | 
								By("create and scale rc")
 | 
				
			||||||
			runKubectl("create", "-f", controllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", controllerYaml, nsFlag)
 | 
				
			||||||
			err = ScaleRC(c, ns, "cassandra", 2, true)
 | 
								err = ScaleRC(c, ns, "cassandra", 2, true)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			forEachPod(c, ns, "name", "cassandra", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "name", "cassandra", func(pod api.Pod) {
 | 
				
			||||||
@@ -230,7 +230,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
				Expect(err).NotTo(HaveOccurred())
 | 
									Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			output := runKubectl("exec", "cassandra", nsFlag, "--", "nodetool", "status")
 | 
								output := runKubectlOrDie("exec", "cassandra", nsFlag, "--", "nodetool", "status")
 | 
				
			||||||
			forEachPod(c, ns, "name", "cassandra", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "name", "cassandra", func(pod api.Pod) {
 | 
				
			||||||
				if !strings.Contains(output, pod.Status.PodIP) {
 | 
									if !strings.Contains(output, pod.Status.PodIP) {
 | 
				
			||||||
					Failf("Pod ip %s not found in nodetool status", pod.Status.PodIP)
 | 
										Failf("Pod ip %s not found in nodetool status", pod.Status.PodIP)
 | 
				
			||||||
@@ -253,8 +253,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			zookeeperPod := "zookeeper"
 | 
								zookeeperPod := "zookeeper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting Zookeeper")
 | 
								By("starting Zookeeper")
 | 
				
			||||||
			runKubectl("create", "-f", zookeeperPodJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", zookeeperPodJson, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", zookeeperServiceJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", zookeeperServiceJson, nsFlag)
 | 
				
			||||||
			err := waitForPodRunningInNamespace(c, zookeeperPod, ns)
 | 
								err := waitForPodRunningInNamespace(c, zookeeperPod, ns)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -265,8 +265,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting Nimbus")
 | 
								By("starting Nimbus")
 | 
				
			||||||
			runKubectl("create", "-f", nimbusPodJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", nimbusPodJson, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", nimbusServiceJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", nimbusServiceJson, nsFlag)
 | 
				
			||||||
			err = waitForPodRunningInNamespace(c, "nimbus", ns)
 | 
								err = waitForPodRunningInNamespace(c, "nimbus", ns)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -274,7 +274,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting workers")
 | 
								By("starting workers")
 | 
				
			||||||
			runKubectl("create", "-f", workerControllerJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", workerControllerJson, nsFlag)
 | 
				
			||||||
			forEachPod(c, ns, "name", "storm-worker", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "name", "storm-worker", func(pod api.Pod) {
 | 
				
			||||||
				//do nothing, just wait for the pod to be running
 | 
									//do nothing, just wait for the pod to be running
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@@ -288,7 +288,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			By("checking if Nimbus responds to requests")
 | 
								By("checking if Nimbus responds to requests")
 | 
				
			||||||
			lookForString("No topologies running.", time.Minute, func() string {
 | 
								lookForString("No topologies running.", time.Minute, func() string {
 | 
				
			||||||
				return runKubectl("exec", "nimbus", nsFlag, "--", "bin/storm", "list")
 | 
									return runKubectlOrDie("exec", "nimbus", nsFlag, "--", "bin/storm", "list")
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -302,8 +302,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			httpYaml := mkpath("http-liveness.yaml")
 | 
								httpYaml := mkpath("http-liveness.yaml")
 | 
				
			||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			runKubectl("create", "-f", execYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", execYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", httpYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", httpYaml, nsFlag)
 | 
				
			||||||
			checkRestart := func(podName string, timeout time.Duration) {
 | 
								checkRestart := func(podName string, timeout time.Duration) {
 | 
				
			||||||
				err := waitForPodRunningInNamespace(c, podName, ns)
 | 
									err := waitForPodRunningInNamespace(c, podName, ns)
 | 
				
			||||||
				Expect(err).NotTo(HaveOccurred())
 | 
									Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -335,8 +335,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("creating secret and pod")
 | 
								By("creating secret and pod")
 | 
				
			||||||
			runKubectl("create", "-f", secretYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", secretYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", podYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", podYaml, nsFlag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("checking if secret was read correctly")
 | 
								By("checking if secret was read correctly")
 | 
				
			||||||
			_, err := lookForStringInLog(ns, "secret-test-pod", "test-container", "value-1", serverStartTimeout)
 | 
								_, err := lookForStringInLog(ns, "secret-test-pod", "test-container", "value-1", serverStartTimeout)
 | 
				
			||||||
@@ -354,7 +354,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			podName := "dapi-test-pod"
 | 
								podName := "dapi-test-pod"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("creating the pod")
 | 
								By("creating the pod")
 | 
				
			||||||
			runKubectl("create", "-f", podYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", podYaml, nsFlag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("checking if name and namespace were passed correctly")
 | 
								By("checking if name and namespace were passed correctly")
 | 
				
			||||||
			_, err := lookForStringInLog(ns, podName, "test-container", fmt.Sprintf("POD_NAMESPACE=%v", ns), serverStartTimeout)
 | 
								_, err := lookForStringInLog(ns, podName, "test-container", fmt.Sprintf("POD_NAMESPACE=%v", ns), serverStartTimeout)
 | 
				
			||||||
@@ -376,8 +376,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting rethinkdb")
 | 
								By("starting rethinkdb")
 | 
				
			||||||
			runKubectl("create", "-f", driverServiceYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", driverServiceYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", rethinkDbControllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", rethinkDbControllerYaml, nsFlag)
 | 
				
			||||||
			checkDbInstances := func() {
 | 
								checkDbInstances := func() {
 | 
				
			||||||
				forEachPod(c, ns, "db", "rethinkdb", func(pod api.Pod) {
 | 
									forEachPod(c, ns, "db", "rethinkdb", func(pod api.Pod) {
 | 
				
			||||||
					_, err := lookForStringInLog(ns, pod.Name, "rethinkdb", "Server ready", serverStartTimeout)
 | 
										_, err := lookForStringInLog(ns, pod.Name, "rethinkdb", "Server ready", serverStartTimeout)
 | 
				
			||||||
@@ -393,8 +393,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			checkDbInstances()
 | 
								checkDbInstances()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting admin")
 | 
								By("starting admin")
 | 
				
			||||||
			runKubectl("create", "-f", adminServiceYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", adminServiceYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", adminPodYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", adminPodYaml, nsFlag)
 | 
				
			||||||
			err = waitForPodRunningInNamespace(c, "rethinkdb-admin", ns)
 | 
								err = waitForPodRunningInNamespace(c, "rethinkdb-admin", ns)
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			checkDbInstances()
 | 
								checkDbInstances()
 | 
				
			||||||
@@ -416,8 +416,8 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("starting hazelcast")
 | 
								By("starting hazelcast")
 | 
				
			||||||
			runKubectl("create", "-f", serviceYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", serviceYaml, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", controllerYaml, nsFlag)
 | 
								runKubectlOrDie("create", "-f", controllerYaml, nsFlag)
 | 
				
			||||||
			forEachPod(c, ns, "name", "hazelcast", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "name", "hazelcast", func(pod api.Pod) {
 | 
				
			||||||
				_, err := lookForStringInLog(ns, pod.Name, "hazelcast", "Members [1]", serverStartTimeout)
 | 
									_, err := lookForStringInLog(ns, pod.Name, "hazelcast", "Members [1]", serverStartTimeout)
 | 
				
			||||||
				Expect(err).NotTo(HaveOccurred())
 | 
									Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -476,11 +476,11 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for _, ns := range namespaces {
 | 
								for _, ns := range namespaces {
 | 
				
			||||||
				runKubectl("create", "-f", backendRcYaml, getNsCmdFlag(ns))
 | 
									runKubectlOrDie("create", "-f", backendRcYaml, getNsCmdFlag(ns))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for _, ns := range namespaces {
 | 
								for _, ns := range namespaces {
 | 
				
			||||||
				runKubectl("create", "-f", backendSvcYaml, getNsCmdFlag(ns))
 | 
									runKubectlOrDie("create", "-f", backendSvcYaml, getNsCmdFlag(ns))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// wait for objects
 | 
								// wait for objects
 | 
				
			||||||
@@ -526,7 +526,7 @@ var _ = Describe("Examples e2e", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			// create a pod in each namespace
 | 
								// create a pod in each namespace
 | 
				
			||||||
			for _, ns := range namespaces {
 | 
								for _, ns := range namespaces {
 | 
				
			||||||
				newKubectlCommand("create", "-f", "-", getNsCmdFlag(ns)).withStdinData(updatedPodYaml).exec()
 | 
									newKubectlCommand("create", "-f", "-", getNsCmdFlag(ns)).withStdinData(updatedPodYaml).execOrDie()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// wait until the pods have been scheduler, i.e. are not Pending anymore. Remember
 | 
								// wait until the pods have been scheduler, i.e. are not Pending anymore. Remember
 | 
				
			||||||
@@ -605,13 +605,13 @@ func forEachPod(c *client.Client, ns, selectorKey, selectorValue string, fn func
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func lookForStringInLog(ns, podName, container, expectedString string, timeout time.Duration) (result string, err error) {
 | 
					func lookForStringInLog(ns, podName, container, expectedString string, timeout time.Duration) (result string, err error) {
 | 
				
			||||||
	return lookForString(expectedString, timeout, func() string {
 | 
						return lookForString(expectedString, timeout, func() string {
 | 
				
			||||||
		return runKubectl("log", podName, container, fmt.Sprintf("--namespace=%v", ns))
 | 
							return runKubectlOrDie("log", podName, container, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func lookForStringInFile(ns, podName, container, file, expectedString string, timeout time.Duration) (result string, err error) {
 | 
					func lookForStringInFile(ns, podName, container, file, expectedString string, timeout time.Duration) (result string, err error) {
 | 
				
			||||||
	return lookForString(expectedString, timeout, func() string {
 | 
						return lookForString(expectedString, timeout, func() string {
 | 
				
			||||||
		return runKubectl("exec", podName, "-c", container, fmt.Sprintf("--namespace=%v", ns), "--", "cat", file)
 | 
							return runKubectlOrDie("exec", podName, "-c", container, fmt.Sprintf("--namespace=%v", ns), "--", "cat", file)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -620,7 +620,7 @@ func lookForStringInPodExec(ns, podName string, command []string, expectedString
 | 
				
			|||||||
		// use the first container
 | 
							// use the first container
 | 
				
			||||||
		args := []string{"exec", podName, fmt.Sprintf("--namespace=%v", ns), "--"}
 | 
							args := []string{"exec", podName, fmt.Sprintf("--namespace=%v", ns), "--"}
 | 
				
			||||||
		args = append(args, command...)
 | 
							args = append(args, command...)
 | 
				
			||||||
		return runKubectl(args...)
 | 
							return runKubectlOrDie(args...)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,6 +65,10 @@ var (
 | 
				
			|||||||
	// Name of the loadbalancer controller within the cluster addon
 | 
						// Name of the loadbalancer controller within the cluster addon
 | 
				
			||||||
	lbContainerName = "l7-lb-controller"
 | 
						lbContainerName = "l7-lb-controller"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If set, the test tries to perform an HTTP GET on each url endpoint of
 | 
				
			||||||
 | 
						// the Ingress. Only set to false to short-circuit test runs in debugging.
 | 
				
			||||||
 | 
						verifyHTTPGET = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// On average it takes ~6 minutes for a single backend to come online.
 | 
						// On average it takes ~6 minutes for a single backend to come online.
 | 
				
			||||||
	// We *don't* expect this poll to consistently take 15 minutes for every
 | 
						// We *don't* expect this poll to consistently take 15 minutes for every
 | 
				
			||||||
	// Ingress as GCE is creating/checking backends in parallel, but at the
 | 
						// Ingress as GCE is creating/checking backends in parallel, but at the
 | 
				
			||||||
@@ -173,7 +177,9 @@ func createApp(c *client.Client, ns string, i int) {
 | 
				
			|||||||
// gcloudUnmarshal unmarshals json output of gcloud into given out interface.
 | 
					// gcloudUnmarshal unmarshals json output of gcloud into given out interface.
 | 
				
			||||||
func gcloudUnmarshal(resource, regex string, out interface{}) {
 | 
					func gcloudUnmarshal(resource, regex string, out interface{}) {
 | 
				
			||||||
	output, err := exec.Command("gcloud", "compute", resource, "list",
 | 
						output, err := exec.Command("gcloud", "compute", resource, "list",
 | 
				
			||||||
		fmt.Sprintf("--regex=%v", regex), "-q", "--format=json").CombinedOutput()
 | 
							fmt.Sprintf("--regex=%v", regex),
 | 
				
			||||||
 | 
							fmt.Sprintf("--project=%v", testContext.CloudConfig.ProjectID),
 | 
				
			||||||
 | 
							"-q", "--format=json").CombinedOutput()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		Failf("Error unmarshalling gcloud output: %v", err)
 | 
							Failf("Error unmarshalling gcloud output: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -204,7 +210,7 @@ func checkLeakedResources() error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// run kubectl log on the L7 controller pod.
 | 
					// kubectlLogLBController logs kubectl debug output for the L7 controller pod.
 | 
				
			||||||
func kubectlLogLBController(c *client.Client) {
 | 
					func kubectlLogLBController(c *client.Client) {
 | 
				
			||||||
	selector := labels.SelectorFromSet(labels.Set(map[string]string{"name": "glbc"}))
 | 
						selector := labels.SelectorFromSet(labels.Set(map[string]string{"name": "glbc"}))
 | 
				
			||||||
	podList, err := c.Pods(api.NamespaceAll).List(selector, fields.Everything())
 | 
						podList, err := c.Pods(api.NamespaceAll).List(selector, fields.Everything())
 | 
				
			||||||
@@ -218,21 +224,11 @@ func kubectlLogLBController(c *client.Client) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	for _, p := range podList.Items {
 | 
						for _, p := range podList.Items {
 | 
				
			||||||
		Logf("\nLast 100 log lines of %v\n", p.Name)
 | 
							Logf("\nLast 100 log lines of %v\n", p.Name)
 | 
				
			||||||
		Logf(runKubectl("logs", p.Name, "--namespace=kube-system", "-c", lbContainerName, "--tail=100"))
 | 
							l, _ := runKubectl("logs", p.Name, fmt.Sprintf("--namespace=%v", api.NamespaceSystem), "-c", lbContainerName, "--tail=100")
 | 
				
			||||||
 | 
							Logf(l)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// dumpDebugAndFail dumps verbose debug output before failing.
 | 
					 | 
				
			||||||
func dumpDebugAndFail(err string, ns string, c *client.Client) {
 | 
					 | 
				
			||||||
	kubectlLogLBController(c)
 | 
					 | 
				
			||||||
	Logf("\nOutput of kubectl describe ing:\n")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// TODO: runKubectl will hard fail if kubectl fails, swap it out for
 | 
					 | 
				
			||||||
	// something more befitting for a debug dumper.
 | 
					 | 
				
			||||||
	Logf(runKubectl("describe", "ing", fmt.Sprintf("--namespace=%v", ns)))
 | 
					 | 
				
			||||||
	Failf(err)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _ = Describe("GCE L7 LoadBalancer Controller", func() {
 | 
					var _ = Describe("GCE L7 LoadBalancer Controller", func() {
 | 
				
			||||||
	// These variables are initialized after framework's beforeEach.
 | 
						// These variables are initialized after framework's beforeEach.
 | 
				
			||||||
	var ns string
 | 
						var ns string
 | 
				
			||||||
@@ -254,6 +250,12 @@ var _ = Describe("GCE L7 LoadBalancer Controller", func() {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AfterEach(func() {
 | 
						AfterEach(func() {
 | 
				
			||||||
 | 
							if CurrentGinkgoTestDescription().Failed {
 | 
				
			||||||
 | 
								kubectlLogLBController(client)
 | 
				
			||||||
 | 
								Logf("\nOutput of kubectl describe ing:\n")
 | 
				
			||||||
 | 
								desc, _ := runKubectl("describe", "ing", fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
 | 
								Logf(desc)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		framework.afterEach()
 | 
							framework.afterEach()
 | 
				
			||||||
		err := wait.Poll(lbPollInterval, lbPollTimeout, func() (bool, error) {
 | 
							err := wait.Poll(lbPollInterval, lbPollTimeout, func() (bool, error) {
 | 
				
			||||||
			if err := checkLeakedResources(); err != nil {
 | 
								if err := checkLeakedResources(); err != nil {
 | 
				
			||||||
@@ -301,13 +303,17 @@ var _ = Describe("GCE L7 LoadBalancer Controller", func() {
 | 
				
			|||||||
			start := time.Now()
 | 
								start := time.Now()
 | 
				
			||||||
			address, err := waitForIngressAddress(client, ing.Namespace, ing.Name, lbPollTimeout)
 | 
								address, err := waitForIngressAddress(client, ing.Namespace, ing.Name, lbPollTimeout)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				dumpDebugAndFail(fmt.Sprintf("Ingress failed to acquire an IP address within %v", lbPollTimeout), ns, client)
 | 
									Failf("Ingress failed to acquire an IP address within %v", lbPollTimeout)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			By(fmt.Sprintf("Found address %v for ingress %v, took %v to come online",
 | 
								By(fmt.Sprintf("Found address %v for ingress %v, took %v to come online",
 | 
				
			||||||
				address, ing.Name, time.Since(start)))
 | 
									address, ing.Name, time.Since(start)))
 | 
				
			||||||
			creationTimes = append(creationTimes, time.Since(start))
 | 
								creationTimes = append(creationTimes, time.Since(start))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if !verifyHTTPGET {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Check that all rules respond to a simple GET.
 | 
								// Check that all rules respond to a simple GET.
 | 
				
			||||||
			for _, rules := range ing.Spec.Rules {
 | 
								for _, rules := range ing.Spec.Rules {
 | 
				
			||||||
				// As of Kubernetes 1.1 we only support HTTP Ingress.
 | 
									// As of Kubernetes 1.1 we only support HTTP Ingress.
 | 
				
			||||||
@@ -330,8 +336,8 @@ var _ = Describe("GCE L7 LoadBalancer Controller", func() {
 | 
				
			|||||||
						return true, nil
 | 
											return true, nil
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
					if pollErr != nil {
 | 
										if pollErr != nil {
 | 
				
			||||||
						dumpDebugAndFail(fmt.Sprintf("Failed to execute a successful GET within %v, Last response body for %v, host %v:\n%v\n\n%v",
 | 
											Failf("Failed to execute a successful GET within %v, Last response body for %v, host %v:\n%v\n\n%v",
 | 
				
			||||||
							lbPollTimeout, route, rules.Host, lastBody, pollErr), ns, client)
 | 
												lbPollTimeout, route, rules.Host, lastBody, pollErr)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					rt := time.Since(GETStart)
 | 
										rt := time.Since(GETStart)
 | 
				
			||||||
					By(fmt.Sprintf("Route %v host %v took %v to respond", route, rules.Host, rt))
 | 
										By(fmt.Sprintf("Route %v host %v took %v to respond", route, rules.Host, rt))
 | 
				
			||||||
@@ -345,12 +351,15 @@ var _ = Describe("GCE L7 LoadBalancer Controller", func() {
 | 
				
			|||||||
		sort.Sort(timeSlice(creationTimes))
 | 
							sort.Sort(timeSlice(creationTimes))
 | 
				
			||||||
		perc50 := creationTimes[len(creationTimes)/2]
 | 
							perc50 := creationTimes[len(creationTimes)/2]
 | 
				
			||||||
		if perc50 > expectedLBCreationTime {
 | 
							if perc50 > expectedLBCreationTime {
 | 
				
			||||||
			dumpDebugAndFail(fmt.Sprintf("Average creation time is too high: %+v", creationTimes), ns, client)
 | 
								Failf("Average creation time is too high: %+v", creationTimes)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !verifyHTTPGET {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		sort.Sort(timeSlice(responseTimes))
 | 
							sort.Sort(timeSlice(responseTimes))
 | 
				
			||||||
		perc50 = responseTimes[len(responseTimes)/2]
 | 
							perc50 = responseTimes[len(responseTimes)/2]
 | 
				
			||||||
		if perc50 > expectedLBHealthCheckTime {
 | 
							if perc50 > expectedLBHealthCheckTime {
 | 
				
			||||||
			dumpDebugAndFail(fmt.Sprintf("Average startup time is too high: %+v", responseTimes), ns, client)
 | 
								Failf("Average startup time is too high: %+v", responseTimes)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -95,7 +95,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			defer cleanup(nautilusPath, ns, updateDemoSelector)
 | 
								defer cleanup(nautilusPath, ns, updateDemoSelector)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("creating a replication controller")
 | 
								By("creating a replication controller")
 | 
				
			||||||
			runKubectl("create", "-f", nautilusPath, fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("create", "-f", nautilusPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
								validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -103,22 +103,22 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			defer cleanup(nautilusPath, ns, updateDemoSelector)
 | 
								defer cleanup(nautilusPath, ns, updateDemoSelector)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("creating a replication controller")
 | 
								By("creating a replication controller")
 | 
				
			||||||
			runKubectl("create", "-f", nautilusPath, fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("create", "-f", nautilusPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
								validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
				
			||||||
			By("scaling down the replication controller")
 | 
								By("scaling down the replication controller")
 | 
				
			||||||
			runKubectl("scale", "rc", "update-demo-nautilus", "--replicas=1", "--timeout=5m", fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("scale", "rc", "update-demo-nautilus", "--replicas=1", "--timeout=5m", fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			validateController(c, nautilusImage, 1, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
								validateController(c, nautilusImage, 1, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
				
			||||||
			By("scaling up the replication controller")
 | 
								By("scaling up the replication controller")
 | 
				
			||||||
			runKubectl("scale", "rc", "update-demo-nautilus", "--replicas=2", "--timeout=5m", fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("scale", "rc", "update-demo-nautilus", "--replicas=2", "--timeout=5m", fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
								validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		It("should do a rolling update of a replication controller [Conformance]", func() {
 | 
							It("should do a rolling update of a replication controller [Conformance]", func() {
 | 
				
			||||||
			By("creating the initial replication controller")
 | 
								By("creating the initial replication controller")
 | 
				
			||||||
			runKubectl("create", "-f", nautilusPath, fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("create", "-f", nautilusPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
								validateController(c, nautilusImage, 2, "update-demo", updateDemoSelector, getUDData("nautilus.jpg", ns), ns)
 | 
				
			||||||
			By("rolling-update to new replication controller")
 | 
								By("rolling-update to new replication controller")
 | 
				
			||||||
			runKubectl("rolling-update", "update-demo-nautilus", "--update-period=1s", "-f", kittenPath, fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("rolling-update", "update-demo-nautilus", "--update-period=1s", "-f", kittenPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			validateController(c, kittenImage, 2, "update-demo", updateDemoSelector, getUDData("kitten.jpg", ns), ns)
 | 
								validateController(c, kittenImage, 2, "update-demo", updateDemoSelector, getUDData("kitten.jpg", ns), ns)
 | 
				
			||||||
			// Everything will hopefully be cleaned up when the namespace is deleted.
 | 
								// Everything will hopefully be cleaned up when the namespace is deleted.
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
@@ -135,7 +135,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			defer cleanup(guestbookPath, ns, frontendSelector, redisMasterSelector, redisSlaveSelector)
 | 
								defer cleanup(guestbookPath, ns, frontendSelector, redisMasterSelector, redisSlaveSelector)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("creating all guestbook components")
 | 
								By("creating all guestbook components")
 | 
				
			||||||
			runKubectl("create", "-f", guestbookPath, fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("create", "-f", guestbookPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("validating guestbook app")
 | 
								By("validating guestbook app")
 | 
				
			||||||
			validateGuestbookApp(c, ns)
 | 
								validateGuestbookApp(c, ns)
 | 
				
			||||||
@@ -148,7 +148,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
		BeforeEach(func() {
 | 
							BeforeEach(func() {
 | 
				
			||||||
			podPath = filepath.Join(testContext.RepoRoot, "docs/user-guide/pod.yaml")
 | 
								podPath = filepath.Join(testContext.RepoRoot, "docs/user-guide/pod.yaml")
 | 
				
			||||||
			By("creating the pod")
 | 
								By("creating the pod")
 | 
				
			||||||
			runKubectl("create", "-f", podPath, fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("create", "-f", podPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			checkPodsRunningReady(c, ns, []string{simplePodName}, podStartTimeout)
 | 
								checkPodsRunningReady(c, ns, []string{simplePodName}, podStartTimeout)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		AfterEach(func() {
 | 
							AfterEach(func() {
 | 
				
			||||||
@@ -157,7 +157,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		It("should support exec", func() {
 | 
							It("should support exec", func() {
 | 
				
			||||||
			By("executing a command in the container")
 | 
								By("executing a command in the container")
 | 
				
			||||||
			execOutput := runKubectl("exec", fmt.Sprintf("--namespace=%v", ns), simplePodName, "echo", "running", "in", "container")
 | 
								execOutput := runKubectlOrDie("exec", fmt.Sprintf("--namespace=%v", ns), simplePodName, "echo", "running", "in", "container")
 | 
				
			||||||
			if e, a := "running in container", execOutput; e != a {
 | 
								if e, a := "running in container", execOutput; e != a {
 | 
				
			||||||
				Failf("Unexpected kubectl exec output. Wanted %q, got %q", e, a)
 | 
									Failf("Unexpected kubectl exec output. Wanted %q, got %q", e, a)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -165,7 +165,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			By("executing a command in the container with noninteractive stdin")
 | 
								By("executing a command in the container with noninteractive stdin")
 | 
				
			||||||
			execOutput = newKubectlCommand("exec", fmt.Sprintf("--namespace=%v", ns), "-i", simplePodName, "cat").
 | 
								execOutput = newKubectlCommand("exec", fmt.Sprintf("--namespace=%v", ns), "-i", simplePodName, "cat").
 | 
				
			||||||
				withStdinData("abcd1234").
 | 
									withStdinData("abcd1234").
 | 
				
			||||||
				exec()
 | 
									execOrDie()
 | 
				
			||||||
			if e, a := "abcd1234", execOutput; e != a {
 | 
								if e, a := "abcd1234", execOutput; e != a {
 | 
				
			||||||
				Failf("Unexpected kubectl exec output. Wanted %q, got %q", e, a)
 | 
									Failf("Unexpected kubectl exec output. Wanted %q, got %q", e, a)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -181,7 +181,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			By("executing a command in the container with pseudo-interactive stdin")
 | 
								By("executing a command in the container with pseudo-interactive stdin")
 | 
				
			||||||
			execOutput = newKubectlCommand("exec", fmt.Sprintf("--namespace=%v", ns), "-i", simplePodName, "bash").
 | 
								execOutput = newKubectlCommand("exec", fmt.Sprintf("--namespace=%v", ns), "-i", simplePodName, "bash").
 | 
				
			||||||
				withStdinReader(r).
 | 
									withStdinReader(r).
 | 
				
			||||||
				exec()
 | 
									execOrDie()
 | 
				
			||||||
			if e, a := "hi", execOutput; e != a {
 | 
								if e, a := "hi", execOutput; e != a {
 | 
				
			||||||
				Failf("Unexpected kubectl exec output. Wanted %q, got %q", e, a)
 | 
									Failf("Unexpected kubectl exec output. Wanted %q, got %q", e, a)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -241,7 +241,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			// start exec-proxy-tester container
 | 
								// start exec-proxy-tester container
 | 
				
			||||||
			netexecPodPath := filepath.Join(testContext.RepoRoot, "test/images/netexec/pod.yaml")
 | 
								netexecPodPath := filepath.Join(testContext.RepoRoot, "test/images/netexec/pod.yaml")
 | 
				
			||||||
			runKubectl("create", "-f", netexecPodPath, fmt.Sprintf("--namespace=%v", ns))
 | 
								runKubectlOrDie("create", "-f", netexecPodPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			checkPodsRunningReady(c, ns, []string{netexecContainer}, podStartTimeout)
 | 
								checkPodsRunningReady(c, ns, []string{netexecContainer}, podStartTimeout)
 | 
				
			||||||
			// Clean up
 | 
								// Clean up
 | 
				
			||||||
			defer cleanup(netexecPodPath, ns, netexecPodSelector)
 | 
								defer cleanup(netexecPodPath, ns, netexecPodSelector)
 | 
				
			||||||
@@ -311,7 +311,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
				By("Running kubectl in netexec via an HTTP proxy using " + proxyVar)
 | 
									By("Running kubectl in netexec via an HTTP proxy using " + proxyVar)
 | 
				
			||||||
				// start the proxy container
 | 
									// start the proxy container
 | 
				
			||||||
				goproxyPodPath := filepath.Join(testContext.RepoRoot, "test/images/goproxy/pod.yaml")
 | 
									goproxyPodPath := filepath.Join(testContext.RepoRoot, "test/images/goproxy/pod.yaml")
 | 
				
			||||||
				runKubectl("create", "-f", goproxyPodPath, fmt.Sprintf("--namespace=%v", ns))
 | 
									runKubectlOrDie("create", "-f", goproxyPodPath, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
				checkPodsRunningReady(c, ns, []string{goproxyContainer}, podStartTimeout)
 | 
									checkPodsRunningReady(c, ns, []string{goproxyContainer}, podStartTimeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// get the proxy address
 | 
									// get the proxy address
 | 
				
			||||||
@@ -348,7 +348,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				// Verify the proxy server logs saw the connection
 | 
									// Verify the proxy server logs saw the connection
 | 
				
			||||||
				expectedProxyLog := fmt.Sprintf("Accepting CONNECT to %s", strings.TrimRight(strings.TrimLeft(testContext.Host, "https://"), "/api"))
 | 
									expectedProxyLog := fmt.Sprintf("Accepting CONNECT to %s", strings.TrimRight(strings.TrimLeft(testContext.Host, "https://"), "/api"))
 | 
				
			||||||
				proxyLog := runKubectl("log", "goproxy", fmt.Sprintf("--namespace=%v", ns))
 | 
									proxyLog := runKubectlOrDie("log", "goproxy", fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if !strings.Contains(proxyLog, expectedProxyLog) {
 | 
									if !strings.Contains(proxyLog, expectedProxyLog) {
 | 
				
			||||||
					Failf("Missing expected log result on proxy server for %s. Expected: %q, got %q", proxyVar, expectedProxyLog, proxyLog)
 | 
										Failf("Missing expected log result on proxy server for %s. Expected: %q, got %q", proxyVar, expectedProxyLog, proxyLog)
 | 
				
			||||||
@@ -364,7 +364,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			By("executing a command with run and attach with stdin")
 | 
								By("executing a command with run and attach with stdin")
 | 
				
			||||||
			runOutput := newKubectlCommand(nsFlag, "run", "run-test", "--image=busybox", "--restart=Never", "--attach=true", "--stdin", "--", "sh", "-c", "cat && echo 'stdin closed'").
 | 
								runOutput := newKubectlCommand(nsFlag, "run", "run-test", "--image=busybox", "--restart=Never", "--attach=true", "--stdin", "--", "sh", "-c", "cat && echo 'stdin closed'").
 | 
				
			||||||
				withStdinData("abcd1234").
 | 
									withStdinData("abcd1234").
 | 
				
			||||||
				exec()
 | 
									execOrDie()
 | 
				
			||||||
			Expect(runOutput).To(ContainSubstring("abcd1234"))
 | 
								Expect(runOutput).To(ContainSubstring("abcd1234"))
 | 
				
			||||||
			Expect(runOutput).To(ContainSubstring("stdin closed"))
 | 
								Expect(runOutput).To(ContainSubstring("stdin closed"))
 | 
				
			||||||
			Expect(c.Pods(ns).Delete("run-test", api.NewDeleteOptions(0))).To(BeNil())
 | 
								Expect(c.Pods(ns).Delete("run-test", api.NewDeleteOptions(0))).To(BeNil())
 | 
				
			||||||
@@ -372,7 +372,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			By("executing a command with run and attach without stdin")
 | 
								By("executing a command with run and attach without stdin")
 | 
				
			||||||
			runOutput = newKubectlCommand(fmt.Sprintf("--namespace=%v", ns), "run", "run-test-2", "--image=busybox", "--restart=Never", "--attach=true", "--leave-stdin-open=true", "--", "sh", "-c", "cat && echo 'stdin closed'").
 | 
								runOutput = newKubectlCommand(fmt.Sprintf("--namespace=%v", ns), "run", "run-test-2", "--image=busybox", "--restart=Never", "--attach=true", "--leave-stdin-open=true", "--", "sh", "-c", "cat && echo 'stdin closed'").
 | 
				
			||||||
				withStdinData("abcd1234").
 | 
									withStdinData("abcd1234").
 | 
				
			||||||
				exec()
 | 
									execOrDie()
 | 
				
			||||||
			Expect(runOutput).ToNot(ContainSubstring("abcd1234"))
 | 
								Expect(runOutput).ToNot(ContainSubstring("abcd1234"))
 | 
				
			||||||
			Expect(runOutput).To(ContainSubstring("stdin closed"))
 | 
								Expect(runOutput).To(ContainSubstring("stdin closed"))
 | 
				
			||||||
			Expect(c.Pods(ns).Delete("run-test-2", api.NewDeleteOptions(0))).To(BeNil())
 | 
								Expect(c.Pods(ns).Delete("run-test-2", api.NewDeleteOptions(0))).To(BeNil())
 | 
				
			||||||
@@ -380,7 +380,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			By("executing a command with run and attach with stdin with open stdin should remain running")
 | 
								By("executing a command with run and attach with stdin with open stdin should remain running")
 | 
				
			||||||
			runOutput = newKubectlCommand(nsFlag, "run", "run-test-3", "--image=busybox", "--restart=Never", "--attach=true", "--leave-stdin-open=true", "--stdin", "--", "sh", "-c", "cat && echo 'stdin closed'").
 | 
								runOutput = newKubectlCommand(nsFlag, "run", "run-test-3", "--image=busybox", "--restart=Never", "--attach=true", "--leave-stdin-open=true", "--stdin", "--", "sh", "-c", "cat && echo 'stdin closed'").
 | 
				
			||||||
				withStdinData("abcd1234\n").
 | 
									withStdinData("abcd1234\n").
 | 
				
			||||||
				exec()
 | 
									execOrDie()
 | 
				
			||||||
			Expect(runOutput).ToNot(ContainSubstring("stdin closed"))
 | 
								Expect(runOutput).ToNot(ContainSubstring("stdin closed"))
 | 
				
			||||||
			if !checkPodsRunningReady(c, ns, []string{"run-test-3"}, time.Minute) {
 | 
								if !checkPodsRunningReady(c, ns, []string{"run-test-3"}, time.Minute) {
 | 
				
			||||||
				Failf("Pod %q should still be running", "run-test-3")
 | 
									Failf("Pod %q should still be running", "run-test-3")
 | 
				
			||||||
@@ -392,7 +392,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
				if !checkPodsRunningReady(c, ns, []string{"run-test-3"}, 1*time.Second) {
 | 
									if !checkPodsRunningReady(c, ns, []string{"run-test-3"}, 1*time.Second) {
 | 
				
			||||||
					Failf("Pod %q should still be running", "run-test-3")
 | 
										Failf("Pod %q should still be running", "run-test-3")
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				logOutput := runKubectl(nsFlag, "logs", "run-test-3")
 | 
									logOutput := runKubectlOrDie(nsFlag, "logs", "run-test-3")
 | 
				
			||||||
				Expect(logOutput).ToNot(ContainSubstring("stdin closed"))
 | 
									Expect(logOutput).ToNot(ContainSubstring("stdin closed"))
 | 
				
			||||||
				return strings.Contains(logOutput, "abcd1234"), nil
 | 
									return strings.Contains(logOutput, "abcd1234"), nil
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@@ -425,7 +425,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
	Describe("Kubectl api-versions", func() {
 | 
						Describe("Kubectl api-versions", func() {
 | 
				
			||||||
		It("should check if v1 is in available api versions [Conformance]", func() {
 | 
							It("should check if v1 is in available api versions [Conformance]", func() {
 | 
				
			||||||
			By("validating api verions")
 | 
								By("validating api verions")
 | 
				
			||||||
			output := runKubectl("api-versions")
 | 
								output := runKubectlOrDie("api-versions")
 | 
				
			||||||
			if !strings.Contains(output, "v1") {
 | 
								if !strings.Contains(output, "v1") {
 | 
				
			||||||
				Failf("No v1 in kubectl api-versions")
 | 
									Failf("No v1 in kubectl api-versions")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -440,12 +440,12 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			controllerJson := mkpath("redis-master-controller.json")
 | 
								controllerJson := mkpath("redis-master-controller.json")
 | 
				
			||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
			By("creating Redis RC")
 | 
								By("creating Redis RC")
 | 
				
			||||||
			runKubectl("create", "-f", controllerJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", controllerJson, nsFlag)
 | 
				
			||||||
			By("applying a modified configuration")
 | 
								By("applying a modified configuration")
 | 
				
			||||||
			stdin := modifyReplicationControllerConfiguration(controllerJson)
 | 
								stdin := modifyReplicationControllerConfiguration(controllerJson)
 | 
				
			||||||
			newKubectlCommand("apply", "-f", "-", nsFlag).
 | 
								newKubectlCommand("apply", "-f", "-", nsFlag).
 | 
				
			||||||
				withStdinReader(stdin).
 | 
									withStdinReader(stdin).
 | 
				
			||||||
				exec()
 | 
									execOrDie()
 | 
				
			||||||
			By("checking the result")
 | 
								By("checking the result")
 | 
				
			||||||
			forEachReplicationController(c, ns, "app", "redis", validateReplicationControllerConfiguration)
 | 
								forEachReplicationController(c, ns, "app", "redis", validateReplicationControllerConfiguration)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
@@ -454,7 +454,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
	Describe("Kubectl cluster-info", func() {
 | 
						Describe("Kubectl cluster-info", func() {
 | 
				
			||||||
		It("should check if Kubernetes master services is included in cluster-info [Conformance]", func() {
 | 
							It("should check if Kubernetes master services is included in cluster-info [Conformance]", func() {
 | 
				
			||||||
			By("validating cluster-info")
 | 
								By("validating cluster-info")
 | 
				
			||||||
			output := runKubectl("cluster-info")
 | 
								output := runKubectlOrDie("cluster-info")
 | 
				
			||||||
			// Can't check exact strings due to terminal control commands (colors)
 | 
								// Can't check exact strings due to terminal control commands (colors)
 | 
				
			||||||
			requiredItems := []string{"Kubernetes master", "is running at"}
 | 
								requiredItems := []string{"Kubernetes master", "is running at"}
 | 
				
			||||||
			if providerIs("gce", "gke") {
 | 
								if providerIs("gce", "gke") {
 | 
				
			||||||
@@ -477,12 +477,12 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			serviceJson := mkpath("redis-master-service.json")
 | 
								serviceJson := mkpath("redis-master-service.json")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
			runKubectl("create", "-f", controllerJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", controllerJson, nsFlag)
 | 
				
			||||||
			runKubectl("create", "-f", serviceJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", serviceJson, nsFlag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Pod
 | 
								// Pod
 | 
				
			||||||
			forEachPod(c, ns, "app", "redis", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "app", "redis", func(pod api.Pod) {
 | 
				
			||||||
				output := runKubectl("describe", "pod", pod.Name, nsFlag)
 | 
									output := runKubectlOrDie("describe", "pod", pod.Name, nsFlag)
 | 
				
			||||||
				requiredStrings := [][]string{
 | 
									requiredStrings := [][]string{
 | 
				
			||||||
					{"Name:", "redis-master-"},
 | 
										{"Name:", "redis-master-"},
 | 
				
			||||||
					{"Namespace:", ns},
 | 
										{"Namespace:", ns},
 | 
				
			||||||
@@ -498,7 +498,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Rc
 | 
								// Rc
 | 
				
			||||||
			output := runKubectl("describe", "rc", "redis-master", nsFlag)
 | 
								output := runKubectlOrDie("describe", "rc", "redis-master", nsFlag)
 | 
				
			||||||
			requiredStrings := [][]string{
 | 
								requiredStrings := [][]string{
 | 
				
			||||||
				{"Name:", "redis-master"},
 | 
									{"Name:", "redis-master"},
 | 
				
			||||||
				{"Namespace:", ns},
 | 
									{"Namespace:", ns},
 | 
				
			||||||
@@ -511,7 +511,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			checkOutput(output, requiredStrings)
 | 
								checkOutput(output, requiredStrings)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Service
 | 
								// Service
 | 
				
			||||||
			output = runKubectl("describe", "service", "redis-master", nsFlag)
 | 
								output = runKubectlOrDie("describe", "service", "redis-master", nsFlag)
 | 
				
			||||||
			requiredStrings = [][]string{
 | 
								requiredStrings = [][]string{
 | 
				
			||||||
				{"Name:", "redis-master"},
 | 
									{"Name:", "redis-master"},
 | 
				
			||||||
				{"Namespace:", ns},
 | 
									{"Namespace:", ns},
 | 
				
			||||||
@@ -528,7 +528,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			nodes, err := c.Nodes().List(labels.Everything(), fields.Everything())
 | 
								nodes, err := c.Nodes().List(labels.Everything(), fields.Everything())
 | 
				
			||||||
			Expect(err).NotTo(HaveOccurred())
 | 
								Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
			node := nodes.Items[0]
 | 
								node := nodes.Items[0]
 | 
				
			||||||
			output = runKubectl("describe", "node", node.Name)
 | 
								output = runKubectlOrDie("describe", "node", node.Name)
 | 
				
			||||||
			requiredStrings = [][]string{
 | 
								requiredStrings = [][]string{
 | 
				
			||||||
				{"Name:", node.Name},
 | 
									{"Name:", node.Name},
 | 
				
			||||||
				{"Labels:"},
 | 
									{"Labels:"},
 | 
				
			||||||
@@ -547,7 +547,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			checkOutput(output, requiredStrings)
 | 
								checkOutput(output, requiredStrings)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Namespace
 | 
								// Namespace
 | 
				
			||||||
			output = runKubectl("describe", "namespace", ns)
 | 
								output = runKubectlOrDie("describe", "namespace", ns)
 | 
				
			||||||
			requiredStrings = [][]string{
 | 
								requiredStrings = [][]string{
 | 
				
			||||||
				{"Name:", ns},
 | 
									{"Name:", ns},
 | 
				
			||||||
				{"Labels:"},
 | 
									{"Labels:"},
 | 
				
			||||||
@@ -569,7 +569,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			redisPort := 6379
 | 
								redisPort := 6379
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("creating Redis RC")
 | 
								By("creating Redis RC")
 | 
				
			||||||
			runKubectl("create", "-f", controllerJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", controllerJson, nsFlag)
 | 
				
			||||||
			forEachPod(c, ns, "app", "redis", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "app", "redis", func(pod api.Pod) {
 | 
				
			||||||
				lookForStringInLog(ns, pod.Name, "redis-master", "The server is now ready to accept connections", podStartTimeout)
 | 
									lookForStringInLog(ns, pod.Name, "redis-master", "The server is now ready to accept connections", podStartTimeout)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@@ -617,12 +617,12 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("exposing RC")
 | 
								By("exposing RC")
 | 
				
			||||||
			runKubectl("expose", "rc", "redis-master", "--name=rm2", "--port=1234", fmt.Sprintf("--target-port=%d", redisPort), nsFlag)
 | 
								runKubectlOrDie("expose", "rc", "redis-master", "--name=rm2", "--port=1234", fmt.Sprintf("--target-port=%d", redisPort), nsFlag)
 | 
				
			||||||
			waitForService(c, ns, "rm2", true, poll, serviceStartTimeout)
 | 
								waitForService(c, ns, "rm2", true, poll, serviceStartTimeout)
 | 
				
			||||||
			validateService("rm2", 1234, serviceStartTimeout)
 | 
								validateService("rm2", 1234, serviceStartTimeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("exposing service")
 | 
								By("exposing service")
 | 
				
			||||||
			runKubectl("expose", "service", "rm2", "--name=rm3", "--port=2345", fmt.Sprintf("--target-port=%d", redisPort), nsFlag)
 | 
								runKubectlOrDie("expose", "service", "rm2", "--name=rm3", "--port=2345", fmt.Sprintf("--target-port=%d", redisPort), nsFlag)
 | 
				
			||||||
			waitForService(c, ns, "rm3", true, poll, serviceStartTimeout)
 | 
								waitForService(c, ns, "rm3", true, poll, serviceStartTimeout)
 | 
				
			||||||
			validateService("rm3", 2345, serviceStartTimeout)
 | 
								validateService("rm3", 2345, serviceStartTimeout)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
@@ -635,7 +635,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			podPath = filepath.Join(testContext.RepoRoot, "docs/user-guide/pod.yaml")
 | 
								podPath = filepath.Join(testContext.RepoRoot, "docs/user-guide/pod.yaml")
 | 
				
			||||||
			By("creating the pod")
 | 
								By("creating the pod")
 | 
				
			||||||
			nsFlag = fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag = fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
			runKubectl("create", "-f", podPath, nsFlag)
 | 
								runKubectlOrDie("create", "-f", podPath, nsFlag)
 | 
				
			||||||
			checkPodsRunningReady(c, ns, []string{simplePodName}, podStartTimeout)
 | 
								checkPodsRunningReady(c, ns, []string{simplePodName}, podStartTimeout)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		AfterEach(func() {
 | 
							AfterEach(func() {
 | 
				
			||||||
@@ -647,17 +647,17 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			labelValue := "testing-label-value"
 | 
								labelValue := "testing-label-value"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("adding the label " + labelName + " with value " + labelValue + " to a pod")
 | 
								By("adding the label " + labelName + " with value " + labelValue + " to a pod")
 | 
				
			||||||
			runKubectl("label", "pods", simplePodName, labelName+"="+labelValue, nsFlag)
 | 
								runKubectlOrDie("label", "pods", simplePodName, labelName+"="+labelValue, nsFlag)
 | 
				
			||||||
			By("verifying the pod has the label " + labelName + " with the value " + labelValue)
 | 
								By("verifying the pod has the label " + labelName + " with the value " + labelValue)
 | 
				
			||||||
			output := runKubectl("get", "pod", simplePodName, "-L", labelName, nsFlag)
 | 
								output := runKubectlOrDie("get", "pod", simplePodName, "-L", labelName, nsFlag)
 | 
				
			||||||
			if !strings.Contains(output, labelValue) {
 | 
								if !strings.Contains(output, labelValue) {
 | 
				
			||||||
				Failf("Failed updating label " + labelName + " to the pod " + simplePodName)
 | 
									Failf("Failed updating label " + labelName + " to the pod " + simplePodName)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("removing the label " + labelName + " of a pod")
 | 
								By("removing the label " + labelName + " of a pod")
 | 
				
			||||||
			runKubectl("label", "pods", simplePodName, labelName+"-", nsFlag)
 | 
								runKubectlOrDie("label", "pods", simplePodName, labelName+"-", nsFlag)
 | 
				
			||||||
			By("verifying the pod doesn't have the label " + labelName)
 | 
								By("verifying the pod doesn't have the label " + labelName)
 | 
				
			||||||
			output = runKubectl("get", "pod", simplePodName, "-L", labelName, nsFlag)
 | 
								output = runKubectlOrDie("get", "pod", simplePodName, "-L", labelName, nsFlag)
 | 
				
			||||||
			if strings.Contains(output, labelValue) {
 | 
								if strings.Contains(output, labelValue) {
 | 
				
			||||||
				Failf("Failed removing label " + labelName + " of the pod " + simplePodName)
 | 
									Failf("Failed removing label " + labelName + " of the pod " + simplePodName)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -675,7 +675,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			rcPath = mkpath("redis-master-controller.json")
 | 
								rcPath = mkpath("redis-master-controller.json")
 | 
				
			||||||
			By("creating an rc")
 | 
								By("creating an rc")
 | 
				
			||||||
			nsFlag = fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag = fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
			runKubectl("create", "-f", rcPath, nsFlag)
 | 
								runKubectlOrDie("create", "-f", rcPath, nsFlag)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		AfterEach(func() {
 | 
							AfterEach(func() {
 | 
				
			||||||
			cleanup(rcPath, ns, simplePodSelector)
 | 
								cleanup(rcPath, ns, simplePodSelector)
 | 
				
			||||||
@@ -688,17 +688,17 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
				Expect(err).NotTo(HaveOccurred())
 | 
									Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				By("limiting log lines")
 | 
									By("limiting log lines")
 | 
				
			||||||
				out := runKubectl("log", pod.Name, containerName, nsFlag, "--tail=1")
 | 
									out := runKubectlOrDie("log", pod.Name, containerName, nsFlag, "--tail=1")
 | 
				
			||||||
				Expect(len(out)).NotTo(BeZero())
 | 
									Expect(len(out)).NotTo(BeZero())
 | 
				
			||||||
				Expect(len(strings.Split(out, "\n"))).To(Equal(1))
 | 
									Expect(len(strings.Split(out, "\n"))).To(Equal(1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				By("limiting log bytes")
 | 
									By("limiting log bytes")
 | 
				
			||||||
				out = runKubectl("log", pod.Name, containerName, nsFlag, "--limit-bytes=1")
 | 
									out = runKubectlOrDie("log", pod.Name, containerName, nsFlag, "--limit-bytes=1")
 | 
				
			||||||
				Expect(len(strings.Split(out, "\n"))).To(Equal(1))
 | 
									Expect(len(strings.Split(out, "\n"))).To(Equal(1))
 | 
				
			||||||
				Expect(len(out)).To(Equal(1))
 | 
									Expect(len(out)).To(Equal(1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				By("exposing timestamps")
 | 
									By("exposing timestamps")
 | 
				
			||||||
				out = runKubectl("log", pod.Name, containerName, nsFlag, "--tail=1", "--timestamps")
 | 
									out = runKubectlOrDie("log", pod.Name, containerName, nsFlag, "--tail=1", "--timestamps")
 | 
				
			||||||
				lines := strings.Split(out, "\n")
 | 
									lines := strings.Split(out, "\n")
 | 
				
			||||||
				Expect(len(lines)).To(Equal(1))
 | 
									Expect(len(lines)).To(Equal(1))
 | 
				
			||||||
				words := strings.Split(lines[0], " ")
 | 
									words := strings.Split(lines[0], " ")
 | 
				
			||||||
@@ -711,9 +711,9 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				By("restricting to a time range")
 | 
									By("restricting to a time range")
 | 
				
			||||||
				time.Sleep(1500 * time.Millisecond) // ensure that startup logs on the node are seen as older than 1s
 | 
									time.Sleep(1500 * time.Millisecond) // ensure that startup logs on the node are seen as older than 1s
 | 
				
			||||||
				out = runKubectl("log", pod.Name, containerName, nsFlag, "--since=1s")
 | 
									out = runKubectlOrDie("log", pod.Name, containerName, nsFlag, "--since=1s")
 | 
				
			||||||
				recent := len(strings.Split(out, "\n"))
 | 
									recent := len(strings.Split(out, "\n"))
 | 
				
			||||||
				out = runKubectl("log", pod.Name, containerName, nsFlag, "--since=24h")
 | 
									out = runKubectlOrDie("log", pod.Name, containerName, nsFlag, "--since=24h")
 | 
				
			||||||
				older := len(strings.Split(out, "\n"))
 | 
									older := len(strings.Split(out, "\n"))
 | 
				
			||||||
				Expect(recent).To(BeNumerically("<", older))
 | 
									Expect(recent).To(BeNumerically("<", older))
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@@ -728,10 +728,10 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			controllerJson := mkpath("redis-master-controller.json")
 | 
								controllerJson := mkpath("redis-master-controller.json")
 | 
				
			||||||
			nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag := fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
			By("creating Redis RC")
 | 
								By("creating Redis RC")
 | 
				
			||||||
			runKubectl("create", "-f", controllerJson, nsFlag)
 | 
								runKubectlOrDie("create", "-f", controllerJson, nsFlag)
 | 
				
			||||||
			By("patching all pods")
 | 
								By("patching all pods")
 | 
				
			||||||
			forEachPod(c, ns, "app", "redis", func(pod api.Pod) {
 | 
								forEachPod(c, ns, "app", "redis", func(pod api.Pod) {
 | 
				
			||||||
				runKubectl("patch", "pod", pod.Name, nsFlag, "-p", "{\"metadata\":{\"annotations\":{\"x\":\"y\"}}}")
 | 
									runKubectlOrDie("patch", "pod", pod.Name, nsFlag, "-p", "{\"metadata\":{\"annotations\":{\"x\":\"y\"}}}")
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("checking annotations")
 | 
								By("checking annotations")
 | 
				
			||||||
@@ -751,7 +751,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	Describe("Kubectl version", func() {
 | 
						Describe("Kubectl version", func() {
 | 
				
			||||||
		It("should check is all data is printed [Conformance]", func() {
 | 
							It("should check is all data is printed [Conformance]", func() {
 | 
				
			||||||
			version := runKubectl("version")
 | 
								version := runKubectlOrDie("version")
 | 
				
			||||||
			requiredItems := []string{"Client Version:", "Server Version:", "Major:", "Minor:", "GitCommit:"}
 | 
								requiredItems := []string{"Client Version:", "Server Version:", "Major:", "Minor:", "GitCommit:"}
 | 
				
			||||||
			for _, item := range requiredItems {
 | 
								for _, item := range requiredItems {
 | 
				
			||||||
				if !strings.Contains(version, item) {
 | 
									if !strings.Contains(version, item) {
 | 
				
			||||||
@@ -771,14 +771,14 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		AfterEach(func() {
 | 
							AfterEach(func() {
 | 
				
			||||||
			runKubectl("stop", "rc", rcName, nsFlag)
 | 
								runKubectlOrDie("stop", "rc", rcName, nsFlag)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		It("should create an rc from an image [Conformance]", func() {
 | 
							It("should create an rc from an image [Conformance]", func() {
 | 
				
			||||||
			image := "nginx"
 | 
								image := "nginx"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("running the image " + image)
 | 
								By("running the image " + image)
 | 
				
			||||||
			runKubectl("run", rcName, "--image="+image, nsFlag)
 | 
								runKubectlOrDie("run", rcName, "--image="+image, nsFlag)
 | 
				
			||||||
			By("verifying the rc " + rcName + " was created")
 | 
								By("verifying the rc " + rcName + " was created")
 | 
				
			||||||
			rc, err := c.ReplicationControllers(ns).Get(rcName)
 | 
								rc, err := c.ReplicationControllers(ns).Get(rcName)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
@@ -797,7 +797,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			pods := podlist.Items
 | 
								pods := podlist.Items
 | 
				
			||||||
			if pods == nil || len(pods) != 1 || len(pods[0].Spec.Containers) != 1 || pods[0].Spec.Containers[0].Image != image {
 | 
								if pods == nil || len(pods) != 1 || len(pods[0].Spec.Containers) != 1 || pods[0].Spec.Containers[0].Image != image {
 | 
				
			||||||
				runKubectl("get", "pods", "-L", "run", nsFlag)
 | 
									runKubectlOrDie("get", "pods", "-L", "run", nsFlag)
 | 
				
			||||||
				Failf("Failed creating 1 pod with expected image %s. Number of pods = %v", image, len(pods))
 | 
									Failf("Failed creating 1 pod with expected image %s. Number of pods = %v", image, len(pods))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
@@ -814,14 +814,14 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		AfterEach(func() {
 | 
							AfterEach(func() {
 | 
				
			||||||
			runKubectl("stop", "pods", podName, nsFlag)
 | 
								runKubectlOrDie("stop", "pods", podName, nsFlag)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		It("should create a pod from an image when restart is OnFailure [Conformance]", func() {
 | 
							It("should create a pod from an image when restart is OnFailure [Conformance]", func() {
 | 
				
			||||||
			image := "nginx"
 | 
								image := "nginx"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("running the image " + image)
 | 
								By("running the image " + image)
 | 
				
			||||||
			runKubectl("run", podName, "--restart=OnFailure", "--image="+image, nsFlag)
 | 
								runKubectlOrDie("run", podName, "--restart=OnFailure", "--image="+image, nsFlag)
 | 
				
			||||||
			By("verifying the pod " + podName + " was created")
 | 
								By("verifying the pod " + podName + " was created")
 | 
				
			||||||
			pod, err := c.Pods(ns).Get(podName)
 | 
								pod, err := c.Pods(ns).Get(podName)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
@@ -840,7 +840,7 @@ var _ = Describe("Kubectl client", func() {
 | 
				
			|||||||
			image := "nginx"
 | 
								image := "nginx"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			By("running the image " + image)
 | 
								By("running the image " + image)
 | 
				
			||||||
			runKubectl("run", podName, "--restart=Never", "--image="+image, nsFlag)
 | 
								runKubectlOrDie("run", podName, "--restart=Never", "--image="+image, nsFlag)
 | 
				
			||||||
			By("verifying the pod " + podName + " was created")
 | 
								By("verifying the pod " + podName + " was created")
 | 
				
			||||||
			pod, err := c.Pods(ns).Get(podName)
 | 
								pod, err := c.Pods(ns).Get(podName)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,7 +116,7 @@ func runKubectlWithTimeout(timeout time.Duration, args ...string) string {
 | 
				
			|||||||
	logOutput := make(chan string)
 | 
						logOutput := make(chan string)
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		defer GinkgoRecover()
 | 
							defer GinkgoRecover()
 | 
				
			||||||
		logOutput <- runKubectl(args...)
 | 
							logOutput <- runKubectlOrDie(args...)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	select {
 | 
						select {
 | 
				
			||||||
	case <-time.After(timeout):
 | 
						case <-time.After(timeout):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -926,14 +926,14 @@ func cleanup(filePath string, ns string, selectors ...string) {
 | 
				
			|||||||
	if ns != "" {
 | 
						if ns != "" {
 | 
				
			||||||
		nsArg = fmt.Sprintf("--namespace=%s", ns)
 | 
							nsArg = fmt.Sprintf("--namespace=%s", ns)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	runKubectl("stop", "--grace-period=0", "-f", filePath, nsArg)
 | 
						runKubectlOrDie("stop", "--grace-period=0", "-f", filePath, nsArg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, selector := range selectors {
 | 
						for _, selector := range selectors {
 | 
				
			||||||
		resources := runKubectl("get", "rc,svc", "-l", selector, "--no-headers", nsArg)
 | 
							resources := runKubectlOrDie("get", "rc,svc", "-l", selector, "--no-headers", nsArg)
 | 
				
			||||||
		if resources != "" {
 | 
							if resources != "" {
 | 
				
			||||||
			Failf("Resources left running after stop:\n%s", resources)
 | 
								Failf("Resources left running after stop:\n%s", resources)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		pods := runKubectl("get", "pods", "-l", selector, nsArg, "-o", "go-template={{ range .items }}{{ if not .metadata.deletionTimestamp }}{{ .metadata.name }}{{ \"\\n\" }}{{ end }}{{ end }}")
 | 
							pods := runKubectlOrDie("get", "pods", "-l", selector, nsArg, "-o", "go-template={{ range .items }}{{ if not .metadata.deletionTimestamp }}{{ .metadata.name }}{{ \"\\n\" }}{{ end }}{{ end }}")
 | 
				
			||||||
		if pods != "" {
 | 
							if pods != "" {
 | 
				
			||||||
			Failf("Pods left unterminated after stop:\n%s", pods)
 | 
								Failf("Pods left unterminated after stop:\n%s", pods)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -967,7 +967,7 @@ func validateController(c *client.Client, containerImage string, replicas int, c
 | 
				
			|||||||
	By(fmt.Sprintf("waiting for all containers in %s pods to come up.", testname)) //testname should be selector
 | 
						By(fmt.Sprintf("waiting for all containers in %s pods to come up.", testname)) //testname should be selector
 | 
				
			||||||
waitLoop:
 | 
					waitLoop:
 | 
				
			||||||
	for start := time.Now(); time.Since(start) < podStartTimeout; time.Sleep(5 * time.Second) {
 | 
						for start := time.Now(); time.Since(start) < podStartTimeout; time.Sleep(5 * time.Second) {
 | 
				
			||||||
		getPodsOutput := runKubectl("get", "pods", "-o", "template", getPodsTemplate, "--api-version=v1", "-l", testname, fmt.Sprintf("--namespace=%v", ns))
 | 
							getPodsOutput := runKubectlOrDie("get", "pods", "-o", "template", getPodsTemplate, "--api-version=v1", "-l", testname, fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
		pods := strings.Fields(getPodsOutput)
 | 
							pods := strings.Fields(getPodsOutput)
 | 
				
			||||||
		if numPods := len(pods); numPods != replicas {
 | 
							if numPods := len(pods); numPods != replicas {
 | 
				
			||||||
			By(fmt.Sprintf("Replicas for %s: expected=%d actual=%d", testname, replicas, numPods))
 | 
								By(fmt.Sprintf("Replicas for %s: expected=%d actual=%d", testname, replicas, numPods))
 | 
				
			||||||
@@ -975,13 +975,13 @@ waitLoop:
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		var runningPods []string
 | 
							var runningPods []string
 | 
				
			||||||
		for _, podID := range pods {
 | 
							for _, podID := range pods {
 | 
				
			||||||
			running := runKubectl("get", "pods", podID, "-o", "template", getContainerStateTemplate, "--api-version=v1", fmt.Sprintf("--namespace=%v", ns))
 | 
								running := runKubectlOrDie("get", "pods", podID, "-o", "template", getContainerStateTemplate, "--api-version=v1", fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			if running != "true" {
 | 
								if running != "true" {
 | 
				
			||||||
				Logf("%s is created but not running", podID)
 | 
									Logf("%s is created but not running", podID)
 | 
				
			||||||
				continue waitLoop
 | 
									continue waitLoop
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			currentImage := runKubectl("get", "pods", podID, "-o", "template", getImageTemplate, "--api-version=v1", fmt.Sprintf("--namespace=%v", ns))
 | 
								currentImage := runKubectlOrDie("get", "pods", podID, "-o", "template", getImageTemplate, "--api-version=v1", fmt.Sprintf("--namespace=%v", ns))
 | 
				
			||||||
			if currentImage != containerImage {
 | 
								if currentImage != containerImage {
 | 
				
			||||||
				Logf("%s is created but running wrong image; expected: %s, actual: %s", podID, containerImage, currentImage)
 | 
									Logf("%s is created but running wrong image; expected: %s, actual: %s", podID, containerImage, currentImage)
 | 
				
			||||||
				continue waitLoop
 | 
									continue waitLoop
 | 
				
			||||||
@@ -1062,29 +1062,39 @@ func (b kubectlBuilder) withStdinReader(reader io.Reader) *kubectlBuilder {
 | 
				
			|||||||
	return &b
 | 
						return &b
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b kubectlBuilder) exec() string {
 | 
					func (b kubectlBuilder) execOrDie() string {
 | 
				
			||||||
 | 
						str, err := b.exec()
 | 
				
			||||||
 | 
						Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
						return str
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b kubectlBuilder) exec() (string, error) {
 | 
				
			||||||
	var stdout, stderr bytes.Buffer
 | 
						var stdout, stderr bytes.Buffer
 | 
				
			||||||
	cmd := b.cmd
 | 
						cmd := b.cmd
 | 
				
			||||||
	cmd.Stdout, cmd.Stderr = &stdout, &stderr
 | 
						cmd.Stdout, cmd.Stderr = &stdout, &stderr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Logf("Running '%s %s'", cmd.Path, strings.Join(cmd.Args[1:], " ")) // skip arg[0] as it is printed separately
 | 
						Logf("Running '%s %s'", cmd.Path, strings.Join(cmd.Args[1:], " ")) // skip arg[0] as it is printed separately
 | 
				
			||||||
	if err := cmd.Run(); err != nil {
 | 
						if err := cmd.Run(); err != nil {
 | 
				
			||||||
		Failf("Error running %v:\nCommand stdout:\n%v\nstderr:\n%v\n", cmd, cmd.Stdout, cmd.Stderr)
 | 
							return "", fmt.Errorf("Error running %v:\nCommand stdout:\n%v\nstderr:\n%v\n", cmd, cmd.Stdout, cmd.Stderr)
 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	Logf(stdout.String())
 | 
						Logf(stdout.String())
 | 
				
			||||||
	// TODO: trimspace should be unnecessary after switching to use kubectl binary directly
 | 
						// TODO: trimspace should be unnecessary after switching to use kubectl binary directly
 | 
				
			||||||
	return strings.TrimSpace(stdout.String())
 | 
						return strings.TrimSpace(stdout.String()), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// runKubectlOrDie is a convenience wrapper over kubectlBuilder
 | 
				
			||||||
 | 
					func runKubectlOrDie(args ...string) string {
 | 
				
			||||||
 | 
						return newKubectlCommand(args...).execOrDie()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// runKubectl is a convenience wrapper over kubectlBuilder
 | 
					// runKubectl is a convenience wrapper over kubectlBuilder
 | 
				
			||||||
func runKubectl(args ...string) string {
 | 
					func runKubectl(args ...string) (string, error) {
 | 
				
			||||||
	return newKubectlCommand(args...).exec()
 | 
						return newKubectlCommand(args...).exec()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// runKubectlInput is a convenience wrapper over kubectlBuilder that takes input to stdin
 | 
					// runKubectlOrDieInput is a convenience wrapper over kubectlBuilder that takes input to stdin
 | 
				
			||||||
func runKubectlInput(data string, args ...string) string {
 | 
					func runKubectlOrDieInput(data string, args ...string) string {
 | 
				
			||||||
	return newKubectlCommand(args...).withStdinData(data).exec()
 | 
						return newKubectlCommand(args...).withStdinData(data).execOrDie()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCmdAndStreamOutput(cmd *exec.Cmd) (stdout, stderr io.ReadCloser, err error) {
 | 
					func startCmdAndStreamOutput(cmd *exec.Cmd) (stdout, stderr io.ReadCloser, err error) {
 | 
				
			||||||
@@ -1973,7 +1983,7 @@ func NewHostExecPodSpec(ns, name string) *api.Pod {
 | 
				
			|||||||
// RunHostCmd runs the given cmd in the context of the given pod using `kubectl exec`
 | 
					// RunHostCmd runs the given cmd in the context of the given pod using `kubectl exec`
 | 
				
			||||||
// inside of a shell.
 | 
					// inside of a shell.
 | 
				
			||||||
func RunHostCmd(ns, name, cmd string) string {
 | 
					func RunHostCmd(ns, name, cmd string) string {
 | 
				
			||||||
	return runKubectl("exec", fmt.Sprintf("--namespace=%v", ns), name, "--", "/bin/sh", "-c", cmd)
 | 
						return runKubectlOrDie("exec", fmt.Sprintf("--namespace=%v", ns), name, "--", "/bin/sh", "-c", cmd)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LaunchHostExecPod launches a hostexec pod in the given namespace and waits
 | 
					// LaunchHostExecPod launches a hostexec pod in the given namespace and waits
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user