From a5da41de6e29ca728057a68940a79ffee985a91e Mon Sep 17 00:00:00 2001 From: James Nord Date: Wed, 9 Mar 2016 13:06:50 +0000 Subject: [PATCH] Allow hyper-v driver to be used from non admin accounts and clean up the fixed disk after convertion. Signed-off-by: James Nord --- drivers/hyperv/hyperv.go | 21 +++++++++++++++++---- drivers/hyperv/powershell.go | 15 ++++++--------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/drivers/hyperv/hyperv.go b/drivers/hyperv/hyperv.go index 8064b5106f..e67e043711 100644 --- a/drivers/hyperv/hyperv.go +++ b/drivers/hyperv/hyperv.go @@ -428,8 +428,19 @@ func (d *Driver) generateDiskImage() (string, error) { diskImage := d.ResolveStorePath("disk.vhd") fixed := d.ResolveStorePath("fixed.vhd") + // Resizing vhds requires administrator priviledges + // incase the user is only a hyper-v admin then create the disk at the target size to avoid resizing. + isWindowsAdmin, err := isWindowsAdministrator() + if err != nil { + return "", err + } + fixedDiskSize := "10MB" + if !isWindowsAdmin { + fixedDiskSize = toMb(d.DiskSize) + } + log.Infof("Creating VHD") - if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", "10MB", "-Fixed"); err != nil { + if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", fixedDiskSize, "-Fixed"); err != nil { return "", err } @@ -451,12 +462,14 @@ func (d *Driver) generateDiskImage() (string, error) { } file.Close() - if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic"); err != nil { + if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic", "-DeleteSource"); err != nil { return "", err } - if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil { - return "", err + if isWindowsAdmin { + if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil { + return "", err + } } return diskImage, nil diff --git a/drivers/hyperv/powershell.go b/drivers/hyperv/powershell.go index 888ee44747..b486cbad6e 100644 --- a/drivers/hyperv/powershell.go +++ b/drivers/hyperv/powershell.go @@ -69,20 +69,16 @@ func hypervAvailable() error { } func isAdministrator() (bool, error) { - var hypervAdmin bool - var windowsAdmin bool - var windowsErr error + hypervAdmin := isHypervAdministrator() - hypervAdmin = isHypervAdministrator() - - if hypervAdmin == true { + if hypervAdmin { return true, nil } - windowsAdmin, windowsErr = isWindowsAdministrator() + windowsAdmin, err := isWindowsAdministrator() - if windowsErr != nil { - return false, windowsErr + if err != nil { + return false, err } return windowsAdmin, nil @@ -91,6 +87,7 @@ func isAdministrator() (bool, error) { func isHypervAdministrator() bool { stdout, err := cmdOut(`@([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Hyper-V Administrators")`) if err != nil { + log.Debug(err) return false }