mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-06 10:43:56 +00:00
Generate individual test results for upgrade tests
This commit is contained in:
parent
6da0d384cf
commit
82c58f2658
@ -172,6 +172,7 @@ go_library(
|
|||||||
"//test/e2e_federation:go_default_library",
|
"//test/e2e_federation:go_default_library",
|
||||||
"//test/images/net/nat:go_default_library",
|
"//test/images/net/nat:go_default_library",
|
||||||
"//test/utils:go_default_library",
|
"//test/utils:go_default_library",
|
||||||
|
"//test/utils/junit:go_default_library",
|
||||||
"//vendor/github.com/davecgh/go-spew/spew:go_default_library",
|
"//vendor/github.com/davecgh/go-spew/spew:go_default_library",
|
||||||
"//vendor/github.com/elazarl/goproxy:go_default_library",
|
"//vendor/github.com/elazarl/goproxy:go_default_library",
|
||||||
"//vendor/github.com/ghodss/yaml:go_default_library",
|
"//vendor/github.com/ghodss/yaml:go_default_library",
|
||||||
|
@ -17,11 +17,20 @@ limitations under the License.
|
|||||||
package e2e
|
package e2e
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"k8s.io/client-go/discovery"
|
"k8s.io/client-go/discovery"
|
||||||
"k8s.io/kubernetes/pkg/util/version"
|
"k8s.io/kubernetes/pkg/util/version"
|
||||||
"k8s.io/kubernetes/test/e2e/chaosmonkey"
|
"k8s.io/kubernetes/test/e2e/chaosmonkey"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
|
"k8s.io/kubernetes/test/e2e/framework/ginkgowrapper"
|
||||||
"k8s.io/kubernetes/test/e2e/upgrades"
|
"k8s.io/kubernetes/test/e2e/upgrades"
|
||||||
|
"k8s.io/kubernetes/test/utils/junit"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
)
|
)
|
||||||
@ -45,32 +54,24 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
|
|||||||
|
|
||||||
// Create the frameworks here because we can only create them
|
// Create the frameworks here because we can only create them
|
||||||
// in a "Describe".
|
// in a "Describe".
|
||||||
testFrameworks := map[string]*framework.Framework{}
|
testFrameworks := createUpgradeFrameworks()
|
||||||
for _, t := range upgradeTests {
|
|
||||||
testFrameworks[t.Name()] = framework.NewDefaultFramework(t.Name())
|
|
||||||
}
|
|
||||||
|
|
||||||
framework.KubeDescribe("master upgrade", func() {
|
framework.KubeDescribe("master upgrade", func() {
|
||||||
It("should maintain a functioning cluster [Feature:MasterUpgrade]", func() {
|
It("should maintain a functioning cluster [Feature:MasterUpgrade]", func() {
|
||||||
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
cm := chaosmonkey.New(func() {
|
testSuite := &junit.TestSuite{Name: "Master upgrade"}
|
||||||
|
masterUpgradeTest := &junit.TestCase{Name: "master-upgrade", Classname: "upgrade_tests"}
|
||||||
|
testSuite.TestCases = append(testSuite.TestCases, masterUpgradeTest)
|
||||||
|
|
||||||
|
upgradeFunc := func() {
|
||||||
|
start := time.Now()
|
||||||
|
defer finalizeUpgradeTest(start, masterUpgradeTest)
|
||||||
target := upgCtx.Versions[1].Version.String()
|
target := upgCtx.Versions[1].Version.String()
|
||||||
framework.ExpectNoError(framework.MasterUpgrade(target))
|
framework.ExpectNoError(framework.MasterUpgrade(target))
|
||||||
framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target))
|
framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target))
|
||||||
})
|
|
||||||
for _, t := range upgradeTests {
|
|
||||||
cma := chaosMonkeyAdapter{
|
|
||||||
test: t,
|
|
||||||
framework: testFrameworks[t.Name()],
|
|
||||||
upgradeType: upgrades.MasterUpgrade,
|
|
||||||
upgCtx: *upgCtx,
|
|
||||||
}
|
|
||||||
cm.Register(cma.Test)
|
|
||||||
}
|
}
|
||||||
|
runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.MasterUpgrade, upgradeFunc)
|
||||||
cm.Do()
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -79,21 +80,17 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
|
|||||||
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
cm := chaosmonkey.New(func() {
|
testSuite := &junit.TestSuite{Name: "Node upgrade"}
|
||||||
|
nodeUpgradeTest := &junit.TestCase{Name: "node-upgrade", Classname: "upgrade_tests"}
|
||||||
|
|
||||||
|
upgradeFunc := func() {
|
||||||
|
start := time.Now()
|
||||||
|
defer finalizeUpgradeTest(start, nodeUpgradeTest)
|
||||||
target := upgCtx.Versions[1].Version.String()
|
target := upgCtx.Versions[1].Version.String()
|
||||||
framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage))
|
framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage))
|
||||||
framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target))
|
framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target))
|
||||||
})
|
|
||||||
for _, t := range upgradeTests {
|
|
||||||
cma := chaosMonkeyAdapter{
|
|
||||||
test: t,
|
|
||||||
framework: testFrameworks[t.Name()],
|
|
||||||
upgradeType: upgrades.NodeUpgrade,
|
|
||||||
upgCtx: *upgCtx,
|
|
||||||
}
|
|
||||||
cm.Register(cma.Test)
|
|
||||||
}
|
}
|
||||||
cm.Do()
|
runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.NodeUpgrade, upgradeFunc)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -102,23 +99,19 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
|
|||||||
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
cm := chaosmonkey.New(func() {
|
testSuite := &junit.TestSuite{Name: "Cluster upgrade"}
|
||||||
|
clusterUpgradeTest := &junit.TestCase{Name: "cluster-upgrade", Classname: "upgrade_tests"}
|
||||||
|
testSuite.TestCases = append(testSuite.TestCases, clusterUpgradeTest)
|
||||||
|
upgradeFunc := func() {
|
||||||
|
start := time.Now()
|
||||||
|
defer finalizeUpgradeTest(start, clusterUpgradeTest)
|
||||||
target := upgCtx.Versions[1].Version.String()
|
target := upgCtx.Versions[1].Version.String()
|
||||||
framework.ExpectNoError(framework.MasterUpgrade(target))
|
framework.ExpectNoError(framework.MasterUpgrade(target))
|
||||||
framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target))
|
framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target))
|
||||||
framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage))
|
framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage))
|
||||||
framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target))
|
framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target))
|
||||||
})
|
|
||||||
for _, t := range upgradeTests {
|
|
||||||
cma := chaosMonkeyAdapter{
|
|
||||||
test: t,
|
|
||||||
framework: testFrameworks[t.Name()],
|
|
||||||
upgradeType: upgrades.ClusterUpgrade,
|
|
||||||
upgCtx: *upgCtx,
|
|
||||||
}
|
|
||||||
cm.Register(cma.Test)
|
|
||||||
}
|
}
|
||||||
cm.Do()
|
runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.ClusterUpgrade, upgradeFunc)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -138,24 +131,21 @@ var _ = framework.KubeDescribe("Downgrade [Feature:Downgrade]", func() {
|
|||||||
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
cm := chaosmonkey.New(func() {
|
testSuite := &junit.TestSuite{Name: "Cluster downgrade"}
|
||||||
|
clusterDowngradeTest := &junit.TestCase{Name: "cluster-downgrade", Classname: "upgrade_tests"}
|
||||||
|
testSuite.TestCases = append(testSuite.TestCases, clusterDowngradeTest)
|
||||||
|
|
||||||
|
upgradeFunc := func() {
|
||||||
|
start := time.Now()
|
||||||
|
defer finalizeUpgradeTest(start, clusterDowngradeTest)
|
||||||
// Yes this really is a downgrade. And nodes must downgrade first.
|
// Yes this really is a downgrade. And nodes must downgrade first.
|
||||||
target := upgCtx.Versions[1].Version.String()
|
target := upgCtx.Versions[1].Version.String()
|
||||||
framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage))
|
framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage))
|
||||||
framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target))
|
framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target))
|
||||||
framework.ExpectNoError(framework.MasterUpgrade(target))
|
framework.ExpectNoError(framework.MasterUpgrade(target))
|
||||||
framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target))
|
framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target))
|
||||||
})
|
|
||||||
for _, t := range upgradeTests {
|
|
||||||
cma := chaosMonkeyAdapter{
|
|
||||||
test: t,
|
|
||||||
framework: testFrameworks[t.Name()],
|
|
||||||
upgradeType: upgrades.ClusterUpgrade,
|
|
||||||
upgCtx: *upgCtx,
|
|
||||||
}
|
|
||||||
cm.Register(cma.Test)
|
|
||||||
}
|
}
|
||||||
cm.Do()
|
runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.ClusterUpgrade, upgradeFunc)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -165,55 +155,138 @@ var _ = framework.KubeDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() {
|
|||||||
|
|
||||||
// Create the frameworks here because we can only create them
|
// Create the frameworks here because we can only create them
|
||||||
// in a "Describe".
|
// in a "Describe".
|
||||||
testFrameworks := map[string]*framework.Framework{}
|
testFrameworks := createUpgradeFrameworks()
|
||||||
for _, t := range upgradeTests {
|
|
||||||
testFrameworks[t.Name()] = framework.NewDefaultFramework(t.Name())
|
|
||||||
}
|
|
||||||
|
|
||||||
framework.KubeDescribe("etcd upgrade", func() {
|
framework.KubeDescribe("etcd upgrade", func() {
|
||||||
It("should maintain a functioning cluster", func() {
|
It("should maintain a functioning cluster", func() {
|
||||||
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), "")
|
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), "")
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
cm := chaosmonkey.New(func() {
|
testSuite := &junit.TestSuite{Name: "Etcd upgrade"}
|
||||||
framework.ExpectNoError(framework.EtcdUpgrade(framework.TestContext.EtcdUpgradeStorage, framework.TestContext.EtcdUpgradeVersion))
|
etcdTest := &junit.TestCase{Name: "etcd-upgrade", Classname: "upgrade_tests"}
|
||||||
// TODO(mml): verify the etcd version
|
testSuite.TestCases = append(testSuite.TestCases, etcdTest)
|
||||||
})
|
|
||||||
for _, t := range upgradeTests {
|
|
||||||
cma := chaosMonkeyAdapter{
|
|
||||||
test: t,
|
|
||||||
framework: testFrameworks[t.Name()],
|
|
||||||
upgradeType: upgrades.EtcdUpgrade,
|
|
||||||
upgCtx: *upgCtx,
|
|
||||||
}
|
|
||||||
cm.Register(cma.Test)
|
|
||||||
}
|
|
||||||
|
|
||||||
cm.Do()
|
upgradeFunc := func() {
|
||||||
|
start := time.Now()
|
||||||
|
defer finalizeUpgradeTest(start, etcdTest)
|
||||||
|
framework.ExpectNoError(framework.EtcdUpgrade(framework.TestContext.EtcdUpgradeStorage, framework.TestContext.EtcdUpgradeVersion))
|
||||||
|
}
|
||||||
|
runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.EtcdUpgrade, upgradeFunc)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
type chaosMonkeyAdapter struct {
|
type chaosMonkeyAdapter struct {
|
||||||
test upgrades.Test
|
test upgrades.Test
|
||||||
|
testReport *junit.TestCase
|
||||||
framework *framework.Framework
|
framework *framework.Framework
|
||||||
upgradeType upgrades.UpgradeType
|
upgradeType upgrades.UpgradeType
|
||||||
upgCtx upgrades.UpgradeContext
|
upgCtx upgrades.UpgradeContext
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cma *chaosMonkeyAdapter) Test(sem *chaosmonkey.Semaphore) {
|
func (cma *chaosMonkeyAdapter) Test(sem *chaosmonkey.Semaphore) {
|
||||||
|
start := time.Now()
|
||||||
|
var once sync.Once
|
||||||
|
ready := func() {
|
||||||
|
once.Do(func() {
|
||||||
|
sem.Ready()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
defer finalizeUpgradeTest(start, cma.testReport)
|
||||||
|
defer ready()
|
||||||
if skippable, ok := cma.test.(upgrades.Skippable); ok && skippable.Skip(cma.upgCtx) {
|
if skippable, ok := cma.test.(upgrades.Skippable); ok && skippable.Skip(cma.upgCtx) {
|
||||||
By("skipping test " + cma.test.Name())
|
By("skipping test " + cma.test.Name())
|
||||||
sem.Ready()
|
cma.testReport.Skipped = "skipping test " + cma.test.Name()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer cma.test.Teardown(cma.framework)
|
defer cma.test.Teardown(cma.framework)
|
||||||
cma.test.Setup(cma.framework)
|
cma.test.Setup(cma.framework)
|
||||||
sem.Ready()
|
ready()
|
||||||
cma.test.Test(cma.framework, sem.StopCh, cma.upgradeType)
|
cma.test.Test(cma.framework, sem.StopCh, cma.upgradeType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func finalizeUpgradeTest(start time.Time, tc *junit.TestCase) {
|
||||||
|
tc.Time = time.Since(start).Seconds()
|
||||||
|
r := recover()
|
||||||
|
if r == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch r := r.(type) {
|
||||||
|
case ginkgowrapper.FailurePanic:
|
||||||
|
tc.Failures = []*junit.Failure{
|
||||||
|
{
|
||||||
|
Message: r.Message,
|
||||||
|
Type: "Failure",
|
||||||
|
Value: fmt.Sprintf("%s\n\n%s", r.Message, r.FullStackTrace),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case ginkgowrapper.SkipPanic:
|
||||||
|
tc.Skipped = fmt.Sprintf("%s:%d %q", r.Filename, r.Line, r.Message)
|
||||||
|
default:
|
||||||
|
tc.Errors = []*junit.Error{
|
||||||
|
{
|
||||||
|
Message: fmt.Sprintf("%v", r),
|
||||||
|
Type: "Panic",
|
||||||
|
Value: fmt.Sprintf("%v", r),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func createUpgradeFrameworks() map[string]*framework.Framework {
|
||||||
|
testFrameworks := map[string]*framework.Framework{}
|
||||||
|
for _, t := range upgradeTests {
|
||||||
|
testFrameworks[t.Name()] = framework.NewDefaultFramework(t.Name())
|
||||||
|
}
|
||||||
|
return testFrameworks
|
||||||
|
}
|
||||||
|
|
||||||
|
func runUpgradeSuite(
|
||||||
|
f *framework.Framework,
|
||||||
|
testFrameworks map[string]*framework.Framework,
|
||||||
|
testSuite *junit.TestSuite,
|
||||||
|
upgCtx *upgrades.UpgradeContext,
|
||||||
|
upgradeType upgrades.UpgradeType,
|
||||||
|
upgradeFunc func(),
|
||||||
|
) {
|
||||||
|
upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget)
|
||||||
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
|
cm := chaosmonkey.New(upgradeFunc)
|
||||||
|
for _, t := range upgradeTests {
|
||||||
|
testCase := &junit.TestCase{
|
||||||
|
Name: t.Name(),
|
||||||
|
Classname: "upgrade_tests",
|
||||||
|
}
|
||||||
|
testSuite.TestCases = append(testSuite.TestCases, testCase)
|
||||||
|
cma := chaosMonkeyAdapter{
|
||||||
|
test: t,
|
||||||
|
testReport: testCase,
|
||||||
|
framework: testFrameworks[t.Name()],
|
||||||
|
upgradeType: upgradeType,
|
||||||
|
upgCtx: *upgCtx,
|
||||||
|
}
|
||||||
|
cm.Register(cma.Test)
|
||||||
|
}
|
||||||
|
|
||||||
|
start := time.Now()
|
||||||
|
defer func() {
|
||||||
|
testSuite.Update()
|
||||||
|
testSuite.Time = time.Since(start).Seconds()
|
||||||
|
if framework.TestContext.ReportDir != "" {
|
||||||
|
fname := filepath.Join(framework.TestContext.ReportDir, fmt.Sprintf("junit_%supgrades.xml", framework.TestContext.ReportPrefix))
|
||||||
|
f, err := os.Create(fname)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
xml.NewEncoder(f).Encode(testSuite)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
cm.Do()
|
||||||
|
}
|
||||||
|
|
||||||
func getUpgradeContext(c discovery.DiscoveryInterface, upgradeTarget string) (*upgrades.UpgradeContext, error) {
|
func getUpgradeContext(c discovery.DiscoveryInterface, upgradeTarget string) (*upgrades.UpgradeContext, error) {
|
||||||
current, err := c.ServerVersion()
|
current, err := c.ServerVersion()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user