mirror of
https://github.com/containers/podman.git
synced 2025-08-06 11:32:07 +08:00
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package hypervctl
|
|
|
|
import (
|
|
"github.com/containers/libhvee/pkg/wmiext"
|
|
)
|
|
|
|
const SyntheticDiskDriveType = "Microsoft:Hyper-V:Synthetic Disk Drive"
|
|
|
|
type SyntheticDiskDriveSettings struct {
|
|
ResourceSettings
|
|
systemSettings *SystemSettings
|
|
controllerSettings *ScsiControllerSettings
|
|
}
|
|
|
|
type diskAssociation interface {
|
|
setParent(parent string)
|
|
setHostResource(resource []string)
|
|
Path() string
|
|
}
|
|
|
|
func (d *SyntheticDiskDriveSettings) DefineVirtualHardDisk(vhdxFile string, beforeAdd func(*VirtualHardDiskStorageSettings)) (*VirtualHardDiskStorageSettings, error) {
|
|
vhd := &VirtualHardDiskStorageSettings{}
|
|
|
|
var cb func()
|
|
if beforeAdd != nil {
|
|
cb = func() {
|
|
beforeAdd(vhd)
|
|
}
|
|
}
|
|
|
|
if err := createDiskResourceInternal(d.systemSettings.Path(), d.Path(), vhdxFile, vhd, VirtualHardDiskType, cb); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
vhd.driveSettings = d
|
|
vhd.systemSettings = d.systemSettings
|
|
return vhd, nil
|
|
}
|
|
|
|
func createDiskResourceInternal(systemPath string, drivePath string, file string, settings diskAssociation, resourceType string, cb func()) error {
|
|
var service *wmiext.Service
|
|
var err error
|
|
if service, err = NewLocalHyperVService(); err != nil {
|
|
return err
|
|
}
|
|
defer service.Close()
|
|
|
|
if err = populateDefaults(resourceType, settings); err != nil {
|
|
return err
|
|
}
|
|
|
|
settings.setHostResource([]string{file})
|
|
settings.setParent(drivePath)
|
|
if cb != nil {
|
|
cb()
|
|
}
|
|
|
|
diskResource, err := createResourceSettingGeneric(settings, resourceType)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
path, err := addResource(service, systemPath, diskResource)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return service.GetObjectAsObject(path, settings)
|
|
}
|