diff --git a/docs/drivers/hyper-v.md b/docs/drivers/hyper-v.md index e19f16033a..b664afacbc 100644 --- a/docs/drivers/hyper-v.md +++ b/docs/drivers/hyper-v.md @@ -31,13 +31,17 @@ Options: - `--hyperv-disk-size`: Size of disk for the host in MB. - `--hyperv-memory`: Size of memory for the host in MB. - `--hyperv-cpu-count`: Number of CPUs for the host. +- `--hyperv-static-macaddress`: Hyper-V network adapter's static MAC address. +- `--hyperv-vlan-id`: Hyper-V network adapter's VLAN ID if any. Environment variables and default values: -| CLI option | Environment variable | Default | -| -------------------------- | ------------------------ | ------------------------ | -| `--hyperv-boot2docker-url` | `HYPERV_BOOT2DOCKER_URL` | _Latest boot2docker url_ | -| `--hyperv-virtual-switch` | `HYPERV_VIRTUAL_SWITCH` | _first found_ | -| `--hyperv-disk-size` | `HYPERV_DISK_SIZE` | `20000` | -| `--hyperv-memory` | `HYPERV_MEMORY` | `1024` | -| `--hyperv-cpu-count` | `HYPERV_CPU_COUNT` | `1` | +| CLI option | Environment variable | Default | +| ---------------------------- | -------------------------- | ------------------------ | +| `--hyperv-boot2docker-url` | `HYPERV_BOOT2DOCKER_URL` | _Latest boot2docker url_ | +| `--hyperv-virtual-switch` | `HYPERV_VIRTUAL_SWITCH` | _first found_ | +| `--hyperv-disk-size` | `HYPERV_DISK_SIZE` | `20000` | +| `--hyperv-memory` | `HYPERV_MEMORY` | `1024` | +| `--hyperv-cpu-count` | `HYPERV_CPU_COUNT` | `1` | +| `--hyperv-static-macaddress` | `HYPERV_STATIC_MACADDRESS` | _undefined_ | +| `--hyperv-cpu-count` | `HYPERV_VLAN_ID` | _undefined_ | diff --git a/drivers/hyperv/hyperv.go b/drivers/hyperv/hyperv.go index e533b8eb59..8064b5106f 100644 --- a/drivers/hyperv/hyperv.go +++ b/drivers/hyperv/hyperv.go @@ -23,12 +23,15 @@ type Driver struct { DiskSize int MemSize int CPU int + MacAddr string + VLanID int } const ( defaultDiskSize = 20000 defaultMemory = 1024 defaultCPU = 1 + defaultVLanID = 0 ) // NewDriver creates a new Hyper-v driver with default settings. @@ -76,6 +79,17 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Value: defaultCPU, EnvVar: "HYPERV_CPU_COUNT", }, + mcnflag.StringFlag{ + Name: "hyperv-static-macaddress", + Usage: "Hyper-V network adapter's static MAC address.", + EnvVar: "HYPERV_STATIC_MACADDRESS", + }, + mcnflag.IntFlag{ + Name: "hyperv-vlan-id", + Usage: "Hyper-V network adapter's VLAN ID if any", + Value: defaultVLanID, + EnvVar: "HYPERV_VLAN_ID", + }, } } @@ -88,6 +102,8 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { d.DiskSize = flags.Int("hyperv-disk-size") d.MemSize = flags.Int("hyperv-memory") d.CPU = flags.Int("hyperv-cpu-count") + d.MacAddr = flags.String("hyperv-static-macaddress") + d.VLanID = flags.Int("hyperv-vlan-id") d.SSHUser = "docker" d.SetSwarmConfigFromFlags(flags) @@ -213,6 +229,23 @@ func (d *Driver) Create() error { } } + if d.MacAddr != "" { + if err := cmd("Set-VMNetworkAdapter", + "-VMName", d.MachineName, + "-StaticMacAddress", fmt.Sprintf("\"%s\"", d.MacAddr)); err != nil { + return err + } + } + + if d.VLanID > 0 { + if err := cmd("Set-VMNetworkAdapterVlan", + "-VMName", d.MachineName, + "-Access", + "-VlanId", fmt.Sprintf("%d", d.VLanID)); err != nil { + return err + } + } + if err := cmd("Set-VMDvdDrive", "-VMName", d.MachineName, "-Path", quote(d.ResolveStorePath("boot2docker.iso"))); err != nil { diff --git a/drivers/hyperv/hyperv_test.go b/drivers/hyperv/hyperv_test.go index ab4659594b..d4d833ee7d 100644 --- a/drivers/hyperv/hyperv_test.go +++ b/drivers/hyperv/hyperv_test.go @@ -28,6 +28,8 @@ func TestSetConfigFromDefaultFlags(t *testing.T) { assert.Equal(t, defaultDiskSize, driver.DiskSize) assert.Equal(t, defaultMemory, driver.MemSize) assert.Equal(t, defaultCPU, driver.CPU) + assert.Equal(t, "", driver.MacAddr) + assert.Equal(t, defaultVLanID, driver.VLanID) assert.Equal(t, "docker", driver.GetSSHUsername()) } @@ -36,11 +38,13 @@ func TestSetConfigFromCustomFlags(t *testing.T) { checkFlags := &drivers.CheckDriverOptions{ FlagsValues: map[string]interface{}{ - "hyperv-boot2docker-url": "B2D_URL", - "hyperv-virtual-switch": "TheSwitch", - "hyperv-disk-size": 100000, - "hyperv-memory": 4096, - "hyperv-cpu-count": 4, + "hyperv-boot2docker-url": "B2D_URL", + "hyperv-virtual-switch": "TheSwitch", + "hyperv-disk-size": 100000, + "hyperv-memory": 4096, + "hyperv-cpu-count": 4, + "hyperv-static-macaddress": "00:0a:95:9d:68:16", + "hyperv-vlan-id": 2, }, CreateFlags: driver.GetCreateFlags(), } @@ -58,5 +62,7 @@ func TestSetConfigFromCustomFlags(t *testing.T) { assert.Equal(t, 100000, driver.DiskSize) assert.Equal(t, 4096, driver.MemSize) assert.Equal(t, 4, driver.CPU) + assert.Equal(t, "00:0a:95:9d:68:16", driver.MacAddr) + assert.Equal(t, 2, driver.VLanID) assert.Equal(t, "docker", driver.GetSSHUsername()) }