mirror of https://github.com/k3s-io/k3s
Initial Pod e2e test
parent
0d4e0dc173
commit
ec5ecb18fa
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
@ -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))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue