Skip to content

Commit

Permalink
Merge pull request #89 from microsoft/user/pradipd/modifysettings
Browse files Browse the repository at this point in the history
Adding function to modify VM settings
  • Loading branch information
pradipd authored Mar 17, 2023
2 parents 6949ba5 + 3c875f3 commit 412f058
Show file tree
Hide file tree
Showing 2 changed files with 159 additions and 3 deletions.
54 changes: 54 additions & 0 deletions pkg/virtualization/core/service/virtualmachinemanagementservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -363,3 +363,57 @@ func (vmms *VirtualSystemManagementService) ModifyVirtualSystemFeature(data wmi.
}
return
}

func (vmms *VirtualSystemManagementService) ModifyVirtualSystemSettings(data *virtualsystem.VirtualSystemSettingData, timeoutSeconds int16) (err error) {

embeddedInstance, err := data.EmbeddedXMLInstance()
if err != nil {
return
}

method, err := vmms.GetWmiMethod("ModifySystemSettings")
if err != nil {
return
}
defer method.Close()

inparams := wmi.WmiMethodParamCollection{}
inparams = append(inparams, wmi.NewWmiMethodParam("SystemSettings", embeddedInstance))

outparams := wmi.WmiMethodParamCollection{wmi.NewWmiMethodParam("Job", nil)}

for {
result, err1 := method.Execute(inparams, outparams)
if err1 != nil {
err = err1
return
}

returnVal := result.ReturnValue
if returnVal != 0 && returnVal != 4096 {
// Virtual System is in Invalid State, try to retry
if returnVal == 32775 {
log.Printf("[WMI] Method [%s] failed with [%d]. Retrying ...", method.Name, returnVal)
time.Sleep(100 * time.Millisecond)
continue
}
err = errors.Wrapf(errors.Failed, "Method failed with [%d]", result.ReturnValue)
return
}

if result.ReturnValue == 0 {
return
}

val := result.OutMethodParams["Job"]
job, err1 := instance.GetWmiJob(vmms.GetWmiHost(), string(constant.Virtualization), val.Value.(string))
if err1 != nil {
err = err1
return
}
defer job.Close()
err = job.WaitForJobCompletion(result.ReturnValue, timeoutSeconds)
return
}
return
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import (
"github.com/microsoft/wmi/pkg/virtualization/core/virtualsystem"
vswitchservice "github.com/microsoft/wmi/pkg/virtualization/network/service"
"github.com/microsoft/wmi/pkg/virtualization/network/virtualswitch"
//v2 "github.com/microsoft/wmi/server2019/root/virtualization/v2"
"github.com/nwoodmsft/iso9660"
//v2 "github.com/microsoft/wmi/server2019/root/virtualization/v2"
)

var (
Expand Down Expand Up @@ -684,7 +684,7 @@ func TestAddRemoveVirtualHardDisk(t *testing.T) {
defer os.RemoveAll(path)
t.Logf("Created vhd [%s]", path)

vhd, vhddrive, err := vmms.AttachVirtualHardDisk(vm, path)
vhd, vhddrive, err := vmms.AttachVirtualHardDisk(vm, path, virtualsystem.VirtualHardDiskType_DATADISK_VIRTUALHARDDISK)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
Expand Down Expand Up @@ -753,7 +753,7 @@ func TestAddRemoveVirtualHardDiskGen1(t *testing.T) {
defer os.RemoveAll(path)
t.Logf("Created vhd [%s]", path)

vhd, vhddrive, err := vmms.AttachVirtualHardDisk(vm, path)
vhd, vhddrive, err := vmms.AttachVirtualHardDisk(vm, path, virtualsystem.VirtualHardDiskType_DATADISK_VIRTUALHARDDISK)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
Expand Down Expand Up @@ -1266,3 +1266,105 @@ func TestAddRemoveGpuDdaGen1(t *testing.T) {
}
t.Logf("Detached GPU-DDA from [%s] VMs", "testGen1")
}

func TestModifyVirtualMachineSystemSettings(t *testing.T) {
vmms, err := GetVirtualSystemManagementService(whost)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
vm, err := vmms.GetVirtualMachineByName("test")
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
defer vm.Close()
t.Logf("Found [%s] VMs", "test")

// Get the original value
setting, err := vm.GetVirtualSystemSettingData()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
valBefore, err := setting.GetPropertyGuestControlledCacheTypes()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
t.Logf("Settings before change: %v", valBefore)

// Invert the setting
err = setting.SetPropertyGuestControlledCacheTypes(!valBefore)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
// Modify the VM settings
err = vmms.ModifyVirtualSystemSettings(setting, -1)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}

// Get the new value
setting, err = vm.GetVirtualSystemSettingData()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
valAfter, err := setting.GetPropertyGuestControlledCacheTypes()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
t.Logf("Settings after change: %v", valAfter)

if valBefore == valAfter {
t.Fatalf("Settings did not change after ModifyVirtualMachineSystemSettings(): before:%v after: %v", valBefore, valAfter)
}
t.Logf("Successfully changes vm setting from %v to %v", valBefore, valAfter)
}

func TestModifyVirtualMachineSystemSettingsGen1(t *testing.T) {
vmms, err := GetVirtualSystemManagementService(whost)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
vm, err := vmms.GetVirtualMachineByName("testGen1")
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
defer vm.Close()
t.Logf("Found [%s] VMs", "testGen1")

// Get the original value
setting, err := vm.GetVirtualSystemSettingData()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
valBefore, err := setting.GetPropertyGuestControlledCacheTypes()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
t.Logf("Settings before change: %v", valBefore)

// Invert the setting
err = setting.SetPropertyGuestControlledCacheTypes(!valBefore)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
// Modify the VM settings
err = vmms.ModifyVirtualSystemSettings(setting, -1)
if err != nil {
t.Fatalf("Failed [%+v]", err)
}

// Get the new value
setting, err = vm.GetVirtualSystemSettingData()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
valAfter, err := setting.GetPropertyGuestControlledCacheTypes()
if err != nil {
t.Fatalf("Failed [%+v]", err)
}
t.Logf("Settings after change: %v", valAfter)

if valBefore == valAfter {
t.Fatalf("Settings did not change after ModifyVirtualMachineSystemSettings(): before:%v after: %v", valBefore, valAfter)
}
t.Logf("Successfully changes vm setting from %v to %v", valBefore, valAfter)
}

0 comments on commit 412f058

Please sign in to comment.