github.com/vmware/govmomi@v0.37.2/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  }