Initial Pod e2e test

pull/6/head
Phillip Wittrock 2015-11-20 15:59:31 -08:00
parent 0d4e0dc173
commit ec5ecb18fa
6 changed files with 100 additions and 33 deletions

View File

@ -10,10 +10,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
@ -140,12 +140,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
@ -209,6 +209,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

View File

@ -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()

View File

@ -72,13 +72,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")
}
@ -143,10 +144,10 @@ func (gc *gCloudClientImpl) CopyAndRun(sudo bool, remotePort string, bin string,
// 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
}
}()

View File

@ -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() {
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",
},
},
},
}
_, err := cl.Pods(api.NamespaceDefault).Create(pod)
Expect(err).To(BeNil(), fmt.Sprintf("Error creating Pod %v", err))
})
// 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
}
glog.Infof("Resp: %s", body)
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))
})
})
})

View File

@ -96,7 +96,7 @@ func main() {
// Wait for the tests to finish
w.Wait()
glog.Infof("All hosts finished")
glog.Infof("Done")
}
func WaitForUser() {
@ -148,7 +148,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()
}

37
test/e2e_node/util.go Normal file
View File

@ -0,0 +1,37 @@
/*
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
}