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 all-namespaces
allocate-node-cidrs allocate-node-cidrs
allow-privileged allow-privileged
api-server-address
api-burst api-burst
api-prefix api-prefix
api-rate api-rate
api-server-host
api-server-port api-server-port
api-servers api-servers
api-token api-token
@ -140,12 +140,12 @@ km-path
kube-api-burst kube-api-burst
kube-api-qps kube-api-qps
kubectl-path kubectl-path
kubelet-address
kubelet-cadvisor-port kubelet-cadvisor-port
kubelet-certificate-authority kubelet-certificate-authority
kubelet-client-certificate kubelet-client-certificate
kubelet-client-key kubelet-client-key
kubelet-docker-endpoint kubelet-docker-endpoint
kubelet-host
kubelet-host-network-sources kubelet-host-network-sources
kubelet-https kubelet-https
kubelet-network-plugin kubelet-network-plugin
@ -209,6 +209,7 @@ node-monitor-grace-period
node-monitor-period node-monitor-period
node-label node-label
node-labels-file node-labels-file
node-name
node-startup-grace-period node-startup-grace-period
node-status-update-frequency node-status-update-frequency
node-sync-period node-sync-period

View File

@ -24,11 +24,9 @@ import (
"testing" "testing"
) )
var kubeletHost = flag.String("kubelet-host", "localhost", "Host address of the kubelet") var kubeletAddress = flag.String("kubelet-address", "localhost:10250", "Host and port of the kubelet")
var kubeletPort = flag.Int("kubelet-port", 10250, "Kubelet port") 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")
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")
func TestE2eNode(t *testing.T) { func TestE2eNode(t *testing.T) {
flag.Parse() flag.Parse()

View File

@ -72,13 +72,14 @@ func (gc *gCloudClientImpl) Command(cmd string, moreargs ...string) ([]byte, err
return exec.Command("gcloud", args...).CombinedOutput() 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) tunnelStr := fmt.Sprintf("-L %s:localhost:%s", lPort, rPort)
args := []string{"compute", "ssh"} args := []string{"compute", "ssh"}
if gc.zone != "" { if gc.zone != "" {
args = append(args, "--zone", gc.zone) args = append(args, "--zone", gc.zone)
} }
args = append(args, "--ssh-flag", tunnelStr, gc.host, "--") args = append(args, "--ssh-flag", tunnelStr, gc.host, "--")
args = append(args, "cd", dir, ";")
if sudo { if sudo {
args = append(args, "sudo") args = append(args, "sudo")
} }
@ -143,10 +144,10 @@ func (gc *gCloudClientImpl) CopyAndRun(sudo bool, remotePort string, bin string,
// Do the setup // Do the setup
go func() { go func() {
// Start the process // 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 { if err != nil {
glog.Errorf("command failed %v", err) 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 return
} }
}() }()

View File

@ -17,36 +17,65 @@ limitations under the License.
package e2e_node package e2e_node
import ( import (
"bytes"
"fmt" "fmt"
"io/ioutil" "time"
"net/http"
"github.com/golang/glog"
. "github.com/onsi/ginkgo" . "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 _ = Describe("Kubelet", func() {
var cl *client.Client
BeforeEach(func() { 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() { Describe("pod scheduling", func() {
Context("when retrieving the node status", func() { Context("when scheduling a busybox command in a pod", func() {
It("should have the container version", 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 It("it should print the output to logs", func() {
resp, err := http.Get(fmt.Sprintf("http://%s:%d/api/v2.0/attributes", *kubeletHost, *kubeletPort)) errs := Retry(time.Minute*3, time.Second*2, cl, func(cl *client.Client) error {
if err != nil { rc, err := cl.Pods(api.NamespaceDefault).GetLogs("busybox", &api.PodLogOptions{}).Stream()
glog.Errorf("Error: %v", err) if err != nil {
return return err
} }
defer resp.Body.Close() defer rc.Close()
body, err := ioutil.ReadAll(resp.Body) buf := new(bytes.Buffer)
if err != nil { buf.ReadFrom(rc)
glog.Errorf("Error: %v", err) Expect(buf.String()).To(Equal("'Hello World'\n"))
return return nil
} })
glog.Infof("Resp: %s", body) 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 // Wait for the tests to finish
w.Wait() w.Wait()
glog.Infof("All hosts finished") glog.Infof("Done")
} }
func WaitForUser() { func WaitForUser() {
@ -148,7 +148,8 @@ func runTests(host string) ([]byte, error) {
ginkoTests := filepath.Join(kubeRoot, ginkoTestRelPath) ginkoTests := filepath.Join(kubeRoot, ginkoTestRelPath)
return exec.Command( return exec.Command(
"ginkgo", ginkoTests, "--", "ginkgo", ginkoTests, "--",
"--kubelet-host", "localhost", "--kubelet-port", kh.LPort, "--kubelet-address", fmt.Sprintf("http://localhost:%s", kh.LPort),
"--api-server-host", "localhost", "--api-server-port", kh.LPort, "--api-server-address", fmt.Sprintf("http://localhost:%s", ah.LPort),
"--node-name", host,
"-logtostderr").CombinedOutput() "-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
}