From fd08eb7e1dfdef80706fa714b6a0a1353810677b Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 15 Aug 2014 13:19:12 -0700 Subject: [PATCH] Create GCE instance, but without Camlistore running. Change-Id: I3775ad8dc90562f9d4cb6c59da9a4df63aa417e8 --- misc/gce/create.go | 91 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/misc/gce/create.go b/misc/gce/create.go index 042ce294b..b1e97e049 100644 --- a/misc/gce/create.go +++ b/misc/gce/create.go @@ -5,17 +5,20 @@ import ( "flag" "io/ioutil" "log" + "net/http" "os" "strings" + "time" "camlistore.org/third_party/code.google.com/p/goauth2/oauth" compute "camlistore.org/third_party/code.google.com/p/google-api-go-client/compute/v1" ) var ( - projFlag = flag.String("project", "", "name of Project") - zoneFlag = flag.String("zone", "us-central1-a", "GCE zone") - machFlag = flag.String("machinetype", "g1-small", "e.g. n1-standard-1, f1-micro, g1-small") + projFlag = flag.String("project", "", "name of Project") + zoneFlag = flag.String("zone", "us-central1-a", "GCE zone") + machFlag = flag.String("machinetype", "g1-small", "e.g. n1-standard-1, f1-micro, g1-small") + instanceFlag = flag.String("instance_name", "camlistore-server", "Name of VM instance.") ) func readFile(v string) string { @@ -72,6 +75,84 @@ func main() { tokenCache.PutToken(token) } - log.Printf("Got token: %#v", token) - _, _ = machType, imageURL + tr.Token = token + service, _ := compute.New(&http.Client{Transport: tr}) + + instance := &compute.Instance{ + Name: *instanceFlag, + Description: "Camlistore server", + MachineType: machType, + Disks: []*compute.AttachedDisk{ + { + AutoDelete: true, + Boot: true, + Type: "PERSISTENT", + InitializeParams: &compute.AttachedDiskInitializeParams{ + DiskName: "camlistore-coreos-stateless-pd", + SourceImage: imageURL, + }, + }, + }, + NetworkInterfaces: []*compute.NetworkInterface{ + &compute.NetworkInterface{ + AccessConfigs: []*compute.AccessConfig{ + &compute.AccessConfig{ + Type: "ONE_TO_ONE_NAT", + Name: "External NAT", + }, + }, + Network: prefix + "/global/networks/default", + }, + }, + ServiceAccounts: []*compute.ServiceAccount{ + { + Email: "default", + Scopes: []string{ + compute.DevstorageFull_controlScope, + compute.ComputeScope, + "https://www.googleapis.com/auth/sqlservice", + "https://www.googleapis.com/auth/sqlservice.admin", + }, + }, + }, + } + const localMySQL = false // later + if localMySQL { + instance.Disks = append(instance.Disks, &compute.AttachedDisk{ + AutoDelete: false, + Boot: false, + Type: "PERSISTENT", + InitializeParams: &compute.AttachedDiskInitializeParams{ + DiskName: "camlistore-mysql-index-pd", + DiskSizeGb: 4, + }, + }) + } + + op, err := service.Instances.Insert(*projFlag, *zoneFlag, instance).Do() + if err != nil { + log.Fatalf("Failed to create instance: %v", err) + } + opName := op.Name + for { + op, err := service.ZoneOperations.Get(*projFlag, *zoneFlag, opName).Do() + if err != nil { + log.Fatalf("Failed to get op %s: %v", opName, err) + } + switch op.Status { + case "PENDING", "RUNNING": + time.Sleep(1 * time.Second) + case "DONE": + if op.Error != nil { + for _, operr := range op.Error.Errors { + log.Printf("Error: %+v", operr) + } + log.Fatalf("Failed to start.") + } + log.Printf("Success. %+v", op) + return + default: + log.Fatalf("Unknown status %q: %+v", op.Status, op) + } + } }