Skip to content

Commit 2f14e4b

Browse files
committed
ovf: add Config and ExtraConfig to VirtualHardwareSection
ovf.Unmarshal() didn't have much test coverage other than the govc import.ova bats tests. Update ovf/ovf_test.go to validate these fields are properly unmarshaled.
1 parent 5e76025 commit 2f14e4b

File tree

3 files changed

+134
-14
lines changed

3 files changed

+134
-14
lines changed

ovf/envelope.go

+8
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ type EulaSection struct {
148148
License string `xml:"License"`
149149
}
150150

151+
type Config struct {
152+
Required *bool `xml:"required,attr"`
153+
Key string `xml:"key,attr"`
154+
Value string `xml:"value,attr"`
155+
}
156+
151157
type VirtualHardwareSection struct {
152158
Section
153159

@@ -157,6 +163,8 @@ type VirtualHardwareSection struct {
157163
System *VirtualSystemSettingData `xml:"System"`
158164
Item []ResourceAllocationSettingData `xml:"Item"`
159165
StorageItem []StorageAllocationSettingData `xml:"StorageItem"`
166+
Config []Config `xml:"Config"`
167+
ExtraConfig []Config `xml:"ExtraConfig"`
160168
}
161169

162170
type VirtualSystemSettingData struct {

ovf/fixtures/ttylinux.ovf

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<!-- fork of ../govc/test/images/ttylinux-pc_i486-16.1.ovf (see govc/test/README.md) -->
2+
<Envelope vmw:buildId="build-2060496"
3+
xmlns="http://schemas.dmtf.org/ovf/envelope/1"
4+
xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common"
5+
xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1"
6+
xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData"
7+
xmlns:vmw="http://www.vmware.com/schema/ovf"
8+
xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData"
9+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
10+
<References>
11+
<File ovf:href="ttylinux-pc_i486-16.1-disk1.vmdk" ovf:id="file1" ovf:size="10595840"/>
12+
</References>
13+
<DiskSection>
14+
<Info>Virtual disk information</Info>
15+
<Disk ovf:capacity="30" ovf:capacityAllocationUnits="byte * 2^20" ovf:diskId="vmdisk1" ovf:fileRef="file1"
16+
ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="18743296"/>
17+
</DiskSection>
18+
<NetworkSection>
19+
<Info>The list of logical networks</Info>
20+
<Network ovf:name="nat">
21+
<Description>The nat network</Description>
22+
</Network>
23+
</NetworkSection>
24+
<VirtualSystem ovf:id="vm">
25+
<Info>A virtual machine</Info>
26+
<Name>ttylinux-pc_i486-16.1</Name>
27+
<OperatingSystemSection ovf:id="36" vmw:osType="otherLinuxGuest">
28+
<Info>The kind of installed guest operating system</Info>
29+
</OperatingSystemSection>
30+
<VirtualHardwareSection>
31+
<Info>Virtual hardware requirements</Info>
32+
<System>
33+
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
34+
<vssd:InstanceID>0</vssd:InstanceID>
35+
<vssd:VirtualSystemIdentifier>ttylinux-pc_i486-16.1</vssd:VirtualSystemIdentifier>
36+
<vssd:VirtualSystemType>vmx-09</vssd:VirtualSystemType>
37+
</System>
38+
<Item>
39+
<rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
40+
<rasd:Description>Number of Virtual CPUs</rasd:Description>
41+
<rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
42+
<rasd:InstanceID>1</rasd:InstanceID>
43+
<rasd:ResourceType>3</rasd:ResourceType>
44+
<rasd:VirtualQuantity>1</rasd:VirtualQuantity>
45+
</Item>
46+
<Item>
47+
<rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
48+
<rasd:Description>Memory Size</rasd:Description>
49+
<rasd:ElementName>32MB of memory</rasd:ElementName>
50+
<rasd:InstanceID>2</rasd:InstanceID>
51+
<rasd:ResourceType>4</rasd:ResourceType>
52+
<rasd:VirtualQuantity>32</rasd:VirtualQuantity>
53+
</Item>
54+
<Item>
55+
<rasd:Address>0</rasd:Address>
56+
<rasd:Description>IDE Controller</rasd:Description>
57+
<rasd:ElementName>ideController0</rasd:ElementName>
58+
<rasd:InstanceID>3</rasd:InstanceID>
59+
<rasd:ResourceType>5</rasd:ResourceType>
60+
</Item>
61+
<Item>
62+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
63+
<rasd:ElementName>disk0</rasd:ElementName>
64+
<rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
65+
<rasd:InstanceID>4</rasd:InstanceID>
66+
<rasd:Parent>3</rasd:Parent>
67+
<rasd:ResourceType>17</rasd:ResourceType>
68+
</Item>
69+
<Item>
70+
<rasd:AddressOnParent>1</rasd:AddressOnParent>
71+
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
72+
<rasd:Connection>nat</rasd:Connection>
73+
<rasd:Description>E1000 ethernet adapter on &quot;nat&quot;</rasd:Description>
74+
<rasd:ElementName>ethernet0</rasd:ElementName>
75+
<rasd:InstanceID>5</rasd:InstanceID>
76+
<rasd:ResourceSubType>E1000</rasd:ResourceSubType>
77+
<rasd:ResourceType>10</rasd:ResourceType>
78+
<vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="false"/>
79+
</Item>
80+
<Item ovf:required="false">
81+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
82+
<rasd:ElementName>video</rasd:ElementName>
83+
<rasd:InstanceID>6</rasd:InstanceID>
84+
<rasd:ResourceType>24</rasd:ResourceType>
85+
</Item>
86+
<Item ovf:required="false">
87+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
88+
<rasd:ElementName>vmci</rasd:ElementName>
89+
<rasd:InstanceID>7</rasd:InstanceID>
90+
<rasd:ResourceSubType>vmware.vmci</rasd:ResourceSubType>
91+
<rasd:ResourceType>1</rasd:ResourceType>
92+
</Item>
93+
<vmw:Config ovf:required="false" vmw:key="powerOpInfo.powerOffType" vmw:value="soft"/>
94+
<vmw:Config ovf:required="false" vmw:key="powerOpInfo.resetType" vmw:value="soft"/>
95+
<vmw:Config ovf:required="false" vmw:key="powerOpInfo.suspendType" vmw:value="soft"/>
96+
<vmw:ExtraConfig ovf:required="false" vmw:key="tools.syncTimeWithHost" vmw:value="true"/>
97+
<vmw:ExtraConfig ovf:required="false" vmw:key="tools.toolsUpgradePolicy" vmw:value="upgradeAtPowerCycle"/>
98+
</VirtualHardwareSection>
99+
</VirtualSystem>
100+
</Envelope>

ovf/ovf_test.go

+26-14
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,11 @@ import (
2424
"text/tabwriter"
2525
)
2626

27-
func testFile(t *testing.T) *os.File {
28-
fn := os.Getenv("OVF_TEST_FILE")
29-
if fn == "" {
30-
t.Skip("OVF_TEST_FILE not specified")
31-
}
32-
27+
func testEnvelope(t *testing.T, fn string) *Envelope {
3328
f, err := os.Open(fn)
3429
if err != nil {
3530
t.Fatalf("error opening %s %s", fn, err)
3631
}
37-
38-
return f
39-
}
40-
41-
func testEnvelope(t *testing.T) *Envelope {
42-
f := testFile(t)
4332
defer f.Close()
4433

4534
e, err := Unmarshal(f)
@@ -55,11 +44,34 @@ func testEnvelope(t *testing.T) *Envelope {
5544
}
5645

5746
func TestUnmarshal(t *testing.T) {
58-
testEnvelope(t)
47+
e := testEnvelope(t, "fixtures/ttylinux.ovf")
48+
49+
hw := e.VirtualSystem.VirtualHardware[0]
50+
if n := len(hw.Config); n != 3 {
51+
t.Errorf("Config=%d", n)
52+
}
53+
if n := len(hw.ExtraConfig); n != 2 {
54+
t.Errorf("ExtraConfig=%d", n)
55+
}
56+
for i, c := range append(hw.Config, hw.ExtraConfig...) {
57+
if *c.Required {
58+
t.Errorf("%d: Required=%t", i, *c.Required)
59+
}
60+
if c.Key == "" {
61+
t.Errorf("%d: key=''", i)
62+
}
63+
if c.Value == "" {
64+
t.Errorf("%d: value=''", i)
65+
}
66+
}
5967
}
6068

6169
func TestDeploymentOptions(t *testing.T) {
62-
e := testEnvelope(t)
70+
fn := os.Getenv("OVF_TEST_FILE")
71+
if fn == "" {
72+
t.Skip("OVF_TEST_FILE not specified")
73+
}
74+
e := testEnvelope(t, fn)
6375

6476
if e.DeploymentOption == nil {
6577
t.Fatal("DeploymentOptionSection empty")

0 commit comments

Comments
 (0)