Allow hyper-v driver to be used from non admin accounts and clean up the fixed disk after convertion.

Signed-off-by: James Nord <jnord@cloudbees.com>
This commit is contained in:
James Nord 2016-03-09 13:06:50 +00:00
parent b800a93f5e
commit a5da41de6e
2 changed files with 23 additions and 13 deletions

View File

@ -428,8 +428,19 @@ func (d *Driver) generateDiskImage() (string, error) {
diskImage := d.ResolveStorePath("disk.vhd") diskImage := d.ResolveStorePath("disk.vhd")
fixed := d.ResolveStorePath("fixed.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") 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 return "", err
} }
@ -451,12 +462,14 @@ func (d *Driver) generateDiskImage() (string, error) {
} }
file.Close() 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 return "", err
} }
if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil { if isWindowsAdmin {
return "", err if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
return "", err
}
} }
return diskImage, nil return diskImage, nil

View File

@ -69,20 +69,16 @@ func hypervAvailable() error {
} }
func isAdministrator() (bool, error) { func isAdministrator() (bool, error) {
var hypervAdmin bool hypervAdmin := isHypervAdministrator()
var windowsAdmin bool
var windowsErr error
hypervAdmin = isHypervAdministrator() if hypervAdmin {
if hypervAdmin == true {
return true, nil return true, nil
} }
windowsAdmin, windowsErr = isWindowsAdministrator() windowsAdmin, err := isWindowsAdministrator()
if windowsErr != nil { if err != nil {
return false, windowsErr return false, err
} }
return windowsAdmin, nil return windowsAdmin, nil
@ -91,6 +87,7 @@ func isAdministrator() (bool, error) {
func isHypervAdministrator() bool { func isHypervAdministrator() bool {
stdout, err := cmdOut(`@([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Hyper-V Administrators")`) stdout, err := cmdOut(`@([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Hyper-V Administrators")`)
if err != nil { if err != nil {
log.Debug(err)
return false return false
} }