| package main |
| |
| import ( |
| "bytes" |
| "context" |
| "flag" |
| "fmt" |
| "os" |
| "strings" |
| |
| "go.skia.org/infra/go/exec" |
| ) |
| |
| var ( |
| project = flag.String("project", "", "[REQUIRED] The GCP project to analyze usage for.") |
| displayBytes = flag.Bool("display_bytes", false, "Show the results in bytes, not in human readable form.") |
| ) |
| |
| func main() { |
| flag.Parse() |
| if *project == "" { |
| fmt.Println("--project is required") |
| flag.PrintDefaults() |
| os.Exit(1) |
| } |
| |
| fmt.Println("Fetching buckets in project") |
| output := bytes.Buffer{} |
| err := exec.Run(context.Background(), &exec.Command{ |
| Name: "gsutil", |
| Args: []string{"ls", "-p", *project}, |
| Stdout: &output, |
| }) |
| if err != nil { |
| fmt.Printf("Could not retrieve buckets: %s\n", err) |
| os.Exit(1) |
| } |
| |
| buckets := strings.Split(strings.TrimSpace(output.String()), "\n") |
| fmt.Printf("Found %d buckets\n", len(buckets)) |
| fmt.Println("Tabulating total space, this may take tens of seconds for big buckets") |
| |
| flags := "-hs" |
| if *displayBytes { |
| flags = "-s" |
| } |
| |
| // Do them one at a time to show incremental progress, as large |
| // buckets can take >10s to tabulate. |
| for _, b := range buckets { |
| output := bytes.Buffer{} |
| // GCS buckets must be uniquely named, so no need to specify a project. |
| err := exec.Run(context.Background(), &exec.Command{ |
| Name: "gsutil", |
| Args: []string{"du", flags, b}, |
| Stdout: &output, |
| }) |
| if err != nil { |
| fmt.Printf("Could not get size for bucket %s: %s\n", b, err) |
| continue |
| } |
| fmt.Println(strings.TrimSpace(output.String())) |
| } |
| fmt.Println("Done") |
| } |