Skip to content

Commit

Permalink
Merge pull request kubernetes#17683 from pwittrock/node_e2e_tests
Browse files Browse the repository at this point in the history
Auto commit by PR queue bot
  • Loading branch information
k8s-merge-robot committed Dec 9, 2015
2 parents b741386 + ec5ecb1 commit 9bbe601
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 33 deletions.
5 changes: 3 additions & 2 deletions hack/verify-flags/known-flags.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
8 changes: 3 additions & 5 deletions test/e2e_node/e2e_node_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
7 changes: 4 additions & 3 deletions test/e2e_node/gcloud/gcloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Expand Down Expand Up @@ -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
}
}()
Expand Down
69 changes: 49 additions & 20 deletions test/e2e_node/kubelet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
})
})
})
Expand Down
7 changes: 4 additions & 3 deletions test/e2e_node/runner/run_e2e.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ func main() {

// Wait for the tests to finish
w.Wait()
glog.Infof("All hosts finished")
glog.Infof("Done")
}

func WaitForUser() {
Expand Down Expand Up @@ -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()
}
37 changes: 37 additions & 0 deletions test/e2e_node/util.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 9bbe601

Please sign in to comment.