2015-06-09 01:59:13 +00:00
/ *
2016-06-03 00:25:58 +00:00
Copyright 2016 The Kubernetes Authors .
2015-06-09 01:59:13 +00:00
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 .
* /
2017-07-18 20:04:46 +00:00
package lifecycle
2015-06-09 01:59:13 +00:00
import (
2017-05-16 16:50:14 +00:00
"encoding/xml"
2018-07-27 15:29:00 +00:00
"flag"
2017-05-16 16:50:14 +00:00
"fmt"
"os"
"path/filepath"
2017-07-17 17:45:05 +00:00
"regexp"
"strings"
2019-03-15 01:59:44 +00:00
"sync"
2017-05-16 16:50:14 +00:00
"time"
2018-09-21 05:06:51 +00:00
"k8s.io/apimachinery/pkg/util/version"
2018-09-21 06:03:05 +00:00
"k8s.io/client-go/discovery"
2016-04-06 22:12:31 +00:00
"k8s.io/kubernetes/test/e2e/chaosmonkey"
2016-04-07 17:21:31 +00:00
"k8s.io/kubernetes/test/e2e/framework"
2017-05-16 16:50:14 +00:00
"k8s.io/kubernetes/test/e2e/framework/ginkgowrapper"
2019-04-24 16:18:04 +00:00
e2elifecycle "k8s.io/kubernetes/test/e2e/framework/lifecycle"
2017-01-23 22:44:28 +00:00
"k8s.io/kubernetes/test/e2e/upgrades"
2017-07-13 19:14:55 +00:00
apps "k8s.io/kubernetes/test/e2e/upgrades/apps"
2017-07-13 22:34:49 +00:00
"k8s.io/kubernetes/test/e2e/upgrades/storage"
2017-05-16 16:50:14 +00:00
"k8s.io/kubernetes/test/utils/junit"
2015-06-09 01:59:13 +00:00
2019-04-25 15:40:22 +00:00
"github.com/onsi/ginkgo"
2015-06-09 01:59:13 +00:00
)
2018-07-27 15:29:00 +00:00
var (
upgradeTarget = flag . String ( "upgrade-target" , "ci/latest" , "Version to upgrade to (e.g. 'release/stable', 'release/latest', 'ci/latest', '0.19.1', '0.19.1-669-gabac8c8') if doing an upgrade test." )
upgradeImage = flag . String ( "upgrade-image" , "" , "Image to upgrade to (e.g. 'container_vm' or 'gci') if doing an upgrade test." )
)
2017-01-23 22:44:28 +00:00
var upgradeTests = [ ] upgrades . Test {
& upgrades . ServiceUpgradeTest { } ,
2017-01-26 19:07:50 +00:00
& upgrades . SecretUpgradeTest { } ,
2017-10-16 19:10:04 +00:00
& apps . ReplicaSetUpgradeTest { } ,
2017-07-13 19:14:55 +00:00
& apps . StatefulSetUpgradeTest { } ,
& apps . DeploymentUpgradeTest { } ,
& apps . JobUpgradeTest { } ,
2017-02-11 23:01:22 +00:00
& upgrades . ConfigMapUpgradeTest { } ,
2017-04-06 16:26:35 +00:00
& upgrades . HPAUpgradeTest { } ,
2017-07-13 22:34:49 +00:00
& storage . PersistentVolumeUpgradeTest { } ,
2017-07-13 19:14:55 +00:00
& apps . DaemonSetUpgradeTest { } ,
2017-03-08 01:15:53 +00:00
& upgrades . AppArmorUpgradeTest { } ,
2018-10-25 19:49:02 +00:00
& storage . VolumeModeDowngradeTest { } ,
2017-01-23 22:44:28 +00:00
}
2018-05-04 00:33:01 +00:00
var gpuUpgradeTests = [ ] upgrades . Test {
& upgrades . NvidiaGPUUpgradeTest { } ,
}
2017-08-08 17:50:38 +00:00
var statefulsetUpgradeTests = [ ] upgrades . Test {
2019-02-25 08:36:26 +00:00
& upgrades . MySQLUpgradeTest { } ,
2017-08-08 17:50:38 +00:00
& upgrades . EtcdUpgradeTest { } ,
& upgrades . CassandraUpgradeTest { } ,
}
2017-09-01 23:03:55 +00:00
var kubeProxyUpgradeTests = [ ] upgrades . Test {
& upgrades . KubeProxyUpgradeTest { } ,
& upgrades . ServiceUpgradeTest { } ,
}
var kubeProxyDowngradeTests = [ ] upgrades . Test {
& upgrades . KubeProxyDowngradeTest { } ,
& upgrades . ServiceUpgradeTest { } ,
2018-01-10 05:07:01 +00:00
}
2017-08-13 09:04:52 +00:00
var _ = SIGDescribe ( "Upgrade [Feature:Upgrade]" , func ( ) {
2016-04-06 22:12:31 +00:00
f := framework . NewDefaultFramework ( "cluster-upgrade" )
2017-03-01 18:56:00 +00:00
// Create the frameworks here because we can only create them
// in a "Describe".
2017-08-08 17:50:38 +00:00
testFrameworks := createUpgradeFrameworks ( upgradeTests )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "master upgrade" , func ( ) {
ginkgo . It ( "should maintain a functioning cluster [Feature:MasterUpgrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( err )
2017-05-16 16:50:14 +00:00
testSuite := & junit . TestSuite { Name : "Master upgrade" }
2017-07-18 20:04:46 +00:00
masterUpgradeTest := & junit . TestCase {
Name : "[sig-cluster-lifecycle] master-upgrade" ,
Classname : "upgrade_tests" ,
}
2017-05-16 16:50:14 +00:00
testSuite . TestCases = append ( testSuite . TestCases , masterUpgradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , masterUpgradeTest )
2017-03-15 21:58:37 +00:00
target := upgCtx . Versions [ 1 ] . Version . String ( )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( framework . MasterUpgrade ( target ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2017-01-23 22:44:28 +00:00
}
2017-08-08 17:50:38 +00:00
runUpgradeSuite ( f , upgradeTests , testFrameworks , testSuite , upgCtx , upgrades . MasterUpgrade , upgradeFunc )
2016-04-06 22:12:31 +00:00
} )
} )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "node upgrade" , func ( ) {
ginkgo . It ( "should maintain a functioning cluster [Feature:NodeUpgrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( err )
2017-05-16 16:50:14 +00:00
testSuite := & junit . TestSuite { Name : "Node upgrade" }
2017-07-18 20:04:46 +00:00
nodeUpgradeTest := & junit . TestCase {
Name : "node-upgrade" ,
Classname : "upgrade_tests" ,
}
2017-05-16 16:50:14 +00:00
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , nodeUpgradeTest )
2017-03-15 21:58:37 +00:00
target := upgCtx . Versions [ 1 ] . Version . String ( )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgrade ( f , target , * upgradeImage ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2017-01-23 22:44:28 +00:00
}
2017-08-08 17:50:38 +00:00
runUpgradeSuite ( f , upgradeTests , testFrameworks , testSuite , upgCtx , upgrades . NodeUpgrade , upgradeFunc )
2016-04-06 22:12:31 +00:00
} )
} )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "cluster upgrade" , func ( ) {
ginkgo . It ( "should maintain a functioning cluster [Feature:ClusterUpgrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( err )
2017-05-16 16:50:14 +00:00
testSuite := & junit . TestSuite { Name : "Cluster upgrade" }
2017-07-18 20:04:46 +00:00
clusterUpgradeTest := & junit . TestCase { Name : "[sig-cluster-lifecycle] cluster-upgrade" , Classname : "upgrade_tests" }
2017-05-16 16:50:14 +00:00
testSuite . TestCases = append ( testSuite . TestCases , clusterUpgradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , clusterUpgradeTest )
2017-03-15 21:58:37 +00:00
target := upgCtx . Versions [ 1 ] . Version . String ( )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( framework . MasterUpgrade ( target ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgrade ( f , target , * upgradeImage ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2017-01-23 22:44:28 +00:00
}
2017-08-08 17:50:38 +00:00
runUpgradeSuite ( f , upgradeTests , testFrameworks , testSuite , upgCtx , upgrades . ClusterUpgrade , upgradeFunc )
2016-04-06 22:12:31 +00:00
} )
} )
} )
2017-07-18 20:04:46 +00:00
var _ = SIGDescribe ( "Downgrade [Feature:Downgrade]" , func ( ) {
2017-03-08 22:13:07 +00:00
f := framework . NewDefaultFramework ( "cluster-downgrade" )
// Create the frameworks here because we can only create them
// in a "Describe".
2017-08-08 17:50:38 +00:00
testFrameworks := createUpgradeFrameworks ( upgradeTests )
2017-03-08 22:13:07 +00:00
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "cluster downgrade" , func ( ) {
ginkgo . It ( "should maintain a functioning cluster [Feature:ClusterDowngrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( err )
2017-05-16 16:50:14 +00:00
testSuite := & junit . TestSuite { Name : "Cluster downgrade" }
2017-07-18 20:04:46 +00:00
clusterDowngradeTest := & junit . TestCase { Name : "[sig-cluster-lifecycle] cluster-downgrade" , Classname : "upgrade_tests" }
2017-05-16 16:50:14 +00:00
testSuite . TestCases = append ( testSuite . TestCases , clusterDowngradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , clusterDowngradeTest )
2017-03-08 22:13:07 +00:00
// Yes this really is a downgrade. And nodes must downgrade first.
2017-03-15 21:58:37 +00:00
target := upgCtx . Versions [ 1 ] . Version . String ( )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgrade ( f , target , * upgradeImage ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( framework . MasterUpgrade ( target ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2017-03-08 22:13:07 +00:00
}
2017-08-08 17:50:38 +00:00
runUpgradeSuite ( f , upgradeTests , testFrameworks , testSuite , upgCtx , upgrades . ClusterUpgrade , upgradeFunc )
2017-03-08 22:13:07 +00:00
} )
} )
} )
2017-07-18 20:04:46 +00:00
var _ = SIGDescribe ( "etcd Upgrade [Feature:EtcdUpgrade]" , func ( ) {
2017-03-14 18:11:28 +00:00
f := framework . NewDefaultFramework ( "etc-upgrade" )
2017-03-01 18:56:00 +00:00
// Create the frameworks here because we can only create them
// in a "Describe".
2017-08-08 17:50:38 +00:00
testFrameworks := createUpgradeFrameworks ( upgradeTests )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "etcd upgrade" , func ( ) {
ginkgo . It ( "should maintain a functioning cluster" , func ( ) {
2017-03-15 21:58:37 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , "" )
2017-03-14 18:11:28 +00:00
framework . ExpectNoError ( err )
2017-05-16 16:50:14 +00:00
testSuite := & junit . TestSuite { Name : "Etcd upgrade" }
2017-07-18 20:04:46 +00:00
etcdTest := & junit . TestCase { Name : "[sig-cluster-lifecycle] etcd-upgrade" , Classname : "upgrade_tests" }
2017-05-16 16:50:14 +00:00
testSuite . TestCases = append ( testSuite . TestCases , etcdTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , etcdTest )
2017-02-22 22:30:27 +00:00
framework . ExpectNoError ( framework . EtcdUpgrade ( framework . TestContext . EtcdUpgradeStorage , framework . TestContext . EtcdUpgradeVersion ) )
}
2017-08-08 17:50:38 +00:00
runUpgradeSuite ( f , upgradeTests , testFrameworks , testSuite , upgCtx , upgrades . EtcdUpgrade , upgradeFunc )
} )
} )
} )
2018-05-04 00:33:01 +00:00
var _ = SIGDescribe ( "gpu Upgrade [Feature:GPUUpgrade]" , func ( ) {
f := framework . NewDefaultFramework ( "gpu-upgrade" )
// Create the frameworks here because we can only create them
// in a "Describe".
testFrameworks := createUpgradeFrameworks ( gpuUpgradeTests )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "master upgrade" , func ( ) {
ginkgo . It ( "should NOT disrupt gpu pod [Feature:GPUMasterUpgrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2018-05-04 00:33:01 +00:00
framework . ExpectNoError ( err )
testSuite := & junit . TestSuite { Name : "GPU master upgrade" }
gpuUpgradeTest := & junit . TestCase { Name : "[sig-node] gpu-master-upgrade" , Classname : "upgrade_tests" }
testSuite . TestCases = append ( testSuite . TestCases , gpuUpgradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , gpuUpgradeTest )
target := upgCtx . Versions [ 1 ] . Version . String ( )
framework . ExpectNoError ( framework . MasterUpgrade ( target ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2018-05-04 00:33:01 +00:00
}
runUpgradeSuite ( f , gpuUpgradeTests , testFrameworks , testSuite , upgCtx , upgrades . MasterUpgrade , upgradeFunc )
} )
} )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "cluster upgrade" , func ( ) {
ginkgo . It ( "should be able to run gpu pod after upgrade [Feature:GPUClusterUpgrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2018-05-04 00:33:01 +00:00
framework . ExpectNoError ( err )
testSuite := & junit . TestSuite { Name : "GPU cluster upgrade" }
gpuUpgradeTest := & junit . TestCase { Name : "[sig-node] gpu-cluster-upgrade" , Classname : "upgrade_tests" }
testSuite . TestCases = append ( testSuite . TestCases , gpuUpgradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , gpuUpgradeTest )
target := upgCtx . Versions [ 1 ] . Version . String ( )
framework . ExpectNoError ( framework . MasterUpgrade ( target ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgrade ( f , target , * upgradeImage ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2018-05-04 00:33:01 +00:00
}
runUpgradeSuite ( f , gpuUpgradeTests , testFrameworks , testSuite , upgCtx , upgrades . ClusterUpgrade , upgradeFunc )
} )
} )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "cluster downgrade" , func ( ) {
ginkgo . It ( "should be able to run gpu pod after downgrade [Feature:GPUClusterDowngrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2018-06-20 23:28:55 +00:00
framework . ExpectNoError ( err )
testSuite := & junit . TestSuite { Name : "GPU cluster downgrade" }
gpuDowngradeTest := & junit . TestCase { Name : "[sig-node] gpu-cluster-downgrade" , Classname : "upgrade_tests" }
testSuite . TestCases = append ( testSuite . TestCases , gpuDowngradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , gpuDowngradeTest )
target := upgCtx . Versions [ 1 ] . Version . String ( )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgrade ( f , target , * upgradeImage ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2018-06-20 23:28:55 +00:00
framework . ExpectNoError ( framework . MasterUpgrade ( target ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2018-06-20 23:28:55 +00:00
}
runUpgradeSuite ( f , gpuUpgradeTests , testFrameworks , testSuite , upgCtx , upgrades . ClusterUpgrade , upgradeFunc )
} )
} )
2018-05-04 00:33:01 +00:00
} )
2019-04-25 15:40:22 +00:00
var _ = ginkgo . Describe ( "[sig-apps] stateful Upgrade [Feature:StatefulUpgrade]" , func ( ) {
2017-08-08 17:50:38 +00:00
f := framework . NewDefaultFramework ( "stateful-upgrade" )
// Create the frameworks here because we can only create them
// in a "Describe".
testFrameworks := createUpgradeFrameworks ( statefulsetUpgradeTests )
framework . KubeDescribe ( "stateful upgrade" , func ( ) {
2019-04-25 15:40:22 +00:00
ginkgo . It ( "should maintain a functioning cluster" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-08-08 17:50:38 +00:00
framework . ExpectNoError ( err )
testSuite := & junit . TestSuite { Name : "Stateful upgrade" }
statefulUpgradeTest := & junit . TestCase { Name : "[sig-apps] stateful-upgrade" , Classname : "upgrade_tests" }
testSuite . TestCases = append ( testSuite . TestCases , statefulUpgradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , statefulUpgradeTest )
target := upgCtx . Versions [ 1 ] . Version . String ( )
framework . ExpectNoError ( framework . MasterUpgrade ( target ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgrade ( f , target , * upgradeImage ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2017-08-08 17:50:38 +00:00
}
runUpgradeSuite ( f , statefulsetUpgradeTests , testFrameworks , testSuite , upgCtx , upgrades . ClusterUpgrade , upgradeFunc )
2017-02-22 22:30:27 +00:00
} )
} )
} )
2017-08-18 23:17:24 +00:00
var _ = SIGDescribe ( "kube-proxy migration [Feature:KubeProxyDaemonSetMigration]" , func ( ) {
f := framework . NewDefaultFramework ( "kube-proxy-ds-migration" )
2019-04-25 15:40:22 +00:00
ginkgo . BeforeEach ( func ( ) {
2017-08-18 23:17:24 +00:00
framework . SkipUnlessProviderIs ( "gce" )
} )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "Upgrade kube-proxy from static pods to a DaemonSet" , func ( ) {
2017-09-01 23:03:55 +00:00
testFrameworks := createUpgradeFrameworks ( kubeProxyUpgradeTests )
2019-04-25 15:40:22 +00:00
ginkgo . It ( "should maintain a functioning cluster [Feature:KubeProxyDaemonSetUpgrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-08-18 23:17:24 +00:00
framework . ExpectNoError ( err )
testSuite := & junit . TestSuite { Name : "kube-proxy upgrade" }
kubeProxyUpgradeTest := & junit . TestCase {
Name : "kube-proxy-ds-upgrade" ,
Classname : "upgrade_tests" ,
}
testSuite . TestCases = append ( testSuite . TestCases , kubeProxyUpgradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , kubeProxyUpgradeTest )
target := upgCtx . Versions [ 1 ] . Version . String ( )
framework . ExpectNoError ( framework . MasterUpgradeGCEWithKubeProxyDaemonSet ( target , true ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgradeGCEWithKubeProxyDaemonSet ( f , target , * upgradeImage , true ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2017-08-18 23:17:24 +00:00
}
2017-09-01 23:03:55 +00:00
runUpgradeSuite ( f , kubeProxyUpgradeTests , testFrameworks , testSuite , upgCtx , upgrades . ClusterUpgrade , upgradeFunc )
2017-08-18 23:17:24 +00:00
} )
} )
2019-04-25 15:40:22 +00:00
ginkgo . Describe ( "Downgrade kube-proxy from a DaemonSet to static pods" , func ( ) {
2017-09-01 23:03:55 +00:00
testFrameworks := createUpgradeFrameworks ( kubeProxyDowngradeTests )
2019-04-25 15:40:22 +00:00
ginkgo . It ( "should maintain a functioning cluster [Feature:KubeProxyDaemonSetDowngrade]" , func ( ) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-08-18 23:17:24 +00:00
framework . ExpectNoError ( err )
testSuite := & junit . TestSuite { Name : "kube-proxy downgrade" }
kubeProxyDowngradeTest := & junit . TestCase {
Name : "kube-proxy-ds-downgrade" ,
Classname : "upgrade_tests" ,
}
testSuite . TestCases = append ( testSuite . TestCases , kubeProxyDowngradeTest )
upgradeFunc := func ( ) {
start := time . Now ( )
defer finalizeUpgradeTest ( start , kubeProxyDowngradeTest )
// Yes this really is a downgrade. And nodes must downgrade first.
target := upgCtx . Versions [ 1 ] . Version . String ( )
2018-07-27 15:29:00 +00:00
framework . ExpectNoError ( framework . NodeUpgradeGCEWithKubeProxyDaemonSet ( f , target , * upgradeImage , false ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckNodesVersions ( f . ClientSet , target ) )
2017-08-18 23:17:24 +00:00
framework . ExpectNoError ( framework . MasterUpgradeGCEWithKubeProxyDaemonSet ( target , false ) )
2019-04-24 16:18:04 +00:00
framework . ExpectNoError ( e2elifecycle . CheckMasterVersion ( f . ClientSet , target ) )
2017-08-18 23:17:24 +00:00
}
2017-09-01 23:03:55 +00:00
runUpgradeSuite ( f , kubeProxyDowngradeTests , testFrameworks , testSuite , upgCtx , upgrades . ClusterUpgrade , upgradeFunc )
2017-08-18 23:17:24 +00:00
} )
} )
} )
2017-01-23 22:44:28 +00:00
type chaosMonkeyAdapter struct {
test upgrades . Test
2017-05-16 16:50:14 +00:00
testReport * junit . TestCase
2017-01-23 22:44:28 +00:00
framework * framework . Framework
upgradeType upgrades . UpgradeType
2017-03-15 21:58:37 +00:00
upgCtx upgrades . UpgradeContext
2017-01-23 22:44:28 +00:00
}
2017-03-14 18:11:28 +00:00
func ( cma * chaosMonkeyAdapter ) Test ( sem * chaosmonkey . Semaphore ) {
2017-05-16 16:50:14 +00:00
start := time . Now ( )
2019-03-15 01:59:44 +00:00
var once sync . Once
2017-05-16 16:50:14 +00:00
ready := func ( ) {
2019-03-15 01:59:44 +00:00
once . Do ( func ( ) {
2017-05-16 16:50:14 +00:00
sem . Ready ( )
2019-03-15 01:59:44 +00:00
} )
2017-05-16 16:50:14 +00:00
}
defer finalizeUpgradeTest ( start , cma . testReport )
defer ready ( )
2017-03-15 21:58:37 +00:00
if skippable , ok := cma . test . ( upgrades . Skippable ) ; ok && skippable . Skip ( cma . upgCtx ) {
2019-04-25 15:40:22 +00:00
ginkgo . By ( "skipping test " + cma . test . Name ( ) )
2017-05-16 16:50:14 +00:00
cma . testReport . Skipped = "skipping test " + cma . test . Name ( )
2017-03-14 18:11:28 +00:00
return
}
2017-01-23 22:44:28 +00:00
2017-03-14 18:11:28 +00:00
defer cma . test . Teardown ( cma . framework )
2017-04-05 18:00:42 +00:00
cma . test . Setup ( cma . framework )
2017-05-16 16:50:14 +00:00
ready ( )
2017-03-14 18:11:28 +00:00
cma . test . Test ( cma . framework , sem . StopCh , cma . upgradeType )
2017-01-23 22:44:28 +00:00
}
2017-05-16 16:50:14 +00:00
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 ) ,
} ,
}
}
}
2017-08-08 17:50:38 +00:00
func createUpgradeFrameworks ( tests [ ] upgrades . Test ) map [ string ] * framework . Framework {
2017-07-17 17:45:05 +00:00
nsFilter := regexp . MustCompile ( "[^[:word:]-]+" ) // match anything that's not a word character or hyphen
2017-05-16 16:50:14 +00:00
testFrameworks := map [ string ] * framework . Framework { }
2017-08-08 17:50:38 +00:00
for _ , t := range tests {
2017-07-17 17:45:05 +00:00
ns := nsFilter . ReplaceAllString ( t . Name ( ) , "-" ) // and replace with a single hyphen
ns = strings . Trim ( ns , "-" )
testFrameworks [ t . Name ( ) ] = framework . NewDefaultFramework ( ns )
2017-05-16 16:50:14 +00:00
}
return testFrameworks
}
func runUpgradeSuite (
f * framework . Framework ,
2017-08-08 17:50:38 +00:00
tests [ ] upgrades . Test ,
2017-05-16 16:50:14 +00:00
testFrameworks map [ string ] * framework . Framework ,
testSuite * junit . TestSuite ,
upgCtx * upgrades . UpgradeContext ,
upgradeType upgrades . UpgradeType ,
upgradeFunc func ( ) ,
) {
2018-07-27 15:29:00 +00:00
upgCtx , err := getUpgradeContext ( f . ClientSet . Discovery ( ) , * upgradeTarget )
2017-05-16 16:50:14 +00:00
framework . ExpectNoError ( err )
cm := chaosmonkey . New ( upgradeFunc )
2017-08-08 17:50:38 +00:00
for _ , t := range tests {
2017-05-16 16:50:14 +00:00
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 ( )
}
2017-03-15 21:58:37 +00:00
func getUpgradeContext ( c discovery . DiscoveryInterface , upgradeTarget string ) ( * upgrades . UpgradeContext , error ) {
current , err := c . ServerVersion ( )
if err != nil {
return nil , err
}
curVer , err := version . ParseSemantic ( current . String ( ) )
if err != nil {
return nil , err
}
upgCtx := & upgrades . UpgradeContext {
Versions : [ ] upgrades . VersionContext {
{
Version : * curVer ,
NodeImage : framework . TestContext . NodeOSDistro ,
} ,
} ,
}
if len ( upgradeTarget ) == 0 {
return upgCtx , nil
2017-03-14 18:11:28 +00:00
}
2017-03-15 21:58:37 +00:00
2019-04-24 16:18:04 +00:00
next , err := e2elifecycle . RealVersion ( upgradeTarget )
2017-03-15 21:58:37 +00:00
if err != nil {
return nil , err
}
nextVer , err := version . ParseSemantic ( next )
if err != nil {
return nil , err
}
upgCtx . Versions = append ( upgCtx . Versions , upgrades . VersionContext {
Version : * nextVer ,
2018-07-27 15:29:00 +00:00
NodeImage : * upgradeImage ,
2017-03-15 21:58:37 +00:00
} )
return upgCtx , nil
2017-01-23 22:44:28 +00:00
}