github.com/vmware/govmomi@v0.43.0/vim25/mo/retrieve_test.go (about) 1 /* 2 Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package mo 18 19 import ( 20 "os" 21 "testing" 22 "time" 23 24 "github.com/vmware/govmomi/vim25/soap" 25 "github.com/vmware/govmomi/vim25/types" 26 "github.com/vmware/govmomi/vim25/xml" 27 ) 28 29 func load(name string) []types.ObjectContent { 30 f, err := os.Open(name) 31 if err != nil { 32 panic(err) 33 } 34 35 defer f.Close() 36 37 var b types.RetrievePropertiesResponse 38 39 dec := xml.NewDecoder(f) 40 dec.TypeFunc = types.TypeFunc() 41 if err := dec.Decode(&b); err != nil { 42 panic(err) 43 } 44 45 return b.Returnval 46 } 47 48 func TestNotAuthenticatedFault(t *testing.T) { 49 var s SessionManager 50 51 err := LoadObjectContent(load("fixtures/not_authenticated_fault.xml"), &s) 52 if !soap.IsVimFault(err) { 53 t.Errorf("Expected IsVimFault") 54 } 55 56 fault := soap.ToVimFault(err).(*types.NotAuthenticated) 57 if fault.PrivilegeId != "System.View" { 58 t.Errorf("Expected first fault to be returned") 59 } 60 } 61 62 func TestNestedProperty(t *testing.T) { 63 var vm VirtualMachine 64 65 err := LoadObjectContent(load("fixtures/nested_property.xml"), &vm) 66 if err != nil { 67 t.Fatalf("Expected no error, got: %s", err) 68 } 69 70 self := types.ManagedObjectReference{ 71 Type: "VirtualMachine", 72 Value: "vm-411", 73 } 74 75 if vm.Self != self { 76 t.Fatalf("Expected vm.Self to be set") 77 } 78 79 if vm.Config == nil { 80 t.Fatalf("Expected vm.Config to be set") 81 } 82 83 if vm.Config.Name != "kubernetes-master" { 84 t.Errorf("Got: %s", vm.Config.Name) 85 } 86 87 if vm.Config.Uuid != "422ec880-ab06-06b4-23f3-beb7a052a4c9" { 88 t.Errorf("Got: %s", vm.Config.Uuid) 89 } 90 } 91 92 func TestPointerProperty(t *testing.T) { 93 var vm VirtualMachine 94 95 err := LoadObjectContent(load("fixtures/pointer_property.xml"), &vm) 96 if err != nil { 97 t.Fatalf("Expected no error, got: %s", err) 98 } 99 100 if vm.Config == nil { 101 t.Fatalf("Expected vm.Config to be set") 102 } 103 104 if vm.Config.BootOptions == nil { 105 t.Fatalf("Expected vm.Config.BootOptions to be set") 106 } 107 } 108 109 func TestEmbeddedTypeProperty(t *testing.T) { 110 // Test that we avoid in this case: 111 // panic: reflect.Set: value of type mo.ClusterComputeResource is not assignable to type mo.ComputeResource 112 var cr ComputeResource 113 114 err := LoadObjectContent(load("fixtures/cluster_host_property.xml"), &cr) 115 if err != nil { 116 t.Fatalf("Expected no error, got: %s", err) 117 } 118 119 if len(cr.Host) != 4 { 120 t.Fatalf("Expected cr.Host to be set") 121 } 122 } 123 124 func TestEmbeddedTypePropertySlice(t *testing.T) { 125 var me []ManagedEntity 126 127 err := LoadObjectContent(load("fixtures/hostsystem_list_name_property.xml"), &me) 128 if err != nil { 129 t.Fatalf("Expected no error, got: %s", err) 130 } 131 132 if len(me) != 2 { 133 t.Fatalf("Expected 2 elements") 134 } 135 136 for _, m := range me { 137 if m.Name == "" { 138 t.Fatal("Expected Name field to be set") 139 } 140 } 141 142 if me[0].Name == me[1].Name { 143 t.Fatal("Name fields should not be the same") 144 } 145 } 146 147 func TestReferences(t *testing.T) { 148 var cr ComputeResource 149 150 err := LoadObjectContent(load("fixtures/cluster_host_property.xml"), &cr) 151 if err != nil { 152 t.Fatalf("Expected no error, got: %s", err) 153 } 154 155 refs := References(cr) 156 n := len(refs) 157 if n != 5 { 158 t.Errorf("%d refs", n) 159 } 160 } 161 162 func TestEventReferences(t *testing.T) { 163 event := &types.VmPoweredOnEvent{ 164 VmEvent: types.VmEvent{ 165 Event: types.Event{ 166 Key: 0, 167 ChainId: 0, 168 CreatedTime: time.Now(), 169 UserName: "", 170 Datacenter: &types.DatacenterEventArgument{ 171 EntityEventArgument: types.EntityEventArgument{ 172 EventArgument: types.EventArgument{}, 173 Name: "DC0", 174 }, 175 Datacenter: types.ManagedObjectReference{Type: "Datacenter", Value: "datacenter-2"}, 176 }, 177 ComputeResource: &types.ComputeResourceEventArgument{ 178 EntityEventArgument: types.EntityEventArgument{ 179 EventArgument: types.EventArgument{}, 180 Name: "DC0_C0", 181 }, 182 ComputeResource: types.ManagedObjectReference{Type: "ClusterComputeResource", Value: "clustercomputeresource-26"}, 183 }, 184 Host: &types.HostEventArgument{ 185 EntityEventArgument: types.EntityEventArgument{ 186 EventArgument: types.EventArgument{}, 187 Name: "DC0_C0_H0", 188 }, 189 Host: types.ManagedObjectReference{Type: "HostSystem", Value: "host-32"}, 190 }, 191 Vm: &types.VmEventArgument{ 192 EntityEventArgument: types.EntityEventArgument{ 193 EventArgument: types.EventArgument{}, 194 Name: "DC0_C0_RP0_VM1", 195 }, 196 Vm: types.ManagedObjectReference{Type: "VirtualMachine", Value: "vm-62"}, 197 }, 198 Ds: (*types.DatastoreEventArgument)(nil), 199 Net: (*types.NetworkEventArgument)(nil), 200 Dvs: (*types.DvsEventArgument)(nil), 201 FullFormattedMessage: "", 202 ChangeTag: "", 203 }, 204 Template: false, 205 }, 206 } 207 208 refs := References(event, true) 209 n := len(refs) 210 if n != 4 { 211 t.Errorf("%d refs", n) 212 } 213 } 214 215 func TestDatastoreInfoURL(t *testing.T) { 216 // Datastore.Info is types.BaseDatastoreInfo 217 // LoadObjectContent() should populate Info with the base type (*types.DatastoreInfo) in this case 218 content := []types.ObjectContent{ 219 { 220 Obj: types.ManagedObjectReference{Type: "Datastore", Value: "datastore-48", ServerGUID: ""}, 221 PropSet: []types.DynamicProperty{ 222 { 223 Name: "info.url", 224 Val: "ds:///vmfs/volumes/666d7a79-cb0d28b2-57c8-0645602e1b58/", 225 }, 226 }, 227 MissingSet: nil, 228 }, 229 } 230 231 var ds Datastore 232 233 if err := LoadObjectContent(content, &ds); err != nil { 234 t.Fatal(err) 235 } 236 237 info := ds.Info.GetDatastoreInfo() 238 239 if info.Url != content[0].PropSet[0].Val.(string) { 240 t.Errorf("info.url=%s", info.Url) 241 } 242 }