Refactor Hyper-V for new CLI.

Signed-off-by: Jeff Mendoza <jeffmendoza@live.com>
This commit is contained in:
Jeff Mendoza 2014-12-19 11:52:54 -08:00 committed by Evan Hazlett
parent 1d10b7bfb5
commit 3265a38d0a
1 changed files with 49 additions and 36 deletions

View File

@ -13,7 +13,7 @@ import (
"time" "time"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
flag "github.com/docker/docker/pkg/mflag" "github.com/codegangsta/cli"
"github.com/docker/docker/utils" "github.com/docker/docker/utils"
"github.com/docker/machine/drivers" "github.com/docker/machine/drivers"
"github.com/docker/machine/ssh" "github.com/docker/machine/ssh"
@ -31,31 +31,49 @@ type Driver struct {
memSize int memSize int
} }
type CreateFlags struct {
boot2DockerURL *string
boot2DockerLoc *string
vSwitch *string
diskSize *int
memSize *int
}
func init() { func init() {
drivers.Register("hyper-v", &drivers.RegisteredDriver{ drivers.Register("hyper-v", &drivers.RegisteredDriver{
New: NewDriver, New: NewDriver,
RegisterCreateFlags: RegisterCreateFlags, GetCreateFlags: GetCreateFlags,
}) })
} }
// RegisterCreateFlags registers the flags this driver adds to // GetCreateFlags registers the flags this driver adds to
// "docker hosts create" // "docker hosts create"
func RegisterCreateFlags(cmd *flag.FlagSet) interface{} { func GetCreateFlags() []cli.Flag {
createFlags := new(CreateFlags) return []cli.Flag{
createFlags.boot2DockerURL = cmd.String([]string{"-hyper-v-boot2docker-url"}, "", "The URL of the boot2docker image. Defaults to the latest available version.") cli.StringFlag{
createFlags.boot2DockerLoc = cmd.String([]string{"-hyper-v-boot2docker-location"}, "", "Local boot2docker iso. Overrides URL.") Name: "hyper-v-boot2docker-url",
createFlags.vSwitch = cmd.String([]string{"-hyper-v-virtual-switch"}, "", "Name of virtual switch. Defaults to first found.") Usage: "The URL of the boot2docker image. Defaults to the latest available version.",
createFlags.diskSize = cmd.Int([]string{"-hyper-v-disk-size"}, 20000, "Size of disk for host in MB.") },
createFlags.memSize = cmd.Int([]string{"-hyper-v-memory"}, 1024, "Size of memory for host in MB.") cli.StringFlag{
return createFlags Name: "hyper-v-boot2docker-location",
Usage: "Local boot2docker iso. Overrides URL.",
},
cli.StringFlag{
Name: "hyper-v-virtual-switch",
Usage: "Name of virtual switch. Defaults to first found.",
},
cli.IntFlag{
Name: "hyper-v-disk-size",
Usage: "Size of disk for host in MB.",
Value: 20000,
},
cli.IntFlag{
Name: "hyper-v-memory",
Usage: "Size of memory for host in MB.",
Value: 1024,
},
}
}
func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
d.boot2DockerURL = flags.String("hyper-v-boot2docker-url")
d.boot2DockerLoc = flags.String("hyper-v-boot2docker-location")
d.vSwitch = flags.String("hyper-v-virtual-switch")
d.diskSize = flags.Int("hyper-v-disk-size")
d.memSize = flags.Int("hyper-v-memory")
return nil
} }
func NewDriver(storePath string) (drivers.Driver, error) { func NewDriver(storePath string) (drivers.Driver, error) {
@ -211,12 +229,20 @@ func (d *Driver) Create() error {
log.Infof("Adding key to authorized-keys.d...") log.Infof("Adding key to authorized-keys.d...")
cmd, err := d.GetSSHCommand("sudo chown -R docker /var/lib/docker/auth.d")
if err != nil {
return err
}
if err := cmd.Run(); err != nil {
return err
}
if err := drivers.AddPublicKeyToAuthorizedHosts(d, "/var/lib/docker/auth.d"); err != nil { if err := drivers.AddPublicKeyToAuthorizedHosts(d, "/var/lib/docker/auth.d"); err != nil {
return err return err
} }
log.Infof("Restart docker...") log.Infof("Restart docker...")
cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker restart") cmd, err = d.GetSSHCommand("sudo /etc/init.d/docker restart")
if err != nil { if err != nil {
return err return err
} }
@ -245,23 +271,10 @@ func (d *Driver) chooseVirtualSwitch() (string, error) {
return "", fmt.Errorf("no vswitch found") return "", fmt.Errorf("no vswitch found")
} }
func (d *Driver) SetConfigFromFlags(flagsInterface interface{}) error {
flags := flagsInterface.(*CreateFlags)
d.boot2DockerURL = *flags.boot2DockerURL
d.boot2DockerLoc = *flags.boot2DockerLoc
d.vSwitch = *flags.vSwitch
d.diskSize = *flags.diskSize
d.memSize = *flags.memSize
return nil
}
func (d *Driver) wait() error { func (d *Driver) wait() error {
log.Infof("Waiting for host to start...") log.Infof("Waiting for host to start...")
for { for {
ip, err := d.GetIP() ip, _ := d.GetIP()
if err != nil {
return err
}
if ip != "" { if ip != "" {
break break
} }
@ -384,7 +397,7 @@ func (d *Driver) GetIP() (string, error) {
func (d *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) { func (d *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) {
ip, err := d.GetIP() ip, err := d.GetIP()
if err != nil { if err != nil {
return "", err return nil, err
} }
return ssh.GetSSHCommand(ip, 22, "docker", d.sshKeyPath(), args...), nil return ssh.GetSSHCommand(ip, 22, "docker", d.sshKeyPath(), args...), nil
} }