buildlet: add DestroyVM method to Client

And use it in gomote and release tools.

Change-Id: I87fa013d6d6729e7305dacd137be1b3d3b02f5f4
Reviewed-on: https://go-review.googlesource.com/3771
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/cmd/release/release.go b/cmd/release/release.go
index 82599f2..6a5aad1 100644
--- a/cmd/release/release.go
+++ b/cmd/release/release.go
@@ -108,7 +108,10 @@
 
 	defer func() {
 		log.Printf("%v: Destroying VM.", instance)
-		haltAndDestroy(client, instance)
+		err := client.DestroyVM(projTokenSource(), *project, *zone, instance)
+		if err != nil {
+			log.Printf("%v: Destroying VM: %v", instance, err)
+		}
 	}()
 
 	// Push source to VM
@@ -175,49 +178,6 @@
 	return nil
 }
 
-func haltAndDestroy(bc *buildlet.Client, instance string) {
-	// TODO(adg): move this to buildlet library.
-
-	// Ask buildlet to kill itself, and tell GCE to kill it too.
-	gceErrc := make(chan error, 1)
-	buildletErrc := make(chan error, 1)
-	go func() {
-		gceErrc <- buildlet.DestroyVM(projTokenSource(), *project, *zone, instance)
-	}()
-	go func() {
-		buildletErrc <- bc.Destroy()
-	}()
-	timeout := time.NewTimer(5 * time.Second)
-	defer timeout.Stop()
-
-	var gceDone, buildletDone bool
-	for !gceDone || !buildletDone {
-		select {
-		case err := <-gceErrc:
-			if err != nil {
-				log.Printf("%v: GCE: %v", instance, err)
-			} else {
-				log.Printf("%v: Requested GCE delete.", instance)
-			}
-			gceDone = true
-		case err := <-buildletErrc:
-			if err != nil {
-				log.Printf("%v: Buildlet: %v", instance, err)
-			} else {
-				log.Printf("%v: Requested buildlet to shut down.", instance)
-			}
-			buildletDone = true
-		case <-timeout.C:
-			if !buildletDone {
-				log.Printf("%v: timeout asking buildlet to shut down", instance)
-			}
-			if !gceDone {
-				log.Printf("%v: timeout asking GCE to delete builder VM", instance)
-			}
-		}
-	}
-}
-
 func projTokenSource() oauth2.TokenSource {
 	ts, err := auth.ProjectTokenSource(*project, compute.ComputeScope)
 	if err != nil {