in testing/gimmeproj/main.go [123:194]
func submain() error {
ctx := context.Background()
usage := errors.New(`
Usage:
gimmeproj -project=[meta project ID] command
gimmeproj -project=[meta project ID] -output=list status
Commands:
lease [duration] Leases a project for a given duration. Prints the project ID to stdout.
done [project ID] Returns a project to the pool.
version Prints the version of gimmeproj.
Administrative commands:
pool-add [project ID] Adds a project to the pool.
pool-rm [project ID] Removes a project from the pool.
status Displays the current status of the meta project. Respects -output.
`)
if flag.Arg(0) == "version" {
fmt.Printf("gimmeproj %s@%s; built at %s\n", buildSource, version, buildDate)
return nil
}
if *metaProject == "" {
fmt.Fprintln(os.Stderr, "-project flag is required.")
return usage
}
if len(flag.Args()) == 0 {
fmt.Fprintln(os.Stderr, "Missing command.")
return usage
}
var err error
datastore, err = ds.NewClient(ctx, *metaProject)
if err != nil {
return fmt.Errorf("datastore.NewClient: %w", err)
}
switch flag.Arg(0) {
case "help":
fmt.Fprintln(os.Stderr, usage.Error())
return nil
case "lease":
// When leasing, keep trying until we reach our configured timeout
ctx, cancel := context.WithTimeout(ctx, *waitTime)
defer cancel()
for ctx.Err() == nil {
err := lease(ctx, flag.Arg(1))
if err == nil {
return err
} else if errors.Is(err, ErrNoProjects) {
log.Printf("Temporary error: %v\n", err)
time.Sleep(30 * time.Second)
} else {
return err
}
}
return ctx.Err()
case "pool-add":
return addToPool(ctx, flag.Arg(1))
case "pool-rm":
return removeFromPool(ctx, flag.Arg(1))
case "status":
return status(ctx)
case "done":
return done(ctx, flag.Arg(1))
}
fmt.Fprintln(os.Stderr, "Unknown command.")
return usage
}