github.com/vmware/govmomi@v0.37.1/vim25/types/helpers_test.go (about) 1 /* 2 Copyright (c) 2022 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 types 18 19 import ( 20 "testing" 21 22 "github.com/vmware/govmomi/vim25/xml" 23 ) 24 25 func TestVirtualMachineConfigInfoToConfigSpec(t *testing.T) { 26 testCases := []struct { 27 name string 28 conf VirtualMachineConfigInfo 29 spec VirtualMachineConfigSpec 30 fail bool 31 }{ 32 { 33 name: "default value", 34 conf: VirtualMachineConfigInfo{}, 35 spec: VirtualMachineConfigSpec{}, 36 }, 37 { 38 name: "matching names", 39 conf: VirtualMachineConfigInfo{ 40 Name: "Hello, world.", 41 }, 42 spec: VirtualMachineConfigSpec{ 43 Name: "Hello, world.", 44 }, 45 }, 46 { 47 name: "matching nics", 48 conf: VirtualMachineConfigInfo{ 49 Name: "Hello, world.", 50 Hardware: VirtualHardware{ 51 Device: []BaseVirtualDevice{ 52 &VirtualVmxnet3{ 53 VirtualVmxnet: VirtualVmxnet{ 54 VirtualEthernetCard: VirtualEthernetCard{ 55 VirtualDevice: VirtualDevice{ 56 Key: 3, 57 }, 58 MacAddress: "00:11:22:33:44:55:66:77", 59 }, 60 }, 61 }, 62 }, 63 }, 64 }, 65 spec: VirtualMachineConfigSpec{ 66 Name: "Hello, world.", 67 DeviceChange: []BaseVirtualDeviceConfigSpec{ 68 &VirtualDeviceConfigSpec{ 69 Operation: VirtualDeviceConfigSpecOperationAdd, 70 FileOperation: VirtualDeviceConfigSpecFileOperationCreate, 71 Device: &VirtualVmxnet3{ 72 VirtualVmxnet: VirtualVmxnet{ 73 VirtualEthernetCard: VirtualEthernetCard{ 74 VirtualDevice: VirtualDevice{ 75 Key: 3, 76 }, 77 MacAddress: "00:11:22:33:44:55:66:77", 78 }, 79 }, 80 }, 81 }, 82 }, 83 }, 84 }, 85 { 86 name: "nics with different mac addresses", 87 fail: true, 88 conf: VirtualMachineConfigInfo{ 89 Name: "Hello, world.", 90 Hardware: VirtualHardware{ 91 Device: []BaseVirtualDevice{ 92 &VirtualVmxnet3{ 93 VirtualVmxnet: VirtualVmxnet{ 94 VirtualEthernetCard: VirtualEthernetCard{ 95 VirtualDevice: VirtualDevice{ 96 Key: 3, 97 }, 98 MacAddress: "00:11:22:33:44:55:66:77", 99 }, 100 }, 101 }, 102 }, 103 }, 104 }, 105 spec: VirtualMachineConfigSpec{ 106 Name: "Hello, world.", 107 DeviceChange: []BaseVirtualDeviceConfigSpec{ 108 &VirtualDeviceConfigSpec{ 109 Operation: VirtualDeviceConfigSpecOperationAdd, 110 FileOperation: VirtualDeviceConfigSpecFileOperationCreate, 111 Device: &VirtualVmxnet3{ 112 VirtualVmxnet: VirtualVmxnet{ 113 VirtualEthernetCard: VirtualEthernetCard{ 114 VirtualDevice: VirtualDevice{ 115 Key: 3, 116 }, 117 MacAddress: "00:11:22:33:44:55:66:88", 118 }, 119 }, 120 }, 121 }, 122 }, 123 }, 124 }, 125 { 126 name: "vAppConfig", 127 conf: VirtualMachineConfigInfo{ 128 Name: "Hello, world.", 129 VAppConfig: &VmConfigInfo{ 130 InstallBootRequired: false, 131 IpAssignment: VAppIPAssignmentInfo{}, 132 Product: []VAppProductInfo{ 133 { 134 Key: 1, 135 Name: "P1", 136 }, 137 }, 138 }, 139 }, 140 spec: VirtualMachineConfigSpec{ 141 Name: "Hello, world.", 142 VAppConfig: &VmConfigSpec{ 143 InstallBootRequired: NewBool(false), 144 IpAssignment: &VAppIPAssignmentInfo{}, 145 Product: []VAppProductSpec{ 146 { 147 ArrayUpdateSpec: ArrayUpdateSpec{ 148 Operation: ArrayUpdateOperationAdd, 149 }, 150 Info: &VAppProductInfo{ 151 Key: 1, 152 Name: "P1", 153 }, 154 }, 155 }, 156 }, 157 }, 158 }, 159 { 160 name: "really big config", 161 conf: VirtualMachineConfigInfo{ 162 Name: "vm-001", 163 GuestId: "otherGuest", 164 Files: VirtualMachineFileInfo{VmPathName: "[datastore1]"}, 165 Hardware: VirtualHardware{ 166 NumCPU: 1, 167 MemoryMB: 128, 168 Device: []BaseVirtualDevice{ 169 &VirtualLsiLogicController{ 170 VirtualSCSIController: VirtualSCSIController{ 171 SharedBus: VirtualSCSISharingNoSharing, 172 VirtualController: VirtualController{ 173 BusNumber: 0, 174 VirtualDevice: VirtualDevice{ 175 Key: 1000, 176 }, 177 }, 178 }, 179 }, 180 &VirtualDisk{ 181 VirtualDevice: VirtualDevice{ 182 Key: 0, 183 ControllerKey: 1000, 184 UnitNumber: new(int32), // zero default value 185 Backing: &VirtualDiskFlatVer2BackingInfo{ 186 DiskMode: string(VirtualDiskModePersistent), 187 ThinProvisioned: NewBool(true), 188 VirtualDeviceFileBackingInfo: VirtualDeviceFileBackingInfo{ 189 FileName: "[datastore1]", 190 }, 191 }, 192 }, 193 CapacityInKB: 4000000, 194 }, 195 &VirtualE1000{ 196 VirtualEthernetCard: VirtualEthernetCard{ 197 VirtualDevice: VirtualDevice{ 198 Key: 0, 199 DeviceInfo: &Description{ 200 Label: "Network Adapter 1", 201 Summary: "VM Network", 202 }, 203 Backing: &VirtualEthernetCardNetworkBackingInfo{ 204 VirtualDeviceDeviceBackingInfo: VirtualDeviceDeviceBackingInfo{ 205 DeviceName: "VM Network", 206 }, 207 }, 208 }, 209 AddressType: string(VirtualEthernetCardMacTypeGenerated), 210 }, 211 }, 212 }, 213 }, 214 ExtraConfig: []BaseOptionValue{ 215 &OptionValue{Key: "bios.bootOrder", Value: "ethernet0"}, 216 }, 217 }, 218 spec: VirtualMachineConfigSpec{ 219 Name: "vm-001", 220 GuestId: "otherGuest", 221 Files: &VirtualMachineFileInfo{VmPathName: "[datastore1]"}, 222 NumCPUs: 1, 223 MemoryMB: 128, 224 DeviceChange: []BaseVirtualDeviceConfigSpec{ 225 &VirtualDeviceConfigSpec{ 226 Operation: VirtualDeviceConfigSpecOperationAdd, 227 FileOperation: VirtualDeviceConfigSpecFileOperationCreate, 228 Device: &VirtualLsiLogicController{VirtualSCSIController{ 229 SharedBus: VirtualSCSISharingNoSharing, 230 VirtualController: VirtualController{ 231 BusNumber: 0, 232 VirtualDevice: VirtualDevice{ 233 Key: 1000, 234 }, 235 }, 236 }}, 237 }, 238 &VirtualDeviceConfigSpec{ 239 Operation: VirtualDeviceConfigSpecOperationAdd, 240 FileOperation: VirtualDeviceConfigSpecFileOperationCreate, 241 Device: &VirtualDisk{ 242 VirtualDevice: VirtualDevice{ 243 Key: 0, 244 ControllerKey: 1000, 245 UnitNumber: new(int32), // zero default value 246 Backing: &VirtualDiskFlatVer2BackingInfo{ 247 DiskMode: string(VirtualDiskModePersistent), 248 ThinProvisioned: NewBool(true), 249 VirtualDeviceFileBackingInfo: VirtualDeviceFileBackingInfo{ 250 FileName: "[datastore1]", 251 }, 252 }, 253 }, 254 CapacityInKB: 4000000, 255 }, 256 }, 257 &VirtualDeviceConfigSpec{ 258 Operation: VirtualDeviceConfigSpecOperationAdd, 259 FileOperation: VirtualDeviceConfigSpecFileOperationCreate, 260 Device: &VirtualE1000{VirtualEthernetCard{ 261 VirtualDevice: VirtualDevice{ 262 Key: 0, 263 DeviceInfo: &Description{ 264 Label: "Network Adapter 1", 265 Summary: "VM Network", 266 }, 267 Backing: &VirtualEthernetCardNetworkBackingInfo{ 268 VirtualDeviceDeviceBackingInfo: VirtualDeviceDeviceBackingInfo{ 269 DeviceName: "VM Network", 270 }, 271 }, 272 }, 273 AddressType: string(VirtualEthernetCardMacTypeGenerated), 274 }}, 275 }, 276 }, 277 ExtraConfig: []BaseOptionValue{ 278 &OptionValue{Key: "bios.bootOrder", Value: "ethernet0"}, 279 }, 280 }, 281 }, 282 } 283 284 for i := range testCases { 285 tc := testCases[i] 286 t.Run(tc.name, func(t *testing.T) { 287 e, a := tc.spec, tc.conf.ToConfigSpec() 288 ed, err := xml.MarshalIndent(e, "", " ") 289 if err != nil { 290 t.Fatalf("failed to marshal expected ConfigSpec: %v", err) 291 } 292 ad, err := xml.MarshalIndent(a, "", " ") 293 if err != nil { 294 t.Fatalf("failed to marshal actual ConfigSpec: %v", err) 295 } 296 eds, ads := string(ed), string(ad) 297 if eds != ads && !tc.fail { 298 t.Errorf("unexpected error: \n\n"+ 299 "exp=%+v\n\nact=%+v\n\n"+ 300 "exp.s=%s\n\nact.s=%s\n\n", e, a, eds, ads) 301 } else if eds == ads && tc.fail { 302 t.Errorf("expected error did not occur: \n\n"+ 303 "exp=%+v\n\nact=%+v\n\n"+ 304 "exp.s=%s\n\nact.s=%s\n\n", e, a, eds, ads) 305 } 306 }) 307 } 308 }