mirror of https://github.com/docker/docs.git
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:
parent
b800a93f5e
commit
a5da41de6e
|
@ -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,13 +462,15 @@ 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 isWindowsAdmin {
|
||||||
if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
|
if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return diskImage, nil
|
return diskImage, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue