Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 1 | // Copyright 2015 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 5 | package main |
| 6 | |
| 7 | import ( |
| 8 | "flag" |
| 9 | "fmt" |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 10 | "os" |
| 11 | "sort" |
Brad Fitzpatrick | b35ba9f | 2015-01-19 20:53:34 -0800 | [diff] [blame] | 12 | "strings" |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 13 | |
Andrew Gerrand | fa8373a | 2015-01-21 17:25:37 +1100 | [diff] [blame] | 14 | "golang.org/x/build/dashboard" |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 15 | ) |
| 16 | |
Brad Fitzpatrick | 45156e8 | 2015-02-05 13:37:19 -0800 | [diff] [blame] | 17 | func vmTypes() (s []string) { |
Brad Fitzpatrick | 4ad4435 | 2015-02-23 09:14:46 -0800 | [diff] [blame] | 18 | for k := range dashboard.Builders { |
| 19 | s = append(s, k) |
Brad Fitzpatrick | 45156e8 | 2015-02-05 13:37:19 -0800 | [diff] [blame] | 20 | } |
| 21 | sort.Strings(s) |
| 22 | return |
| 23 | } |
| 24 | |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 25 | func create(args []string) error { |
| 26 | fs := flag.NewFlagSet("create", flag.ContinueOnError) |
Brad Fitzpatrick | 45156e8 | 2015-02-05 13:37:19 -0800 | [diff] [blame] | 27 | |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 28 | fs.Usage = func() { |
Andrew Gerrand | bf8575d | 2015-05-08 13:34:07 +1000 | [diff] [blame^] | 29 | fmt.Fprintln(os.Stderr, "create usage: gomote create [create-opts] <type>") |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 30 | fs.PrintDefaults() |
Andrew Gerrand | bf8575d | 2015-05-08 13:34:07 +1000 | [diff] [blame^] | 31 | fmt.Fprintln(os.Stderr, "\nValid types:") |
Brad Fitzpatrick | 45156e8 | 2015-02-05 13:37:19 -0800 | [diff] [blame] | 32 | for _, t := range vmTypes() { |
| 33 | fmt.Fprintf(os.Stderr, " * %s\n", t) |
| 34 | } |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 35 | os.Exit(1) |
| 36 | } |
Brad Fitzpatrick | 6a12af6 | 2015-07-19 10:26:22 -0700 | [diff] [blame] | 37 | // TODO(bradfitz): restore this option, and send it to the coordinator: |
| 38 | // For now, comment it out so it's not misleading. |
| 39 | // var timeout time.Duration |
| 40 | // fs.DurationVar(&timeout, "timeout", 60*time.Minute, "how long the VM will live before being deleted.") |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 41 | |
| 42 | fs.Parse(args) |
| 43 | if fs.NArg() != 1 { |
| 44 | fs.Usage() |
| 45 | } |
| 46 | builderType := fs.Arg(0) |
Brad Fitzpatrick | 4ad4435 | 2015-02-23 09:14:46 -0800 | [diff] [blame] | 47 | _, ok := dashboard.Builders[builderType] |
| 48 | if !ok { |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 49 | var valid []string |
Brad Fitzpatrick | b35ba9f | 2015-01-19 20:53:34 -0800 | [diff] [blame] | 50 | var prefixMatch []string |
Brad Fitzpatrick | 4ad4435 | 2015-02-23 09:14:46 -0800 | [diff] [blame] | 51 | for k := range dashboard.Builders { |
| 52 | valid = append(valid, k) |
| 53 | if strings.HasPrefix(k, builderType) { |
| 54 | prefixMatch = append(prefixMatch, k) |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 55 | } |
| 56 | } |
Brad Fitzpatrick | b35ba9f | 2015-01-19 20:53:34 -0800 | [diff] [blame] | 57 | if len(prefixMatch) == 1 { |
| 58 | builderType = prefixMatch[0] |
Brad Fitzpatrick | b35ba9f | 2015-01-19 20:53:34 -0800 | [diff] [blame] | 59 | } else { |
| 60 | sort.Strings(valid) |
| 61 | return fmt.Errorf("Invalid builder type %q. Valid options include: %q", builderType, valid) |
| 62 | } |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 63 | } |
| 64 | |
Brad Fitzpatrick | 6a12af6 | 2015-07-19 10:26:22 -0700 | [diff] [blame] | 65 | cc := coordinatorClient() |
| 66 | client, err := cc.CreateBuildlet(builderType) |
| 67 | if err != nil { |
| 68 | return fmt.Errorf("failed to create buildlet: %v", err) |
Andrew Gerrand | 51edd24 | 2015-03-05 15:56:40 +1100 | [diff] [blame] | 69 | } |
Brad Fitzpatrick | 6a12af6 | 2015-07-19 10:26:22 -0700 | [diff] [blame] | 70 | fmt.Println(client.RemoteName()) |
Brad Fitzpatrick | 874c083 | 2015-01-16 12:59:14 -0800 | [diff] [blame] | 71 | return nil |
| 72 | } |