blob: 2a9e82e04eb198a6840d950b9a7dcc9e08f74291 [file] [log] [blame]
package clients
import (
"context"
"fmt"
"time"
compute "google.golang.org/api/compute/v1"
)
type ComputeInstance struct {
Name string
Zone string
Project string
Status string
CreationTime time.Time
}
type ComputeEngineClient struct {
service *compute.Service
}
func CreateComputeEngineClient() (*ComputeEngineClient, error) {
ctx := context.Background()
service, err := compute.NewService(ctx)
if err != nil {
return nil, err
}
return &ComputeEngineClient{service: service}, nil
}
func (c *ComputeEngineClient) GetAllInstances(projects []string) ([]*ComputeInstance, error) {
allInstances := make([]*ComputeInstance, 0)
for _, project := range projects {
projectInstances, err := c.getAllInstancesForProject(project)
if err != nil {
return nil, err
}
allInstances = append(allInstances, projectInstances...)
}
return allInstances, nil
}
func (c *ComputeEngineClient) getAllInstancesForProject(project string) ([]*ComputeInstance, error) {
instances := make([]*ComputeInstance, 0)
request := c.service.Instances.AggregatedList(project)
for {
response, err := request.Do()
if err != nil {
return nil, fmt.Errorf("Could not retrieve instances for project '%s': %v", project, err)
}
for zone, instanceList := range response.Items {
for _, instance := range instanceList.Instances {
creationTime, error := time.Parse(time.RFC3339, instance.CreationTimestamp)
if error != nil {
return nil, fmt.Errorf("Failed to parse creation time for instance %s/%s: %v", zone, instance.Name, err)
}
instances = append(instances, &ComputeInstance{Name: instance.Name, Zone: zone, Project: project, Status: instance.Status, CreationTime: creationTime})
}
}
if response.NextPageToken == "" {
break
} else {
request.PageToken(response.NextPageToken)
}
}
return instances, nil
}