Properly exit CTS on signals

This kills the loops when the global context is cancelled ensuring reliable termination
of the CTS with Ctrl+C or a signal.

Test Plan: Manually tested by aborting the CTS with Ctrl+C

X-Origin-Diff: phab/D673
GitOrigin-RevId: a2f367cd4a7a57bb573bd57656148681add048a2
diff --git a/metropolis/test/e2e/k8s_cts/main.go b/metropolis/test/e2e/k8s_cts/main.go
index 8ee63be..2c5a19e 100644
--- a/metropolis/test/e2e/k8s_cts/main.go
+++ b/metropolis/test/e2e/k8s_cts/main.go
@@ -88,7 +88,8 @@
 	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
 	ctx, cancel := context.WithCancel(context.Background())
 	go func() {
-		<-sigs
+		sig := <-sigs
+		log.Printf("Got signal %s, aborting test", sig)
 		cancel()
 	}()
 
@@ -97,7 +98,6 @@
 		log.Fatalf("Failed to launch cluster: %v", err)
 	}
 	log.Println("Cluster initialized")
-
 	clientSet, err := e2e.GetKubeClientSet(ctx, debugClient, portMap[common.KubernetesAPIPort])
 	if err != nil {
 		log.Fatalf("Failed to get clientSet: %v", err)
@@ -152,6 +152,8 @@
 					log.Printf("Log pump error: %v", err)
 				}
 				logs.Close()
+			} else if err == ctx.Err() {
+				return // Exit if the context has been cancelled
 			} else {
 				log.Printf("Pod logs not ready yet: %v", err)
 			}
@@ -161,7 +163,9 @@
 	for {
 		time.Sleep(1 * time.Second)
 		pod, err := clientSet.CoreV1().Pods("default").Get(ctx, podName, metav1.GetOptions{})
-		if err != nil {
+		if err != nil && err == ctx.Err() {
+			return // Exit if the context has been cancelled
+		} else if err != nil {
 			log.Printf("Failed to get CTS pod: %v", err)
 			continue
 		}