diff --git a/hack/verify-flags/exceptions.txt b/hack/verify-flags/exceptions.txt index adac72a3d42..764eaf0accb 100644 --- a/hack/verify-flags/exceptions.txt +++ b/hack/verify-flags/exceptions.txt @@ -69,6 +69,7 @@ docs/getting-started-guides/coreos/azure/lib/deployment_logic/kubernetes.js:var examples/cassandra/image/run.sh: cluster_name \ examples/cluster-dns/images/frontend/client.py: service_address = socket.gethostbyname(hostname) examples/vitess/env.sh: node_ip=$(get_node_ip) +hack/jenkins/e2e-runner.sh: local image_project="$1" hack/local-up-cluster.sh: runtime_config="--runtime-config=${RUNTIME_CONFIG}" hack/local-up-cluster.sh: runtime_config="" hack/test-update-storage-objects.sh: local storage_media_type=${2:-""} diff --git a/hack/verify-flags/known-flags.txt b/hack/verify-flags/known-flags.txt index 796afbb6d03..30d1983df6e 100644 --- a/hack/verify-flags/known-flags.txt +++ b/hack/verify-flags/known-flags.txt @@ -193,6 +193,7 @@ ignore-daemonsets ignore-not-found image-gc-high-threshold image-gc-low-threshold +image-project image-pull-policy include-extended-apis included-types-overrides @@ -410,6 +411,7 @@ service-node-ports service-overrides service-sync-period session-affinity +setup-node show-all show-events show-labels diff --git a/test/e2e_node/e2e_node_suite_test.go b/test/e2e_node/e2e_node_suite_test.go index b450db81318..3fed3209eae 100644 --- a/test/e2e_node/e2e_node_suite_test.go +++ b/test/e2e_node/e2e_node_suite_test.go @@ -105,6 +105,7 @@ var _ = AfterSuite(func() { glog.Infof("Stopping node services...") e2es.stop() } + glog.Infof("Tests Finished") }) diff --git a/test/e2e_node/e2e_remote.go b/test/e2e_node/e2e_remote.go index 20f4280664b..a81ce4bf544 100644 --- a/test/e2e_node/e2e_remote.go +++ b/test/e2e_node/e2e_remote.go @@ -124,9 +124,19 @@ func CreateTestArchive() string { return filepath.Join(dir, archiveName) } -// RunRemote copies the archive file to a /tmp file on host, unpacks it, and runs the e2e_node.test // Returns the command output, whether the exit was ok, and any errors -func RunRemote(archive string, host string, cleanup bool, junitFileNumber int) (string, bool, error) { +func RunRemote(archive string, host string, cleanup bool, junitFileNumber int, setupNode bool) (string, bool, error) { + if setupNode { + uname, err := user.Current() + if err != nil { + return "", false, fmt.Errorf("could not find username: %v", err) + } + output, err := RunSshCommand("ssh", host, "--", "sudo", "usermod", "-a", "-G", "docker", uname.Username) + if err != nil { + return "", false, fmt.Errorf("Instance %s not running docker daemon - Command failed: %s", host, output) + } + } + // Create the temp staging directory glog.Infof("Staging test binaries on %s", host) tmp := fmt.Sprintf("/tmp/gcloud-e2e-%d", rand.Int31()) diff --git a/test/e2e_node/environment/setup_host.sh b/test/e2e_node/environment/setup_host.sh index ebbfd5d4e48..700a975c119 100755 --- a/test/e2e_node/environment/setup_host.sh +++ b/test/e2e_node/environment/setup_host.sh @@ -64,4 +64,4 @@ fi # delete init kubelet from containervm so that is doesn't startup if [ -f /etc/init.d/kubelet ]; then sudo rm /etc/init.d/kubelet -fi \ No newline at end of file +fi diff --git a/test/e2e_node/jenkins/e2e-node-jenkins.sh b/test/e2e_node/jenkins/e2e-node-jenkins.sh index 573f6833977..67e3ed626d1 100755 --- a/test/e2e_node/jenkins/e2e-node-jenkins.sh +++ b/test/e2e_node/jenkins/e2e-node-jenkins.sh @@ -38,6 +38,7 @@ go build test/e2e_node/environment/conformance.go ARTIFACTS=${WORKSPACE}/_artifacts mkdir -p ${ARTIFACTS} go run test/e2e_node/runner/run_e2e.go --logtostderr --vmodule=*=2 --ssh-env="gce" \ - --zone="$GCE_ZONE" --project="$GCE_PROJECT" \ + --zone="$GCE_ZONE" --project="$GCE_PROJECT" --image-project="$GCE_IMAGE_PROJECT" \ --hosts="$GCE_HOSTS" --images="$GCE_IMAGES" --cleanup="$CLEANUP" \ - --results-dir="$ARTIFACTS" --ginkgo-flags="$GINKGO_FLAGS" + --results-dir="$ARTIFACTS" --ginkgo-flags="$GINKGO_FLAGS" \ + --setup-node="$SETUP_NODE" diff --git a/test/e2e_node/jenkins/jenkins-ci.properties b/test/e2e_node/jenkins/jenkins-ci.properties index 04b778b11e5..03ce988d9c9 100644 --- a/test/e2e_node/jenkins/jenkins-ci.properties +++ b/test/e2e_node/jenkins/jenkins-ci.properties @@ -6,6 +6,9 @@ GCE_HOSTS= GCE_IMAGES=e2e-node-ubuntu-trusty-docker10-image,e2e-node-ubuntu-trusty-docker9-image,e2e-node-ubuntu-trusty-docker8-image,e2e-node-coreos-stable20160218-image,e2e-node-containervm-v20160321-image GCE_ZONE=us-central1-f GCE_PROJECT=kubernetes-jenkins +GCE_IMAGE_PROJECT=kubernetes-jenkins INSTALL_GODEP=true CLEANUP=true GINKGO_FLAGS= +SETUP_NODE=false + diff --git a/test/e2e_node/jenkins/jenkins-pull.properties b/test/e2e_node/jenkins/jenkins-pull.properties index 76d0afdf2b5..027a69d3fbc 100644 --- a/test/e2e_node/jenkins/jenkins-pull.properties +++ b/test/e2e_node/jenkins/jenkins-pull.properties @@ -6,6 +6,8 @@ GCE_HOSTS= GCE_IMAGES=e2e-node-ubuntu-trusty-docker10-image,e2e-node-ubuntu-trusty-docker9-image,e2e-node-ubuntu-trusty-docker8-image,e2e-node-coreos-stable20160218-image,e2e-node-containervm-v20160321-image GCE_ZONE=us-central1-f GCE_PROJECT=kubernetes-jenkins-pull +GCE_IMAGE_PROJECT=kubernetes-jenkins-pull INSTALL_GODEP=true CLEANUP=true GINKGO_FLAGS= +SETUP_NODE=false \ No newline at end of file diff --git a/test/e2e_node/jenkins/template.properties b/test/e2e_node/jenkins/template.properties index 70d0a5506f2..4c0277df8d7 100644 --- a/test/e2e_node/jenkins/template.properties +++ b/test/e2e_node/jenkins/template.properties @@ -5,9 +5,15 @@ GCE_HOSTS= GCE_IMAGES= # Gce zone to use - required when using GCE_IMAGES GCE_ZONE= -# Gce project to use - required when using GCE_IMAGES +# Gce project to use for creating instances +# required when using GCE_IMAGES GCE_PROJECT= +# Gce project to use for GCE_IMAGES +# required when using GCE_IMAGES +GCE_IMAGE_PROJECT= # If true, assume a pristine GOPATH and install necessary godeps INSTALL_GODEP=false # If true, delete instances created from GCE_IMAGES and files copied to GCE_HOSTS CLEANUP=true +# If true, current user will be added to the docker group on test node +SETUP_NODE=false diff --git a/test/e2e_node/runner/run_e2e.go b/test/e2e_node/runner/run_e2e.go index e4f4022d9f3..1019073fa09 100644 --- a/test/e2e_node/runner/run_e2e.go +++ b/test/e2e_node/runner/run_e2e.go @@ -41,10 +41,12 @@ import ( var instanceNamePrefix = flag.String("instance-name-prefix", "", "prefix for instance names") var zone = flag.String("zone", "", "gce zone the hosts live in") var project = flag.String("project", "", "gce project the hosts live in") +var imageProject = flag.String("image-project", "", "gce project the hosts live in") var images = flag.String("images", "", "images to test") var hosts = flag.String("hosts", "", "hosts to test") var cleanup = flag.Bool("cleanup", true, "If true remove files from remote hosts and delete temporary instances") var buildOnly = flag.Bool("build-only", false, "If true, build e2e_node_test.tar.gz and exit.") +var setupNode = flag.Bool("setup-node", false, "When true, current user will be added to docker group on the test machine") var computeService *compute.Service @@ -70,8 +72,13 @@ func main() { if *images != "" && *zone == "" { glog.Fatal("Must specify --zone flag") } - if *images != "" && *project == "" { - glog.Fatal("Must specify --project flag") + if *images != "" { + if *imageProject == "" { + glog.Fatal("Must specify --image-project flag") + } + if *project == "" { + glog.Fatal("Must specify --project flag") + } } if *instanceNamePrefix == "" { *instanceNamePrefix = "tmp-node-e2e-" + uuid.NewUUID().String()[:8] @@ -123,7 +130,7 @@ func main() { fmt.Printf("Initializing e2e tests using host %s.\n", host) running++ go func(host string, junitFileNum int) { - results <- testHost(host, archive, *cleanup, junitFileNum) + results <- testHost(host, archive, *cleanup, junitFileNum, *setupNode) }(host, running) } } @@ -153,8 +160,8 @@ func main() { } // Run tests in archive against host -func testHost(host, archive string, deleteFiles bool, junitFileNum int) *TestResult { - output, exitOk, err := e2e_node.RunRemote(archive, host, deleteFiles, junitFileNum) +func testHost(host, archive string, deleteFiles bool, junitFileNum int, setupNode bool) *TestResult { + output, exitOk, err := e2e_node.RunRemote(archive, host, deleteFiles, junitFileNum, setupNode) return &TestResult{ output: output, err: err, @@ -175,7 +182,7 @@ func testImage(image, archive string, junitFileNum int) *TestResult { err: fmt.Errorf("Unable to create gce instance with running docker daemon for image %s. %v", image, err), } } - return testHost(host, archive, false, junitFileNum) + return testHost(host, archive, false, junitFileNum, *setupNode) } // Provision a gce instance using image @@ -253,7 +260,7 @@ func imageToInstanceName(image string) string { } func sourceImage(image string) string { - return fmt.Sprintf("projects/%s/global/images/%s", *project, image) + return fmt.Sprintf("projects/%s/global/images/%s", *imageProject, image) } func machineType() string {