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