Merge pull request #233 from nathanleclaire/funccmds

Move closures to be named functions
This commit is contained in:
Evan Hazlett 2015-01-07 17:17:10 -08:00
commit 68c80b5ae6
1 changed files with 264 additions and 238 deletions

View File

@ -46,33 +46,9 @@ func (h hostListItemByName) Less(i, j int) bool {
var Commands = []cli.Command{ var Commands = []cli.Command{
{ {
Name: "active", Name: "active",
Usage: "Get or set the active machine", Usage: "Get or set the active machine",
Action: func(c *cli.Context) { Action: cmdActive,
name := c.Args().First()
store := NewStore(c.GlobalString("storage-path"))
if name == "" {
host, err := store.GetActive()
if err != nil {
log.Fatalf("error getting active host: %v", err)
}
if host != nil {
fmt.Println(host.Name)
}
} else if name != "" {
host, err := store.Load(name)
if err != nil {
log.Fatalf("error loading host: %v", err)
}
if err := store.SetActive(host); err != nil {
log.Fatalf("error setting active host: %v", err)
}
} else {
cli.ShowCommandHelp(c, "active")
}
},
}, },
{ {
Flags: append( Flags: append(
@ -86,71 +62,24 @@ var Commands = []cli.Command{
Value: "none", Value: "none",
}, },
), ),
Name: "create", Name: "create",
Usage: "Create a machine", Usage: "Create a machine",
Action: func(c *cli.Context) { Action: cmdCreate,
driver := c.String("driver")
name := c.Args().First()
if name == "" {
cli.ShowCommandHelp(c, "create")
log.Fatal("You must specify a machine name")
}
keyExists, err := drivers.PublicKeyExists()
if err != nil {
log.Fatal(err)
}
if !keyExists {
log.Fatalf("Identity authentication public key doesn't exist at %q. Create your public key by running the \"docker\" command.", drivers.PublicKeyPath())
}
store := NewStore(c.GlobalString("storage-path"))
host, err := store.Create(name, driver, c)
if err != nil {
log.Fatal(err)
}
if err := store.SetActive(host); err != nil {
log.Fatalf("error setting active host: %v", err)
}
log.Infof("%q has been created and is now the active machine. To point Docker at this machine, run: export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity", name)
},
}, },
{ {
Name: "inspect", Name: "inspect",
Usage: "Inspect information about a machine", Usage: "Inspect information about a machine",
Action: func(c *cli.Context) { Action: cmdInspect,
prettyJSON, err := json.MarshalIndent(getHost(c), "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(prettyJSON))
},
}, },
{ {
Name: "ip", Name: "ip",
Usage: "Get the IP address of a machine", Usage: "Get the IP address of a machine",
Action: func(c *cli.Context) { Action: cmdIp,
ip, err := getHost(c).Driver.GetIP()
if err != nil {
log.Fatal(err)
}
fmt.Println(ip)
},
}, },
{ {
Name: "kill", Name: "kill",
Usage: "Kill a machine", Usage: "Kill a machine",
Action: func(c *cli.Context) { Action: cmdKill,
if err := getHost(c).Driver.Kill(); err != nil {
log.Fatal(err)
}
},
}, },
{ {
Flags: []cli.Flag{ Flags: []cli.Flag{
@ -159,64 +88,14 @@ var Commands = []cli.Command{
Usage: "Enable quiet mode", Usage: "Enable quiet mode",
}, },
}, },
Name: "ls", Name: "ls",
Usage: "List machines", Usage: "List machines",
Action: func(c *cli.Context) { Action: cmdLs,
quiet := c.Bool("quiet")
store := NewStore(c.GlobalString("storage-path"))
hostList, err := store.List()
if err != nil {
log.Fatal(err)
}
w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0)
if !quiet {
fmt.Fprintln(w, "NAME\tACTIVE\tDRIVER\tSTATE\tURL")
}
items := []hostListItem{}
hostListItems := make(chan hostListItem)
for _, host := range hostList {
if !quiet {
go getHostState(host, *store, hostListItems)
} else {
fmt.Fprintf(w, "%s\n", host.Name)
}
}
if !quiet {
for i := 0; i < len(hostList); i++ {
items = append(items, <-hostListItems)
}
}
close(hostListItems)
sort.Sort(hostListItemByName(items))
for _, item := range items {
activeString := ""
if item.Active {
activeString = "*"
}
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n",
item.Name, activeString, item.DriverName, item.State, item.URL)
}
w.Flush()
},
}, },
{ {
Name: "restart", Name: "restart",
Usage: "Restart a machine", Usage: "Restart a machine",
Action: func(c *cli.Context) { Action: cmdRestart,
if err := getHost(c).Driver.Restart(); err != nil {
log.Fatal(err)
}
},
}, },
{ {
Flags: []cli.Flag{ Flags: []cli.Flag{
@ -225,29 +104,9 @@ var Commands = []cli.Command{
Usage: "Remove local configuration even if machine cannot be removed", Usage: "Remove local configuration even if machine cannot be removed",
}, },
}, },
Name: "rm", Name: "rm",
Usage: "Remove a machine", Usage: "Remove a machine",
Action: func(c *cli.Context) { Action: cmdRm,
if len(c.Args()) == 0 {
cli.ShowCommandHelp(c, "rm")
log.Fatal("You must specify a machine name")
}
force := c.Bool("force")
isError := false
store := NewStore(c.GlobalString("storage-path"))
for _, host := range c.Args() {
if err := store.Remove(host, force); err != nil {
log.Errorf("Error removing machine %s: %s", host, err)
isError = true
}
}
if isError {
log.Fatal("There was an error removing a machine. To force remove it, pass the -f option. Warning: this might leave it running on the provider.")
}
},
}, },
{ {
Flags: []cli.Flag{ Flags: []cli.Flag{
@ -257,88 +116,255 @@ var Commands = []cli.Command{
Value: "", Value: "",
}, },
}, },
Name: "ssh", Name: "ssh",
Usage: "Log into or run a command on a machine with SSH", Usage: "Log into or run a command on a machine with SSH",
Action: func(c *cli.Context) { Action: cmdSsh,
name := c.Args().First()
store := NewStore(c.GlobalString("storage-path"))
if name == "" {
host, err := store.GetActive()
if err != nil {
log.Fatalf("unable to get active host: %v", err)
}
name = host.Name
}
i := 1
for i < len(os.Args) && os.Args[i-1] != name {
i++
}
host, err := store.Load(name)
if err != nil {
log.Fatal(err)
}
var sshCmd *exec.Cmd
if c.String("command") == "" {
sshCmd, err = host.Driver.GetSSHCommand()
} else {
sshCmd, err = host.Driver.GetSSHCommand(c.String("command"))
}
if err != nil {
log.Fatal(err)
}
sshCmd.Stdin = os.Stdin
sshCmd.Stdout = os.Stdout
sshCmd.Stderr = os.Stderr
if err := sshCmd.Run(); err != nil {
log.Fatal(err)
}
},
}, },
{ {
Name: "start", Name: "start",
Usage: "Start a machine", Usage: "Start a machine",
Action: func(c *cli.Context) { Action: cmdStart,
if err := getHost(c).Start(); err != nil {
log.Fatal(err)
}
},
}, },
{ {
Name: "stop", Name: "stop",
Usage: "Stop a machine", Usage: "Stop a machine",
Action: func(c *cli.Context) { Action: cmdStop,
if err := getHost(c).Stop(); err != nil {
log.Fatal(err)
}
},
}, },
{ {
Name: "upgrade", Name: "upgrade",
Usage: "Upgrade a machine to the latest version of Docker", Usage: "Upgrade a machine to the latest version of Docker",
Action: func(c *cli.Context) { Action: cmdUpgrade,
if err := getHost(c).Upgrade(); err != nil {
log.Fatal(err)
}
},
}, },
{ {
Name: "url", Name: "url",
Usage: "Get the URL of a machine", Usage: "Get the URL of a machine",
Action: func(c *cli.Context) { Action: cmdUrl,
url, err := getHost(c).GetURL() },
if err != nil { }
log.Fatal(err)
}
fmt.Println(url) func cmdActive(c *cli.Context) {
}, name := c.Args().First()
}, store := NewStore(c.GlobalString("storage-path"))
if name == "" {
host, err := store.GetActive()
if err != nil {
log.Fatalf("error getting active host: %v", err)
}
if host != nil {
fmt.Println(host.Name)
}
} else if name != "" {
host, err := store.Load(name)
if err != nil {
log.Fatalf("error loading host: %v", err)
}
if err := store.SetActive(host); err != nil {
log.Fatalf("error setting active host: %v", err)
}
} else {
cli.ShowCommandHelp(c, "active")
}
}
func cmdCreate(c *cli.Context) {
driver := c.String("driver")
name := c.Args().First()
if name == "" {
cli.ShowCommandHelp(c, "create")
log.Fatal("You must specify a machine name")
}
keyExists, err := drivers.PublicKeyExists()
if err != nil {
log.Fatal(err)
}
if !keyExists {
log.Fatalf("Identity authentication public key doesn't exist at %q. Create your public key by running the \"docker\" command.", drivers.PublicKeyPath())
}
store := NewStore(c.GlobalString("storage-path"))
host, err := store.Create(name, driver, c)
if err != nil {
log.Fatal(err)
}
if err := store.SetActive(host); err != nil {
log.Fatalf("error setting active host: %v", err)
}
log.Infof("%q has been created and is now the active machine. To point Docker at this machine, run: export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity", name)
}
func cmdInspect(c *cli.Context) {
prettyJSON, err := json.MarshalIndent(getHost(c), "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(prettyJSON))
}
func cmdIp(c *cli.Context) {
ip, err := getHost(c).Driver.GetIP()
if err != nil {
log.Fatal(err)
}
fmt.Println(ip)
}
func cmdKill(c *cli.Context) {
if err := getHost(c).Driver.Kill(); err != nil {
log.Fatal(err)
}
}
func cmdLs(c *cli.Context) {
quiet := c.Bool("quiet")
store := NewStore(c.GlobalString("storage-path"))
hostList, err := store.List()
if err != nil {
log.Fatal(err)
}
w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0)
if !quiet {
fmt.Fprintln(w, "NAME\tACTIVE\tDRIVER\tSTATE\tURL")
}
items := []hostListItem{}
hostListItems := make(chan hostListItem)
for _, host := range hostList {
if !quiet {
go getHostState(host, *store, hostListItems)
} else {
fmt.Fprintf(w, "%s\n", host.Name)
}
}
if !quiet {
for i := 0; i < len(hostList); i++ {
items = append(items, <-hostListItems)
}
}
close(hostListItems)
sort.Sort(hostListItemByName(items))
for _, item := range items {
activeString := ""
if item.Active {
activeString = "*"
}
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n",
item.Name, activeString, item.DriverName, item.State, item.URL)
}
w.Flush()
}
func cmdRestart(c *cli.Context) {
if err := getHost(c).Driver.Restart(); err != nil {
log.Fatal(err)
}
}
func cmdRm(c *cli.Context) {
if len(c.Args()) == 0 {
cli.ShowCommandHelp(c, "rm")
log.Fatal("You must specify a machine name")
}
force := c.Bool("force")
isError := false
store := NewStore(c.GlobalString("storage-path"))
for _, host := range c.Args() {
if err := store.Remove(host, force); err != nil {
log.Errorf("Error removing machine %s: %s", host, err)
isError = true
}
}
if isError {
log.Fatal("There was an error removing a machine. To force remove it, pass the -f option. Warning: this might leave it running on the provider.")
}
}
func cmdSsh(c *cli.Context) {
name := c.Args().First()
store := NewStore(c.GlobalString("storage-path"))
if name == "" {
host, err := store.GetActive()
if err != nil {
log.Fatalf("unable to get active host: %v", err)
}
name = host.Name
}
i := 1
for i < len(os.Args) && os.Args[i-1] != name {
i++
}
host, err := store.Load(name)
if err != nil {
log.Fatal(err)
}
var sshCmd *exec.Cmd
if c.String("command") == "" {
sshCmd, err = host.Driver.GetSSHCommand()
} else {
sshCmd, err = host.Driver.GetSSHCommand(c.String("command"))
}
if err != nil {
log.Fatal(err)
}
sshCmd.Stdin = os.Stdin
sshCmd.Stdout = os.Stdout
sshCmd.Stderr = os.Stderr
if err := sshCmd.Run(); err != nil {
log.Fatal(err)
}
}
func cmdStart(c *cli.Context) {
if err := getHost(c).Start(); err != nil {
log.Fatal(err)
}
}
func cmdStop(c *cli.Context) {
if err := getHost(c).Stop(); err != nil {
log.Fatal(err)
}
}
func cmdUpgrade(c *cli.Context) {
if err := getHost(c).Upgrade(); err != nil {
log.Fatal(err)
}
}
func cmdUrl(c *cli.Context) {
url, err := getHost(c).GetURL()
if err != nil {
log.Fatal(err)
}
fmt.Println(url)
} }
func getHost(c *cli.Context) *Host { func getHost(c *cli.Context) *Host {