@@ -84,6 +84,9 @@ const (
84
84
// AffinityConfirmCount is the number of needed continuous requests to confirm that
85
85
// affinity is enabled.
86
86
AffinityConfirmCount = 15
87
+
88
+ // ssh port
89
+ sshPort = "22"
87
90
)
88
91
89
92
var (
@@ -1107,7 +1110,7 @@ var _ = SIGDescribe("Services", func() {
1107
1110
1108
1111
// Restart apiserver
1109
1112
ginkgo .By ("Restarting apiserver" )
1110
- if err := framework . RestartApiserver (ns , cs ); err != nil {
1113
+ if err := restartApiserver (ns , cs ); err != nil {
1111
1114
framework .Failf ("error restarting apiserver: %v" , err )
1112
1115
}
1113
1116
ginkgo .By ("Waiting for apiserver to come up by polling /healthz" )
@@ -3431,3 +3434,83 @@ func validateEndpointsPorts(c clientset.Interface, namespace, serviceName string
3431
3434
}
3432
3435
return fmt .Errorf ("Timed out waiting for service %s in namespace %s to expose endpoints %v (%v elapsed)" , serviceName , namespace , expectedEndpoints , framework .ServiceStartTimeout )
3433
3436
}
3437
+
3438
+ // restartApiserver restarts the kube-apiserver.
3439
+ func restartApiserver (namespace string , cs clientset.Interface ) error {
3440
+ // TODO: Make it work for all providers.
3441
+ if ! framework .ProviderIs ("gce" , "gke" , "aws" ) {
3442
+ return fmt .Errorf ("unsupported provider for RestartApiserver: %s" , framework .TestContext .Provider )
3443
+ }
3444
+ if framework .ProviderIs ("gce" , "aws" ) {
3445
+ initialRestartCount , err := getApiserverRestartCount (cs )
3446
+ if err != nil {
3447
+ return fmt .Errorf ("failed to get apiserver's restart count: %v" , err )
3448
+ }
3449
+ if err := sshRestartMaster (); err != nil {
3450
+ return fmt .Errorf ("failed to restart apiserver: %v" , err )
3451
+ }
3452
+ return waitForApiserverRestarted (cs , initialRestartCount )
3453
+ }
3454
+ // GKE doesn't allow ssh access, so use a same-version master
3455
+ // upgrade to teardown/recreate master.
3456
+ v , err := cs .Discovery ().ServerVersion ()
3457
+ if err != nil {
3458
+ return err
3459
+ }
3460
+ return framework .MasterUpgradeGKE (namespace , v .GitVersion [1 :]) // strip leading 'v'
3461
+ }
3462
+
3463
+ func sshRestartMaster () error {
3464
+ if ! framework .ProviderIs ("gce" , "aws" ) {
3465
+ return fmt .Errorf ("unsupported provider for sshRestartMaster: %s" , framework .TestContext .Provider )
3466
+ }
3467
+ var command string
3468
+ if framework .ProviderIs ("gce" ) {
3469
+ command = "pidof kube-apiserver | xargs sudo kill"
3470
+ } else {
3471
+ command = "sudo /etc/init.d/kube-apiserver restart"
3472
+ }
3473
+ framework .Logf ("Restarting master via ssh, running: %v" , command )
3474
+ result , err := e2essh .SSH (command , net .JoinHostPort (framework .GetMasterHost (), sshPort ), framework .TestContext .Provider )
3475
+ if err != nil || result .Code != 0 {
3476
+ e2essh .LogResult (result )
3477
+ return fmt .Errorf ("couldn't restart apiserver: %v" , err )
3478
+ }
3479
+ return nil
3480
+ }
3481
+
3482
+ // waitForApiserverRestarted waits until apiserver's restart count increased.
3483
+ func waitForApiserverRestarted (c clientset.Interface , initialRestartCount int32 ) error {
3484
+ for start := time .Now (); time .Since (start ) < time .Minute ; time .Sleep (5 * time .Second ) {
3485
+ restartCount , err := getApiserverRestartCount (c )
3486
+ if err != nil {
3487
+ framework .Logf ("Failed to get apiserver's restart count: %v" , err )
3488
+ continue
3489
+ }
3490
+ if restartCount > initialRestartCount {
3491
+ framework .Logf ("Apiserver has restarted." )
3492
+ return nil
3493
+ }
3494
+ framework .Logf ("Waiting for apiserver restart count to increase" )
3495
+ }
3496
+ return fmt .Errorf ("timed out waiting for apiserver to be restarted" )
3497
+ }
3498
+
3499
+ func getApiserverRestartCount (c clientset.Interface ) (int32 , error ) {
3500
+ label := labels .SelectorFromSet (labels .Set (map [string ]string {"component" : "kube-apiserver" }))
3501
+ listOpts := metav1.ListOptions {LabelSelector : label .String ()}
3502
+ pods , err := c .CoreV1 ().Pods (metav1 .NamespaceSystem ).List (context .TODO (), listOpts )
3503
+ if err != nil {
3504
+ return - 1 , err
3505
+ }
3506
+ if len (pods .Items ) != 1 {
3507
+ return - 1 , fmt .Errorf ("unexpected number of apiserver pod: %d" , len (pods .Items ))
3508
+ }
3509
+ for _ , s := range pods .Items [0 ].Status .ContainerStatuses {
3510
+ if s .Name != "kube-apiserver" {
3511
+ continue
3512
+ }
3513
+ return s .RestartCount , nil
3514
+ }
3515
+ return - 1 , fmt .Errorf ("Failed to find kube-apiserver container in pod" )
3516
+ }
0 commit comments