diff --git a/builder/hyperv/common/step_configure_vlan.go b/builder/hyperv/common/step_configure_vlan.go index cd0b34169..bfd24b490 100644 --- a/builder/hyperv/common/step_configure_vlan.go +++ b/builder/hyperv/common/step_configure_vlan.go @@ -6,12 +6,14 @@ package common import ( "fmt" + "github.com/mitchellh/multistep" "github.com/mitchellh/packer/packer" ) type StepConfigureVlan struct { - VlanID string + VlanId string + SwitchVlanId string } func (s *StepConfigureVlan) Run(state multistep.StateBag) multistep.StepAction { @@ -21,30 +23,29 @@ func (s *StepConfigureVlan) Run(state multistep.StateBag) multistep.StepAction { errorMsg := "Error configuring vlan: %s" vmName := state.Get("vmName").(string) switchName := state.Get("SwitchName").(string) + vlanId := s.VlanId + switchVlanId := s.SwitchVlanId ui.Say("Configuring vlan...") - vlanId := s.VlanID - - if vlanId == "" { - // If no vlan ID is specified, do not enable Virtual LAN Identification - return multistep.ActionContinue + if switchVlanId != "" { + err := driver.SetNetworkAdapterVlanId(switchName, vlanId) + if err != nil { + err := fmt.Errorf(errorMsg, err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } } - err := driver.SetNetworkAdapterVlanId(switchName, vlanId) - if err != nil { - err := fmt.Errorf(errorMsg, err) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt - } - - err = driver.SetVirtualMachineVlanId(vmName, vlanId) - if err != nil { - err := fmt.Errorf(errorMsg, err) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt + if vlanId != "" { + err := driver.SetVirtualMachineVlanId(vmName, vlanId) + if err != nil { + err := fmt.Errorf(errorMsg, err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } } return multistep.ActionContinue diff --git a/builder/hyperv/iso/builder.go b/builder/hyperv/iso/builder.go index 162e3c915..ac390eba1 100644 --- a/builder/hyperv/iso/builder.go +++ b/builder/hyperv/iso/builder.go @@ -87,7 +87,8 @@ type Config struct { BootCommand []string `mapstructure:"boot_command"` SwitchName string `mapstructure:"switch_name"` - VlandID string `mapstructure:"vlan_id"` + SwitchVlanId string `mapstructure:"switch_vlan_id"` + VlanId string `mapstructure:"vlan_id"` Cpu uint `mapstructure:"cpu"` Generation uint `mapstructure:"generation"` EnableMacSpoofing bool `mapstructure:"enable_mac_spoofing"` @@ -272,6 +273,13 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { } } + if b.config.SwitchVlanId != "" { + if b.config.SwitchVlanId != b.config.VlanId { + warning = fmt.Sprintf("Switch network adaptor vlan should match virtual machine network adaptor vlan. The switch will not be able to see traffic from the VM.") + warnings = appendWarnings(warnings, warning) + } + } + if errs != nil && len(errs.Errors) > 0 { return warnings, errs } @@ -354,9 +362,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe IsoPaths: b.config.SecondaryDvdImages, Generation: b.config.Generation, }, - + &hypervcommon.StepConfigureVlan{ - VlanID: b.config.VlandID, + VlanId: b.config.VlanId, + SwitchVlanId: b.config.SwitchVlanId, }, &hypervcommon.StepRun{ diff --git a/website/source/docs/builders/hyperv-iso.html.markdown b/website/source/docs/builders/hyperv-iso.html.markdown index 0148c518d..062f6bd79 100644 --- a/website/source/docs/builders/hyperv-iso.html.markdown +++ b/website/source/docs/builders/hyperv-iso.html.markdown @@ -186,7 +186,15 @@ can be configured for this builder. this to an empty string, Packer will try to determine the switch to use by looking for external switch that is up and running. -- `vm_name` (string) - This is the name of the virtua machine for the new virtual +- `switch_vlan_id` (string) - This is the vlan of the virtual switch's network card. + By default none is set. If none is set then a vlan is not set on the switch's network card. + If this value is set it should match the vlan specified in by `vlan_id`. + +- `vlan_id` (string) - This is the vlan of the virtual machine's network card for the new virtual + machine. By default none is set. If none is set then vlans are not set on the virtual machine's + network card. + +- `vm_name` (string) - This is the name of the virtual machine for the new virtual machine, without the file extension. By default this is "packer-BUILDNAME", where "BUILDNAME" is the name of the build.