compute/compute.go (1,682 lines of code) (raw):

// Copyright 2017 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package compute provides access to the Google Compute API. package compute import ( "context" "fmt" "math/rand" "net/http" "strings" "time" "golang.org/x/oauth2" computeAlpha "google.golang.org/api/compute/v0.alpha" computeBeta "google.golang.org/api/compute/v0.beta" "google.golang.org/api/compute/v1" "google.golang.org/api/googleapi" "google.golang.org/api/option" "google.golang.org/api/transport" ) // Client is a client for interacting with Google Cloud Compute. type Client interface { AttachDisk(project, zone, instance string, d *compute.AttachedDisk) error DetachDisk(project, zone, instance, disk string) error CreateDisk(project, zone string, d *compute.Disk) error CreateDiskAlpha(project, zone string, d *computeAlpha.Disk) error CreateDiskBeta(project, zone string, d *computeBeta.Disk) error CreateForwardingRule(project, region string, fr *compute.ForwardingRule) error CreateFirewallRule(project string, i *compute.Firewall) error CreateImage(project string, i *compute.Image) error CreateImageAlpha(project string, i *computeAlpha.Image) error CreateImageBeta(project string, i *computeBeta.Image) error CreateInstance(project, zone string, i *compute.Instance) error CreateInstanceAlpha(project, zone string, i *computeAlpha.Instance) error CreateInstanceBeta(project, zone string, i *computeBeta.Instance) error CreateNetwork(project string, n *compute.Network) error CreateSnapshot(project, zone, disk string, s *compute.Snapshot) error CreateSnapshotWithGuestFlush(project, zone, disk string, s *compute.Snapshot) error CreateSubnetwork(project, region string, n *compute.Subnetwork) error CreateTargetInstance(project, zone string, ti *compute.TargetInstance) error DeleteDisk(project, zone, name string) error DeleteForwardingRule(project, region, name string) error DeleteFirewallRule(project, name string) error DeleteImage(project, name string) error DeleteInstance(project, zone, name string) error StartInstance(project, zone, name string) error StopInstance(project, zone, name string) error DeleteNetwork(project, name string) error DeleteSubnetwork(project, region, name string) error DeleteTargetInstance(project, zone, name string) error DeprecateImage(project, name string, deprecationstatus *compute.DeprecationStatus) error DeprecateImageAlpha(project, name string, deprecationstatus *computeAlpha.DeprecationStatus) error GetMachineType(project, zone, machineType string) (*compute.MachineType, error) GetProject(project string) (*compute.Project, error) GetSerialPortOutput(project, zone, name string, port, start int64) (*compute.SerialPortOutput, error) GetZone(project, zone string) (*compute.Zone, error) GetInstance(project, zone, name string) (*compute.Instance, error) GetInstanceAlpha(project, zone, name string) (*computeAlpha.Instance, error) GetInstanceBeta(project, zone, name string) (*computeBeta.Instance, error) GetDisk(project, zone, name string) (*compute.Disk, error) GetDiskAlpha(project, zone, name string) (*computeAlpha.Disk, error) GetDiskBeta(project, zone, name string) (*computeBeta.Disk, error) GetForwardingRule(project, region, name string) (*compute.ForwardingRule, error) GetFirewallRule(project, name string) (*compute.Firewall, error) GetGuestAttributes(project, zone, name, queryPath, variableKey string) (*compute.GuestAttributes, error) GetImage(project, name string) (*compute.Image, error) GetImageAlpha(project, name string) (*computeAlpha.Image, error) GetImageBeta(project, name string) (*computeBeta.Image, error) GetImageFromFamily(project, family string) (*compute.Image, error) GetImageFromFamilyBeta(project, family string) (*computeBeta.Image, error) GetLicense(project, name string) (*compute.License, error) GetNetwork(project, name string) (*compute.Network, error) GetRegion(project, region string) (*compute.Region, error) GetSubnetwork(project, region, name string) (*compute.Subnetwork, error) GetTargetInstance(project, zone, name string) (*compute.TargetInstance, error) InstanceStatus(project, zone, name string) (string, error) InstanceStopped(project, zone, name string) (bool, error) ListMachineTypes(project, zone string, opts ...ListCallOption) ([]*compute.MachineType, error) ListLicenses(project string, opts ...ListCallOption) ([]*compute.License, error) ListZones(project string, opts ...ListCallOption) ([]*compute.Zone, error) ListRegions(project string, opts ...ListCallOption) ([]*compute.Region, error) AggregatedListInstances(project string, opts ...ListCallOption) ([]*compute.Instance, error) ListInstances(project, zone string, opts ...ListCallOption) ([]*compute.Instance, error) AggregatedListDisks(project string, opts ...ListCallOption) ([]*compute.Disk, error) ListDisks(project, zone string, opts ...ListCallOption) ([]*compute.Disk, error) AggregatedListForwardingRules(project string, opts ...ListCallOption) ([]*compute.ForwardingRule, error) ListForwardingRules(project, zone string, opts ...ListCallOption) ([]*compute.ForwardingRule, error) ListFirewallRules(project string, opts ...ListCallOption) ([]*compute.Firewall, error) ListImages(project string, opts ...ListCallOption) ([]*compute.Image, error) ListImagesAlpha(project string, opts ...ListCallOption) ([]*computeAlpha.Image, error) GetSnapshot(project, name string) (*compute.Snapshot, error) ListSnapshots(project string, opts ...ListCallOption) ([]*compute.Snapshot, error) DeleteSnapshot(project, name string) error ListNetworks(project string, opts ...ListCallOption) ([]*compute.Network, error) AggregatedListSubnetworks(project string, opts ...ListCallOption) ([]*compute.Subnetwork, error) ListSubnetworks(project, region string, opts ...ListCallOption) ([]*compute.Subnetwork, error) ListTargetInstances(project, zone string, opts ...ListCallOption) ([]*compute.TargetInstance, error) ResizeDisk(project, zone, disk string, drr *compute.DisksResizeRequest) error SetInstanceMetadata(project, zone, name string, md *compute.Metadata) error SetCommonInstanceMetadata(project string, md *compute.Metadata) error SetDiskAutoDelete(project, zone, instance string, autoDelete bool, deviceName string) error ListMachineImages(project string, opts ...ListCallOption) ([]*compute.MachineImage, error) DeleteMachineImage(project, name string) error CreateMachineImage(project string, i *compute.MachineImage) error GetMachineImage(project, name string) (*compute.MachineImage, error) Suspend(project, zone, instance string) error Resume(project, zone, instance string) error SimulateMaintenanceEvent(project, zone, instance string) error DeleteRegionTargetHTTPProxy(project, region, name string) error CreateRegionTargetHTTPProxy(project, region string, p *compute.TargetHttpProxy) error ListRegionTargetHTTPProxies(project, region string, opts ...ListCallOption) ([]*compute.TargetHttpProxy, error) GetRegionTargetHTTPProxy(project, region, name string) (*compute.TargetHttpProxy, error) DeleteRegionURLMap(project, region, name string) error CreateRegionURLMap(project, region string, u *compute.UrlMap) error ListRegionURLMaps(project, region string, opts ...ListCallOption) ([]*compute.UrlMap, error) GetRegionURLMap(project, region, name string) (*compute.UrlMap, error) DeleteRegionBackendService(project, region, name string) error CreateRegionBackendService(project, region string, b *compute.BackendService) error ListRegionBackendServices(project, region string, opts ...ListCallOption) ([]*compute.BackendService, error) GetRegionBackendService(project, region, name string) (*compute.BackendService, error) DeleteRegionHealthCheck(project, region, name string) error CreateRegionHealthCheck(project, region string, h *compute.HealthCheck) error ListRegionHealthChecks(project, region string, opts ...ListCallOption) ([]*compute.HealthCheck, error) GetRegionHealthCheck(project, region, name string) (*compute.HealthCheck, error) DeleteRegionNetworkEndpointGroup(project, region, name string) error CreateRegionNetworkEndpointGroup(project, region string, n *compute.NetworkEndpointGroup) error ListRegionNetworkEndpointGroups(project, region string, opts ...ListCallOption) ([]*compute.NetworkEndpointGroup, error) GetRegionNetworkEndpointGroup(project, region, name string) (*compute.NetworkEndpointGroup, error) Retry(f func(opts ...googleapi.CallOption) (*compute.Operation, error), opts ...googleapi.CallOption) (op *compute.Operation, err error) RetryBeta(f func(opts ...googleapi.CallOption) (*computeBeta.Operation, error), opts ...googleapi.CallOption) (op *computeBeta.Operation, err error) BasePath() string } // A ListCallOption is an option for a Google Compute API *ListCall. type ListCallOption interface { listCallOptionApply(interface{}) interface{} } // OrderBy sets the optional parameter "orderBy": Sorts list results by a // certain order. By default, results are returned in alphanumerical order // based on the resource name. type OrderBy string func (o OrderBy) listCallOptionApply(i interface{}) interface{} { switch c := i.(type) { case *compute.FirewallsListCall: return c.OrderBy(string(o)) case *computeAlpha.ImagesListCall: return c.OrderBy(string(o)) case *compute.ImagesListCall: return c.OrderBy(string(o)) case *computeAlpha.MachineImagesListCall: return c.OrderBy(string(o)) case *computeBeta.MachineImagesListCall: return c.OrderBy(string(o)) case *compute.MachineImagesListCall: return c.OrderBy(string(o)) case *compute.MachineTypesListCall: return c.OrderBy(string(o)) case *compute.ZonesListCall: return c.OrderBy(string(o)) case *compute.InstancesListCall: return c.OrderBy(string(o)) case *compute.DisksListCall: return c.OrderBy(string(o)) case *compute.NetworksListCall: return c.OrderBy(string(o)) case *compute.SubnetworksListCall: return c.OrderBy(string(o)) case *compute.InstancesAggregatedListCall: return c.OrderBy(string(o)) case *compute.DisksAggregatedListCall: return c.OrderBy(string(o)) case *compute.SubnetworksAggregatedListCall: return c.OrderBy(string(o)) } return i } // Filter sets the optional parameter "filter": Sets a filter {expression} for // filtering listed resources. Your {expression} must be in the format: // field_name comparison_string literal_string. type Filter string func (o Filter) listCallOptionApply(i interface{}) interface{} { switch c := i.(type) { case *compute.FirewallsListCall: return c.Filter(string(o)) case *computeAlpha.ImagesListCall: return c.Filter(string(o)) case *compute.ImagesListCall: return c.Filter(string(o)) case *computeAlpha.MachineImagesListCall: return c.Filter(string(o)) case *computeBeta.MachineImagesListCall: return c.Filter(string(o)) case *compute.MachineImagesListCall: return c.Filter(string(o)) case *compute.MachineTypesListCall: return c.Filter(string(o)) case *compute.ZonesListCall: return c.Filter(string(o)) case *compute.InstancesListCall: return c.Filter(string(o)) case *compute.DisksListCall: return c.Filter(string(o)) case *compute.NetworksListCall: return c.Filter(string(o)) case *compute.SubnetworksListCall: return c.Filter(string(o)) case *compute.InstancesAggregatedListCall: return c.Filter(string(o)) case *compute.DisksAggregatedListCall: return c.Filter(string(o)) case *compute.SubnetworksAggregatedListCall: return c.Filter(string(o)) } return i } type clientImpl interface { Client zoneOperationsWait(project, zone, name string) error regionOperationsWait(project, region, name string) error globalOperationsWait(project, name string) error } type client struct { i clientImpl hc *http.Client raw *compute.Service rawBeta *computeBeta.Service rawAlpha *computeAlpha.Service } // shouldRetryWithWait returns true if the HTTP response / error indicates // that the request should be attempted again. func shouldRetryWithWait(tripper http.RoundTripper, err error, multiplier int) bool { if err == nil { return false } tkValid := true trans, ok := tripper.(*oauth2.Transport) if ok { if tk, err := trans.Source.Token(); err == nil { tkValid = tk.Valid() } } apiErr, ok := err.(*googleapi.Error) var retry bool switch { case !ok && (strings.Contains(err.Error(), "connection reset by peer") || strings.Contains(err.Error(), "unexpected EOF")): retry = true case !ok && (strings.Contains(err.Error(), "server sent GOAWAY") || strings.Contains(err.Error(), "ENHANCE_YOUR_CALM")): // The wait operation can return GOAWAY/ENHANCE_YOUR_CALM messages, so doubling the wait multiplier as it based on the retry count. multiplier = multiplier * 2 retry = true case !ok && tkValid: // Not a googleapi.Error and the token is still valid. return false case apiErr.Code >= 500 && apiErr.Code <= 599: retry = true case apiErr.Code >= 429: // Too many API requests. retry = true case apiErr.Code == 403 && strings.Contains(err.Error(), "rateLimitExceeded"): // Quota errors are reported as 403. // Generally we don't want to retry on quota errors, but if it's quota on rate (GetSerialPortOutput) - we should. retry = true case !tkValid: // This was probably a failure to get new token from metadata server. retry = true } if !retry { return false } sleep := (time.Duration(rand.Intn(1000))*time.Millisecond + 1*time.Second) * time.Duration(multiplier) time.Sleep(sleep) return true } // NewClient creates a new Google Cloud Compute client. func NewClient(ctx context.Context, opts ...option.ClientOption) (Client, error) { // Set these scopes to be align with compute.NewService o := []option.ClientOption{ option.WithScopes( compute.CloudPlatformScope, compute.ComputeScope, compute.ComputeReadonlyScope, compute.DevstorageFullControlScope, compute.DevstorageReadOnlyScope, compute.DevstorageReadWriteScope, ), } opts = append(o, opts...) hc, ep, err := transport.NewHTTPClient(ctx, opts...) if err != nil { return nil, fmt.Errorf("error creating HTTP API client: %v", err) } rawService, err := compute.New(hc) if err != nil { return nil, fmt.Errorf("compute client: %v", err) } if ep != "" { rawService.BasePath = ep } rawBetaService, err := computeBeta.New(hc) if err != nil { return nil, fmt.Errorf("beta compute client: %v", err) } if ep != "" { rawBetaService.BasePath = ep } rawAlphaService, err := computeAlpha.New(hc) if err != nil { return nil, fmt.Errorf("alpha compute client: %v", err) } if ep != "" { rawAlphaService.BasePath = ep } c := &client{hc: hc, raw: rawService, rawBeta: rawBetaService, rawAlpha: rawAlphaService} c.i = c return c, nil } // BasePath returns the base path for this client. func (c *client) BasePath() string { return c.raw.BasePath } type operationGetterFunc func() (*compute.Operation, error) func (c *client) zoneOperationsWait(project, zone, name string) error { return c.operationsWaitHelper(project, name, func() (op *compute.Operation, err error) { op, err = c.Retry(c.raw.ZoneOperations.Wait(project, zone, name).Do) if err != nil { err = fmt.Errorf("failed to get zone operation %s: %v", name, err) } return op, err }) } func (c *client) regionOperationsWait(project, region, name string) error { return c.operationsWaitHelper(project, name, func() (op *compute.Operation, err error) { op, err = c.Retry(c.raw.RegionOperations.Wait(project, region, name).Do) if err != nil { err = fmt.Errorf("failed to get region operation %s: %v", name, err) } return op, err }) } func (c *client) globalOperationsWait(project, name string) error { return c.operationsWaitHelper(project, name, func() (op *compute.Operation, err error) { op, err = c.Retry(c.raw.GlobalOperations.Wait(project, name).Do) if err != nil { err = fmt.Errorf("failed to get global operation %s: %v", name, err) } return op, err }) } // OperationErrorCodeFormat is the format of operation error code. var OperationErrorCodeFormat = "Code: %s" var operationErrorMessageFormat = "Message: %s" func (c *client) operationsWaitHelper(project, name string, getOperation operationGetterFunc) error { for { op, err := getOperation() if err != nil { return err } switch op.Status { case "PENDING", "RUNNING": time.Sleep(1 * time.Second) continue case "DONE": if op.Error != nil { var operrs string for _, operr := range op.Error.Errors { operrs = operrs + fmt.Sprintf( fmt.Sprintf("\n%v\n%v", OperationErrorCodeFormat, operationErrorMessageFormat), operr.Code, operr.Message) } return fmt.Errorf("operation failed %+v: %s", op, operrs) } default: return fmt.Errorf("unknown operation status %q: %+v", op.Status, op) } return nil } } // Retry invokes the given function, retrying it multiple times if the HTTP // status response indicates the request should be attempted again or the // oauth Token is no longer valid. func (c *client) Retry(f func(opts ...googleapi.CallOption) (*compute.Operation, error), opts ...googleapi.CallOption) (op *compute.Operation, err error) { for i := 1; i < 4; i++ { op, err = f(opts...) if err == nil { return op, nil } if !shouldRetryWithWait(c.hc.Transport, err, i) { return nil, err } } return } // RetryBeta invokes the given function, retrying it multiple times if the HTTP // status response indicates the request should be attempted again or the // oauth Token is no longer valid. func (c *client) RetryBeta(f func(opts ...googleapi.CallOption) (*computeBeta.Operation, error), opts ...googleapi.CallOption) (op *computeBeta.Operation, err error) { for i := 1; i < 4; i++ { op, err = f(opts...) if err == nil { return op, nil } if !shouldRetryWithWait(c.hc.Transport, err, i) { return nil, err } } return } // RetryAlpha invokes the given function, retrying it multiple times if the HTTP // status response indicates the request should be attempted again or the // oauth Token is no longer valid. func (c *client) RetryAlpha(f func(opts ...googleapi.CallOption) (*computeAlpha.Operation, error), opts ...googleapi.CallOption) (op *computeAlpha.Operation, err error) { for i := 1; i < 4; i++ { op, err = f(opts...) if err == nil { return op, nil } if !shouldRetryWithWait(c.hc.Transport, err, i) { return nil, err } } return } // AttachDisk attaches a GCE persistent disk to an instance. func (c *client) AttachDisk(project, zone, instance string, d *compute.AttachedDisk) error { op, err := c.Retry(c.raw.Instances.AttachDisk(project, zone, instance, d).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // DetachDisk detaches a GCE persistent disk to an instance. func (c *client) DetachDisk(project, zone, instance, disk string) error { op, err := c.Retry(c.raw.Instances.DetachDisk(project, zone, instance, disk).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // CreateDisk creates a GCE persistent disk. func (c *client) CreateDisk(project, zone string, d *compute.Disk) error { op, err := c.Retry(c.raw.Disks.Insert(project, zone, d).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdDisk *compute.Disk if createdDisk, err = c.i.GetDisk(project, zone, d.Name); err != nil { return err } *d = *createdDisk return nil } // CreateDiskAlpha creates a GCE persistent disk. func (c *client) CreateDiskAlpha(project, zone string, d *computeAlpha.Disk) error { op, err := c.RetryAlpha(c.rawAlpha.Disks.Insert(project, zone, d).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdDisk *computeAlpha.Disk if createdDisk, err = c.i.GetDiskAlpha(project, zone, d.Name); err != nil { return err } *d = *createdDisk return nil } // CreateDiskBeta creates a GCE persistent disk. func (c *client) CreateDiskBeta(project, zone string, d *computeBeta.Disk) error { op, err := c.RetryBeta(c.rawBeta.Disks.Insert(project, zone, d).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdDisk *computeBeta.Disk if createdDisk, err = c.i.GetDiskBeta(project, zone, d.Name); err != nil { return err } *d = *createdDisk return nil } // CreateForwardingRule creates a GCE forwarding rule. func (c *client) CreateForwardingRule(project, region string, fr *compute.ForwardingRule) error { op, err := c.Retry(c.raw.ForwardingRules.Insert(project, region, fr).Do) if err != nil { return err } if err := c.i.regionOperationsWait(project, region, op.Name); err != nil { return err } var createdForwardingRule *compute.ForwardingRule if createdForwardingRule, err = c.i.GetForwardingRule(project, region, fr.Name); err != nil { return err } *fr = *createdForwardingRule return nil } func (c *client) CreateFirewallRule(project string, i *compute.Firewall) error { op, err := c.Retry(c.raw.Firewalls.Insert(project, i).Do) if err != nil { return err } if err := c.i.globalOperationsWait(project, op.Name); err != nil { return err } var createdFirewallRule *compute.Firewall if createdFirewallRule, err = c.i.GetFirewallRule(project, i.Name); err != nil { return err } *i = *createdFirewallRule return nil } // CreateImage creates a GCE image. // Only one of sourceDisk or sourceFile must be specified, sourceDisk is the // url (full or partial) to the source disk, sourceFile is the full Google // Cloud Storage URL where the disk image is stored. func (c *client) CreateImage(project string, i *compute.Image) error { op, err := c.Retry(c.raw.Images.Insert(project, i).Do) if err != nil { return err } if err := c.i.globalOperationsWait(project, op.Name); err != nil { return err } var createdImage *compute.Image if createdImage, err = c.i.GetImage(project, i.Name); err != nil { return err } *i = *createdImage return nil } // CreateImageBeta creates a GCE image using Beta API. // Only one of sourceDisk or sourceFile must be specified, sourceDisk is the // url (full or partial) to the source disk, sourceFile is the full Google // Cloud Storage URL where the disk image is stored. func (c *client) CreateImageBeta(project string, i *computeBeta.Image) error { op, err := c.RetryBeta(c.rawBeta.Images.Insert(project, i).Do) if err != nil { return err } if err := c.i.globalOperationsWait(project, op.Name); err != nil { return err } var createdImage *computeBeta.Image if createdImage, err = c.i.GetImageBeta(project, i.Name); err != nil { return err } *i = *createdImage return nil } // CreateImageAlpha creates a GCE image using Alpha API. // Only one of sourceDisk or sourceFile must be specified, sourceDisk is the // url (full or partial) to the source disk, sourceFile is the full Google // Cloud Storage URL where the disk image is stored. func (c *client) CreateImageAlpha(project string, i *computeAlpha.Image) error { op, err := c.RetryAlpha(c.rawAlpha.Images.Insert(project, i).Do) if err != nil { return err } if err := c.i.globalOperationsWait(project, op.Name); err != nil { return err } var createdImage *computeAlpha.Image if createdImage, err = c.i.GetImageAlpha(project, i.Name); err != nil { return err } *i = *createdImage return nil } // DeleteRegionTargetHTTPProxy deletes a GCE RegionTargetHTTPProxy. func (c *client) DeleteRegionTargetHTTPProxy(project, region, name string) error { op, err := c.Retry(c.raw.RegionTargetHttpProxies.Delete(project, region, name).Do) if err != nil { return err } return c.i.regionOperationsWait(project, region, op.Name) } // CreateRegionTargetHTTPProxy creates a GCE RegionTargetHTTPProxy. func (c *client) CreateRegionTargetHTTPProxy(project, region string, p *compute.TargetHttpProxy) error { op, err := c.Retry(c.raw.RegionTargetHttpProxies.Insert(project, region, p).Do) if err != nil { return err } if err := c.i.regionOperationsWait(project, region, op.Name); err != nil { return err } var createdRegionTargetHTTPProxy *compute.TargetHttpProxy if createdRegionTargetHTTPProxy, err = c.i.GetRegionTargetHTTPProxy(project, region, p.Name); err != nil { return err } *p = *createdRegionTargetHTTPProxy return nil } // GetRegionTargetHTTPProxy gets a GCE RegionTargetHTTPProxy. func (c *client) GetRegionTargetHTTPProxy(project, region, name string) (*compute.TargetHttpProxy, error) { i, err := c.raw.RegionTargetHttpProxies.Get(project, region, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.RegionTargetHttpProxies.Get(project, region, name).Do() } return i, err } // ListRegionTargetHTTPProxies lists GCE RegionTargetHTTPProxies. func (c *client) ListRegionTargetHTTPProxies(project, region string, opts ...ListCallOption) ([]*compute.TargetHttpProxy, error) { var is []*compute.TargetHttpProxy var pt string call := c.raw.RegionTargetHttpProxies.List(project, region) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.RegionTargetHttpProxiesListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // DeleteRegionBackendService deletes a GCE RegionBackendService. func (c *client) DeleteRegionBackendService(project, region, name string) error { op, err := c.Retry(c.raw.RegionBackendServices.Delete(project, region, name).Do) if err != nil { return err } return c.i.regionOperationsWait(project, region, op.Name) } // CreateRegionBackendService creates a GCE RegionBackendService. func (c *client) CreateRegionBackendService(project, region string, p *compute.BackendService) error { op, err := c.Retry(c.raw.RegionBackendServices.Insert(project, region, p).Do) if err != nil { return err } if err := c.i.regionOperationsWait(project, region, op.Name); err != nil { return err } var createdRegionBackendService *compute.BackendService if createdRegionBackendService, err = c.i.GetRegionBackendService(project, region, p.Name); err != nil { return err } *p = *createdRegionBackendService return nil } // GetRegionBackendService gets a GCE RegionBackendService. func (c *client) GetRegionBackendService(project, region, name string) (*compute.BackendService, error) { i, err := c.raw.RegionBackendServices.Get(project, region, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.RegionBackendServices.Get(project, region, name).Do() } return i, err } // ListRegionBackendServices lists GCE RegionBackendServices. func (c *client) ListRegionBackendServices(project, region string, opts ...ListCallOption) ([]*compute.BackendService, error) { var is []*compute.BackendService var pt string call := c.raw.RegionBackendServices.List(project, region) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.RegionBackendServicesListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // DeleteRegionURLMap deletes a GCE RegionURLMap. func (c *client) DeleteRegionURLMap(project, region, name string) error { op, err := c.Retry(c.raw.RegionUrlMaps.Delete(project, region, name).Do) if err != nil { return err } return c.i.regionOperationsWait(project, region, op.Name) } // CreateRegionURLMap creates a GCE RegionURLMap. func (c *client) CreateRegionURLMap(project, region string, p *compute.UrlMap) error { op, err := c.Retry(c.raw.RegionUrlMaps.Insert(project, region, p).Do) if err != nil { return err } if err := c.i.regionOperationsWait(project, region, op.Name); err != nil { return err } var createdRegionURLMap *compute.UrlMap if createdRegionURLMap, err = c.i.GetRegionURLMap(project, region, p.Name); err != nil { return err } *p = *createdRegionURLMap return nil } // GetRegionURLMap gets a GCE RegionURLMap. func (c *client) GetRegionURLMap(project, region, name string) (*compute.UrlMap, error) { i, err := c.raw.RegionUrlMaps.Get(project, region, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.RegionUrlMaps.Get(project, region, name).Do() } return i, err } // ListRegionURLMaps lists GCE RegionURLMaps. func (c *client) ListRegionURLMaps(project, region string, opts ...ListCallOption) ([]*compute.UrlMap, error) { var is []*compute.UrlMap var pt string call := c.raw.RegionUrlMaps.List(project, region) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.RegionUrlMapsListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // DeleteRegionHealthCheck deletes a GCE RegionHealthCheck. func (c *client) DeleteRegionHealthCheck(project, region, name string) error { op, err := c.Retry(c.raw.RegionHealthChecks.Delete(project, region, name).Do) if err != nil { return err } return c.i.regionOperationsWait(project, region, op.Name) } // CreateRegionHealthCheck creates a GCE RegionHealthCheck. func (c *client) CreateRegionHealthCheck(project, region string, p *compute.HealthCheck) error { op, err := c.Retry(c.raw.RegionHealthChecks.Insert(project, region, p).Do) if err != nil { return err } if err := c.i.regionOperationsWait(project, region, op.Name); err != nil { return err } var createdRegionHealthCheck *compute.HealthCheck if createdRegionHealthCheck, err = c.i.GetRegionHealthCheck(project, region, p.Name); err != nil { return err } *p = *createdRegionHealthCheck return nil } // GetRegionHealthCheck gets a GCE RegionHealthCheck. func (c *client) GetRegionHealthCheck(project, region, name string) (*compute.HealthCheck, error) { i, err := c.raw.RegionHealthChecks.Get(project, region, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.RegionHealthChecks.Get(project, region, name).Do() } return i, err } // ListRegionHealthChecks lists GCE RegionHealthChecks. func (c *client) ListRegionHealthChecks(project, region string, opts ...ListCallOption) ([]*compute.HealthCheck, error) { var is []*compute.HealthCheck var pt string call := c.raw.RegionHealthChecks.List(project, region) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.RegionHealthChecksListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // DeleteRegionNetworkEndpointGroup deletes a GCE RegionNetworkEndpointGroup. func (c *client) DeleteRegionNetworkEndpointGroup(project, region, name string) error { op, err := c.Retry(c.raw.RegionNetworkEndpointGroups.Delete(project, region, name).Do) if err != nil { return err } return c.i.regionOperationsWait(project, region, op.Name) } // CreateRegionNetworkEndpointGroup creates a GCE RegionNetworkEndpointGroup. func (c *client) CreateRegionNetworkEndpointGroup(project, region string, p *compute.NetworkEndpointGroup) error { op, err := c.Retry(c.raw.RegionNetworkEndpointGroups.Insert(project, region, p).Do) if err != nil { return err } if err := c.i.regionOperationsWait(project, region, op.Name); err != nil { return err } var createdRegionNetworkEndpointGroup *compute.NetworkEndpointGroup if createdRegionNetworkEndpointGroup, err = c.i.GetRegionNetworkEndpointGroup(project, region, p.Name); err != nil { return err } *p = *createdRegionNetworkEndpointGroup return nil } // GetRegionNetworkEndpointGroup gets a GCE RegionNetworkEndpointGroup. func (c *client) GetRegionNetworkEndpointGroup(project, region, name string) (*compute.NetworkEndpointGroup, error) { i, err := c.raw.RegionNetworkEndpointGroups.Get(project, region, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.RegionNetworkEndpointGroups.Get(project, region, name).Do() } return i, err } // ListRegionNetworkEndpointGroups lists GCE RegionNetworkEndpointGroups. func (c *client) ListRegionNetworkEndpointGroups(project, region string, opts ...ListCallOption) ([]*compute.NetworkEndpointGroup, error) { var is []*compute.NetworkEndpointGroup var pt string call := c.raw.RegionNetworkEndpointGroups.List(project, region) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.RegionNetworkEndpointGroupsListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } func (c *client) CreateInstance(project, zone string, i *compute.Instance) error { op, err := c.Retry(c.raw.Instances.Insert(project, zone, i).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdInstance *compute.Instance if createdInstance, err = c.i.GetInstance(project, zone, i.Name); err != nil { return err } *i = *createdInstance return nil } // CreateInstanceAlpha creates a GCE image using Alpha API. func (c *client) CreateInstanceAlpha(project, zone string, i *computeAlpha.Instance) error { op, err := c.RetryAlpha(c.rawAlpha.Instances.Insert(project, zone, i).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdInstance *computeAlpha.Instance if createdInstance, err = c.i.GetInstanceAlpha(project, zone, i.Name); err != nil { return err } *i = *createdInstance return nil } // CreateInstanceBeta creates a GCE image using Beta API. func (c *client) CreateInstanceBeta(project, zone string, i *computeBeta.Instance) error { op, err := c.RetryBeta(c.rawBeta.Instances.Insert(project, zone, i).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdInstance *computeBeta.Instance if createdInstance, err = c.i.GetInstanceBeta(project, zone, i.Name); err != nil { return err } *i = *createdInstance return nil } func (c *client) CreateNetwork(project string, n *compute.Network) error { op, err := c.Retry(c.raw.Networks.Insert(project, n).Do) if err != nil { return err } if err := c.i.globalOperationsWait(project, op.Name); err != nil { return err } var createdNetwork *compute.Network if createdNetwork, err = c.i.GetNetwork(project, n.Name); err != nil { return err } *n = *createdNetwork return nil } func (c *client) CreateSubnetwork(project, region string, n *compute.Subnetwork) error { op, err := c.Retry(c.raw.Subnetworks.Insert(project, region, n).Do) if err != nil { return err } if err := c.i.regionOperationsWait(project, region, op.Name); err != nil { return err } var createdSubnetwork *compute.Subnetwork if createdSubnetwork, err = c.i.GetSubnetwork(project, region, n.Name); err != nil { return err } *n = *createdSubnetwork return nil } // CreateTargetInstance creates a GCE Target Instance, which can be used as // target on ForwardingRule func (c *client) CreateTargetInstance(project, zone string, ti *compute.TargetInstance) error { op, err := c.Retry(c.raw.TargetInstances.Insert(project, zone, ti).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdTargetInstance *compute.TargetInstance if createdTargetInstance, err = c.i.GetTargetInstance(project, zone, ti.Name); err != nil { return err } *ti = *createdTargetInstance return nil } // DeleteFirewallRule deletes a GCE FirewallRule. func (c *client) DeleteFirewallRule(project, name string) error { op, err := c.Retry(c.raw.Firewalls.Delete(project, name).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // DeleteImage deletes a GCE image. func (c *client) DeleteImage(project, name string) error { op, err := c.Retry(c.raw.Images.Delete(project, name).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // DeleteDisk deletes a GCE persistent disk. func (c *client) DeleteDisk(project, zone, name string) error { op, err := c.Retry(c.raw.Disks.Delete(project, zone, name).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // SetDiskAutoDelete set auto-delete of an attached disk func (c *client) SetDiskAutoDelete(project, zone, instance string, autoDelete bool, deviceName string) error { op, err := c.Retry(c.raw.Instances.SetDiskAutoDelete(project, zone, instance, autoDelete, deviceName).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // DeleteForwardingRule deletes a GCE ForwardingRule. func (c *client) DeleteForwardingRule(project, region, name string) error { op, err := c.Retry(c.raw.ForwardingRules.Delete(project, region, name).Do) if err != nil { return err } return c.i.regionOperationsWait(project, region, op.Name) } // DeleteInstance deletes a GCE instance. func (c *client) DeleteInstance(project, zone, name string) error { op, err := c.Retry(c.raw.Instances.Delete(project, zone, name).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // StartInstance starts a GCE instance. func (c *client) StartInstance(project, zone, name string) error { op, err := c.Retry(c.raw.Instances.Start(project, zone, name).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // StopInstance stops a GCE instance. func (c *client) StopInstance(project, zone, name string) error { op, err := c.Retry(c.raw.Instances.Stop(project, zone, name).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // DeleteNetwork deletes a GCE network. func (c *client) DeleteNetwork(project, name string) error { op, err := c.Retry(c.raw.Networks.Delete(project, name).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // DeleteSubnetwork deletes a GCE subnetwork. func (c *client) DeleteSubnetwork(project, region, name string) error { op, err := c.Retry(c.raw.Subnetworks.Delete(project, region, name).Do) if err != nil { return err } return c.i.regionOperationsWait(project, region, op.Name) } // DeleteTargetInstance deletes a GCE TargetInstance. func (c *client) DeleteTargetInstance(project, zone, name string) error { op, err := c.Retry(c.raw.TargetInstances.Delete(project, zone, name).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // DeprecateImage sets deprecation status on a GCE image. func (c *client) DeprecateImage(project, name string, deprecationstatus *compute.DeprecationStatus) error { op, err := c.Retry(c.raw.Images.Deprecate(project, name, deprecationstatus).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // DeprecateImageAlpha sets deprecation status on a GCE image using the Alpha API. func (c *client) DeprecateImageAlpha(project, name string, deprecationstatus *computeAlpha.DeprecationStatus) error { op, err := c.RetryAlpha(c.rawAlpha.Images.Deprecate(project, name, deprecationstatus).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // GetMachineType gets a GCE MachineType. func (c *client) GetMachineType(project, zone, machineType string) (*compute.MachineType, error) { mt, err := c.raw.MachineTypes.Get(project, zone, machineType).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.MachineTypes.Get(project, zone, machineType).Do() } return mt, err } // ListMachineTypes gets a list of GCE MachineTypes. func (c *client) ListMachineTypes(project, zone string, opts ...ListCallOption) ([]*compute.MachineType, error) { var mts []*compute.MachineType var pt string call := c.raw.MachineTypes.List(project, zone) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.MachineTypesListCall) } for mtl, err := call.PageToken(pt).Do(); ; mtl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { mtl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } mts = append(mts, mtl.Items...) if mtl.NextPageToken == "" { return mts, nil } pt = mtl.NextPageToken } } // GetProject gets a GCE Project. func (c *client) GetProject(project string) (*compute.Project, error) { p, err := c.raw.Projects.Get(project).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Projects.Get(project).Do() } return p, err } // GetSerialPortOutput gets the serial port output of a GCE instance. func (c *client) GetSerialPortOutput(project, zone, name string, port, start int64) (*compute.SerialPortOutput, error) { sp, err := c.raw.Instances.GetSerialPortOutput(project, zone, name).Start(start).Port(port).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Instances.GetSerialPortOutput(project, zone, name).Start(start).Port(port).Do() } return sp, err } // GetZone gets a GCE Zone. func (c *client) GetZone(project, zone string) (*compute.Zone, error) { z, err := c.raw.Zones.Get(project, zone).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Zones.Get(project, zone).Do() } return z, err } // ListZones gets a list GCE Zones. func (c *client) ListZones(project string, opts ...ListCallOption) ([]*compute.Zone, error) { var zs []*compute.Zone var pt string call := c.raw.Zones.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.ZonesListCall) } for zl, err := call.PageToken(pt).Do(); ; zl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { zl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } zs = append(zs, zl.Items...) if zl.NextPageToken == "" { return zs, nil } pt = zl.NextPageToken } } // ListRegions gets a list GCE Regions. func (c *client) ListRegions(project string, opts ...ListCallOption) ([]*compute.Region, error) { var rs []*compute.Region var pt string call := c.raw.Regions.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.RegionsListCall) } for rl, err := call.PageToken(pt).Do(); ; rl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { rl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } rs = append(rs, rl.Items...) if rl.NextPageToken == "" { return rs, nil } pt = rl.NextPageToken } } // GetInstance gets a GCE Instance using GA API. func (c *client) GetInstance(project, zone, name string) (*compute.Instance, error) { i, err := c.raw.Instances.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Instances.Get(project, zone, name).Do() } return i, err } // GetInstanceAlpha gets a GCE Instance using Alpha API. func (c *client) GetInstanceAlpha(project, zone, name string) (*computeAlpha.Instance, error) { i, err := c.rawAlpha.Instances.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.rawAlpha.Instances.Get(project, zone, name).Do() } return i, err } // GetInstanceBeta gets a GCE Instance using Beta API. func (c *client) GetInstanceBeta(project, zone, name string) (*computeBeta.Instance, error) { i, err := c.rawBeta.Instances.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.rawBeta.Instances.Get(project, zone, name).Do() } return i, err } // AggregatedListInstances gets an aggregated list of GCE Instances. func (c *client) AggregatedListInstances(project string, opts ...ListCallOption) ([]*compute.Instance, error) { var is []*compute.Instance var pt string call := c.raw.Instances.AggregatedList(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.InstancesAggregatedListCall) } for ial, err := call.PageToken(pt).Do(); ; ial, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { ial, err = call.PageToken(pt).Do() } if err != nil { return nil, err } for _, isl := range ial.Items { is = append(is, isl.Instances...) } if ial.NextPageToken == "" { return is, nil } pt = ial.NextPageToken } } // ListInstances gets a list of GCE Instances. func (c *client) ListInstances(project, zone string, opts ...ListCallOption) ([]*compute.Instance, error) { var is []*compute.Instance var pt string call := c.raw.Instances.List(project, zone) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.InstancesListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // GetDisk gets a GCE Disk. func (c *client) GetDisk(project, zone, name string) (*compute.Disk, error) { d, err := c.raw.Disks.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Disks.Get(project, zone, name).Do() } return d, err } // GetDiskAlpha gets a GCE Disk. func (c *client) GetDiskAlpha(project, zone, name string) (*computeAlpha.Disk, error) { d, err := c.rawAlpha.Disks.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.rawAlpha.Disks.Get(project, zone, name).Do() } return d, err } // GetDiskBeta gets a GCE Disk. func (c *client) GetDiskBeta(project, zone, name string) (*computeBeta.Disk, error) { d, err := c.rawBeta.Disks.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.rawBeta.Disks.Get(project, zone, name).Do() } return d, err } // AggregatedListDisks gets an aggregated list of GCE Disks. func (c *client) AggregatedListDisks(project string, opts ...ListCallOption) ([]*compute.Disk, error) { var is []*compute.Disk var pt string call := c.raw.Disks.AggregatedList(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.DisksAggregatedListCall) } for ial, err := call.PageToken(pt).Do(); ; ial, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { ial, err = call.PageToken(pt).Do() } if err != nil { return nil, err } for _, isl := range ial.Items { is = append(is, isl.Disks...) } if ial.NextPageToken == "" { return is, nil } pt = ial.NextPageToken } } // ListDisks gets a list of GCE Disks. func (c *client) ListDisks(project, zone string, opts ...ListCallOption) ([]*compute.Disk, error) { var ds []*compute.Disk var pt string call := c.raw.Disks.List(project, zone) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.DisksListCall) } for dl, err := call.PageToken(pt).Do(); ; dl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { dl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } ds = append(ds, dl.Items...) if dl.NextPageToken == "" { return ds, nil } pt = dl.NextPageToken } } // GetForwardingRule gets a GCE ForwardingRule. func (c *client) GetForwardingRule(project, region, name string) (*compute.ForwardingRule, error) { n, err := c.raw.ForwardingRules.Get(project, region, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.ForwardingRules.Get(project, region, name).Do() } return n, err } // AggregatedListForwardingRules gets an aggregated list of GCE ForwardingRules. func (c *client) AggregatedListForwardingRules(project string, opts ...ListCallOption) ([]*compute.ForwardingRule, error) { var frs []*compute.ForwardingRule var pt string call := c.raw.ForwardingRules.AggregatedList(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.ForwardingRulesAggregatedListCall) } for ail, err := call.PageToken(pt).Do(); ; ail, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { ail, err = call.PageToken(pt).Do() } if err != nil { return nil, err } for _, frl := range ail.Items { frs = append(frs, frl.ForwardingRules...) } if ail.NextPageToken == "" { return frs, nil } pt = ail.NextPageToken } } // ListForwardingRules gets a list of GCE ForwardingRules. func (c *client) ListForwardingRules(project, region string, opts ...ListCallOption) ([]*compute.ForwardingRule, error) { var frs []*compute.ForwardingRule var pt string call := c.raw.ForwardingRules.List(project, region) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.ForwardingRulesListCall) } for frl, err := call.PageToken(pt).Do(); ; frl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { frl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } frs = append(frs, frl.Items...) if frl.NextPageToken == "" { return frs, nil } pt = frl.NextPageToken } } // GetFirewallRule gets a GCE FirewallRule. func (c *client) GetFirewallRule(project, name string) (*compute.Firewall, error) { i, err := c.raw.Firewalls.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Firewalls.Get(project, name).Do() } return i, err } // ListFirewallRules gets a list of GCE FirewallRules. func (c *client) ListFirewallRules(project string, opts ...ListCallOption) ([]*compute.Firewall, error) { var is []*compute.Firewall var pt string call := c.raw.Firewalls.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.FirewallsListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // GetImage gets a GCE Image. func (c *client) GetImage(project, name string) (*compute.Image, error) { i, err := c.raw.Images.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Images.Get(project, name).Do() } return i, err } // GetImageAlpha gets a GCE Image using Alpha API func (c *client) GetImageAlpha(project, name string) (*computeAlpha.Image, error) { i, err := c.rawAlpha.Images.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.rawAlpha.Images.Get(project, name).Do() } return i, err } // GetImageBeta gets a GCE Image using Beta API func (c *client) GetImageBeta(project, name string) (*computeBeta.Image, error) { i, err := c.rawBeta.Images.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.rawBeta.Images.Get(project, name).Do() } return i, err } // GetImageFromFamily gets a GCE Image from an image family. func (c *client) GetImageFromFamily(project, family string) (*compute.Image, error) { i, err := c.raw.Images.GetFromFamily(project, family).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Images.GetFromFamily(project, family).Do() } return i, err } // GetImageFromFamilyBeta gets a GCE Image from an image family using Beta API. func (c *client) GetImageFromFamilyBeta(project, family string) (*computeBeta.Image, error) { i, err := c.rawBeta.Images.GetFromFamily(project, family).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.rawBeta.Images.GetFromFamily(project, family).Do() } return i, err } // ListImages gets a list of GCE Images. func (c *client) ListImages(project string, opts ...ListCallOption) ([]*compute.Image, error) { var is []*compute.Image var pt string call := c.raw.Images.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.ImagesListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // ListImagesAlpha gets a list of GCE Images using Alpha API. func (c *client) ListImagesAlpha(project string, opts ...ListCallOption) ([]*computeAlpha.Image, error) { var is []*computeAlpha.Image var pt string call := c.rawAlpha.Images.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*computeAlpha.ImagesListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // CreateSnapshot creates a GCE snapshot. // SourceDisk is the url (full or partial) to the source disk. func (c *client) CreateSnapshot(project, zone, disk string, s *compute.Snapshot) error { op, err := c.Retry(c.raw.Disks.CreateSnapshot(project, zone, disk, s).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdSnapshot *compute.Snapshot if createdSnapshot, err = c.i.GetSnapshot(project, s.Name); err != nil { return err } *s = *createdSnapshot return nil } // CreateSnapshotWithGuestFlush creates a GCE snapshot informing the OS to prepare for the snapshot process. func (c *client) CreateSnapshotWithGuestFlush(project, zone, disk string, s *compute.Snapshot) error { op, err := c.Retry(c.raw.Disks.CreateSnapshot(project, zone, disk, s).GuestFlush(true).Do) if err != nil { return err } if err := c.i.zoneOperationsWait(project, zone, op.Name); err != nil { return err } var createdSnapshot *compute.Snapshot if createdSnapshot, err = c.i.GetSnapshot(project, s.Name); err != nil { return err } *s = *createdSnapshot return nil } // GetSnapshot gets a GCE Snapshot. func (c *client) GetSnapshot(project, name string) (*compute.Snapshot, error) { n, err := c.raw.Snapshots.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Snapshots.Get(project, name).Do() } return n, err } // DeleteSnapshot deletes a GCE Snapshot. func (c *client) DeleteSnapshot(project, name string) error { op, err := c.Retry(c.raw.Snapshots.Delete(project, name).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // ListSnapshots gets a list of GCE Snapshots. func (c *client) ListSnapshots(project string, opts ...ListCallOption) ([]*compute.Snapshot, error) { var ss []*compute.Snapshot var pt string call := c.raw.Snapshots.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.SnapshotsListCall) } for sl, err := call.PageToken(pt).Do(); ; sl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { sl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } ss = append(ss, sl.Items...) if sl.NextPageToken == "" { return ss, nil } pt = sl.NextPageToken } } // GetNetwork gets a GCE Network. func (c *client) GetNetwork(project, name string) (*compute.Network, error) { n, err := c.raw.Networks.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Networks.Get(project, name).Do() } return n, err } // GetRegion gets a GCE Region func (c *client) GetRegion(project, name string) (*compute.Region, error) { n, err := c.raw.Regions.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Regions.Get(project, name).Do() } return n, err } // Suspend an instance func (c *client) Suspend(project, zone, name string) error { var op *compute.Operation var err error op, err = c.raw.Instances.Suspend(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { op, err = c.raw.Instances.Suspend(project, zone, name).Do() } if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // Resume an instance func (c *client) Resume(project, zone, name string) error { var op *compute.Operation var err error op, err = c.raw.Instances.Resume(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { op, err = c.raw.Instances.Resume(project, zone, name).Do() } if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // SimulateMaintenanceEvent simulates a maintenance event on an instance. func (c *client) SimulateMaintenanceEvent(project, zone, name string) error { var op *compute.Operation var err error op, err = c.raw.Instances.SimulateMaintenanceEvent(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { op, err = c.raw.Instances.SimulateMaintenanceEvent(project, zone, name).Do() } if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // ListNetworks gets a list of GCE Networks. func (c *client) ListNetworks(project string, opts ...ListCallOption) ([]*compute.Network, error) { var ns []*compute.Network var pt string call := c.raw.Networks.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.NetworksListCall) } for nl, err := call.PageToken(pt).Do(); ; nl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { nl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } ns = append(ns, nl.Items...) if nl.NextPageToken == "" { return ns, nil } pt = nl.NextPageToken } } // GetSubnetwork gets a GCE subnetwork. func (c *client) GetSubnetwork(project, region, name string) (*compute.Subnetwork, error) { n, err := c.raw.Subnetworks.Get(project, region, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Subnetworks.Get(project, region, name).Do() } return n, err } // AggregatedListSubnetworks gets an aggregated list of GCE Subnetworks. func (c *client) AggregatedListSubnetworks(project string, opts ...ListCallOption) ([]*compute.Subnetwork, error) { var ss []*compute.Subnetwork var pt string call := c.raw.Subnetworks.AggregatedList(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.SubnetworksAggregatedListCall) } for sal, err := call.PageToken(pt).Do(); ; sal, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { sal, err = call.PageToken(pt).Do() } if err != nil { return nil, err } for _, sl := range sal.Items { ss = append(ss, sl.Subnetworks...) } if sal.NextPageToken == "" { return ss, nil } pt = sal.NextPageToken } } // ListSubnetworks gets a list of GCE subnetworks. func (c *client) ListSubnetworks(project, region string, opts ...ListCallOption) ([]*compute.Subnetwork, error) { var ns []*compute.Subnetwork var pt string call := c.raw.Subnetworks.List(project, region) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.SubnetworksListCall) } for nl, err := call.PageToken(pt).Do(); ; nl, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { nl, err = call.PageToken(pt).Do() } if err != nil { return nil, err } ns = append(ns, nl.Items...) if nl.NextPageToken == "" { return ns, nil } pt = nl.NextPageToken } } // GetTargetInstance gets a GCE TargetInstance. func (c *client) GetTargetInstance(project, zone, name string) (*compute.TargetInstance, error) { n, err := c.raw.TargetInstances.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.TargetInstances.Get(project, zone, name).Do() } return n, err } // ListTargetInstances gets a list of GCE TargetInstances. func (c *client) ListTargetInstances(project, zone string, opts ...ListCallOption) ([]*compute.TargetInstance, error) { var tis []*compute.TargetInstance var pt string call := c.raw.TargetInstances.List(project, zone) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.TargetInstancesListCall) } for til, err := call.PageToken(pt).Do(); ; til, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { til, err = call.PageToken(pt).Do() } if err != nil { return nil, err } tis = append(tis, til.Items...) if til.NextPageToken == "" { return tis, nil } pt = til.NextPageToken } } // GetLicense gets a GCE License. func (c *client) GetLicense(project, name string) (*compute.License, error) { l, err := c.raw.Licenses.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.Licenses.Get(project, name).Do() } return l, err } // ListLicenses gets a list GCE Licenses. func (c *client) ListLicenses(project string, opts ...ListCallOption) ([]*compute.License, error) { var ls []*compute.License var pt string call := c.raw.Licenses.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.LicensesListCall) } for ll, err := call.PageToken(pt).Do(); ; ll, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { ll, err = call.PageToken(pt).Do() } if err != nil { return nil, err } ls = append(ls, ll.Items...) if ll.NextPageToken == "" { return ls, nil } pt = ll.NextPageToken } } // InstanceStatus returns an instances Status. func (c *client) InstanceStatus(project, zone, name string) (string, error) { is, err := c.raw.Instances.Get(project, zone, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { is, err = c.raw.Instances.Get(project, zone, name).Do() } if err != nil { return "", err } return is.Status, nil } // InstanceStopped checks if a GCE instance is in a 'TERMINATED' or 'STOPPED' state. func (c *client) InstanceStopped(project, zone, name string) (bool, error) { status, err := c.i.InstanceStatus(project, zone, name) if err != nil { return false, err } switch status { case "PROVISIONING", "REPAIRING", "RUNNING", "STAGING", "STOPPING": return false, nil case "TERMINATED", "STOPPED": return true, nil default: return false, fmt.Errorf("unexpected instance status %q", status) } } // ResizeDisk resizes a GCE persistent disk. You can only increase the size of the disk. func (c *client) ResizeDisk(project, zone, disk string, drr *compute.DisksResizeRequest) error { op, err := c.Retry(c.raw.Disks.Resize(project, zone, disk, drr).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // SetInstanceMetadata sets an instances metadata. func (c *client) SetInstanceMetadata(project, zone, name string, md *compute.Metadata) error { op, err := c.Retry(c.raw.Instances.SetMetadata(project, zone, name, md).Do) if err != nil { return err } return c.i.zoneOperationsWait(project, zone, op.Name) } // SetCommonInstanceMetadata sets an instances metadata. func (c *client) SetCommonInstanceMetadata(project string, md *compute.Metadata) error { op, err := c.Retry(c.raw.Projects.SetCommonInstanceMetadata(project, md).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // GetGuestAttributes gets a Guest Attributes. func (c *client) GetGuestAttributes(project, zone, name, queryPath, variableKey string) (*compute.GuestAttributes, error) { call := c.raw.Instances.GetGuestAttributes(project, zone, name) if queryPath != "" { call = call.QueryPath(queryPath) } if variableKey != "" { call = call.VariableKey(variableKey) } a, err := call.Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return call.Do() } return a, err } // ListMachineImages gets a list of GCE Machine Images. func (c *client) ListMachineImages(project string, opts ...ListCallOption) ([]*compute.MachineImage, error) { var is []*compute.MachineImage var pt string call := c.raw.MachineImages.List(project) for _, opt := range opts { call = opt.listCallOptionApply(call).(*compute.MachineImagesListCall) } for il, err := call.PageToken(pt).Do(); ; il, err = call.PageToken(pt).Do() { if shouldRetryWithWait(c.hc.Transport, err, 2) { il, err = call.PageToken(pt).Do() } if err != nil { return nil, err } is = append(is, il.Items...) if il.NextPageToken == "" { return is, nil } pt = il.NextPageToken } } // DeleteMachineImage deletes a GCE machine image. func (c *client) DeleteMachineImage(project, name string) error { op, err := c.Retry(c.raw.MachineImages.Delete(project, name).Do) if err != nil { return err } return c.i.globalOperationsWait(project, op.Name) } // CreateMachineImage creates a GCE machine image. // sourceInstance must be specified, which is the url (full or partial) to the // source instance func (c *client) CreateMachineImage(project string, mi *compute.MachineImage) error { op, err := c.Retry(c.raw.MachineImages.Insert(project, mi).Do) if err != nil { return err } if err := c.i.globalOperationsWait(project, op.Name); err != nil { return err } var createdMachineImage *compute.MachineImage if createdMachineImage, err = c.i.GetMachineImage(project, mi.Name); err != nil { return err } *mi = *createdMachineImage return nil } // GetMachineImage gets a GCE Machine Image. func (c *client) GetMachineImage(project, name string) (*compute.MachineImage, error) { i, err := c.raw.MachineImages.Get(project, name).Do() if shouldRetryWithWait(c.hc.Transport, err, 2) { return c.raw.MachineImages.Get(project, name).Do() } return i, err }