drivers/hyperv/hyperv.go
func (d *Driver) generateDiskImage() (string, error) {
	diskImage := d.ResolveStorePath("disk.vhd")
	fixed := d.ResolveStorePath("fixed.vhd")

	// Resizing vhds requires administrator privileges
	// 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("Hyper-V\\New-VHD", "-Path", quote(fixed), "-SizeBytes", fixedDiskSize, "-Fixed"); err != nil {
		return "", err
	}

	tarBuf, err := mcnutils.MakeDiskImage(d.publicSSHKeyPath())
	if err != nil {
		return "", err
	}

	file, err := os.OpenFile(fixed, os.O_WRONLY, 0644)
	if err != nil {
		return "", err
	}
	defer file.Close()

	file.Seek(0, os.SEEK_SET)
	_, err = file.Write(tarBuf.Bytes())
	if err != nil {
		return "", err
	}
	file.Close()

	if err := cmd("Hyper-V\\Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic", "-DeleteSource"); err != nil {
		return "", err
	}

	if isWindowsAdmin {
		if err := cmd("Hyper-V\\Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
			return "", err
		}
	}

	return diskImage, nil
}
func (d *Driver) generateDiskImage() (string, error) {
	diskImage := d.ResolveStorePath("disk.vhd")
	fixed := d.ResolveStorePath("fixed.vhd")

	// Resizing vhds requires administrator privileges
	// 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("Hyper-V\\New-VHD", "-Path", quote(fixed), "-SizeBytes", fixedDiskSize, "-Fixed"); err != nil {
		return "", err
	}

	tarBuf, err := mcnutils.MakeDiskImage(d.publicSSHKeyPath())
	if err != nil {
		return "", err
	}

	file, err := os.OpenFile(fixed, os.O_WRONLY, 0644)
	if err != nil {
		return "", err
	}
	defer file.Close()

	file.Seek(0, os.SEEK_SET)
	_, err = file.Write(tarBuf.Bytes())
	if err != nil {
		return "", err
	}
	file.Close()

	if err := cmd("Hyper-V\\Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic", "-DeleteSource"); err != nil {
		return "", err
	}

	if isWindowsAdmin {
		if err := cmd("Hyper-V\\Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
			return "", err
		}
	}

	return diskImage, nil
}
func ( d * Driver ) generateDiskImage ( ) ( string , error ) { diskImage := d . ResolveStorePath ( " " ) fixed := d . ResolveStorePath ( " " ) // Resizing vhds requires administrator privileges // 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 := " " if ! isWindowsAdmin { fixedDiskSize = toMb ( d . DiskSize ) } log . Infof ( " " ) if err := cmd ( " \\ " , " " , quote ( fixed ) , " " , fixedDiskSize , " " ) ; err != nil { return " " , err } tarBuf , err := mcnutils . MakeDiskImage ( d . publicSSHKeyPath ( ) ) if err != nil { return " " , err } file , err := os . OpenFile ( fixed , os . O_WRONLY , 0644 ) if err != nil { return " " , err } defer file . Close ( ) file . Seek ( 0 , os . SEEK_SET ) _ , err = file . Write ( tarBuf . Bytes ( ) ) if err != nil { return " " , err } file . Close ( ) if err := cmd ( " \\ " , " " , quote ( fixed ) , " " , quote ( diskImage ) , " " , " " , " " ) ; err != nil { return " " , err } if isWindowsAdmin { if err := cmd ( " \\ " , " " , quote ( diskImage ) , " " , toMb ( d . DiskSize ) ) ; err != nil { return " " , err } } return diskImage , nil }
// generateDiskImage creates a small fixed vhd, put the tar in, convert to dynamic, then resize
generateDiskImage creates a small fixed vhd put the tar in convert to dynamic then resize