Skip to content

Instantly share code, notes, and snippets.

@lubronzhan
Last active July 16, 2025 22:15
Show Gist options
  • Select an option

  • Save lubronzhan/12de2b98cae2fdf9471c0e8c27df6ae7 to your computer and use it in GitHub Desktop.

Select an option

Save lubronzhan/12de2b98cae2fdf9471c0e8c27df6ae7 to your computer and use it in GitHub Desktop.
Test attaaching disk
package main_test
import (
"context"
"fmt"
"testing"
"time"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/find"
"github.com/vmware/govmomi/simulator"
"github.com/vmware/govmomi/vim25/mo"
vimtypes "github.com/vmware/govmomi/vim25/types"
"github.com/vmware/govmomi/vslm"
vslmsimulator "github.com/vmware/govmomi/vslm/simulator"
)
func TestSimulator(t *testing.T) {
ctx := context.Background()
model := simulator.VPX()
defer model.Remove()
var err error
if err = model.Create(); err != nil {
t.Fatal(err)
}
s := model.Service.NewServer()
defer s.Close()
model.Service.RegisterSDK(vslmsimulator.New())
c, err := govmomi.NewClient(ctx, s.URL, true)
if err != nil {
t.Fatal(err)
}
vslmClient, err := vslm.NewClient(ctx, c.Client)
if err != nil {
t.Fatal(err)
}
finder := find.NewFinder(c.Client)
datastore, err := finder.DefaultDatastore(ctx)
if err != nil {
t.Fatal(err)
}
vcVM, err := finder.VirtualMachine(ctx, "DC0_C0_RP0_VM0")
if err != nil {
t.Fatal(err)
}
var moVM mo.VirtualMachine
err = vcVM.Properties(ctx, vcVM.Reference(), []string{"config.hardware.device"}, &moVM)
if err != nil {
t.Fatal(err)
}
// calculate devices before attaching disk
before := moVM.Config.Hardware.Device
fmt.Println(before)
m := vslm.NewGlobalObjectManager(vslmClient)
spec := vimtypes.VslmCreateSpec{
Name: "fcd",
CapacityInMB: 1024 * 1024,
BackingSpec: &vimtypes.VslmCreateSpecDiskFileBackingSpec{
VslmCreateSpecBackingSpec: vimtypes.VslmCreateSpecBackingSpec{
Datastore: datastore.Reference(),
},
},
}
task, err := m.CreateDisk(ctx, spec)
if err != nil {
t.Fatal(err)
}
disk, err := task.Wait(ctx, time.Hour)
if err != nil {
t.Fatal(err)
}
diskMo := disk.(vimtypes.VStorageObject)
fmt.Println("diskmo id", diskMo.Config.Id.Id)
// attach disk through vslm
task, err = m.AttachDisk(ctx, vimtypes.ID{Id: diskMo.Config.Id.Id}, moVM, 0, nil)
if err != nil {
t.Fatal(err)
}
_, err = task.Wait(ctx, time.Hour)
if err != nil {
t.Fatal(err)
}
// attach disk through vm
if err = vcVM.AttachDisk(ctx, diskMo.Config.Id.Id, datastore, 0, nil); err != nil {
t.Fatal(err)
}
// calculate devices after attaching disk
err = vcVM.Properties(ctx, vcVM.Reference(), []string{"config.hardware.device"}, &moVM)
if err != nil {
t.Fatal(err)
}
after := moVM.Config.Hardware.Device
fmt.Println(after)
if len(before) == len(after) {
fmt.Println("before::::::::::::::::")
for _, b := range before {
if vd, ok := b.(*vimtypes.VirtualDisk); ok {
printDisk(vd)
}
}
fmt.Println("after::::::::::::::::")
for _, a := range after {
if vd, ok := a.(*vimtypes.VirtualDisk); ok {
printDisk(vd)
}
}
t.Fatal("before and after should be different ")
}
}
func printDisk(vd *vimtypes.VirtualDisk) {
diskUUID := ""
fileName := ""
switch tb := vd.Backing.(type) {
case *vimtypes.VirtualDiskFlatVer2BackingInfo:
diskUUID = tb.Uuid
fileName = tb.FileName
case *vimtypes.VirtualDiskSeSparseBackingInfo:
diskUUID = tb.Uuid
fileName = tb.FileName
case *vimtypes.VirtualDiskRawDiskMappingVer1BackingInfo:
diskUUID = tb.Uuid
fileName = tb.FileName
case *vimtypes.VirtualDiskSparseVer2BackingInfo:
diskUUID = tb.Uuid
fileName = tb.FileName
case *vimtypes.VirtualDiskRawDiskVer2BackingInfo:
diskUUID = tb.Uuid
fileName = tb.DescriptorFileName
}
fmt.Println(diskUUID, fileName)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment