Advertisement
Guest User

Untitled

a guest
Jun 15th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. // Bob Lee
  2. package main
  3.  
  4. import (
  5. "flag"
  6. "fmt"
  7. "log"
  8.  
  9. "golang.org/x/net/context"
  10. "golang.org/x/oauth2"
  11. "golang.org/x/oauth2/google"
  12. cloudresourcemanager "google.golang.org/api/cloudresourcemanager/v1"
  13. "google.golang.org/api/compute/v1"
  14. )
  15.  
  16. // DebugOutout turn on or off debugging
  17. var DebugOutput = false
  18.  
  19. // getInstanceInfo get instances in a project that for all zones that match the pattern
  20. func getInstanceInfo(project string, zonefilter string, filter string) error {
  21. ctx := context.Background()
  22.  
  23. c, err := google.DefaultClient(ctx, compute.CloudPlatformScope)
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27.  
  28. computeService, err := compute.New(c)
  29. if err != nil {
  30. log.Fatal(err)
  31. }
  32.  
  33. zones, err := lookupZones(computeService, project, zonefilter)
  34. if err != nil {
  35. log.Fatal(err)
  36. }
  37.  
  38. if DebugOutput {
  39. fmt.Printf("[DEBUG] Found zones %v\n", zones)
  40. }
  41.  
  42. for _, zone := range zones {
  43. err := OutputInstanceInfo(computeService, project, zone, filter)
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. }
  48. return nil
  49. }
  50.  
  51. // lookupProjects retrieves the projects that the user has access to and filters them.
  52. func lookupProjects(filter string) ([]string, error) {
  53. var projects []string
  54. ctx := context.Background()
  55.  
  56. cr, err := google.DefaultClient(ctx, cloudresourcemanager.CloudPlatformScope)
  57. if err != nil {
  58. log.Fatal(err)
  59. }
  60.  
  61. cloudresourcemanagerService, err := cloudresourcemanager.New(cr)
  62. if err != nil {
  63. log.Fatal(err)
  64. }
  65.  
  66. call := cloudresourcemanagerService.Projects.List()
  67. if filter != "" {
  68. call = call.Filter("name:" + filter)
  69. }
  70.  
  71. if err := call.Pages(ctx, func(page *cloudresourcemanager.ListProjectsResponse) error {
  72. for _, project := range page.Projects {
  73. // Check that project exists
  74. resp, err := cloudresourcemanagerService.Projects.Get(project.Name).Context(ctx).Do()
  75. if err == nil && resp != nil {
  76. projects = append(projects, project.Name)
  77. }
  78. }
  79. return nil
  80. }); err != nil {
  81. log.Fatal(err)
  82. }
  83.  
  84. return projects, nil
  85. }
  86.  
  87. // OutputInstanceInfo outputs the instance info from the project and filters them.
  88. func OutputInstanceInfo(svc *compute.Service, project, zone string, filter string) error {
  89. call := svc.Instances.List(project, zone)
  90. if filter != "" {
  91. call = call.Filter(filter)
  92. }
  93. f := func(page *compute.InstanceList) error {
  94. for _, instance := range page.Items {
  95. // output instance name and ip
  96. s := fmt.Sprintf("%s %s", instance.Name, instance.NetworkInterfaces[0].NetworkIP)
  97. fmt.Println(s)
  98. }
  99. return nil
  100. }
  101. if err := call.Pages(oauth2.NoContext, f); err != nil {
  102. return err
  103. }
  104. return nil
  105. }
  106.  
  107. // lookupZones retrieves the zones of the project and filters them by pattern.
  108. func lookupZones(svc *compute.Service, project, pattern string) ([]string, error) {
  109. call := svc.Zones.List(project)
  110. if pattern != "" {
  111. call = call.Filter("name:" + pattern)
  112. }
  113.  
  114. var zones []string
  115. f := func(page *compute.ZoneList) error {
  116. for _, v := range page.Items {
  117. zones = append(zones, v.Name)
  118. }
  119. return nil
  120. }
  121.  
  122. if err := call.Pages(oauth2.NoContext, f); err != nil {
  123. return nil, err
  124. }
  125. return zones, nil
  126. }
  127.  
  128. func main() {
  129. projectFilterPtr := flag.String("projectfilter", "", "A filter expression that filters projects")
  130.  
  131. instanceFilterPtr := flag.String("instancefilter", "labels.mysql=server", "A filter expression that filters instances")
  132.  
  133. zoneFilterPtr := flag.String("zone", "us-central.*", "Regular expression for filtering zones, e.g. us-central1-.*, or us-(?west|east).*")
  134.  
  135. debugPtr := flag.Bool("debug", false, "Show debug output")
  136.  
  137. flag.Parse()
  138.  
  139. DebugOutput = *debugPtr
  140.  
  141. projects, err := lookupProjects(*projectFilterPtr)
  142. if err != nil {
  143. log.Fatal(err)
  144. }
  145.  
  146. if DebugOutput {
  147. fmt.Printf("[DEBUG] Found projects %v\n", projects)
  148. }
  149.  
  150. for _, project := range projects {
  151. err := getInstanceInfo(project, *zoneFilterPtr, *instanceFilterPtr)
  152. if err != nil {
  153. log.Fatal(err)
  154. }
  155. }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement