| 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 | |
| } |