From 71140cf47ce9714d93f2e2f8f10449fa357a3845 Mon Sep 17 00:00:00 2001 From: Dan Farrelly Date: Sat, 28 Mar 2015 20:04:17 -0400 Subject: [PATCH 1/3] Filter create command flags by driver Signed-off-by: Dan Farrelly --- commands.go | 89 ++++++++++++++++++++++++++++++---------------- drivers/drivers.go | 14 ++++++++ 2 files changed, 72 insertions(+), 31 deletions(-) diff --git a/commands.go b/commands.go index 7c93ecbd9f..be1e57f5ce 100644 --- a/commands.go +++ b/commands.go @@ -161,6 +161,40 @@ func setupCertificates(caCertPath, caKeyPath, clientCertPath, clientKeyPath stri return nil } +var CreateFlags = []cli.Flag{ + cli.StringFlag{ + Name: "driver, d", + Usage: fmt.Sprintf( + "Driver to create machine with. Available drivers: %s", + strings.Join(drivers.GetDriverNames(), ", "), + ), + Value: "none", + }, + cli.BoolFlag{ + Name: "swarm", + Usage: "Configure Machine with Swarm", + }, + cli.BoolFlag{ + Name: "swarm-master", + Usage: "Configure Machine to be a Swarm master", + }, + cli.StringFlag{ + Name: "swarm-discovery", + Usage: "Discovery service to use with Swarm", + Value: "", + }, + cli.StringFlag{ + Name: "swarm-host", + Usage: "ip/socket to listen on for Swarm master", + Value: "tcp://0.0.0.0:3376", + }, + cli.StringFlag{ + Name: "swarm-addr", + Usage: "addr to advertise for Swarm (default: detect and use the machine IP)", + Value: "", + }, +} + var Commands = []cli.Command{ { Name: "active", @@ -170,37 +204,7 @@ var Commands = []cli.Command{ { Flags: append( drivers.GetCreateFlags(), - cli.StringFlag{ - Name: "driver, d", - Usage: fmt.Sprintf( - "Driver to create machine with. Available drivers: %s", - strings.Join(drivers.GetDriverNames(), ", "), - ), - Value: "none", - }, - cli.BoolFlag{ - Name: "swarm", - Usage: "Configure Machine with Swarm", - }, - cli.BoolFlag{ - Name: "swarm-master", - Usage: "Configure Machine to be a Swarm master", - }, - cli.StringFlag{ - Name: "swarm-discovery", - Usage: "Discovery service to use with Swarm", - Value: "", - }, - cli.StringFlag{ - Name: "swarm-host", - Usage: "ip/socket to listen on for Swarm master", - Value: "tcp://0.0.0.0:3376", - }, - cli.StringFlag{ - Name: "swarm-addr", - Usage: "addr to advertise for Swarm (default: detect and use the machine IP)", - Value: "", - }, + CreateFlags..., ), Name: "create", Usage: "Create a machine", @@ -370,7 +374,30 @@ func cmdCreate(c *cli.Context) { name := c.Args().First() if name == "" { + + hasDriver := false + driverFlags, err := drivers.GetCreateFlagsForDriver(driver) + if err != nil { + log.Fatal(err) + } else { + hasDriver = true + } + + if hasDriver { + for i, cmd := range c.App.Commands { + if cmd.HasName("create") { + c.App.Commands[i].Flags = append( + driverFlags, + CreateFlags..., + ) + } + } + } + cli.ShowCommandHelp(c, "create") + if hasDriver { + fmt.Println("Run 'docker-machine create --help' for all options.\n") + } log.Fatal("You must specify a machine name") } diff --git a/drivers/drivers.go b/drivers/drivers.go index 46ad7eacdb..32f8dcd4a1 100644 --- a/drivers/drivers.go +++ b/drivers/drivers.go @@ -143,6 +143,20 @@ func GetCreateFlags() []cli.Flag { return flags } +func GetCreateFlagsForDriver(name string) ([]cli.Flag, error) { + + for driverName := range drivers { + if name == driverName { + driver := drivers[driverName] + flags := driver.GetCreateFlags() + sort.Sort(ByFlagName(flags)) + return flags, nil + } + } + + return nil, fmt.Errorf("Driver %s not found", name) +} + // GetDriverNames returns a slice of all registered driver names func GetDriverNames() []string { names := make([]string, 0, len(drivers)) From 379de3acec0baaf4f5effd49c04fc0d1fbe6eb27 Mon Sep 17 00:00:00 2001 From: Nathan LeClaire Date: Thu, 9 Apr 2015 17:17:10 -0700 Subject: [PATCH 2/3] Make nitpicky modifications Signed-off-by: Nathan LeClaire --- commands.go | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/commands.go b/commands.go index be1e57f5ce..01c82e2112 100644 --- a/commands.go +++ b/commands.go @@ -161,7 +161,7 @@ func setupCertificates(caCertPath, caKeyPath, clientCertPath, clientKeyPath stri return nil } -var CreateFlags = []cli.Flag{ +var sharedCreateFlags = []cli.Flag{ cli.StringFlag{ Name: "driver, d", Usage: fmt.Sprintf( @@ -204,7 +204,7 @@ var Commands = []cli.Command{ { Flags: append( drivers.GetCreateFlags(), - CreateFlags..., + sharedCreateFlags..., ), Name: "create", Usage: "Create a machine", @@ -369,35 +369,42 @@ func cmdActive(c *cli.Context) { } } +// If the user has specified a driver, they should not see the flags for all +// of the drivers in `docker-machine create`. This method replaces the 100+ +// create flags with only the ones applicable to the driver specified +func trimDriverFlags(driver string, cmds []cli.Command) ([]cli.Command, error) { + filteredCmds := cmds + driverFlags, err := drivers.GetCreateFlagsForDriver(driver) + if err != nil { + return nil, err + } + + for i, cmd := range cmds { + if cmd.HasName("create") { + filteredCmds[i].Flags = append(sharedCreateFlags, driverFlags...) + } + } + + return filteredCmds, nil +} + func cmdCreate(c *cli.Context) { + var ( + err error + ) driver := c.String("driver") name := c.Args().First() - if name == "" { - - hasDriver := false - driverFlags, err := drivers.GetCreateFlagsForDriver(driver) + // TODO: Not really a fan of "none" as the default driver... + if driver != "none" { + c.App.Commands, err = trimDriverFlags(driver, c.App.Commands) if err != nil { log.Fatal(err) - } else { - hasDriver = true - } - - if hasDriver { - for i, cmd := range c.App.Commands { - if cmd.HasName("create") { - c.App.Commands[i].Flags = append( - driverFlags, - CreateFlags..., - ) - } - } } + } + if name == "" { cli.ShowCommandHelp(c, "create") - if hasDriver { - fmt.Println("Run 'docker-machine create --help' for all options.\n") - } log.Fatal("You must specify a machine name") } From 2059647ccb4fa3895e31c6a7ee5e0cacc1d82a46 Mon Sep 17 00:00:00 2001 From: Nathan LeClaire Date: Fri, 10 Apr 2015 10:41:20 -0700 Subject: [PATCH 3/3] Fix ordering issue Signed-off-by: Nathan LeClaire --- commands.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands.go b/commands.go index 01c82e2112..e08b2e5d29 100644 --- a/commands.go +++ b/commands.go @@ -381,7 +381,7 @@ func trimDriverFlags(driver string, cmds []cli.Command) ([]cli.Command, error) { for i, cmd := range cmds { if cmd.HasName("create") { - filteredCmds[i].Flags = append(sharedCreateFlags, driverFlags...) + filteredCmds[i].Flags = append(driverFlags, sharedCreateFlags...) } }