Skip to content

Commit a5da41d

Browse files
committed
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>
1 parent b800a93 commit a5da41d

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

drivers/hyperv/hyperv.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,19 @@ func (d *Driver) generateDiskImage() (string, error) {
428428
diskImage := d.ResolveStorePath("disk.vhd")
429429
fixed := d.ResolveStorePath("fixed.vhd")
430430

431+
// Resizing vhds requires administrator priviledges
432+
// incase the user is only a hyper-v admin then create the disk at the target size to avoid resizing.
433+
isWindowsAdmin, err := isWindowsAdministrator()
434+
if err != nil {
435+
return "", err
436+
}
437+
fixedDiskSize := "10MB"
438+
if !isWindowsAdmin {
439+
fixedDiskSize = toMb(d.DiskSize)
440+
}
441+
431442
log.Infof("Creating VHD")
432-
if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", "10MB", "-Fixed"); err != nil {
443+
if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", fixedDiskSize, "-Fixed"); err != nil {
433444
return "", err
434445
}
435446

@@ -451,12 +462,14 @@ func (d *Driver) generateDiskImage() (string, error) {
451462
}
452463
file.Close()
453464

454-
if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic"); err != nil {
465+
if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic", "-DeleteSource"); err != nil {
455466
return "", err
456467
}
457468

458-
if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
459-
return "", err
469+
if isWindowsAdmin {
470+
if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
471+
return "", err
472+
}
460473
}
461474

462475
return diskImage, nil

drivers/hyperv/powershell.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,16 @@ func hypervAvailable() error {
6969
}
7070

7171
func isAdministrator() (bool, error) {
72-
var hypervAdmin bool
73-
var windowsAdmin bool
74-
var windowsErr error
72+
hypervAdmin := isHypervAdministrator()
7573

76-
hypervAdmin = isHypervAdministrator()
77-
78-
if hypervAdmin == true {
74+
if hypervAdmin {
7975
return true, nil
8076
}
8177

82-
windowsAdmin, windowsErr = isWindowsAdministrator()
78+
windowsAdmin, err := isWindowsAdministrator()
8379

84-
if windowsErr != nil {
85-
return false, windowsErr
80+
if err != nil {
81+
return false, err
8682
}
8783

8884
return windowsAdmin, nil
@@ -91,6 +87,7 @@ func isAdministrator() (bool, error) {
9187
func isHypervAdministrator() bool {
9288
stdout, err := cmdOut(`@([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Hyper-V Administrators")`)
9389
if err != nil {
90+
log.Debug(err)
9491
return false
9592
}
9693

0 commit comments

Comments
 (0)