2015-01-13 02:11:27 +00:00
|
|
|
/*
|
|
|
|
Copyright 2014 Google Inc. 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
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
|
|
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
|
|
|
"github.com/golang/glog"
|
|
|
|
)
|
|
|
|
|
|
|
|
type testSpec struct {
|
|
|
|
// The test to run
|
|
|
|
test func(c *client.Client) bool
|
|
|
|
// The human readable name of this test
|
|
|
|
name string
|
|
|
|
// The id for this test. It should be constant for the life of the test.
|
|
|
|
id int
|
|
|
|
}
|
|
|
|
|
|
|
|
type testInfo struct {
|
|
|
|
passed bool
|
|
|
|
spec testSpec
|
|
|
|
}
|
|
|
|
|
|
|
|
// Output a summary in the TAP (test anything protocol) format for automated processing.
|
|
|
|
// See http://testanything.org/ for more info
|
|
|
|
func outputTAPSummary(infoList []testInfo) {
|
|
|
|
glog.Infof("1..%d", len(infoList))
|
|
|
|
for _, info := range infoList {
|
|
|
|
if info.passed {
|
|
|
|
glog.Infof("ok %d - %s", info.spec.id, info.spec.name)
|
|
|
|
} else {
|
|
|
|
glog.Infof("not ok %d - %s", info.spec.id, info.spec.name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-15 23:24:58 +00:00
|
|
|
// Run each Go end-to-end-test. This function assumes the
|
|
|
|
// creation of a test cluster.
|
|
|
|
func RunE2ETests(authConfig, certDir, host, repoRoot, provider string, testList []string) {
|
|
|
|
testContext = testContextType{authConfig, certDir, host, repoRoot, provider}
|
2015-01-13 02:11:27 +00:00
|
|
|
util.ReallyCrash = true
|
|
|
|
util.InitLogs()
|
|
|
|
defer util.FlushLogs()
|
|
|
|
|
2015-01-15 23:24:58 +00:00
|
|
|
// TODO: Associate a timeout with each test individually.
|
2015-01-13 02:11:27 +00:00
|
|
|
go func() {
|
|
|
|
defer util.FlushLogs()
|
2015-01-15 23:24:58 +00:00
|
|
|
time.Sleep(10 * time.Minute)
|
2015-01-13 02:11:27 +00:00
|
|
|
glog.Fatalf("This test has timed out. Cleanup not guaranteed.")
|
|
|
|
}()
|
|
|
|
|
|
|
|
c := loadClientOrDie()
|
|
|
|
|
|
|
|
tests := []testSpec{
|
|
|
|
{TestKubernetesROService, "TestKubernetesROService", 1},
|
|
|
|
{TestKubeletSendsEvent, "TestKubeletSendsEvent", 2},
|
|
|
|
{TestImportantURLs, "TestImportantURLs", 3},
|
|
|
|
{TestPodUpdate, "TestPodUpdate", 4},
|
|
|
|
{TestNetwork, "TestNetwork", 5},
|
|
|
|
{TestClusterDNS, "TestClusterDNS", 6},
|
|
|
|
{TestPodHasServiceEnvVars, "TestPodHasServiceEnvVars", 7},
|
|
|
|
{TestBasic, "TestBasic", 8},
|
2015-01-15 23:24:58 +00:00
|
|
|
{TestPrivate, "TestPrivate", 9},
|
2015-01-13 02:11:27 +00:00
|
|
|
}
|
|
|
|
|
2015-01-16 00:11:46 +00:00
|
|
|
validTestNames := util.NewStringSet()
|
|
|
|
for _, test := range tests {
|
|
|
|
validTestNames.Insert(test.name)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check testList for non-existent tests and populate a StringSet with tests to run.
|
|
|
|
runTestNames := util.NewStringSet()
|
|
|
|
for _, testName := range testList {
|
|
|
|
if validTestNames.Has(testName) {
|
|
|
|
runTestNames.Insert(testName)
|
|
|
|
} else {
|
|
|
|
glog.Warningf("Requested test %s does not exist", testName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-13 02:11:27 +00:00
|
|
|
info := []testInfo{}
|
|
|
|
passed := true
|
|
|
|
for i, test := range tests {
|
2015-01-16 00:11:46 +00:00
|
|
|
// Check if this test is supposed to run, either if listed explicitly in
|
|
|
|
// a --test flag or if no --test flags were supplied.
|
|
|
|
if len(testList) > 0 && !runTestNames.Has(test.name) {
|
|
|
|
glog.Infof("Skipping test %d %s", i+1, test.name)
|
|
|
|
continue
|
|
|
|
}
|
2015-01-13 02:11:27 +00:00
|
|
|
glog.Infof("Running test %d %s", i+1, test.name)
|
|
|
|
testPassed := test.test(c)
|
|
|
|
if !testPassed {
|
|
|
|
glog.Infof(" test %d failed", i+1)
|
|
|
|
passed = false
|
|
|
|
} else {
|
|
|
|
glog.Infof(" test %d passed", i+1)
|
|
|
|
}
|
|
|
|
// TODO: clean up objects created during a test after the test, so cases
|
|
|
|
// are independent.
|
|
|
|
info = append(info, testInfo{testPassed, test})
|
|
|
|
}
|
|
|
|
outputTAPSummary(info)
|
|
|
|
if !passed {
|
|
|
|
glog.Fatalf("At least one test failed")
|
|
|
|
} else {
|
|
|
|
glog.Infof("All tests pass")
|
|
|
|
}
|
|
|
|
}
|