compute.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "os"
  7. "strings"
  8. compute "google.golang.org/api/compute/v1"
  9. "google.golang.org/api/googleapi"
  10. )
  11. func init() {
  12. scopes := strings.Join([]string{
  13. compute.DevstorageFullControlScope,
  14. compute.ComputeScope,
  15. }, " ")
  16. registerDemo("compute", scopes, computeMain)
  17. }
  18. func computeMain(client *http.Client, argv []string) {
  19. if len(argv) != 2 {
  20. fmt.Fprintln(os.Stderr, "Usage: compute project_id instance_name (to start an instance)")
  21. return
  22. }
  23. service, err := compute.New(client)
  24. if err != nil {
  25. log.Fatalf("Unable to create Compute service: %v", err)
  26. }
  27. projectId := argv[0]
  28. instanceName := argv[1]
  29. prefix := "https://www.googleapis.com/compute/v1/projects/" + projectId
  30. imageURL := "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140606"
  31. zone := "us-central1-a"
  32. // Show the current images that are available.
  33. res, err := service.Images.List(projectId).Do()
  34. log.Printf("Got compute.Images.List, err: %#v, %v", res, err)
  35. instance := &compute.Instance{
  36. Name: instanceName,
  37. Description: "compute sample instance",
  38. MachineType: prefix + "/zones/" + zone + "/machineTypes/n1-standard-1",
  39. Disks: []*compute.AttachedDisk{
  40. {
  41. AutoDelete: true,
  42. Boot: true,
  43. Type: "PERSISTENT",
  44. InitializeParams: &compute.AttachedDiskInitializeParams{
  45. DiskName: "my-root-pd",
  46. SourceImage: imageURL,
  47. },
  48. },
  49. },
  50. NetworkInterfaces: []*compute.NetworkInterface{
  51. &compute.NetworkInterface{
  52. AccessConfigs: []*compute.AccessConfig{
  53. &compute.AccessConfig{
  54. Type: "ONE_TO_ONE_NAT",
  55. Name: "External NAT",
  56. },
  57. },
  58. Network: prefix + "/global/networks/default",
  59. },
  60. },
  61. ServiceAccounts: []*compute.ServiceAccount{
  62. {
  63. Email: "default",
  64. Scopes: []string{
  65. compute.DevstorageFullControlScope,
  66. compute.ComputeScope,
  67. },
  68. },
  69. },
  70. }
  71. op, err := service.Instances.Insert(projectId, zone, instance).Do()
  72. log.Printf("Got compute.Operation, err: %#v, %v", op, err)
  73. etag := op.Header.Get("Etag")
  74. log.Printf("Etag=%v", etag)
  75. inst, err := service.Instances.Get(projectId, zone, instanceName).IfNoneMatch(etag).Do()
  76. log.Printf("Got compute.Instance, err: %#v, %v", inst, err)
  77. if googleapi.IsNotModified(err) {
  78. log.Printf("Instance not modified since insert.")
  79. } else {
  80. log.Printf("Instance modified since insert.")
  81. }
  82. }