Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Bob Lee
- package main
- import (
- "flag"
- "fmt"
- "log"
- "golang.org/x/net/context"
- "golang.org/x/oauth2"
- "golang.org/x/oauth2/google"
- cloudresourcemanager "google.golang.org/api/cloudresourcemanager/v1"
- "google.golang.org/api/compute/v1"
- )
- // DebugOutout turn on or off debugging
- var DebugOutput = false
- // getInstanceInfo get instances in a project that for all zones that match the pattern
- func getInstanceInfo(project string, zonefilter string, filter string) error {
- ctx := context.Background()
- c, err := google.DefaultClient(ctx, compute.CloudPlatformScope)
- if err != nil {
- log.Fatal(err)
- }
- computeService, err := compute.New(c)
- if err != nil {
- log.Fatal(err)
- }
- zones, err := lookupZones(computeService, project, zonefilter)
- if err != nil {
- log.Fatal(err)
- }
- if DebugOutput {
- fmt.Printf("[DEBUG] Found zones %v\n", zones)
- }
- for _, zone := range zones {
- err := OutputInstanceInfo(computeService, project, zone, filter)
- if err != nil {
- log.Fatal(err)
- }
- }
- return nil
- }
- // lookupProjects retrieves the projects that the user has access to and filters them.
- func lookupProjects(filter string) ([]string, error) {
- var projects []string
- ctx := context.Background()
- cr, err := google.DefaultClient(ctx, cloudresourcemanager.CloudPlatformScope)
- if err != nil {
- log.Fatal(err)
- }
- cloudresourcemanagerService, err := cloudresourcemanager.New(cr)
- if err != nil {
- log.Fatal(err)
- }
- call := cloudresourcemanagerService.Projects.List()
- if filter != "" {
- call = call.Filter("name:" + filter)
- }
- if err := call.Pages(ctx, func(page *cloudresourcemanager.ListProjectsResponse) error {
- for _, project := range page.Projects {
- // Check that project exists
- resp, err := cloudresourcemanagerService.Projects.Get(project.Name).Context(ctx).Do()
- if err == nil && resp != nil {
- projects = append(projects, project.Name)
- }
- }
- return nil
- }); err != nil {
- log.Fatal(err)
- }
- return projects, nil
- }
- // OutputInstanceInfo outputs the instance info from the project and filters them.
- func OutputInstanceInfo(svc *compute.Service, project, zone string, filter string) error {
- call := svc.Instances.List(project, zone)
- if filter != "" {
- call = call.Filter(filter)
- }
- f := func(page *compute.InstanceList) error {
- for _, instance := range page.Items {
- // output instance name and ip
- s := fmt.Sprintf("%s %s", instance.Name, instance.NetworkInterfaces[0].NetworkIP)
- fmt.Println(s)
- }
- return nil
- }
- if err := call.Pages(oauth2.NoContext, f); err != nil {
- return err
- }
- return nil
- }
- // lookupZones retrieves the zones of the project and filters them by pattern.
- func lookupZones(svc *compute.Service, project, pattern string) ([]string, error) {
- call := svc.Zones.List(project)
- if pattern != "" {
- call = call.Filter("name:" + pattern)
- }
- var zones []string
- f := func(page *compute.ZoneList) error {
- for _, v := range page.Items {
- zones = append(zones, v.Name)
- }
- return nil
- }
- if err := call.Pages(oauth2.NoContext, f); err != nil {
- return nil, err
- }
- return zones, nil
- }
- func main() {
- projectFilterPtr := flag.String("projectfilter", "", "A filter expression that filters projects")
- instanceFilterPtr := flag.String("instancefilter", "labels.mysql=server", "A filter expression that filters instances")
- zoneFilterPtr := flag.String("zone", "us-central.*", "Regular expression for filtering zones, e.g. us-central1-.*, or us-(?west|east).*")
- debugPtr := flag.Bool("debug", false, "Show debug output")
- flag.Parse()
- DebugOutput = *debugPtr
- projects, err := lookupProjects(*projectFilterPtr)
- if err != nil {
- log.Fatal(err)
- }
- if DebugOutput {
- fmt.Printf("[DEBUG] Found projects %v\n", projects)
- }
- for _, project := range projects {
- err := getInstanceInfo(project, *zoneFilterPtr, *instanceFilterPtr)
- if err != nil {
- log.Fatal(err)
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement