github.com/vmware/govmomi@v0.51.0/vim25/mo/retrieve_test.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package mo 6 7 import ( 8 "os" 9 "testing" 10 "time" 11 12 "github.com/vmware/govmomi/fault" 13 "github.com/vmware/govmomi/vim25/soap" 14 "github.com/vmware/govmomi/vim25/types" 15 "github.com/vmware/govmomi/vim25/xml" 16 ) 17 18 func load(name string) []types.ObjectContent { 19 f, err := os.Open(name) 20 if err != nil { 21 panic(err) 22 } 23 24 defer f.Close() 25 26 var b types.RetrievePropertiesResponse 27 28 dec := xml.NewDecoder(f) 29 dec.TypeFunc = types.TypeFunc() 30 if err := dec.Decode(&b); err != nil { 31 panic(err) 32 } 33 34 return b.Returnval 35 } 36 37 func TestNotAuthenticatedFault(t *testing.T) { 38 var s SessionManager 39 40 err := LoadObjectContent(load("fixtures/not_authenticated_fault.xml"), &s) 41 if !soap.IsVimFault(err) { 42 t.Errorf("Expected IsVimFault") 43 } 44 45 var not *types.NotAuthenticated 46 fault.As(err, ¬) 47 if not.PrivilegeId != "System.View" { 48 t.Errorf("Expected first fault to be returned") 49 } 50 } 51 52 func TestNestedProperty(t *testing.T) { 53 var vm VirtualMachine 54 55 err := LoadObjectContent(load("fixtures/nested_property.xml"), &vm) 56 if err != nil { 57 t.Fatalf("Expected no error, got: %s", err) 58 } 59 60 self := types.ManagedObjectReference{ 61 Type: "VirtualMachine", 62 Value: "vm-411", 63 } 64 65 if vm.Self != self { 66 t.Fatalf("Expected vm.Self to be set") 67 } 68 69 if vm.Config == nil { 70 t.Fatalf("Expected vm.Config to be set") 71 } 72 73 if vm.Config.Name != "kubernetes-master" { 74 t.Errorf("Got: %s", vm.Config.Name) 75 } 76 77 if vm.Config.Uuid != "422ec880-ab06-06b4-23f3-beb7a052a4c9" { 78 t.Errorf("Got: %s", vm.Config.Uuid) 79 } 80 } 81 82 func TestPointerProperty(t *testing.T) { 83 var vm VirtualMachine 84 85 err := LoadObjectContent(load("fixtures/pointer_property.xml"), &vm) 86 if err != nil { 87 t.Fatalf("Expected no error, got: %s", err) 88 } 89 90 if vm.Config == nil { 91 t.Fatalf("Expected vm.Config to be set") 92 } 93 94 if vm.Config.BootOptions == nil { 95 t.Fatalf("Expected vm.Config.BootOptions to be set") 96 } 97 } 98 99 func TestEmbeddedTypeProperty(t *testing.T) { 100 // Test that we avoid in this case: 101 // panic: reflect.Set: value of type mo.ClusterComputeResource is not assignable to type mo.ComputeResource 102 var cr ComputeResource 103 104 err := LoadObjectContent(load("fixtures/cluster_host_property.xml"), &cr) 105 if err != nil { 106 t.Fatalf("Expected no error, got: %s", err) 107 } 108 109 if len(cr.Host) != 4 { 110 t.Fatalf("Expected cr.Host to be set") 111 } 112 } 113 114 func TestEmbeddedTypePropertySlice(t *testing.T) { 115 var me []ManagedEntity 116 117 err := LoadObjectContent(load("fixtures/hostsystem_list_name_property.xml"), &me) 118 if err != nil { 119 t.Fatalf("Expected no error, got: %s", err) 120 } 121 122 if len(me) != 2 { 123 t.Fatalf("Expected 2 elements") 124 } 125 126 for _, m := range me { 127 if m.Name == "" { 128 t.Fatal("Expected Name field to be set") 129 } 130 } 131 132 if me[0].Name == me[1].Name { 133 t.Fatal("Name fields should not be the same") 134 } 135 } 136 137 func TestReferences(t *testing.T) { 138 var cr ComputeResource 139 140 err := LoadObjectContent(load("fixtures/cluster_host_property.xml"), &cr) 141 if err != nil { 142 t.Fatalf("Expected no error, got: %s", err) 143 } 144 145 refs := References(cr) 146 n := len(refs) 147 if n != 5 { 148 t.Errorf("%d refs", n) 149 } 150 } 151 152 func TestEventReferences(t *testing.T) { 153 event := &types.VmPoweredOnEvent{ 154 VmEvent: types.VmEvent{ 155 Event: types.Event{ 156 Key: 0, 157 ChainId: 0, 158 CreatedTime: time.Now(), 159 UserName: "", 160 Datacenter: &types.DatacenterEventArgument{ 161 EntityEventArgument: types.EntityEventArgument{ 162 EventArgument: types.EventArgument{}, 163 Name: "DC0", 164 }, 165 Datacenter: types.ManagedObjectReference{Type: "Datacenter", Value: "datacenter-2"}, 166 }, 167 ComputeResource: &types.ComputeResourceEventArgument{ 168 EntityEventArgument: types.EntityEventArgument{ 169 EventArgument: types.EventArgument{}, 170 Name: "DC0_C0", 171 }, 172 ComputeResource: types.ManagedObjectReference{Type: "ClusterComputeResource", Value: "clustercomputeresource-26"}, 173 }, 174 Host: &types.HostEventArgument{ 175 EntityEventArgument: types.EntityEventArgument{ 176 EventArgument: types.EventArgument{}, 177 Name: "DC0_C0_H0", 178 }, 179 Host: types.ManagedObjectReference{Type: "HostSystem", Value: "host-32"}, 180 }, 181 Vm: &types.VmEventArgument{ 182 EntityEventArgument: types.EntityEventArgument{ 183 EventArgument: types.EventArgument{}, 184 Name: "DC0_C0_RP0_VM1", 185 }, 186 Vm: types.ManagedObjectReference{Type: "VirtualMachine", Value: "vm-62"}, 187 }, 188 Ds: (*types.DatastoreEventArgument)(nil), 189 Net: (*types.NetworkEventArgument)(nil), 190 Dvs: (*types.DvsEventArgument)(nil), 191 FullFormattedMessage: "", 192 ChangeTag: "", 193 }, 194 Template: false, 195 }, 196 } 197 198 refs := References(event, true) 199 n := len(refs) 200 if n != 4 { 201 t.Errorf("%d refs", n) 202 } 203 } 204 205 func TestDatastoreInfoURL(t *testing.T) { 206 // Datastore.Info is types.BaseDatastoreInfo 207 // LoadObjectContent() should populate Info with the base type (*types.DatastoreInfo) in this case 208 content := []types.ObjectContent{ 209 { 210 Obj: types.ManagedObjectReference{Type: "Datastore", Value: "datastore-48", ServerGUID: ""}, 211 PropSet: []types.DynamicProperty{ 212 { 213 Name: "info.url", 214 Val: "ds:///vmfs/volumes/666d7a79-cb0d28b2-57c8-0645602e1b58/", 215 }, 216 { 217 Name: "info.name", 218 Val: "foo", 219 }, 220 }, 221 MissingSet: nil, 222 }, 223 } 224 225 var ds Datastore 226 227 if err := LoadObjectContent(content, &ds); err != nil { 228 t.Fatal(err) 229 } 230 231 info := ds.Info.GetDatastoreInfo() 232 233 if info.Url != content[0].PropSet[0].Val.(string) { 234 t.Errorf("info.url=%s", info.Url) 235 } 236 237 if info.Name != content[0].PropSet[1].Val.(string) { 238 t.Errorf("info.name=%s", info.Name) 239 } 240 } 241 242 func TestIgnoreMissingProperty(t *testing.T) { 243 // subset of RetrievePropertiesEx response, see ignoreMissingProperty() 244 content := []types.ObjectContent{{ 245 Obj: types.ManagedObjectReference{Type: "ResourcePool", Value: "ha-root-pool"}, 246 PropSet: []types.DynamicProperty{{ 247 Name: "config", 248 Val: types.ResourceConfigSpec{ 249 CpuAllocation: types.ResourceAllocationInfo{ 250 Reservation: types.NewInt64(5585), 251 Limit: types.NewInt64(5585), 252 }, 253 MemoryAllocation: types.ResourceAllocationInfo{ 254 Reservation: types.NewInt64(13652), 255 Limit: types.NewInt64(13652), 256 }, 257 }, 258 }}, 259 MissingSet: []types.MissingProperty{ 260 { 261 Path: "resourceConfigSpecDetailed", 262 Fault: types.LocalizedMethodFault{ 263 Fault: &types.SystemError{ 264 Reason: "unexpected error reading property", 265 }, 266 }, 267 }, 268 }, 269 }} 270 271 var pool ResourcePool 272 273 if err := LoadObjectContent(content, &pool); err != nil { 274 t.Fatal(err) 275 } 276 }