@@ -131,7 +131,7 @@ var _ = SIGDescribe("Upgrade [Feature:Upgrade]", func() {
131
131
start := time .Now ()
132
132
defer finalizeUpgradeTest (start , nodeUpgradeTest )
133
133
target := upgCtx .Versions [1 ].Version .String ()
134
- framework .ExpectNoError (framework . NodeUpgrade (f , target , * upgradeImage ))
134
+ framework .ExpectNoError (nodeUpgrade (f , target , * upgradeImage ))
135
135
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
136
136
}
137
137
runUpgradeSuite (f , upgradeTests , testFrameworks , testSuite , upgrades .NodeUpgrade , upgradeFunc )
@@ -152,7 +152,7 @@ var _ = SIGDescribe("Upgrade [Feature:Upgrade]", func() {
152
152
target := upgCtx .Versions [1 ].Version .String ()
153
153
framework .ExpectNoError (framework .MasterUpgrade (f , target ))
154
154
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
155
- framework .ExpectNoError (framework . NodeUpgrade (f , target , * upgradeImage ))
155
+ framework .ExpectNoError (nodeUpgrade (f , target , * upgradeImage ))
156
156
framework .ExpectNoError (checkNodesVersions (f .ClientSet , target ))
157
157
}
158
158
runUpgradeSuite (f , upgradeTests , testFrameworks , testSuite , upgrades .ClusterUpgrade , upgradeFunc )
@@ -181,7 +181,7 @@ var _ = SIGDescribe("Downgrade [Feature:Downgrade]", func() {
181
181
defer finalizeUpgradeTest (start , clusterDowngradeTest )
182
182
// Yes this really is a downgrade. And nodes must downgrade first.
183
183
target := upgCtx .Versions [1 ].Version .String ()
184
- framework .ExpectNoError (framework . NodeUpgrade (f , target , * upgradeImage ))
184
+ framework .ExpectNoError (nodeUpgrade (f , target , * upgradeImage ))
185
185
framework .ExpectNoError (checkNodesVersions (f .ClientSet , target ))
186
186
framework .ExpectNoError (framework .MasterUpgrade (f , target ))
187
187
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
@@ -251,7 +251,7 @@ var _ = SIGDescribe("gpu Upgrade [Feature:GPUUpgrade]", func() {
251
251
target := upgCtx .Versions [1 ].Version .String ()
252
252
framework .ExpectNoError (framework .MasterUpgrade (f , target ))
253
253
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
254
- framework .ExpectNoError (framework . NodeUpgrade (f , target , * upgradeImage ))
254
+ framework .ExpectNoError (nodeUpgrade (f , target , * upgradeImage ))
255
255
framework .ExpectNoError (checkNodesVersions (f .ClientSet , target ))
256
256
}
257
257
runUpgradeSuite (f , gpuUpgradeTests , testFrameworks , testSuite , upgrades .ClusterUpgrade , upgradeFunc )
@@ -269,7 +269,7 @@ var _ = SIGDescribe("gpu Upgrade [Feature:GPUUpgrade]", func() {
269
269
start := time .Now ()
270
270
defer finalizeUpgradeTest (start , gpuDowngradeTest )
271
271
target := upgCtx .Versions [1 ].Version .String ()
272
- framework .ExpectNoError (framework . NodeUpgrade (f , target , * upgradeImage ))
272
+ framework .ExpectNoError (nodeUpgrade (f , target , * upgradeImage ))
273
273
framework .ExpectNoError (checkNodesVersions (f .ClientSet , target ))
274
274
framework .ExpectNoError (framework .MasterUpgrade (f , target ))
275
275
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
@@ -299,7 +299,7 @@ var _ = ginkgo.Describe("[sig-apps] stateful Upgrade [Feature:StatefulUpgrade]",
299
299
target := upgCtx .Versions [1 ].Version .String ()
300
300
framework .ExpectNoError (framework .MasterUpgrade (f , target ))
301
301
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
302
- framework .ExpectNoError (framework . NodeUpgrade (f , target , * upgradeImage ))
302
+ framework .ExpectNoError (nodeUpgrade (f , target , * upgradeImage ))
303
303
framework .ExpectNoError (checkNodesVersions (f .ClientSet , target ))
304
304
}
305
305
runUpgradeSuite (f , statefulsetUpgradeTests , testFrameworks , testSuite , upgrades .ClusterUpgrade , upgradeFunc )
@@ -334,7 +334,7 @@ var _ = SIGDescribe("kube-proxy migration [Feature:KubeProxyDaemonSetMigration]"
334
334
target := upgCtx .Versions [1 ].Version .String ()
335
335
framework .ExpectNoError (framework .MasterUpgradeGCEWithKubeProxyDaemonSet (target , true ))
336
336
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
337
- framework .ExpectNoError (framework . NodeUpgradeGCEWithKubeProxyDaemonSet (f , target , * upgradeImage , true ))
337
+ framework .ExpectNoError (nodeUpgradeGCEWithKubeProxyDaemonSet (f , target , * upgradeImage , true ))
338
338
framework .ExpectNoError (checkNodesVersions (f .ClientSet , target ))
339
339
}
340
340
runUpgradeSuite (f , kubeProxyUpgradeTests , testFrameworks , testSuite , upgrades .ClusterUpgrade , upgradeFunc )
@@ -360,7 +360,7 @@ var _ = SIGDescribe("kube-proxy migration [Feature:KubeProxyDaemonSetMigration]"
360
360
defer finalizeUpgradeTest (start , kubeProxyDowngradeTest )
361
361
// Yes this really is a downgrade. And nodes must downgrade first.
362
362
target := upgCtx .Versions [1 ].Version .String ()
363
- framework .ExpectNoError (framework . NodeUpgradeGCEWithKubeProxyDaemonSet (f , target , * upgradeImage , false ))
363
+ framework .ExpectNoError (nodeUpgradeGCEWithKubeProxyDaemonSet (f , target , * upgradeImage , false ))
364
364
framework .ExpectNoError (checkNodesVersions (f .ClientSet , target ))
365
365
framework .ExpectNoError (framework .MasterUpgradeGCEWithKubeProxyDaemonSet (target , false ))
366
366
framework .ExpectNoError (checkMasterVersion (f .ClientSet , target ))
@@ -605,3 +605,113 @@ func checkNodesVersions(cs clientset.Interface, want string) error {
605
605
}
606
606
return nil
607
607
}
608
+
609
+ // nodeUpgrade upgrades nodes on GCE/GKE.
610
+ func nodeUpgrade (f * framework.Framework , v string , img string ) error {
611
+ // Perform the upgrade.
612
+ var err error
613
+ switch framework .TestContext .Provider {
614
+ case "gce" :
615
+ err = nodeUpgradeGCE (v , img , false )
616
+ case "gke" :
617
+ err = nodeUpgradeGKE (f .Namespace .Name , v , img )
618
+ default :
619
+ err = fmt .Errorf ("nodeUpgrade() is not implemented for provider %s" , framework .TestContext .Provider )
620
+ }
621
+ if err != nil {
622
+ return err
623
+ }
624
+ return waitForNodesReadyAfterUpgrade (f )
625
+ }
626
+
627
+ // nodeUpgradeGCEWithKubeProxyDaemonSet upgrades nodes on GCE with enabling/disabling the daemon set of kube-proxy.
628
+ // TODO(mrhohn): Remove this function when kube-proxy is run as a DaemonSet by default.
629
+ func nodeUpgradeGCEWithKubeProxyDaemonSet (f * framework.Framework , v string , img string , enableKubeProxyDaemonSet bool ) error {
630
+ // Perform the upgrade.
631
+ if err := nodeUpgradeGCE (v , img , enableKubeProxyDaemonSet ); err != nil {
632
+ return err
633
+ }
634
+ return waitForNodesReadyAfterUpgrade (f )
635
+ }
636
+
637
+ // TODO(mrhohn): Remove 'enableKubeProxyDaemonSet' when kube-proxy is run as a DaemonSet by default.
638
+ func nodeUpgradeGCE (rawV , img string , enableKubeProxyDaemonSet bool ) error {
639
+ v := "v" + rawV
640
+ env := append (os .Environ (), fmt .Sprintf ("KUBE_PROXY_DAEMONSET=%v" , enableKubeProxyDaemonSet ))
641
+ if img != "" {
642
+ env = append (env , "KUBE_NODE_OS_DISTRIBUTION=" + img )
643
+ _ , _ , err := framework .RunCmdEnv (env , framework .GCEUpgradeScript (), "-N" , "-o" , v )
644
+ return err
645
+ }
646
+ _ , _ , err := framework .RunCmdEnv (env , framework .GCEUpgradeScript (), "-N" , v )
647
+ return err
648
+ }
649
+
650
+ func nodeUpgradeGKE (namespace string , v string , img string ) error {
651
+ framework .Logf ("Upgrading nodes to version %q and image %q" , v , img )
652
+ nps , err := nodePoolsGKE ()
653
+ if err != nil {
654
+ return err
655
+ }
656
+ framework .Logf ("Found node pools %v" , nps )
657
+ for _ , np := range nps {
658
+ args := []string {
659
+ "container" ,
660
+ "clusters" ,
661
+ fmt .Sprintf ("--project=%s" , framework .TestContext .CloudConfig .ProjectID ),
662
+ framework .LocationParamGKE (),
663
+ "upgrade" ,
664
+ framework .TestContext .CloudConfig .Cluster ,
665
+ fmt .Sprintf ("--node-pool=%s" , np ),
666
+ fmt .Sprintf ("--cluster-version=%s" , v ),
667
+ "--quiet" ,
668
+ }
669
+ if len (img ) > 0 {
670
+ args = append (args , fmt .Sprintf ("--image-type=%s" , img ))
671
+ }
672
+ _ , _ , err = framework .RunCmd ("gcloud" , framework .AppendContainerCommandGroupIfNeeded (args )... )
673
+
674
+ if err != nil {
675
+ return err
676
+ }
677
+
678
+ framework .WaitForSSHTunnels (namespace )
679
+ }
680
+ return nil
681
+ }
682
+
683
+ func nodePoolsGKE () ([]string , error ) {
684
+ args := []string {
685
+ "container" ,
686
+ "node-pools" ,
687
+ fmt .Sprintf ("--project=%s" , framework .TestContext .CloudConfig .ProjectID ),
688
+ framework .LocationParamGKE (),
689
+ "list" ,
690
+ fmt .Sprintf ("--cluster=%s" , framework .TestContext .CloudConfig .Cluster ),
691
+ "--format=get(name)" ,
692
+ }
693
+ stdout , _ , err := framework .RunCmd ("gcloud" , framework .AppendContainerCommandGroupIfNeeded (args )... )
694
+ if err != nil {
695
+ return nil , err
696
+ }
697
+ if len (strings .TrimSpace (stdout )) == 0 {
698
+ return []string {}, nil
699
+ }
700
+ return strings .Fields (stdout ), nil
701
+ }
702
+
703
+ func waitForNodesReadyAfterUpgrade (f * framework.Framework ) error {
704
+ // Wait for it to complete and validate nodes are healthy.
705
+ //
706
+ // TODO(ihmccreery) We shouldn't have to wait for nodes to be ready in
707
+ // GKE; the operation shouldn't return until they all are.
708
+ numNodes , err := e2enode .TotalRegistered (f .ClientSet )
709
+ if err != nil {
710
+ return fmt .Errorf ("couldn't detect number of nodes" )
711
+ }
712
+ framework .Logf ("Waiting up to %v for all %d nodes to be ready after the upgrade" , framework .RestartNodeReadyAgainTimeout , numNodes )
713
+ if _ , err := e2enode .CheckReady (f .ClientSet , numNodes , framework .RestartNodeReadyAgainTimeout ); err != nil {
714
+ return err
715
+ }
716
+ return nil
717
+ }
0 commit comments