Dvd drive creation will auto select the controller number and controller location. This fixes the bug of first generation machines not being able to add more then 1 dvd drive.
This commit is contained in:
parent
5f7290c6f8
commit
e636c3de3c
|
@ -1,9 +1,11 @@
|
||||||
package hyperv
|
package hyperv
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/mitchellh/packer/powershell"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/mitchellh/packer/powershell"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetHostAdapterIpAddressForSwitch(switchName string) (string, error) {
|
func GetHostAdapterIpAddressForSwitch(switchName string) (string, error) {
|
||||||
|
@ -54,58 +56,37 @@ $ip
|
||||||
func CreateDvdDrive(vmName string, isoPath string, generation uint) (uint, uint, error) {
|
func CreateDvdDrive(vmName string, isoPath string, generation uint) (uint, uint, error) {
|
||||||
var ps powershell.PowerShellCmd
|
var ps powershell.PowerShellCmd
|
||||||
var script string
|
var script string
|
||||||
var controllerNumber uint
|
|
||||||
controllerNumber = 0
|
|
||||||
if generation < 2 {
|
|
||||||
// get the controller number that the OS install disk is mounted on
|
|
||||||
// generation 1 requires dvd to be added to ide controller, generation 2 uses scsi for dvd drives
|
|
||||||
script = `
|
|
||||||
param([string]$vmName)
|
|
||||||
$dvdDrives = @(Get-VMDvdDrive -VMName $vmName)
|
|
||||||
$lastControllerNumber = $dvdDrives | Sort-Object ControllerNumber | Select-Object -Last 1 | %{$_.ControllerNumber}
|
|
||||||
if (!$lastControllerNumber) {
|
|
||||||
$lastControllerNumber = 0
|
|
||||||
} elseif (!$lastControllerNumber -or ($dvdDrives | ?{ $_.ControllerNumber -eq $lastControllerNumber} | measure).count -gt 1) {
|
|
||||||
$lastControllerNumber += 1
|
|
||||||
}
|
|
||||||
$lastControllerNumber
|
|
||||||
`
|
|
||||||
cmdOut, err := ps.Output(script, vmName)
|
|
||||||
if err != nil {
|
|
||||||
return 0, 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
controllerNumberTemp, err := strconv.ParseUint(strings.TrimSpace(cmdOut), 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
controllerNumber = uint(controllerNumberTemp)
|
|
||||||
|
|
||||||
if controllerNumber != 0 && controllerNumber != 1 {
|
|
||||||
//There are only 2 ide controllers, try to use the one the hdd is attached too
|
|
||||||
controllerNumber = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
script = `
|
script = `
|
||||||
param([string]$vmName, [string]$isoPath, [int]$controllerNumber)
|
param([string]$vmName, [string]$isoPath)
|
||||||
$dvdController = Add-VMDvdDrive -VMName $vmName -ControllerNumber $controllerNumber -path $isoPath -Passthru
|
$dvdController = Add-VMDvdDrive -VMName $vmName -path $isoPath -Passthru
|
||||||
$dvdController | Set-VMDvdDrive -path $null
|
$dvdController | Set-VMDvdDrive -path $null
|
||||||
$dvdController.ControllerLocation
|
$result = "$($dvdController.ControllerNumber),$($dvdController.ControllerLocation)"
|
||||||
|
$result
|
||||||
`
|
`
|
||||||
|
|
||||||
cmdOut, err := ps.Output(script, vmName, isoPath, strconv.FormatInt(int64(controllerNumber), 10))
|
cmdOut, err := ps.Output(script, vmName, isoPath)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdOutArray := strings.Split(cmdOut, ",")
|
||||||
|
if len(cmdOutArray) != 2 {
|
||||||
|
return 0, 0, errors.New("Did not return controller number and controller location")
|
||||||
|
}
|
||||||
|
|
||||||
|
controllerNumberTemp, err := strconv.ParseUint(strings.TrimSpace(cmdOutArray[0]), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
controllerNumber := uint(controllerNumberTemp)
|
||||||
|
|
||||||
|
controllerLocationTemp, err := strconv.ParseUint(strings.TrimSpace(cmdOutArray[1]), 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return controllerNumber, 0, err
|
return controllerNumber, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
controllerLocationTemp, err := strconv.ParseUint(strings.TrimSpace(cmdOut), 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return controllerNumber, 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
controllerLocation := uint(controllerLocationTemp)
|
controllerLocation := uint(controllerLocationTemp)
|
||||||
|
|
||||||
return controllerNumber, controllerLocation, err
|
return controllerNumber, controllerLocation, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue