mirror of https://github.com/k3s-io/k3s
E2E tests for kubectl commands (api-versions, cluster-info, describe)
parent
5c014062f6
commit
5ec7109fc1
|
@ -29,6 +29,8 @@ import (
|
||||||
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
|
@ -202,42 +204,126 @@ var _ = Describe("Kubectl client", func() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Describe("Kubectl label", func() {
|
Describe("Kubectl api-versions", func() {
|
||||||
var podPath string
|
It("should check if v1 is in available api versions", func() {
|
||||||
var nsFlag string
|
By("validating api verions")
|
||||||
BeforeEach(func() {
|
output := runKubectl("api-versions")
|
||||||
podPath = filepath.Join(testContext.RepoRoot, "docs/user-guide/pod.yaml")
|
if !strings.Contains(output, "Available Server Api Versions:") {
|
||||||
By("creating the pod")
|
Failf("Missing caption in kubectl api-versions")
|
||||||
nsFlag = fmt.Sprintf("--namespace=%v", ns)
|
|
||||||
runKubectl("create", "-f", podPath, nsFlag)
|
|
||||||
checkPodsRunningReady(c, ns, []string{simplePodName}, podStartTimeout)
|
|
||||||
})
|
|
||||||
AfterEach(func() {
|
|
||||||
cleanup(podPath, ns, simplePodSelector)
|
|
||||||
})
|
|
||||||
|
|
||||||
It("should update the label on a resource", func() {
|
|
||||||
labelName := "testing-label"
|
|
||||||
labelValue := "testing-label-value"
|
|
||||||
|
|
||||||
By("adding the label " + labelName + " with value " + labelValue + " to a pod")
|
|
||||||
runKubectl("label", "pods", simplePodName, labelName+"="+labelValue, nsFlag)
|
|
||||||
By("verifying the pod has the label " + labelName + " with the value " + labelValue)
|
|
||||||
output := runKubectl("get", "pod", simplePodName, "-L", labelName, nsFlag)
|
|
||||||
if !strings.Contains(output, labelValue) {
|
|
||||||
Failf("Failed updating label " + labelName + " to the pod " + simplePodName)
|
|
||||||
}
|
}
|
||||||
|
if !strings.Contains(output, "v1") {
|
||||||
By("removing the label " + labelName + " of a pod")
|
Failf("No v1 in kubectl api-versions")
|
||||||
runKubectl("label", "pods", simplePodName, labelName+"-", nsFlag)
|
|
||||||
By("verifying the pod doesn't have the label " + labelName)
|
|
||||||
output = runKubectl("get", "pod", simplePodName, "-L", labelName, nsFlag)
|
|
||||||
if strings.Contains(output, labelValue) {
|
|
||||||
Failf("Failed removing label " + labelName + " of the pod " + simplePodName)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Describe("Kubectl cluster-info", func() {
|
||||||
|
It("should check if Kubernetes master services is included in cluster-info", func() {
|
||||||
|
By("validating cluster-info")
|
||||||
|
output := runKubectl("cluster-info")
|
||||||
|
// Can't check exact strings due to terminal controll commands (colors)
|
||||||
|
requiredItems := []string{"Kubernetes master", "is running at"}
|
||||||
|
if providerIs("gce", "gke") {
|
||||||
|
requiredItems = append(requiredItems, "KubeDNS", "Heapster")
|
||||||
|
}
|
||||||
|
for _, item := range requiredItems {
|
||||||
|
if !strings.Contains(output, item) {
|
||||||
|
Failf("Missing %s in kubectl cluster-info", item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("Kubectl describe", func() {
|
||||||
|
It("should check if kubectl describe prints relevant information for rc and pods", func() {
|
||||||
|
mkpath := func(file string) string {
|
||||||
|
return filepath.Join(testContext.RepoRoot, "examples/guestbook-go", file)
|
||||||
|
}
|
||||||
|
controllerJson := mkpath("redis-master-controller.json")
|
||||||
|
serviceJson := mkpath("redis-master-service.json")
|
||||||
|
|
||||||
|
nsFlag := fmt.Sprintf("--namespace=%v", ns)
|
||||||
|
runKubectl("create", "-f", controllerJson, nsFlag)
|
||||||
|
runKubectl("create", "-f", serviceJson, nsFlag)
|
||||||
|
|
||||||
|
// Pod
|
||||||
|
forEachPod(c, ns, "app", "redis", func(pod api.Pod) {
|
||||||
|
output := runKubectl("describe", "pod", pod.Name, nsFlag)
|
||||||
|
requiredStrings := [][]string{
|
||||||
|
{"Name:", "redis-master-"},
|
||||||
|
{"Namespace:", ns},
|
||||||
|
{"Image(s):", "redis"},
|
||||||
|
{"Node:"},
|
||||||
|
{"Labels:", "app=redis", "role=master"},
|
||||||
|
{"Status:", "Running"},
|
||||||
|
{"Reason:"},
|
||||||
|
{"Message:"},
|
||||||
|
{"IP:"},
|
||||||
|
{"Replication Controllers:", "redis-master"}}
|
||||||
|
checkOutput(output, requiredStrings)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Rc
|
||||||
|
output := runKubectl("describe", "rc", "redis-master", nsFlag)
|
||||||
|
requiredStrings := [][]string{
|
||||||
|
{"Name:", "redis-master"},
|
||||||
|
{"Namespace:", ns},
|
||||||
|
{"Image(s):", "redis"},
|
||||||
|
{"Selector:", "app=redis,role=master"},
|
||||||
|
{"Labels:", "app=redis,role=master"},
|
||||||
|
{"Replicas:", "1 current", "1 desired"},
|
||||||
|
{"Pods Status:", "1 Running", "0 Waiting", "0 Succeeded", "0 Failed"},
|
||||||
|
{"Events:"}}
|
||||||
|
checkOutput(output, requiredStrings)
|
||||||
|
|
||||||
|
// Service
|
||||||
|
output = runKubectl("describe", "service", "redis-master", nsFlag)
|
||||||
|
requiredStrings = [][]string{
|
||||||
|
{"Name:", "redis-master"},
|
||||||
|
{"Namespace:", ns},
|
||||||
|
{"Labels:", "app=redis", "role=master"},
|
||||||
|
{"Selector:", "app=redis", "role=master"},
|
||||||
|
{"Type:", "ClusterIP"},
|
||||||
|
{"IP:"},
|
||||||
|
{"Port:", "<unnamed>", "6379/TCP"},
|
||||||
|
{"Endpoints:"},
|
||||||
|
{"Session Affinity:", "None"}}
|
||||||
|
checkOutput(output, requiredStrings)
|
||||||
|
|
||||||
|
// Node
|
||||||
|
minions, err := c.Nodes().List(labels.Everything(), fields.Everything())
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
node := minions.Items[0]
|
||||||
|
output = runKubectl("describe", "node", node.Name)
|
||||||
|
requiredStrings = [][]string{
|
||||||
|
{"Name:", node.Name},
|
||||||
|
{"Labels:"},
|
||||||
|
{"CreationTimestamp:"},
|
||||||
|
{"Conditions:"},
|
||||||
|
{"Type", "Status", "LastHeartbeatTime", "LastTransitionTime", "Reason", "Message"},
|
||||||
|
{"Addresses:"},
|
||||||
|
{"Capacity:"},
|
||||||
|
{"Version:"},
|
||||||
|
{"Kernel Version:"},
|
||||||
|
{"OS Image:"},
|
||||||
|
{"Container Runtime Version:"},
|
||||||
|
{"Kubelet Version:"},
|
||||||
|
{"Kube-Proxy Version:"},
|
||||||
|
{"Pods:"}}
|
||||||
|
checkOutput(output, requiredStrings)
|
||||||
|
|
||||||
|
// Namespace
|
||||||
|
output = runKubectl("describe", "namespace", ns)
|
||||||
|
requiredStrings = [][]string{
|
||||||
|
{"Name:", ns},
|
||||||
|
{"Labels:"},
|
||||||
|
{"Status:", "Active"}}
|
||||||
|
checkOutput(output, requiredStrings)
|
||||||
|
|
||||||
|
// Quota and limitrange are skipped for now.
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
Describe("Kubectl expose", func() {
|
Describe("Kubectl expose", func() {
|
||||||
It("should create services for rc", func() {
|
It("should create services for rc", func() {
|
||||||
mkpath := func(file string) string {
|
mkpath := func(file string) string {
|
||||||
|
@ -303,6 +389,42 @@ var _ = Describe("Kubectl client", func() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Describe("Kubectl label", func() {
|
||||||
|
var podPath string
|
||||||
|
var nsFlag string
|
||||||
|
BeforeEach(func() {
|
||||||
|
podPath = filepath.Join(testContext.RepoRoot, "docs/user-guide/pod.yaml")
|
||||||
|
By("creating the pod")
|
||||||
|
nsFlag = fmt.Sprintf("--namespace=%v", ns)
|
||||||
|
runKubectl("create", "-f", podPath, nsFlag)
|
||||||
|
checkPodsRunningReady(c, ns, []string{simplePodName}, podStartTimeout)
|
||||||
|
})
|
||||||
|
AfterEach(func() {
|
||||||
|
cleanup(podPath, ns, simplePodSelector)
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should update the label on a resource", func() {
|
||||||
|
labelName := "testing-label"
|
||||||
|
labelValue := "testing-label-value"
|
||||||
|
|
||||||
|
By("adding the label " + labelName + " with value " + labelValue + " to a pod")
|
||||||
|
runKubectl("label", "pods", simplePodName, labelName+"="+labelValue, nsFlag)
|
||||||
|
By("verifying the pod has the label " + labelName + " with the value " + labelValue)
|
||||||
|
output := runKubectl("get", "pod", simplePodName, "-L", labelName, nsFlag)
|
||||||
|
if !strings.Contains(output, labelValue) {
|
||||||
|
Failf("Failed updating label " + labelName + " to the pod " + simplePodName)
|
||||||
|
}
|
||||||
|
|
||||||
|
By("removing the label " + labelName + " of a pod")
|
||||||
|
runKubectl("label", "pods", simplePodName, labelName+"-", nsFlag)
|
||||||
|
By("verifying the pod doesn't have the label " + labelName)
|
||||||
|
output = runKubectl("get", "pod", simplePodName, "-L", labelName, nsFlag)
|
||||||
|
if strings.Contains(output, labelValue) {
|
||||||
|
Failf("Failed removing label " + labelName + " of the pod " + simplePodName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
Describe("Kubectl logs", func() {
|
Describe("Kubectl logs", func() {
|
||||||
It("should find a string in pod logs", func() {
|
It("should find a string in pod logs", func() {
|
||||||
mkpath := func(file string) string {
|
mkpath := func(file string) string {
|
||||||
|
@ -362,6 +484,25 @@ var _ = Describe("Kubectl client", func() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Checks whether the output split by line contains the required elements.
|
||||||
|
func checkOutput(output string, required [][]string) {
|
||||||
|
outputLines := strings.Split(output, "\n")
|
||||||
|
currentLine := 0
|
||||||
|
for _, requirement := range required {
|
||||||
|
for currentLine < len(outputLines) && !strings.Contains(outputLines[currentLine], requirement[0]) {
|
||||||
|
currentLine++
|
||||||
|
}
|
||||||
|
if currentLine == len(outputLines) {
|
||||||
|
Failf("Failed to find %s in %s", requirement[0], output)
|
||||||
|
}
|
||||||
|
for _, item := range requirement[1:] {
|
||||||
|
if !strings.Contains(outputLines[currentLine], item) {
|
||||||
|
Failf("Failed to find %s in %s", item, outputLines[currentLine])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func curl(addr string) (string, error) {
|
func curl(addr string) (string, error) {
|
||||||
resp, err := http.Get(addr)
|
resp, err := http.Get(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue