Files
podman/vendor/github.com/containers/libhvee/pkg/hypervctl/resources_settings.go
Brent Baude 60d9f9b807 Update to libhvee 0.5.0
Signed-off-by: Brent Baude <bbaude@redhat.com>
2023-11-17 13:34:14 -06:00

136 lines
3.1 KiB
Go

//go:build windows
// +build windows
package hypervctl
import (
"errors"
"fmt"
"github.com/containers/libhvee/pkg/wmiext"
)
type ResourceSettings struct {
S__PATH string
InstanceID string // = "Microsoft:GUID\DeviceSpecificData"
Caption string
Description string
ElementName string
ResourceType uint16
OtherResourceType string
ResourceSubType string
PoolID string
ConsumerVisibility uint16
HostResource []string
AllocationUnits string
VirtualQuantity uint64
Reservation uint64
Limit uint64
Weight uint32
AutomaticAllocation bool
AutomaticDeallocation bool
Parent string
Connection []string
Address string
MappingBehavior uint16
AddressOnParent string
VirtualQuantityUnits string // = "count"
VirtualSystemIdentifiers []string // = { "GUID" }
}
func (s *ResourceSettings) setParent(parent string) {
s.Parent = parent
}
func (s *ResourceSettings) setAddressOnParent(address string) {
s.AddressOnParent = address
}
func (s *ResourceSettings) Path() string {
return s.S__PATH
}
func createResourceSettingGeneric(settings interface{}, resourceType string) (string, error) {
var service *wmiext.Service
var err error
if service, err = NewLocalHyperVService(); err != nil {
return "", err
}
ref, err := findResourceDefaults(service, resourceType)
if err != nil {
return "", err
}
resource, err := service.GetObject(ref)
if err != nil {
return "", err
}
defer resource.Close()
resource, err = resource.CloneInstance()
if err != nil {
return "", err
}
defer resource.Close()
if err = resource.PutAll(settings); err != nil {
return "", err
}
return resource.GetCimText(), nil
}
func populateDefaults(subType string, settings interface{}) error {
var service *wmiext.Service
var err error
if service, err = NewLocalHyperVService(); err != nil {
return err
}
defer service.Close()
ref, err := findResourceDefaults(service, subType)
if err != nil {
return err
}
return service.GetObjectAsObject(ref, settings)
}
func findResourceDefaults(service *wmiext.Service, subType string) (string, error) {
wql := fmt.Sprintf("SELECT * FROM Msvm_AllocationCapabilities WHERE ResourceSubType = '%s'", subType)
instance, err := service.FindFirstInstance(wql)
if err != nil {
return "", err
}
defer instance.Close()
path, err := instance.Path()
if err != nil {
return "", err
}
enum, err := service.ExecQuery(fmt.Sprintf("references of {%s} where ResultClass = Msvm_SettingsDefineCapabilities", path))
if err != nil {
return "", err
}
defer enum.Close()
for {
entry, err := enum.Next()
if err != nil {
return "", err
}
if entry == nil {
return "", errors.New("could not find settings definition for resource")
}
value, vErr := entry.GetAsUint("ValueRole")
ref, pErr := entry.GetAsString("PartComponent")
entry.Close()
if vErr == nil && pErr == nil && value == 0 {
return ref, nil
}
}
}