Skip to content
This repository was archived by the owner on Jan 22, 2026. It is now read-only.

Commit dae0dc2

Browse files
committed
virtconv: Add OVF input support.
1 parent e1e5e09 commit dae0dc2

8 files changed

Lines changed: 772 additions & 4 deletions

File tree

man/en/virt-convert.pod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Show the help message and exit
4646

4747
=item -i format
4848

49-
Input format. Currently, C<vmx> and C<virt-image> are supported.
49+
Input format. Currently, C<vmx>, C<virt-image>, and C<ovf> are supported.
5050

5151
=item -o format
5252

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!-- Generated by VMware VirtualCenter Server, User: jmh, UTC time: 2009-07-08T12:17:47.265625Z -->
3+
<Envelope vmw:buildId="build-162856" 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">
4+
<References>
5+
<File ovf:href="test.ovf-disk1.vmdk" ovf:id="file1" ovf:size="953269760" />
6+
<File ovf:href="testfile" ovf:id="vmfile1" ovf:size="1234" />
7+
</References>
8+
<DiskSection>
9+
<Info>Virtual disk information</Info>
10+
<Disk ovf:capacity="8" ovf:capacityAllocationUnits="byte * 2^30" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" />
11+
</DiskSection>
12+
<NetworkSection>
13+
<Info>The list of logical networks</Info>
14+
<Network ovf:name="VM Network">
15+
<Description>The VM Network network</Description>
16+
</Network>
17+
</NetworkSection>
18+
<VirtualSystem ovf:id="test.ovf">
19+
<Info>A virtual machine</Info>
20+
<Name>test.ovf</Name>
21+
<OperatingSystemSection ovf:id="80" ovf:version="5" vmw:osType="rhel5_64Guest">
22+
<Info>The kind of installed guest operating system</Info>
23+
<Description>Red Hat Enterprise Linux 5 (64-bit)</Description>
24+
</OperatingSystemSection>
25+
<VirtualHardwareSection>
26+
<Info>Virtual hardware requirements</Info>
27+
<System>
28+
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
29+
<vssd:InstanceID>0</vssd:InstanceID>
30+
<vssd:VirtualSystemIdentifier>test.ovf</vssd:VirtualSystemIdentifier>
31+
<vssd:VirtualSystemType>vmx-07</vssd:VirtualSystemType>
32+
</System>
33+
<Item>
34+
<rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
35+
<rasd:Description>Number of Virtual CPUs</rasd:Description>
36+
<rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
37+
<rasd:InstanceID>1</rasd:InstanceID>
38+
<rasd:ResourceType>3</rasd:ResourceType>
39+
<rasd:VirtualQuantity>3</rasd:VirtualQuantity>
40+
</Item>
41+
<Item>
42+
<rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
43+
<rasd:Description>Memory Size</rasd:Description>
44+
<rasd:ElementName>512MB of memory</rasd:ElementName>
45+
<rasd:InstanceID>2</rasd:InstanceID>
46+
<rasd:ResourceType>4</rasd:ResourceType>
47+
<rasd:VirtualQuantity>777</rasd:VirtualQuantity>
48+
</Item>
49+
<Item>
50+
<rasd:Address>0</rasd:Address>
51+
<rasd:Description>SCSI Controller</rasd:Description>
52+
<rasd:ElementName>SCSI controller 0</rasd:ElementName>
53+
<rasd:InstanceID>3</rasd:InstanceID>
54+
<rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>
55+
<rasd:ResourceType>6</rasd:ResourceType>
56+
</Item>
57+
<Item>
58+
<rasd:Address>1</rasd:Address>
59+
<rasd:Description>IDE Controller</rasd:Description>
60+
<rasd:ElementName>IDE 1</rasd:ElementName>
61+
<rasd:InstanceID>4</rasd:InstanceID>
62+
<rasd:ResourceType>5</rasd:ResourceType>
63+
</Item>
64+
<Item>
65+
<rasd:Address>0</rasd:Address>
66+
<rasd:Description>IDE Controller</rasd:Description>
67+
<rasd:ElementName>IDE 0</rasd:ElementName>
68+
<rasd:InstanceID>5</rasd:InstanceID>
69+
<rasd:ResourceType>5</rasd:ResourceType>
70+
</Item>
71+
<Item ovf:required="false">
72+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
73+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
74+
<rasd:Description>Floppy Drive</rasd:Description>
75+
<rasd:ElementName>Floppy drive 1</rasd:ElementName>
76+
<rasd:InstanceID>6</rasd:InstanceID>
77+
<rasd:ResourceType>14</rasd:ResourceType>
78+
</Item>
79+
<Item ovf:required="false">
80+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
81+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
82+
<rasd:ElementName>CD/DVD Drive 1</rasd:ElementName>
83+
<rasd:InstanceID>7</rasd:InstanceID>
84+
<rasd:Parent>4</rasd:Parent>
85+
<rasd:ResourceType>15</rasd:ResourceType>
86+
</Item>
87+
<Item>
88+
<rasd:AddressOnParent>7</rasd:AddressOnParent>
89+
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
90+
<rasd:Connection>VM Network</rasd:Connection>
91+
<rasd:Description>E1000 ethernet adapter on "VM Network"</rasd:Description>
92+
<rasd:ElementName>Network adapter 1</rasd:ElementName>
93+
<rasd:InstanceID>8</rasd:InstanceID>
94+
<rasd:ResourceSubType>E1000</rasd:ResourceSubType>
95+
<rasd:ResourceType>10</rasd:ResourceType>
96+
</Item>
97+
<Item>
98+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
99+
<rasd:ElementName>Hard disk 1</rasd:ElementName>
100+
<rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
101+
<rasd:InstanceID>9</rasd:InstanceID>
102+
<rasd:Parent>3</rasd:Parent>
103+
<rasd:ResourceType>17</rasd:ResourceType>
104+
</Item>
105+
<Item>
106+
<rasd:AddressOnParent>1</rasd:AddressOnParent>
107+
<rasd:ElementName>Hard disk 2</rasd:ElementName>
108+
<rasd:HostResource>ovf:/file/vmfile1</rasd:HostResource>
109+
<rasd:InstanceID>10</rasd:InstanceID>
110+
<rasd:Parent>4</rasd:Parent>
111+
<rasd:ResourceType>17</rasd:ResourceType>
112+
</Item>
113+
</VirtualHardwareSection>
114+
<AnnotationSection ovf:required="false">
115+
<Info>A human-readable annotation</Info>
116+
<Annotation>This is the description, created by RWMJ.</Annotation>
117+
</AnnotationSection>
118+
</VirtualSystem>
119+
<TestSection ovf:required="false">
120+
<Info>A human-readable annotation</Info>
121+
<Annotation>This is the description, created by RWMJ.</Annotation>
122+
</TestSection>
123+
</Envelope>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!-- Generated by VMware VirtualCenter Server, User: jmh, UTC time: 2009-07-08T12:38:39.4375Z -->
3+
<Envelope vmw:buildId="build-162856" 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">
4+
<References>
5+
<File ovf:href="w2k3 32bit-disk1.vmdk" ovf:id="file1" ovf:size="812072448" />
6+
</References>
7+
<DiskSection>
8+
<Info>Virtual disk information</Info>
9+
<Disk ovf:capacity="8" ovf:capacityAllocationUnits="byte * 2^30" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" />
10+
</DiskSection>
11+
<NetworkSection>
12+
<Info>The list of logical networks</Info>
13+
<Network ovf:name="VM Network">
14+
<Description>The VM Network network</Description>
15+
</Network>
16+
</NetworkSection>
17+
<VirtualSystem ovf:id="w2k3 32bit">
18+
<Info>A virtual machine</Info>
19+
<Name>w2k3 32bit</Name>
20+
<OperatingSystemSection ovf:id="69" vmw:osType="winNetEnterpriseGuest">
21+
<Info>The kind of installed guest operating system</Info>
22+
<Description>Microsoft Windows Server 2003, Enterprise Edition (32-bit)</Description>
23+
</OperatingSystemSection>
24+
<VirtualHardwareSection>
25+
<Info>Virtual hardware requirements</Info>
26+
<System>
27+
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
28+
<vssd:InstanceID>0</vssd:InstanceID>
29+
<vssd:VirtualSystemIdentifier>w2k3 32bit</vssd:VirtualSystemIdentifier>
30+
<vssd:VirtualSystemType>vmx-07</vssd:VirtualSystemType>
31+
</System>
32+
<Item>
33+
<rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
34+
<rasd:Description>Number of Virtual CPUs</rasd:Description>
35+
<rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
36+
<rasd:InstanceID>1</rasd:InstanceID>
37+
<rasd:ResourceType>3</rasd:ResourceType>
38+
<rasd:VirtualQuantity>1</rasd:VirtualQuantity>
39+
</Item>
40+
<Item>
41+
<rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
42+
<rasd:Description>Memory Size</rasd:Description>
43+
<rasd:ElementName>1024MB of memory</rasd:ElementName>
44+
<rasd:InstanceID>2</rasd:InstanceID>
45+
<rasd:ResourceType>4</rasd:ResourceType>
46+
<rasd:VirtualQuantity>1024</rasd:VirtualQuantity>
47+
</Item>
48+
<Item>
49+
<rasd:Address>0</rasd:Address>
50+
<rasd:Description>SCSI Controller</rasd:Description>
51+
<rasd:ElementName>SCSI controller 0</rasd:ElementName>
52+
<rasd:InstanceID>3</rasd:InstanceID>
53+
<rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>
54+
<rasd:ResourceType>6</rasd:ResourceType>
55+
</Item>
56+
<Item>
57+
<rasd:Address>1</rasd:Address>
58+
<rasd:Description>IDE Controller</rasd:Description>
59+
<rasd:ElementName>IDE 1</rasd:ElementName>
60+
<rasd:InstanceID>4</rasd:InstanceID>
61+
<rasd:ResourceType>5</rasd:ResourceType>
62+
</Item>
63+
<Item>
64+
<rasd:Address>0</rasd:Address>
65+
<rasd:Description>IDE Controller</rasd:Description>
66+
<rasd:ElementName>IDE 0</rasd:ElementName>
67+
<rasd:InstanceID>5</rasd:InstanceID>
68+
<rasd:ResourceType>5</rasd:ResourceType>
69+
</Item>
70+
<Item ovf:required="false">
71+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
72+
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
73+
<rasd:Description>Floppy Drive</rasd:Description>
74+
<rasd:ElementName>Floppy drive 1</rasd:ElementName>
75+
<rasd:InstanceID>6</rasd:InstanceID>
76+
<rasd:ResourceType>14</rasd:ResourceType>
77+
</Item>
78+
<Item ovf:required="false">
79+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
80+
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
81+
<rasd:ElementName>CD/DVD Drive 1</rasd:ElementName>
82+
<rasd:InstanceID>7</rasd:InstanceID>
83+
<rasd:Parent>4</rasd:Parent>
84+
<rasd:ResourceType>15</rasd:ResourceType>
85+
</Item>
86+
<Item>
87+
<rasd:AddressOnParent>7</rasd:AddressOnParent>
88+
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
89+
<rasd:Connection>VM Network</rasd:Connection>
90+
<rasd:Description>E1000 ethernet adapter on "VM Network"</rasd:Description>
91+
<rasd:ElementName>Network adapter 1</rasd:ElementName>
92+
<rasd:InstanceID>8</rasd:InstanceID>
93+
<rasd:ResourceSubType>E1000</rasd:ResourceSubType>
94+
<rasd:ResourceType>10</rasd:ResourceType>
95+
</Item>
96+
<Item>
97+
<rasd:AddressOnParent>0</rasd:AddressOnParent>
98+
<rasd:ElementName>Hard disk 1</rasd:ElementName>
99+
<rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
100+
<rasd:InstanceID>9</rasd:InstanceID>
101+
<rasd:Parent>3</rasd:Parent>
102+
<rasd:ResourceType>17</rasd:ResourceType>
103+
</Item>
104+
</VirtualHardwareSection>
105+
<AnnotationSection ovf:required="false">
106+
<Info>A human-readable annotation</Info>
107+
<Annotation>Description added by RWMJ.</Annotation>
108+
</AnnotationSection>
109+
</VirtualSystem>
110+
</Envelope>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
2+
<image>
3+
<name>test.ovf</name>
4+
<label>test.ovf</label>
5+
<description>This is the description, created by RWMJ.</description>
6+
<domain>
7+
8+
<boot type="hvm">
9+
<guest>
10+
<arch>i686</arch>
11+
</guest>
12+
<os>
13+
<loader dev="hd"/>
14+
</os>
15+
<drive disk="test.ovf-disk1.vmdk" target="hda" />
16+
<drive disk="testfile" target="hdb" />
17+
18+
</boot>
19+
20+
<devices>
21+
<vcpu>3</vcpu>
22+
<memory>795648</memory>
23+
<interface />
24+
<graphics />
25+
</devices>
26+
</domain>
27+
<storage>
28+
<disk file="test.ovf-disk1.vmdk" use="system" format="raw"/>
29+
<disk file="testfile" use="system" format="raw"/>
30+
31+
</storage>
32+
</image>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
<image>
3+
<name>w2k3_32bit</name>
4+
<label>w2k3_32bit</label>
5+
<description>Description added by RWMJ.</description>
6+
<domain>
7+
8+
<boot type="hvm">
9+
<guest>
10+
<arch>i686</arch>
11+
</guest>
12+
<os>
13+
<loader dev="hd"/>
14+
</os>
15+
<drive disk="w2k3 32bit-disk1.vmdk" target="hda" />
16+
17+
</boot>
18+
19+
<devices>
20+
<vcpu>1</vcpu>
21+
<memory>1048576</memory>
22+
<interface />
23+
<graphics />
24+
</devices>
25+
</domain>
26+
<storage>
27+
<disk file="w2k3 32bit-disk1.vmdk" use="system" format="raw"/>
28+
29+
</storage>
30+
</image>

tests/virtconv-test.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
virtimage_input = BASE + "/virtimage_input"
2828
virtimage_output = BASE + "/virtimage_output"
2929

30+
ovf_input = BASE + "/ovf_input"
31+
3032
class TestVirtConv(unittest.TestCase):
3133

3234
def setUp(self):
@@ -79,6 +81,15 @@ def testVirtImage2VMX(self):
7981

8082
self._compare_files(base, in_type, out_type, in_dir, out_dir)
8183

84+
def testOVF2VirtImage(self):
85+
base = "ovf2virtimage"
86+
in_type = "ovf"
87+
out_type = "virt-image"
88+
in_dir = ovf_input
89+
out_dir = virtimage_output
90+
91+
self._compare_files(base, in_type, out_type, in_dir, out_dir)
92+
8293
# For x2x conversion, we want to use already tested output, since ideally
8394
# we should be able to run a generated config continually through the
8495
# converter and it will generate the same result

virtconv/diskcfg.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ def run_vdiskadm(args):
9999
class disk(object):
100100
"""Definition of an individual disk instance."""
101101

102-
def __init__(self, path = None, format = None, bus = "ide",
103-
type = DISK_TYPE_DISK):
102+
def __init__(self, path = None, format = DISK_FORMAT_NONE, bus = "ide",
103+
type = DISK_TYPE_DISK):
104104
self.path = path
105105
self.format = format
106106
self.bus = bus
@@ -129,8 +129,11 @@ def copy_file(self, infile, outfile):
129129

130130
def out_file(self, out_format):
131131
"""Return the relative path of the output file."""
132+
if not out_format:
133+
return self.path
134+
132135
relout = self.path.replace(disk_suffixes[self.format],
133-
disk_suffixes[out_format])
136+
disk_suffixes[out_format])
134137
return re.sub(r'\s', '_', relout)
135138

136139
def vdisk_convert(self, absin, absout):

0 commit comments

Comments
 (0)