Skip to content

Commit b2bde00

Browse files
committedDec 11, 2024·
api: Update OVF ToConfigSpec to handled unknown types
This patch updates the ToConfigSpec function in the `ovf` package to handle unknown resource types and subtypes. There is now a strict option that may be used to return errors on unknown types/subtypes, otherwise they are ignored. Signed-off-by: akutz <akutz@vmware.com>
1 parent a958b25 commit b2bde00

9 files changed

+1452
-495
lines changed
 

‎object/virtual_device_list.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ func (l VirtualDeviceList) FindCdrom(name string) (*types.VirtualCdrom, error) {
661661
}
662662

663663
// CreateCdrom creates a new VirtualCdrom device which can be added to a VM.
664-
func (l VirtualDeviceList) CreateCdrom(c *types.VirtualIDEController) (*types.VirtualCdrom, error) {
664+
func (l VirtualDeviceList) CreateCdrom(c types.BaseVirtualController) (*types.VirtualCdrom, error) {
665665
device := &types.VirtualCdrom{}
666666

667667
l.AssignController(device, c)

‎ovf/configspec.go

+202-104
Large diffs are not rendered by default.

‎ovf/configspec_test.go

+453-388
Large diffs are not rendered by default.

‎ovf/fixtures/haproxy-vsphere.ovf ‎ovf/fixtures/configspec.ovf

+8
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,14 @@
258258
<rasd:ResourceSubType>vmware.usb.xhci</rasd:ResourceSubType>
259259
<vmw:Config ovf:required="false" vmw:key="autoConnectDevices" vmw:value="true"/>
260260
</Item>
261+
<Item ovf:required="false">
262+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
263+
<rasd:ElementName>serial0</rasd:ElementName>
264+
<rasd:InstanceID>24</rasd:InstanceID>
265+
<rasd:ResourceSubType>vmware.serialport.device</rasd:ResourceSubType>
266+
<rasd:ResourceType>21</rasd:ResourceType>
267+
<vmw:Config ovf:required="false" vmw:key="yieldOnPoll" vmw:value="false" />
268+
</Item>
261269

262270
<vmw:Config ovf:required="false" vmw:key="cpuHotAddEnabled" vmw:value="false"/>
263271
<vmw:Config ovf:required="false" vmw:key="cpuHotRemoveEnabled" vmw:value="false"/>

‎ovf/fixtures/photon5.ovf

+491
Large diffs are not rendered by default.

‎ovf/fixtures/ubuntu24.10.ovf

+186
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Envelope xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3+
<References>
4+
<File ovf:href="ubuntu-oracular-24.10-cloudimg.vmdk" ovf:id="file1" ovf:size="595726336"/>
5+
</References>
6+
<DiskSection>
7+
<Info>Virtual disk information</Info>
8+
<Disk ovf:capacity="10737418240" ovf:capacityAllocationUnits="byte" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="0"/>
9+
</DiskSection>
10+
<NetworkSection>
11+
<Info>The list of logical networks</Info>
12+
<Network ovf:name="VM Network">
13+
<Description>The VM Network network</Description>
14+
</Network>
15+
</NetworkSection>
16+
<VirtualSystem ovf:id="ubuntu-oracular-24.10-cloudimg-20241109">
17+
<Info>A virtual machine</Info>
18+
<Name>ubuntu-oracular-24.10-cloudimg-20241109</Name>
19+
<OperatingSystemSection ovf:id="94" vmw:osType="ubuntu64Guest">
20+
<Info>The kind of installed guest operating system</Info>
21+
<Description>Ubuntu Linux (64-bit)</Description>
22+
</OperatingSystemSection>
23+
24+
<ProductSection ovf:required="false">
25+
<Info>Cloud-Init customization</Info>
26+
<Product>Ubuntu 24.10 Server (20241109)</Product>
27+
<Property ovf:key="instance-id" ovf:type="string" ovf:userConfigurable="true" ovf:value="id-ovf">
28+
<Label>A Unique Instance ID for this instance</Label>
29+
<Description>Specifies the instance id. This is required and used to determine if the machine should take "first boot" actions</Description>
30+
</Property>
31+
<Property ovf:key="hostname" ovf:type="string" ovf:userConfigurable="true" ovf:value="ubuntuguest">
32+
<Description>Specifies the hostname for the appliance</Description>
33+
</Property>
34+
<Property ovf:key="seedfrom" ovf:type="string" ovf:userConfigurable="true">
35+
<Label>Url to seed instance data from</Label>
36+
<Description>This field is optional, but indicates that the instance should 'seed' user-data and meta-data from the given url. If set to 'http://tinyurl.com/sm-' is given, meta-data will be pulled from http://tinyurl.com/sm-meta-data and user-data from http://tinyurl.com/sm-user-data. Leave this empty if you do not want to seed from a url.</Description>
37+
</Property>
38+
<Property ovf:key="public-keys" ovf:type="string" ovf:userConfigurable="true" ovf:value="">
39+
<Label>ssh public keys</Label>
40+
<Description>This field is optional, but indicates that the instance should populate the default user's 'authorized_keys' with this value</Description>
41+
</Property>
42+
<Property ovf:key="user-data" ovf:type="string" ovf:userConfigurable="true" ovf:value="">
43+
<Label>Encoded user-data</Label>
44+
<Description>In order to fit into a xml attribute, this value is base64 encoded . It will be decoded, and then processed normally as user-data.</Description>
45+
<!-- The following represents '#!/bin/sh\necho "hi world"'
46+
ovf:value="IyEvYmluL3NoCmVjaG8gImhpIHdvcmxkIgo="
47+
-->
48+
</Property>
49+
<Property ovf:key="password" ovf:type="string" ovf:userConfigurable="true" ovf:value="">
50+
<Label>Default User's password</Label>
51+
<Description>If set, the default user's password will be set to this value to allow password based login. The password will be good for only a single login. If set to the string 'RANDOM' then a random password will be generated, and written to the console.</Description>
52+
</Property>
53+
</ProductSection>
54+
55+
<VirtualHardwareSection ovf:transport="iso">
56+
<Info>Virtual hardware requirements</Info>
57+
<System>
58+
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
59+
<vssd:InstanceID>0</vssd:InstanceID>
60+
<vssd:VirtualSystemIdentifier>ubuntu-oracular-24.10-cloudimg-20241109</vssd:VirtualSystemIdentifier>
61+
<vssd:VirtualSystemType>vmx-10</vssd:VirtualSystemType>
62+
</System>
63+
<Item>
64+
<rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
65+
<rasd:Description>Number of Virtual CPUs</rasd:Description>
66+
<rasd:ElementName>2 virtual CPU(s)</rasd:ElementName>
67+
<rasd:InstanceID>1</rasd:InstanceID>
68+
<rasd:ResourceType>3</rasd:ResourceType>
69+
<rasd:VirtualQuantity>2</rasd:VirtualQuantity>
70+
</Item>
71+
<Item>
72+
<rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
73+
<rasd:Description>Memory Size</rasd:Description>
74+
<rasd:ElementName>1024MB of memory</rasd:ElementName>
75+
<rasd:InstanceID>2</rasd:InstanceID>
76+
<rasd:ResourceType>4</rasd:ResourceType>
77+
<rasd:VirtualQuantity>1024</rasd:VirtualQuantity>
78+
</Item>
79+
<Item>
80+
<rasd:Address>0</rasd:Address>
81+
<rasd:Description>SCSI Controller</rasd:Description>
82+
<rasd:ElementName>SCSI Controller 0</rasd:ElementName>
83+
<rasd:InstanceID>3</rasd:InstanceID>
84+
<rasd:ResourceSubType>VirtualSCSI</rasd:ResourceSubType>
85+
<rasd:ResourceType>6</rasd:ResourceType>
86+
</Item>
87+
<Item ovf:required="false">
88+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
89+
<rasd:ElementName>serial0</rasd:ElementName>
90+
<rasd:InstanceID>4</rasd:InstanceID>
91+
<rasd:ResourceSubType>vmware.serialport.device</rasd:ResourceSubType>
92+
<rasd:ResourceType>21</rasd:ResourceType>
93+
<vmw:Config ovf:required="false" vmw:key="yieldOnPoll" vmw:value="false" />
94+
</Item>
95+
<Item>
96+
<rasd:Address>1</rasd:Address>
97+
<rasd:Description>IDE Controller</rasd:Description>
98+
<rasd:ElementName>VirtualIDEController 1</rasd:ElementName>
99+
<rasd:InstanceID>5</rasd:InstanceID>
100+
<rasd:ResourceType>5</rasd:ResourceType>
101+
</Item>
102+
<Item>
103+
<rasd:Address>0</rasd:Address>
104+
<rasd:Description>IDE Controller</rasd:Description>
105+
<rasd:ElementName>VirtualIDEController 0</rasd:ElementName>
106+
<rasd:InstanceID>6</rasd:InstanceID>
107+
<rasd:ResourceType>5</rasd:ResourceType>
108+
</Item>
109+
<Item ovf:required="false">
110+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
111+
<rasd:ElementName>VirtualVideoCard</rasd:ElementName>
112+
<rasd:InstanceID>7</rasd:InstanceID>
113+
<rasd:ResourceType>24</rasd:ResourceType>
114+
<vmw:Config ovf:required="false" vmw:key="enable3DSupport" vmw:value="false"/>
115+
<vmw:Config ovf:required="false" vmw:key="enableMPTSupport" vmw:value="false"/>
116+
<vmw:Config ovf:required="false" vmw:key="use3dRenderer" vmw:value="automatic"/>
117+
<vmw:Config ovf:required="false" vmw:key="useAutoDetect" vmw:value="false"/>
118+
<vmw:Config ovf:required="false" vmw:key="videoRamSizeInKB" vmw:value="4096"/>
119+
</Item>
120+
<Item ovf:required="false">
121+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
122+
<rasd:ElementName>VirtualVMCIDevice</rasd:ElementName>
123+
<rasd:InstanceID>8</rasd:InstanceID>
124+
<rasd:ResourceSubType>vmware.vmci</rasd:ResourceSubType>
125+
<rasd:ResourceType>1</rasd:ResourceType>
126+
<vmw:Config ovf:required="false" vmw:key="allowUnrestrictedCommunication" vmw:value="false"/>
127+
</Item>
128+
<Item ovf:required="false">
129+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
130+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
131+
<rasd:ElementName>CD-ROM 1</rasd:ElementName>
132+
<rasd:InstanceID>9</rasd:InstanceID>
133+
<rasd:Parent>5</rasd:Parent>
134+
<rasd:ResourceSubType>vmware.cdrom.remotepassthrough</rasd:ResourceSubType>
135+
<rasd:ResourceType>15</rasd:ResourceType>
136+
<vmw:Config ovf:required="false" vmw:key="backing.exclusive" vmw:value="false"/>
137+
</Item>
138+
<Item>
139+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
140+
<rasd:ElementName>Hard Disk 1</rasd:ElementName>
141+
<rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
142+
<rasd:InstanceID>10</rasd:InstanceID>
143+
<rasd:Parent>3</rasd:Parent>
144+
<rasd:ResourceType>17</rasd:ResourceType>
145+
<vmw:Config ovf:required="false" vmw:key="backing.writeThrough" vmw:value="false"/>
146+
</Item>
147+
<Item ovf:required="false">
148+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
149+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
150+
<rasd:Description>Floppy Drive</rasd:Description>
151+
<rasd:ElementName>Floppy 1</rasd:ElementName>
152+
<rasd:InstanceID>11</rasd:InstanceID>
153+
<rasd:ResourceSubType>vmware.floppy.remotedevice</rasd:ResourceSubType>
154+
<rasd:ResourceType>14</rasd:ResourceType>
155+
</Item>
156+
<Item>
157+
<rasd:AddressOnParent>7</rasd:AddressOnParent>
158+
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
159+
<rasd:Connection>VM Network</rasd:Connection>
160+
<rasd:Description>VmxNet3 ethernet adapter on &quot;VM Network&quot;</rasd:Description>
161+
<rasd:ElementName>Ethernet 1</rasd:ElementName>
162+
<rasd:InstanceID>12</rasd:InstanceID>
163+
<rasd:ResourceSubType>VmxNet3</rasd:ResourceSubType>
164+
<rasd:ResourceType>10</rasd:ResourceType>
165+
<vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/>
166+
</Item>
167+
<vmw:Config ovf:required="false" vmw:key="cpuHotAddEnabled" vmw:value="false"/>
168+
<vmw:Config ovf:required="false" vmw:key="cpuHotRemoveEnabled" vmw:value="false"/>
169+
<vmw:Config ovf:required="false" vmw:key="firmware" vmw:value="bios"/>
170+
<vmw:Config ovf:required="false" vmw:key="virtualICH7MPresent" vmw:value="false"/>
171+
<vmw:Config ovf:required="false" vmw:key="virtualSMCPresent" vmw:value="false"/>
172+
<vmw:Config ovf:required="false" vmw:key="memoryHotAddEnabled" vmw:value="false"/>
173+
<vmw:Config ovf:required="false" vmw:key="nestedHVEnabled" vmw:value="false"/>
174+
<vmw:Config ovf:required="false" vmw:key="powerOpInfo.powerOffType" vmw:value="preset"/>
175+
<vmw:Config ovf:required="false" vmw:key="powerOpInfo.resetType" vmw:value="preset"/>
176+
<vmw:Config ovf:required="false" vmw:key="powerOpInfo.standbyAction" vmw:value="checkpoint"/>
177+
<vmw:Config ovf:required="false" vmw:key="powerOpInfo.suspendType" vmw:value="preset"/>
178+
<vmw:Config ovf:required="false" vmw:key="tools.afterPowerOn" vmw:value="true"/>
179+
<vmw:Config ovf:required="false" vmw:key="tools.afterResume" vmw:value="true"/>
180+
<vmw:Config ovf:required="false" vmw:key="tools.beforeGuestShutdown" vmw:value="true"/>
181+
<vmw:Config ovf:required="false" vmw:key="tools.beforeGuestStandby" vmw:value="true"/>
182+
<vmw:Config ovf:required="false" vmw:key="tools.syncTimeWithHost" vmw:value="false"/>
183+
<vmw:Config ovf:required="false" vmw:key="tools.toolsUpgradePolicy" vmw:value="manual"/>
184+
</VirtualHardwareSection>
185+
</VirtualSystem>
186+
</Envelope>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<Envelope xmlns="http://schemas.dmtf.org/ovf/envelope/1"
3+
xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1"
4+
xmlns:vmw="http://www.vmware.com/schema/ovf"
5+
xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData"
6+
xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData"
7+
xmlns:sasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_StorageAllocationSettingData">
8+
<References />
9+
<DiskSection />
10+
<NetworkSection />
11+
<DeploymentOptionSection />
12+
<vmw:StorageGroupSection />
13+
<VirtualSystem ovf:id="my-vm">
14+
<Info>A Virtual system</Info>
15+
<Name>my-vm</Name>
16+
<AnnotationSection />
17+
<OperatingSystemSection ovf:id="101" vmw:osType="other3xLinux64Guest">
18+
<Info>The operating system installed</Info>
19+
<Description>Other 3.x or later Linux (64-bit)</Description>
20+
</OperatingSystemSection>
21+
<VirtualHardwareSection ovf:transport="com.vmware.guestInfo">
22+
<Info>Virtual hardware requirements</Info>
23+
<System>
24+
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
25+
<vssd:InstanceID>0</vssd:InstanceID>
26+
<vssd:VirtualSystemType>vmx-13</vssd:VirtualSystemType>
27+
</System>
28+
<Item>
29+
<rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
30+
<rasd:Description>Number of Virtual CPUs</rasd:Description>
31+
<rasd:ElementName>2 virtual CPU(s)</rasd:ElementName>
32+
<rasd:InstanceID>1</rasd:InstanceID>
33+
<rasd:ResourceType>3</rasd:ResourceType>
34+
<rasd:VirtualQuantity>2</rasd:VirtualQuantity>
35+
<vmw:CoresPerSocket ovf:required="false">2</vmw:CoresPerSocket>
36+
</Item>
37+
<Item>
38+
<rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
39+
<rasd:Description>Memory Size</rasd:Description>
40+
<rasd:ElementName>4096MB of memory</rasd:ElementName>
41+
<rasd:InstanceID>2</rasd:InstanceID>
42+
<rasd:ResourceType>4</rasd:ResourceType>
43+
<rasd:VirtualQuantity>4096</rasd:VirtualQuantity>
44+
</Item>
45+
<Item>
46+
<rasd:ElementName>invalidResourceSubType</rasd:ElementName>
47+
<rasd:InstanceID>3</rasd:InstanceID>
48+
<rasd:ResourceType>1</rasd:ResourceType>
49+
<rasd:ResourceSubType>invalidResourceSubType</rasd:ResourceSubType>
50+
</Item>
51+
</VirtualHardwareSection>
52+
<vmw:StorageSection />
53+
<EulaSection />
54+
</VirtualSystem>
55+
</Envelope>
+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<Envelope xmlns="http://schemas.dmtf.org/ovf/envelope/1"
3+
xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1"
4+
xmlns:vmw="http://www.vmware.com/schema/ovf"
5+
xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData"
6+
xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData"
7+
xmlns:sasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_StorageAllocationSettingData">
8+
<References />
9+
<DiskSection />
10+
<NetworkSection />
11+
<DeploymentOptionSection />
12+
<vmw:StorageGroupSection />
13+
<VirtualSystem ovf:id="my-vm">
14+
<Info>A Virtual system</Info>
15+
<Name>my-vm</Name>
16+
<AnnotationSection />
17+
<OperatingSystemSection ovf:id="101" vmw:osType="other3xLinux64Guest">
18+
<Info>The operating system installed</Info>
19+
<Description>Other 3.x or later Linux (64-bit)</Description>
20+
</OperatingSystemSection>
21+
<VirtualHardwareSection ovf:transport="com.vmware.guestInfo">
22+
<Info>Virtual hardware requirements</Info>
23+
<System>
24+
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
25+
<vssd:InstanceID>0</vssd:InstanceID>
26+
<vssd:VirtualSystemType>vmx-13</vssd:VirtualSystemType>
27+
</System>
28+
<Item>
29+
<rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
30+
<rasd:Description>Number of Virtual CPUs</rasd:Description>
31+
<rasd:ElementName>2 virtual CPU(s)</rasd:ElementName>
32+
<rasd:InstanceID>1</rasd:InstanceID>
33+
<rasd:ResourceType>3</rasd:ResourceType>
34+
<rasd:VirtualQuantity>2</rasd:VirtualQuantity>
35+
<vmw:CoresPerSocket ovf:required="false">2</vmw:CoresPerSocket>
36+
</Item>
37+
<Item>
38+
<rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
39+
<rasd:Description>Memory Size</rasd:Description>
40+
<rasd:ElementName>4096MB of memory</rasd:ElementName>
41+
<rasd:InstanceID>2</rasd:InstanceID>
42+
<rasd:ResourceType>4</rasd:ResourceType>
43+
<rasd:VirtualQuantity>4096</rasd:VirtualQuantity>
44+
</Item>
45+
<Item>
46+
<rasd:ElementName>invalidResourceType</rasd:ElementName>
47+
<rasd:InstanceID>3</rasd:InstanceID>
48+
<rasd:ResourceType>35</rasd:ResourceType>
49+
</Item>
50+
</VirtualHardwareSection>
51+
<vmw:StorageSection />
52+
<EulaSection />
53+
</VirtualSystem>
54+
</Envelope>

‎ovf/ovf_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func TestVirtualSystemCollection(t *testing.T) {
109109
}
110110

111111
func TestMultipleDeploymentConfigs(t *testing.T) {
112-
e := testEnvelope(t, "fixtures/haproxy-vsphere.ovf")
112+
e := testEnvelope(t, "fixtures/configspec.ovf")
113113

114114
assert.NotNil(t, e.VirtualSystem)
115115
assert.Nil(t, e.VirtualSystemCollection)
@@ -124,7 +124,7 @@ func TestMultipleDeploymentConfigs(t *testing.T) {
124124
assert.Equal(t, "frontend", e.DeploymentOption.Configuration[1].ID)
125125

126126
assert.Len(t, e.VirtualSystem.VirtualHardware, 1)
127-
assert.Len(t, e.VirtualSystem.VirtualHardware[0].Item, 23)
127+
assert.Len(t, e.VirtualSystem.VirtualHardware[0].Item, 24)
128128
assert.Len(t, e.VirtualSystem.VirtualHardware[0].Item[2].Config, 1)
129129
assert.NotNil(t, e.VirtualSystem.VirtualHardware[0].Item[2].Config[0].Required)
130130
assert.False(t, *e.VirtualSystem.VirtualHardware[0].Item[2].Config[0].Required)

0 commit comments

Comments
 (0)
Please sign in to comment.