Commit 9bbe6012 authored by k8s-merge-robot's avatar k8s-merge-robot

Merge pull request #17683 from pwittrock/node_e2e_tests

Auto commit by PR queue bot
parents b7413867 ec5ecb18
......@@ -9,10 +9,10 @@ algorithm-provider
all-namespaces
allocate-node-cidrs
allow-privileged
api-server-address
api-burst
api-prefix
api-rate
api-server-host
api-server-port
api-servers
api-token
......@@ -142,12 +142,12 @@ km-path
kube-api-burst
kube-api-qps
kubectl-path
kubelet-address
kubelet-cadvisor-port
kubelet-certificate-authority
kubelet-client-certificate
kubelet-client-key
kubelet-docker-endpoint
kubelet-host
kubelet-host-network-sources
kubelet-https
kubelet-network-plugin
......@@ -211,6 +211,7 @@ node-monitor-grace-period
node-monitor-period
node-label
node-labels-file
node-name
node-startup-grace-period
node-status-update-frequency
node-sync-period
......
......@@ -24,11 +24,9 @@ import (
"testing"
)
var kubeletHost = flag.String("kubelet-host", "localhost", "Host address of the kubelet")
var kubeletPort = flag.Int("kubelet-port", 10250, "Kubelet port")
var apiServerHost = flag.String("api-server-host", "localhost", "Host address of the api server")
var apiServerPort = flag.Int("api-server-port", 8080, "Api server port")
var kubeletAddress = flag.String("kubelet-address", "localhost:10250", "Host and port of the kubelet")
var apiServerAddress = flag.String("api-server-address", "localhost:8080", "Host and port of the api server")
var nodeName = flag.String("node-name", "", "Name of the node")
func TestE2eNode(t *testing.T) {
flag.Parse()
......
......@@ -74,13 +74,14 @@ func (gc *gCloudClientImpl) Command(cmd string, moreargs ...string) ([]byte, err
return exec.Command("gcloud", args...).CombinedOutput()
}
func (gc *gCloudClientImpl) TunnelCommand(sudo bool, lPort string, rPort string, cmd string, moreargs ...string) ([]byte, error) {
func (gc *gCloudClientImpl) TunnelCommand(sudo bool, lPort string, rPort string, dir string, cmd string, moreargs ...string) ([]byte, error) {
tunnelStr := fmt.Sprintf("-L %s:localhost:%s", lPort, rPort)
args := []string{"compute", "ssh"}
if gc.zone != "" {
args = append(args, "--zone", gc.zone)
}
args = append(args, "--ssh-flag", tunnelStr, gc.host, "--")
args = append(args, "cd", dir, ";")
if sudo {
args = append(args, "sudo")
}
......@@ -152,10 +153,10 @@ func (gc *gCloudClientImpl) CopyAndRun(
// Do the setup
go func() {
// Start the process
out, err = gc.TunnelCommand(sudo, h.LPort, remotePort, cmd, args...)
out, err = gc.TunnelCommand(sudo, h.LPort, remotePort, tDir, fmt.Sprintf("./%s", f), args...)
if err != nil {
glog.Errorf("command failed %v", err)
h.Output <- RunResult{out, err, fmt.Sprintf("%s %s", cmd, strings.Join(args, " "))}
h.Output <- RunResult{out, err, fmt.Sprintf("%s %s", f, strings.Join(args, " "))}
return
}
}()
......
......@@ -17,36 +17,65 @@ limitations under the License.
package e2e_node
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"time"
"github.com/golang/glog"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/kubernetes/pkg/api"
client "k8s.io/kubernetes/pkg/client/unversioned"
)
var _ = Describe("Kubelet", func() {
var cl *client.Client
BeforeEach(func() {
// Setup the client to talk to the kubelet
// Setup the apiserver client
cl = client.NewOrDie(&client.Config{Host: *apiServerAddress})
})
Describe("checking kubelet status", func() {
Context("when retrieving the node status", func() {
It("should have the container version", func() {
// TODO: This is just a place holder, write a real test here
resp, err := http.Get(fmt.Sprintf("http://%s:%d/api/v2.0/attributes", *kubeletHost, *kubeletPort))
if err != nil {
glog.Errorf("Error: %v", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Errorf("Error: %v", err)
return
Describe("pod scheduling", func() {
Context("when scheduling a busybox command in a pod", func() {
It("it should return succes", func() {
pod := &api.Pod{
ObjectMeta: api.ObjectMeta{
Name: "busybox",
Namespace: api.NamespaceDefault,
},
Spec: api.PodSpec{
NodeName: *nodeName,
Containers: []api.Container{
{
Image: "busybox",
Name: "busybox",
Command: []string{"echo", "'Hello World'"},
ImagePullPolicy: "IfNotPresent",
},
},
},
}
glog.Infof("Resp: %s", body)
_, err := cl.Pods(api.NamespaceDefault).Create(pod)
Expect(err).To(BeNil(), fmt.Sprintf("Error creating Pod %v", err))
})
It("it should print the output to logs", func() {
errs := Retry(time.Minute*3, time.Second*2, cl, func(cl *client.Client) error {
rc, err := cl.Pods(api.NamespaceDefault).GetLogs("busybox", &api.PodLogOptions{}).Stream()
if err != nil {
return err
}
defer rc.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(rc)
Expect(buf.String()).To(Equal("'Hello World'\n"))
return nil
})
Expect(errs).To(BeEmpty(), fmt.Sprintf("Failed to get Logs"))
})
It("it should be possible to delete", func() {
err := cl.Pods(api.NamespaceDefault).Delete("busybox", &api.DeleteOptions{})
Expect(err).To(BeNil(), fmt.Sprintf("Error creating Pod %v", err))
})
})
})
......
......@@ -98,7 +98,7 @@ func main() {
// Wait for the tests to finish
w.Wait()
glog.Infof("All hosts finished")
glog.Infof("Done")
}
func WaitForUser() {
......@@ -150,7 +150,8 @@ func runTests(host string) ([]byte, error) {
ginkoTests := filepath.Join(kubeRoot, ginkoTestRelPath)
return exec.Command(
"ginkgo", ginkoTests, "--",
"--kubelet-host", "localhost", "--kubelet-port", kh.LPort,
"--api-server-host", "localhost", "--api-server-port", kh.LPort,
"--kubelet-address", fmt.Sprintf("http://localhost:%s", kh.LPort),
"--api-server-address", fmt.Sprintf("http://localhost:%s", ah.LPort),
"--node-name", host,
"-logtostderr").CombinedOutput()
}
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package e2e_node
import (
"time"
client "k8s.io/kubernetes/pkg/client/unversioned"
)
type RetryFn func(cl *client.Client) error
func Retry(maxWait time.Duration, wait time.Duration, cl *client.Client, retry RetryFn) []error {
errs := []error{}
for start := time.Now(); time.Now().Before(start.Add(maxWait)); {
if err := retry(cl); err != nil {
errs = append(errs, err)
} else {
return []error{}
}
}
return errs
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment