From d31608fcc8a07d6d83ab6782e4f02720f7032c57 Mon Sep 17 00:00:00 2001 From: Vishnu kannan Date: Fri, 22 Jul 2016 17:24:21 -0700 Subject: [PATCH] Make it possible to run node e2e with GCI via make Signed-off-by: Vishnu kannan --- Makefile | 1 + docs/devel/e2e-node-tests.md | 1 + hack/make-rules/test-e2e-node.sh | 5 +++-- test/e2e_node/e2e_node_suite_test.go | 4 +++- test/e2e_node/e2e_service.go | 13 ++++++++++++- test/e2e_node/jenkins/gci-init.yaml | 6 +++--- test/e2e_node/runner/run_e2e.go | 6 ++++-- 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 8d35c52e445..10c2c5072ad 100644 --- a/Makefile +++ b/Makefile @@ -157,6 +157,7 @@ test-e2e: ginkgo generated_files # IMAGES. Defaults to "kubernetes-node-e2e-images". # INSTANCE_PREFIX: For REMOTE=true only. Instances created from images will # have the name "${INSTANCE_PREFIX}-${IMAGE_NAME}". Defaults to "test". +# INSTANCE_METADATA: For REMOTE=true and running on GCE only. # # Example: # make test-e2e-node FOCUS=Kubelet SKIP=container diff --git a/docs/devel/e2e-node-tests.md b/docs/devel/e2e-node-tests.md index 04b82799686..b300cddbfee 100644 --- a/docs/devel/e2e-node-tests.md +++ b/docs/devel/e2e-node-tests.md @@ -51,6 +51,7 @@ Why run tests *Locally*? Much faster than running tests Remotely. Prerequisites: - [Install etcd](https://github.com/coreos/etcd/releases) on your PATH - Verify etcd is installed correctly by running `which etcd` + - Or make etcd binary available and executable at `/tmp/etcd` - [Install ginkgo](https://github.com/onsi/ginkgo) on your PATH - Verify ginkgo is installed correctly by running `which ginkgo` diff --git a/hack/make-rules/test-e2e-node.sh b/hack/make-rules/test-e2e-node.sh index 0640f6033ac..11d812e907b 100755 --- a/hack/make-rules/test-e2e-node.sh +++ b/hack/make-rules/test-e2e-node.sh @@ -34,6 +34,7 @@ delete_instances=${DELETE_INSTANCES:-"false"} run_until_failure=${RUN_UNTIL_FAILURE:-"false"} list_images=${LIST_IMAGES:-"false"} test_args=${TEST_ARGS:-""} +metadata=${INSTANCE_METADATA:-""} if [[ $list_images == "true" ]]; then gcloud compute images list --project="${image_project}" | grep "e2e-node" @@ -111,14 +112,14 @@ if [ $remote = true ] ; then echo "Images: $images" echo "Hosts: $hosts" echo "Ginkgo Flags: $ginkgoflags" - + echo "Instance Metadata: $metadata" # Invoke the runner go run test/e2e_node/runner/run_e2e.go --logtostderr --vmodule=*=2 --ssh-env="gce" \ --zone="$zone" --project="$project" \ --hosts="$hosts" --images="$images" --cleanup="$cleanup" \ --results-dir="$artifacts" --ginkgo-flags="$ginkgoflags" \ --image-project="$image_project" --instance-name-prefix="$instance_prefix" --setup-node="true" \ - --delete-instances="$delete_instances" --test_args="$test_args" + --delete-instances="$delete_instances" --test_args="$test_args" --instance-metadata="$metadata" exit $? else diff --git a/test/e2e_node/e2e_node_suite_test.go b/test/e2e_node/e2e_node_suite_test.go index f99b9f25b8d..c0dd6dce718 100644 --- a/test/e2e_node/e2e_node_suite_test.go +++ b/test/e2e_node/e2e_node_suite_test.go @@ -135,7 +135,9 @@ var _ = AfterSuite(func() { func maskLocksmithdOnCoreos() { data, err := ioutil.ReadFile("/etc/os-release") if err != nil { - glog.Fatalf("Could not read /etc/os-release: %v", err) + // Not all distros contain this file. + glog.Infof("Could not read /etc/os-release: %v", err) + return } if bytes.Contains(data, []byte("ID=coreos")) { if output, err := exec.Command("sudo", "systemctl", "mask", "--now", "locksmithd").CombinedOutput(); err != nil { diff --git a/test/e2e_node/e2e_service.go b/test/e2e_node/e2e_service.go index 76f185756ca..db56e15cf9a 100644 --- a/test/e2e_node/e2e_service.go +++ b/test/e2e_node/e2e_service.go @@ -57,6 +57,8 @@ type logFileData struct { const ( // This is consistent with the level used in a cluster e2e test. LOG_VERBOSITY_LEVEL = "4" + // Etcd binary is expected to either be available via PATH, or at this location. + defaultEtcdPath = "/tmp/etcd" ) func newE2eService(nodeName string, cgroupsPerQOS bool) *e2eService { @@ -179,7 +181,16 @@ func (es *e2eService) startEtcd() (*killCmd, error) { return nil, err } es.etcdDataDir = dataDir - cmd := exec.Command("etcd") + etcdPath, err := exec.LookPath("etcd") + if err != nil { + glog.Infof("etcd not found in PATH. Defaulting to %s...", defaultEtcdPath) + _, err = os.Stat(defaultEtcdPath) + if err != nil { + return nil, fmt.Errorf("etcd binary not found") + } + etcdPath = defaultEtcdPath + } + cmd := exec.Command(etcdPath) // Execute etcd in the data directory instead of using --data-dir because the flag sometimes requires additional // configuration (e.g. --name in version 0.4.9) cmd.Dir = es.etcdDataDir diff --git a/test/e2e_node/jenkins/gci-init.yaml b/test/e2e_node/jenkins/gci-init.yaml index 1227c73e019..3d96f1316d2 100644 --- a/test/e2e_node/jenkins/gci-init.yaml +++ b/test/e2e_node/jenkins/gci-init.yaml @@ -1,9 +1,9 @@ #cloud-config runcmd: + - mount /tmp /tmp -o remount,exec,suid - ETCD_VERSION=v2.2.5 - curl -L https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz -o /tmp/etcd.tar.gz - tar xzvf /tmp/etcd.tar.gz -C /tmp - - sudo mv /tmp/etcd-${ETCD_VERSION}-linux-amd64/etcd* /usr/local/bin/ - - sudo chown root:root /usr/local/bin/etcd* - - rm -r /tmp/etcd* + - cp /tmp/etcd-${ETCD_VERSION}-linux-amd64/etcd* /tmp/ + - rm -rf /tmp/etcd-${ETCD_VERSION}-linux-amd64/ diff --git a/test/e2e_node/runner/run_e2e.go b/test/e2e_node/runner/run_e2e.go index 19e4b4d43c0..66fa26f2e69 100644 --- a/test/e2e_node/runner/run_e2e.go +++ b/test/e2e_node/runner/run_e2e.go @@ -310,7 +310,9 @@ func createInstance(image, imageProject string) (string, error) { }, } if *instanceMetadata != "" { + glog.V(2).Infof("parsing instance metadata: %q", *instanceMetadata) raw := parseInstanceMetadata(*instanceMetadata) + glog.V(3).Infof("parsed instance metadata: %v", raw) i.Metadata = &compute.Metadata{} metadata := []*compute.MetadataItems{} for k, v := range raw { @@ -422,12 +424,12 @@ func parseInstanceMetadata(str string) map[string]string { } kp := strings.Split(s, "<") if len(kp) != 2 { - glog.Errorf("Invalid instance metadata: %q", s) + glog.Fatalf("Invalid instance metadata: %q", s) continue } v, err := ioutil.ReadFile(kp[1]) if err != nil { - glog.Errorf("Failed to read metadata file %q: %v", kp[1], err) + glog.Fatalf("Failed to read metadata file %q: %v", kp[1], err) continue } metadata[kp[0]] = string(v)