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