Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.ovf_unittest.py @ 5abef1b1

History | View | Annotate | Download (30.1 kB)

1 1e6fab60 Agata Murawska
#!/usr/bin/python
2 1e6fab60 Agata Murawska
#
3 1e6fab60 Agata Murawska
4 6e8091f9 Dimitris Aragiorgis
# Copyright (C) 2011, 2012 Google Inc.
5 1e6fab60 Agata Murawska
#
6 1e6fab60 Agata Murawska
# This program is free software; you can redistribute it and/or modify
7 1e6fab60 Agata Murawska
# it under the terms of the GNU General Public License as published by
8 1e6fab60 Agata Murawska
# the Free Software Foundation; either version 2 of the License, or
9 1e6fab60 Agata Murawska
# (at your option) any later version.
10 1e6fab60 Agata Murawska
#
11 1e6fab60 Agata Murawska
# This program is distributed in the hope that it will be useful, but
12 1e6fab60 Agata Murawska
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 1e6fab60 Agata Murawska
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 1e6fab60 Agata Murawska
# General Public License for more details.
15 1e6fab60 Agata Murawska
#
16 1e6fab60 Agata Murawska
# You should have received a copy of the GNU General Public License
17 1e6fab60 Agata Murawska
# along with this program; if not, write to the Free Software
18 1e6fab60 Agata Murawska
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 1e6fab60 Agata Murawska
# 02110-1301, USA.
20 1e6fab60 Agata Murawska
21 1e6fab60 Agata Murawska
22 1e6fab60 Agata Murawska
"""Script for testing ganeti.ovf.
23 1e6fab60 Agata Murawska

24 1e6fab60 Agata Murawska
"""
25 1e6fab60 Agata Murawska
26 1e6fab60 Agata Murawska
import optparse
27 1e6fab60 Agata Murawska
import os
28 1e6fab60 Agata Murawska
import os.path
29 1e6fab60 Agata Murawska
import re
30 1e6fab60 Agata Murawska
import shutil
31 1e6fab60 Agata Murawska
import sys
32 1e6fab60 Agata Murawska
import tempfile
33 1e6fab60 Agata Murawska
import unittest
34 1e6fab60 Agata Murawska
35 d92518d3 Agata Murawska
try:
36 d92518d3 Agata Murawska
  import xml.etree.ElementTree as ET
37 d92518d3 Agata Murawska
except ImportError:
38 d92518d3 Agata Murawska
  import elementtree.ElementTree as ET
39 d92518d3 Agata Murawska
40 1e6fab60 Agata Murawska
from ganeti import constants
41 1e6fab60 Agata Murawska
from ganeti import errors
42 1e6fab60 Agata Murawska
from ganeti import ovf
43 1e6fab60 Agata Murawska
from ganeti import utils
44 a56625a2 Michael Hanselmann
from ganeti import pathutils
45 1e6fab60 Agata Murawska
46 1e6fab60 Agata Murawska
import testutils
47 1e6fab60 Agata Murawska
48 1e6fab60 Agata Murawska
OUTPUT_DIR = "newdir"
49 1e6fab60 Agata Murawska
50 1e6fab60 Agata Murawska
GANETI_DISKS = {
51 1e6fab60 Agata Murawska
  "disk_count": "1",
52 1e6fab60 Agata Murawska
  "disk0_dump": "new_disk.raw",
53 1e6fab60 Agata Murawska
  "disk0_size": "0",
54 1e6fab60 Agata Murawska
  "disk0_ivname": "disk/0",
55 1e6fab60 Agata Murawska
}
56 1e6fab60 Agata Murawska
GANETI_NETWORKS = {
57 1e6fab60 Agata Murawska
  "nic_count": "1",
58 1e6fab60 Agata Murawska
  "nic0_mode": "bridged",
59 1e6fab60 Agata Murawska
  "nic0_ip": "none",
60 1e6fab60 Agata Murawska
  "nic0_mac": "aa:00:00:d8:2c:1e",
61 1e6fab60 Agata Murawska
  "nic0_link": "xen-br0",
62 6e8091f9 Dimitris Aragiorgis
  "nic0_network": "auto",
63 1e6fab60 Agata Murawska
}
64 1e6fab60 Agata Murawska
GANETI_HYPERVISOR = {
65 1e6fab60 Agata Murawska
  "hypervisor_name": "xen-pvm",
66 1e6fab60 Agata Murawska
  "root-path": "/dev/sda",
67 1e6fab60 Agata Murawska
  "kernel_args": "ro",
68 1e6fab60 Agata Murawska
}
69 1e6fab60 Agata Murawska
GANETI_OS = {"os_name": "lenny-image"}
70 1e6fab60 Agata Murawska
GANETI_BACKEND = {
71 1e6fab60 Agata Murawska
  "vcpus": "1",
72 1e6fab60 Agata Murawska
  "memory" : "2048",
73 1e6fab60 Agata Murawska
  "auto_balance": "False",
74 1e6fab60 Agata Murawska
}
75 1e6fab60 Agata Murawska
GANETI_NAME = "ganeti-test-xen"
76 1e6fab60 Agata Murawska
GANETI_TEMPLATE = "plain"
77 1e6fab60 Agata Murawska
GANETI_TAGS = None
78 1e6fab60 Agata Murawska
GANETI_VERSION = "0"
79 1e6fab60 Agata Murawska
80 1e6fab60 Agata Murawska
VIRTUALBOX_DISKS = {
81 1e6fab60 Agata Murawska
  "disk_count": "2",
82 1e6fab60 Agata Murawska
  "disk0_ivname": "disk/0",
83 1e6fab60 Agata Murawska
  "disk0_dump": "new_disk.raw",
84 1e6fab60 Agata Murawska
  "disk0_size": "0",
85 1e6fab60 Agata Murawska
  "disk1_ivname": "disk/1",
86 1e6fab60 Agata Murawska
  "disk1_dump": "second_disk.raw",
87 1e6fab60 Agata Murawska
  "disk1_size": "0",
88 1e6fab60 Agata Murawska
}
89 1e6fab60 Agata Murawska
VIRTUALBOX_NETWORKS = {
90 1e6fab60 Agata Murawska
  "nic_count": "1",
91 1e6fab60 Agata Murawska
  "nic0_mode": "bridged",
92 1e6fab60 Agata Murawska
  "nic0_ip": "none",
93 1e6fab60 Agata Murawska
  "nic0_link": "auto",
94 1e6fab60 Agata Murawska
  "nic0_mac": "auto",
95 6e8091f9 Dimitris Aragiorgis
  "nic0_network": "auto",
96 1e6fab60 Agata Murawska
}
97 1e6fab60 Agata Murawska
VIRTUALBOX_HYPERVISOR = {"hypervisor_name": "auto"}
98 1e6fab60 Agata Murawska
VIRTUALBOX_OS = {"os_name": None}
99 1e6fab60 Agata Murawska
VIRTUALBOX_BACKEND = {
100 1e6fab60 Agata Murawska
 "vcpus": "1",
101 1e6fab60 Agata Murawska
  "memory" : "2048",
102 1e6fab60 Agata Murawska
  "auto_balance": "auto",
103 1e6fab60 Agata Murawska
}
104 1e6fab60 Agata Murawska
VIRTUALBOX_NAME = None
105 1e6fab60 Agata Murawska
VIRTUALBOX_TEMPLATE = None
106 1e6fab60 Agata Murawska
VIRTUALBOX_TAGS = None
107 1e6fab60 Agata Murawska
VIRTUALBOX_VERSION = None
108 1e6fab60 Agata Murawska
109 1e6fab60 Agata Murawska
EMPTY_DISKS = {}
110 1e6fab60 Agata Murawska
EMPTY_NETWORKS = {}
111 1e6fab60 Agata Murawska
EMPTY_HYPERVISOR = {"hypervisor_name": "auto"}
112 1e6fab60 Agata Murawska
EMPTY_OS = {}
113 1e6fab60 Agata Murawska
EMPTY_BACKEND = {
114 1e6fab60 Agata Murawska
  "vcpus": "auto",
115 1e6fab60 Agata Murawska
  "memory" : "auto",
116 1e6fab60 Agata Murawska
  "auto_balance": "auto",
117 1e6fab60 Agata Murawska
}
118 1e6fab60 Agata Murawska
EMPTY_NAME = None
119 1e6fab60 Agata Murawska
EMPTY_TEMPLATE = None
120 1e6fab60 Agata Murawska
EMPTY_TAGS = None
121 1e6fab60 Agata Murawska
EMPTY_VERSION = None
122 1e6fab60 Agata Murawska
123 1e6fab60 Agata Murawska
CMDARGS_DISKS = {
124 1e6fab60 Agata Murawska
  "disk_count": "1",
125 1e6fab60 Agata Murawska
  "disk0_ivname": "disk/0",
126 1e6fab60 Agata Murawska
  "disk0_dump": "disk0.raw",
127 1e6fab60 Agata Murawska
  "disk0_size": "8",
128 1e6fab60 Agata Murawska
}
129 1e6fab60 Agata Murawska
CMDARGS_NETWORKS = {
130 1e6fab60 Agata Murawska
  "nic0_link": "auto",
131 1e6fab60 Agata Murawska
  "nic0_mode": "bridged",
132 1e6fab60 Agata Murawska
  "nic0_ip": "none",
133 1e6fab60 Agata Murawska
  "nic0_mac": "auto",
134 1e6fab60 Agata Murawska
  "nic_count": "1",
135 6e8091f9 Dimitris Aragiorgis
  "nic0_network": "auto",
136 1e6fab60 Agata Murawska
}
137 1e6fab60 Agata Murawska
CMDARGS_HYPERVISOR = {
138 1e6fab60 Agata Murawska
  "hypervisor_name": "xen-pvm"
139 1e6fab60 Agata Murawska
}
140 1e6fab60 Agata Murawska
CMDARGS_OS = {"os_name": "lenny-image"}
141 1e6fab60 Agata Murawska
CMDARGS_BACKEND = {
142 1e6fab60 Agata Murawska
  "auto_balance": False,
143 1e6fab60 Agata Murawska
  "vcpus": "1",
144 1e6fab60 Agata Murawska
  "memory": "256",
145 1e6fab60 Agata Murawska
}
146 1e6fab60 Agata Murawska
CMDARGS_NAME = "test-instance"
147 1e6fab60 Agata Murawska
CMDARGS_TEMPLATE = "plain"
148 1e6fab60 Agata Murawska
CMDARGS_TAGS = "test-tag-1,test-tag-2"
149 1e6fab60 Agata Murawska
150 1e6fab60 Agata Murawska
ARGS_EMPTY = {
151 1e6fab60 Agata Murawska
  "output_dir": None,
152 1e6fab60 Agata Murawska
  "nics": [],
153 1e6fab60 Agata Murawska
  "disks": [],
154 1e6fab60 Agata Murawska
  "name": "test-instance",
155 d92518d3 Agata Murawska
  "ova_package": False,
156 d92518d3 Agata Murawska
  "ext_usage": False,
157 d92518d3 Agata Murawska
  "disk_format": "cow",
158 d92518d3 Agata Murawska
  "compression": False,
159 1e6fab60 Agata Murawska
}
160 1e6fab60 Agata Murawska
ARGS_EXPORT_DIR = dict(ARGS_EMPTY, **{
161 1e6fab60 Agata Murawska
  "output_dir": OUTPUT_DIR,
162 1e6fab60 Agata Murawska
  "name": None,
163 1e6fab60 Agata Murawska
  "hypervisor": None,
164 1e6fab60 Agata Murawska
  "os": None,
165 1e6fab60 Agata Murawska
  "beparams": {},
166 1e6fab60 Agata Murawska
  "no_nics": False,
167 1e6fab60 Agata Murawska
  "disk_template": None,
168 1e6fab60 Agata Murawska
  "tags": None,
169 1e6fab60 Agata Murawska
})
170 1e6fab60 Agata Murawska
ARGS_VBOX = dict(ARGS_EXPORT_DIR, **{
171 1e6fab60 Agata Murawska
  "output_dir": OUTPUT_DIR,
172 1e6fab60 Agata Murawska
  "name": "test-instance",
173 1e6fab60 Agata Murawska
  "os": "lenny-image",
174 1e6fab60 Agata Murawska
  "hypervisor": ("xen-pvm", {}),
175 1e6fab60 Agata Murawska
  "osparams":{},
176 a5efec93 Santi Raffa
  "osparams_private":{},
177 1e6fab60 Agata Murawska
  "disks": [],
178 1e6fab60 Agata Murawska
})
179 1e6fab60 Agata Murawska
ARGS_COMPLETE = dict(ARGS_VBOX, **{
180 1e6fab60 Agata Murawska
  "beparams": {"vcpus":"1", "memory":"256", "auto_balance": False},
181 1e6fab60 Agata Murawska
  "disks": [(0,{"size":"5mb"})],
182 1e6fab60 Agata Murawska
  "nics": [("0",{"mode":"bridged"})],
183 1e6fab60 Agata Murawska
  "disk_template": "plain",
184 1e6fab60 Agata Murawska
  "tags": "test-tag-1,test-tag-2",
185 1e6fab60 Agata Murawska
})
186 1e6fab60 Agata Murawska
ARGS_BROKEN = dict(ARGS_EXPORT_DIR , **{
187 1e6fab60 Agata Murawska
  "no_nics": True,
188 1e6fab60 Agata Murawska
  "disk_template": "diskless",
189 1e6fab60 Agata Murawska
  "name": "test-instance",
190 1e6fab60 Agata Murawska
  "os": "lenny-image",
191 1e6fab60 Agata Murawska
  "osparams": {},
192 a5efec93 Santi Raffa
  "osparams_private":{},
193 1e6fab60 Agata Murawska
})
194 1e6fab60 Agata Murawska
195 d92518d3 Agata Murawska
EXP_ARGS_COMPRESSED = dict(ARGS_EXPORT_DIR, **{
196 d92518d3 Agata Murawska
  "compression": True,
197 d92518d3 Agata Murawska
})
198 d92518d3 Agata Murawska
199 d92518d3 Agata Murawska
EXP_DISKS_LIST = [
200 d92518d3 Agata Murawska
  {
201 d92518d3 Agata Murawska
    "format": "vmdk",
202 d92518d3 Agata Murawska
    "compression": "gzip",
203 d92518d3 Agata Murawska
    "virt-size": 90000,
204 d92518d3 Agata Murawska
    "real-size": 203,
205 d92518d3 Agata Murawska
    "path": "new_disk.cow.gz",
206 d92518d3 Agata Murawska
  },
207 d92518d3 Agata Murawska
  {
208 d92518d3 Agata Murawska
    "format": "cow",
209 d92518d3 Agata Murawska
    "virt-size": 15,
210 d92518d3 Agata Murawska
    "real-size": 15,
211 d92518d3 Agata Murawska
    "path": "new_disk.cow",
212 d92518d3 Agata Murawska
  },
213 d92518d3 Agata Murawska
]
214 d92518d3 Agata Murawska
EXP_NETWORKS_LIST = [
215 6e8091f9 Dimitris Aragiorgis
  {"mac": "aa:00:00:d8:2c:1e", "ip":"None", "link":"br0",
216 6e8091f9 Dimitris Aragiorgis
   "mode":"routed", "network": "test"},
217 d92518d3 Agata Murawska
]
218 d92518d3 Agata Murawska
EXP_PARTIAL_GANETI_DICT = {
219 d92518d3 Agata Murawska
  "hypervisor": {"name": "xen-kvm"},
220 d92518d3 Agata Murawska
  "os": {"name": "lenny-image"},
221 d92518d3 Agata Murawska
  "auto_balance": "True",
222 d92518d3 Agata Murawska
  "version": "0",
223 d92518d3 Agata Murawska
}
224 d92518d3 Agata Murawska
EXP_GANETI_DICT = {
225 8c114acd Michael Hanselmann
  "tags": None,
226 8c114acd Michael Hanselmann
  "auto_balance": "False",
227 8c114acd Michael Hanselmann
  "hypervisor": {
228 8c114acd Michael Hanselmann
     "root-path": "/dev/sda",
229 8c114acd Michael Hanselmann
     "name": "xen-pvm",
230 8c114acd Michael Hanselmann
     "kernel_args": "ro"
231 d92518d3 Agata Murawska
   },
232 8c114acd Michael Hanselmann
  "version": "0",
233 8c114acd Michael Hanselmann
  "disk_template": None,
234 8c114acd Michael Hanselmann
  "os": {"name": "lenny-image"}
235 d92518d3 Agata Murawska
}
236 d92518d3 Agata Murawska
EXP_NAME ="xen-dev-i1"
237 d92518d3 Agata Murawska
EXP_VCPUS = 1
238 d92518d3 Agata Murawska
EXP_MEMORY = 512
239 d92518d3 Agata Murawska
240 d92518d3 Agata Murawska
EXPORT_EMPTY = ("<Envelope xml:lang=\"en-US\" xmlns=\"http://schemas.dmtf.org/"
241 d92518d3 Agata Murawska
                "ovf/envelope/1\" xmlns:gnt=\"http://ganeti\" xmlns:ovf=\""
242 d92518d3 Agata Murawska
                "http://schemas.dmtf.org/ovf/envelope/1\" xmlns:rasd=\""
243 d92518d3 Agata Murawska
                "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_Resource"
244 d92518d3 Agata Murawska
                "AllocationSettingData\" xmlns:vssd=\"http://schemas.dmtf.org"
245 d92518d3 Agata Murawska
                "/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData\""
246 d92518d3 Agata Murawska
                " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" />")
247 fa337742 Agata Murawska
EXPORT_DISKS_EMPTY = ("<References /><DiskSection><Info>Virtual disk"
248 fa337742 Agata Murawska
                      " information</Info></DiskSection>")
249 d92518d3 Agata Murawska
EXPORT_DISKS = ("<References><File ovf:compression=\"gzip\" ovf:href=\"new_disk"
250 d92518d3 Agata Murawska
                ".cow.gz\" ovf:id=\"file0\" ovf:size=\"203\" /><File ovf:href="
251 d92518d3 Agata Murawska
                "\"new_disk.cow\" ovf:id=\"file1\" ovf:size=\"15\" />"
252 fa337742 Agata Murawska
                "</References><DiskSection><Info>Virtual disk information"
253 fa337742 Agata Murawska
                "</Info><Disk ovf:capacity=\"90000\" ovf:diskId=\"disk0\" ovf"
254 fa337742 Agata Murawska
                ":fileRef=\"file0\" ovf:format=\"http://www.vmware.com/"
255 fa337742 Agata Murawska
                "interfaces/specifications/vmdk.html#monolithicSparse\" /><Disk"
256 fa337742 Agata Murawska
                " ovf:capacity=\"15\" ovf:diskId=\"disk1\" ovf:fileRef"
257 fa337742 Agata Murawska
                "=\"file1\" ovf:format=\"http://www.gnome.org/~markmc/qcow"
258 fa337742 Agata Murawska
                "-image-format.html\" /></DiskSection>")
259 fa337742 Agata Murawska
EXPORT_NETWORKS_EMPTY = ("<NetworkSection><Info>List of logical networks</Info>"
260 fa337742 Agata Murawska
                         "</NetworkSection>")
261 fa337742 Agata Murawska
EXPORT_NETWORKS = ("<NetworkSection><Info>List of logical networks</Info>"
262 fa337742 Agata Murawska
                   "<Network ovf:name=\"routed0\" /></NetworkSection>")
263 d92518d3 Agata Murawska
EXPORT_GANETI_INCOMPLETE = ("<gnt:GanetiSection><gnt:Version>0</gnt:Version>"
264 d92518d3 Agata Murawska
                            "<gnt:AutoBalance>True</gnt:AutoBalance><gnt:"
265 d92518d3 Agata Murawska
                            "OperatingSystem><gnt:Name>lenny-image</gnt:Name>"
266 d92518d3 Agata Murawska
                            "<gnt:Parameters /></gnt:OperatingSystem><gnt:"
267 d92518d3 Agata Murawska
                            "Hypervisor><gnt:Name>xen-kvm</gnt:Name><gnt:"
268 d92518d3 Agata Murawska
                            "Parameters /></gnt:Hypervisor><gnt:Network><gnt:"
269 d92518d3 Agata Murawska
                            "Nic ovf:name=\"routed0\"><gnt:Mode>routed</gnt:"
270 d92518d3 Agata Murawska
                            "Mode><gnt:MACAddress>aa:00:00:d8:2c:1e</gnt:"
271 d92518d3 Agata Murawska
                            "MACAddress><gnt:IPAddress>None</gnt:IPAddress>"
272 6e8091f9 Dimitris Aragiorgis
                            "<gnt:Link>br0</gnt:Link><gnt:Net>test</gnt:Net>"
273 6e8091f9 Dimitris Aragiorgis
                            "</gnt:Nic></gnt:Network></gnt:GanetiSection>")
274 d92518d3 Agata Murawska
EXPORT_GANETI = ("<gnt:GanetiSection><gnt:Version>0</gnt:Version><gnt:"
275 d92518d3 Agata Murawska
                 "AutoBalance>False</gnt:AutoBalance><gnt:OperatingSystem>"
276 d92518d3 Agata Murawska
                 "<gnt:Name>lenny-image</gnt:Name><gnt:Parameters /></gnt:"
277 d92518d3 Agata Murawska
                 "OperatingSystem><gnt:Hypervisor><gnt:Name>xen-pvm</gnt:Name>"
278 d92518d3 Agata Murawska
                 "<gnt:Parameters><gnt:root-path>/dev/sda</gnt:root-path><gnt:"
279 d92518d3 Agata Murawska
                 "kernel_args>ro</gnt:kernel_args></gnt:Parameters></gnt:"
280 d92518d3 Agata Murawska
                 "Hypervisor><gnt:Network><gnt:Nic ovf:name=\"routed0\"><gnt:"
281 d92518d3 Agata Murawska
                 "Mode>routed</gnt:Mode><gnt:MACAddress>aa:00:00:d8:2c:1e</gnt:"
282 d92518d3 Agata Murawska
                 "MACAddress><gnt:IPAddress>None</gnt:IPAddress><gnt:Link>br0"
283 6e8091f9 Dimitris Aragiorgis
                 "</gnt:Link><gnt:Net>test</gnt:Net></gnt:Nic></gnt:Network>"
284 6e8091f9 Dimitris Aragiorgis
                 "</gnt:GanetiSection>")
285 d92518d3 Agata Murawska
EXPORT_SYSTEM = ("<References><File ovf:compression=\"gzip\" ovf:href=\"new_"
286 d92518d3 Agata Murawska
                 "disk.cow.gz\" ovf:id=\"file0\" ovf:size=\"203\" /><File ovf:"
287 d92518d3 Agata Murawska
                 "href=\"new_disk.cow\" ovf:id=\"file1\" ovf:size=\"15\" />"
288 fa337742 Agata Murawska
                 "</References><DiskSection><Info>Virtual disk information"
289 fa337742 Agata Murawska
                 "</Info><Disk ovf:capacity=\"90000\" ovf:diskId=\"disk0\""
290 fa337742 Agata Murawska
                 " ovf:fileRef=\"file0\" ovf:format=\"http://www.vmware.com"
291 fa337742 Agata Murawska
                 "/interfaces/specifications/vmdk.html#monolithicSparse\" />"
292 fa337742 Agata Murawska
                 "<Disk ovf:capacity=\"15\" ovf:diskId=\"disk1\" ovf:fileRef"
293 fa337742 Agata Murawska
                 "=\"file1\" ovf:format=\"http://www.gnome.org/~markmc/qcow"
294 fa337742 Agata Murawska
                 "-image-format.html\" /></DiskSection><NetworkSection><Info>"
295 fa337742 Agata Murawska
                 "List of logical networks</Info><Network ovf:name=\"routed0\""
296 fa337742 Agata Murawska
                 " /></NetworkSection><VirtualSystem ovf:id=\"xen-dev-i1\">"
297 fa337742 Agata Murawska
                 "<Info>A virtual machine</Info><Name>xen-dev-i1</Name>"
298 fa337742 Agata Murawska
                 "<OperatingSystemSection ovf:id=\"0\"><Info>Installed guest"
299 fa337742 Agata Murawska
                 " operating system</Info></OperatingSystemSection><Virtual"
300 fa337742 Agata Murawska
                 "HardwareSection><Info>Virtual hardware requirements</Info>"
301 fa337742 Agata Murawska
                 "<System><vssd:ElementName>Virtual Hardware Family"
302 fa337742 Agata Murawska
                 "</vssd:ElementName><vssd:InstanceID>0</vssd:InstanceID><vssd:"
303 d92518d3 Agata Murawska
                 "VirtualSystemIdentifier>xen-dev-i1</vssd:VirtualSystem"
304 d92518d3 Agata Murawska
                 "Identifier><vssd:VirtualSystemType>ganeti-ovf</vssd:Virtual"
305 d92518d3 Agata Murawska
                 "SystemType></System><Item><rasd:ElementName>1 virtual CPU(s)"
306 d92518d3 Agata Murawska
                 "</rasd:ElementName><rasd:InstanceID>1</rasd:InstanceID><rasd:"
307 d92518d3 Agata Murawska
                 "ResourceType>3</rasd:ResourceType><rasd:VirtualQuantity>1"
308 d92518d3 Agata Murawska
                 "</rasd:VirtualQuantity></Item><Item><rasd:AllocationUnits>"
309 d92518d3 Agata Murawska
                 "byte * 2^20</rasd:AllocationUnits><rasd:ElementName>512MB of"
310 d92518d3 Agata Murawska
                 " memory</rasd:ElementName><rasd:InstanceID>2</rasd:"
311 d92518d3 Agata Murawska
                 "InstanceID><rasd:ResourceType>4</rasd:ResourceType><rasd:"
312 d92518d3 Agata Murawska
                 "VirtualQuantity>512</rasd:VirtualQuantity></Item><Item>"
313 d92518d3 Agata Murawska
                 "<rasd:Address>0</rasd:Address><rasd:ElementName>scsi"
314 fa337742 Agata Murawska
                 "_controller0</rasd:ElementName><rasd:InstanceID>3"
315 fa337742 Agata Murawska
                 "</rasd:InstanceID><rasd:ResourceSubType>lsilogic</rasd"
316 fa337742 Agata Murawska
                 ":ResourceSubType><rasd:ResourceType>6</rasd:ResourceType>"
317 fa337742 Agata Murawska
                 "</Item><Item><rasd:ElementName>disk0</rasd:ElementName><rasd"
318 fa337742 Agata Murawska
                 ":HostResource>ovf:/disk/disk0</rasd:HostResource><rasd"
319 fa337742 Agata Murawska
                 ":InstanceID>4</rasd:InstanceID><rasd:Parent>3</rasd:Parent>"
320 fa337742 Agata Murawska
                 "<rasd:ResourceType>17</rasd:ResourceType></Item><Item><rasd:"
321 fa337742 Agata Murawska
                 "ElementName>disk1</rasd:ElementName><rasd:HostResource>ovf:/"
322 fa337742 Agata Murawska
                 "disk/disk1</rasd:HostResource><rasd:InstanceID>5</rasd"
323 fa337742 Agata Murawska
                 ":InstanceID><rasd:Parent>3</rasd:Parent><rasd:ResourceType>17"
324 fa337742 Agata Murawska
                 "</rasd:ResourceType></Item><Item><rasd:Address>aa:00"
325 fa337742 Agata Murawska
                 ":00:d8:2c:1e</rasd:Address><rasd:Connection>routed0</rasd"
326 fa337742 Agata Murawska
                 ":Connection><rasd:ElementName>routed0</rasd:ElementName><rasd"
327 fa337742 Agata Murawska
                 ":InstanceID>6</rasd:InstanceID><rasd:ResourceType>10</rasd"
328 fa337742 Agata Murawska
                 ":ResourceType></Item></VirtualHardwareSection>"
329 fa337742 Agata Murawska
                 "</VirtualSystem>")
330 d92518d3 Agata Murawska
331 1e6fab60 Agata Murawska
332 1e6fab60 Agata Murawska
def _GetArgs(args, with_name=False):
333 1e6fab60 Agata Murawska
  options = optparse.Values()
334 1e6fab60 Agata Murawska
  needed = args
335 1e6fab60 Agata Murawska
  if with_name:
336 1e6fab60 Agata Murawska
    needed["name"] = "test-instance"
337 1e6fab60 Agata Murawska
  options._update_loose(needed)
338 1e6fab60 Agata Murawska
  return options
339 1e6fab60 Agata Murawska
340 1e6fab60 Agata Murawska
341 1e6fab60 Agata Murawska
OPTS_EMPTY = _GetArgs(ARGS_EMPTY)
342 1e6fab60 Agata Murawska
OPTS_EXPORT_NO_NAME = _GetArgs(ARGS_EXPORT_DIR)
343 1e6fab60 Agata Murawska
OPTS_EXPORT = _GetArgs(ARGS_EXPORT_DIR, with_name=True)
344 d92518d3 Agata Murawska
345 d92518d3 Agata Murawska
EXP_OPTS = OPTS_EXPORT_NO_NAME
346 d92518d3 Agata Murawska
EXP_OPTS_COMPRESSED = _GetArgs(EXP_ARGS_COMPRESSED)
347 d92518d3 Agata Murawska
348 1e6fab60 Agata Murawska
OPTS_VBOX = _GetArgs(ARGS_VBOX)
349 1e6fab60 Agata Murawska
OPTS_COMPLETE = _GetArgs(ARGS_COMPLETE)
350 1e6fab60 Agata Murawska
OPTS_NONIC_NODISK = _GetArgs(ARGS_BROKEN)
351 1e6fab60 Agata Murawska
352 1e6fab60 Agata Murawska
353 1e6fab60 Agata Murawska
def _GetFullFilename(file_name):
354 1e6fab60 Agata Murawska
  file_path = "%s/test/data/ovfdata/%s" % (testutils.GetSourceDir(),
355 1e6fab60 Agata Murawska
    file_name)
356 1e6fab60 Agata Murawska
  file_path = os.path.abspath(file_path)
357 1e6fab60 Agata Murawska
  return file_path
358 1e6fab60 Agata Murawska
359 1e6fab60 Agata Murawska
360 1e6fab60 Agata Murawska
class BetterUnitTest(unittest.TestCase):
361 1e6fab60 Agata Murawska
  def assertRaisesRegexp(self, exception, regexp_val, function, *args):
362 1e6fab60 Agata Murawska
    try:
363 1e6fab60 Agata Murawska
      function(*args)
364 1e6fab60 Agata Murawska
      self.fail("Expected raising %s" % exception)
365 1e6fab60 Agata Murawska
    except exception, err:
366 1e6fab60 Agata Murawska
      regexp = re.compile(regexp_val)
367 1e6fab60 Agata Murawska
      if re.search(regexp, str(err)) == None:
368 1e6fab60 Agata Murawska
        self.fail("Expected matching '%s', got '%s'" %
369 1e6fab60 Agata Murawska
          (regexp_val, str(err)))
370 1e6fab60 Agata Murawska
371 1e6fab60 Agata Murawska
372 1e6fab60 Agata Murawska
class TestOVFImporter(BetterUnitTest):
373 1e6fab60 Agata Murawska
  def setUp(self):
374 1e6fab60 Agata Murawska
    self.non_existing_file = _GetFullFilename("not_the_file.ovf")
375 1e6fab60 Agata Murawska
    self.ganeti_ovf = _GetFullFilename("ganeti.ovf")
376 1e6fab60 Agata Murawska
    self.virtualbox_ovf = _GetFullFilename("virtualbox.ovf")
377 1e6fab60 Agata Murawska
    self.ova_package = _GetFullFilename("ova.ova")
378 1e6fab60 Agata Murawska
    self.empty_ovf = _GetFullFilename("empty.ovf")
379 1e6fab60 Agata Murawska
    self.wrong_extension = _GetFullFilename("wrong_extension.ovd")
380 1e6fab60 Agata Murawska
    self.wrong_ova_archive = _GetFullFilename("wrong_ova.ova")
381 1e6fab60 Agata Murawska
    self.no_ovf_in_ova = _GetFullFilename("no_ovf.ova")
382 1e6fab60 Agata Murawska
    self.importer = None
383 1e6fab60 Agata Murawska
384 1e6fab60 Agata Murawska
  def tearDown(self):
385 1e6fab60 Agata Murawska
    if self.importer:
386 1e6fab60 Agata Murawska
      self.importer.Cleanup()
387 1e6fab60 Agata Murawska
    del_dir = os.path.abspath(OUTPUT_DIR)
388 1e6fab60 Agata Murawska
    try:
389 1e6fab60 Agata Murawska
      shutil.rmtree(del_dir)
390 1e6fab60 Agata Murawska
    except OSError:
391 1e6fab60 Agata Murawska
      pass
392 1e6fab60 Agata Murawska
393 1e6fab60 Agata Murawska
  def testFileDoesNotExistError(self):
394 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "does not exist",
395 1e6fab60 Agata Murawska
      ovf.OVFImporter, self.non_existing_file, None)
396 1e6fab60 Agata Murawska
397 1e6fab60 Agata Murawska
  def testWrongInputFileExtensionError(self):
398 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
399 1e6fab60 Agata Murawska
      "Unknown file extension", ovf.OVFImporter,
400 1e6fab60 Agata Murawska
      self.wrong_extension, None)
401 1e6fab60 Agata Murawska
402 1e6fab60 Agata Murawska
  def testOVAUnpackingDirectories(self):
403 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.ova_package, OPTS_EMPTY)
404 1e6fab60 Agata Murawska
    self.assertTrue(self.importer.input_dir != None)
405 a56625a2 Michael Hanselmann
    self.assertEquals(self.importer.output_dir , pathutils.EXPORT_DIR)
406 1e6fab60 Agata Murawska
    self.assertTrue(self.importer.temp_dir != None)
407 1e6fab60 Agata Murawska
408 1e6fab60 Agata Murawska
  def testOVFUnpackingDirectories(self):
409 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.virtualbox_ovf,
410 1e6fab60 Agata Murawska
      OPTS_EMPTY)
411 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.input_dir , _GetFullFilename(""))
412 a56625a2 Michael Hanselmann
    self.assertEquals(self.importer.output_dir , pathutils.EXPORT_DIR)
413 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.temp_dir , None)
414 1e6fab60 Agata Murawska
415 1e6fab60 Agata Murawska
  def testOVFSetOutputDirDirectories(self):
416 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
417 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.input_dir , _GetFullFilename(""))
418 1e6fab60 Agata Murawska
    self.assertTrue(OUTPUT_DIR in self.importer.output_dir)
419 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.temp_dir , None)
420 1e6fab60 Agata Murawska
421 1e6fab60 Agata Murawska
  def testWrongOVAArchiveError(self):
422 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "not a proper tar",
423 1e6fab60 Agata Murawska
      ovf.OVFImporter, self.wrong_ova_archive, None)
424 1e6fab60 Agata Murawska
425 1e6fab60 Agata Murawska
  def testNoOVFFileInOVAPackageError(self):
426 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "No .ovf file",
427 1e6fab60 Agata Murawska
      ovf.OVFImporter, self.no_ovf_in_ova, None)
428 1e6fab60 Agata Murawska
429 1e6fab60 Agata Murawska
  def testParseGanetiOvf(self):
430 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT_NO_NAME)
431 1e6fab60 Agata Murawska
    self.importer.Parse()
432 1e6fab60 Agata Murawska
    self.assertTrue("%s/ganeti-test-xen" % OUTPUT_DIR in
433 1e6fab60 Agata Murawska
      self.importer.output_dir)
434 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_disk, GANETI_DISKS)
435 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_network, GANETI_NETWORKS)
436 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_hypervisor, GANETI_HYPERVISOR)
437 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_os, GANETI_OS)
438 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_backend, GANETI_BACKEND)
439 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_name, GANETI_NAME)
440 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_template, GANETI_TEMPLATE)
441 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_tags, GANETI_TAGS)
442 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_version, GANETI_VERSION)
443 1e6fab60 Agata Murawska
444 1e6fab60 Agata Murawska
  def testParseVirtualboxOvf(self):
445 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.virtualbox_ovf, OPTS_VBOX)
446 1e6fab60 Agata Murawska
    self.importer.Parse()
447 1e6fab60 Agata Murawska
    self.assertTrue("%s/test-instance" % OUTPUT_DIR in self.importer.output_dir)
448 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_disk, VIRTUALBOX_DISKS)
449 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_network, VIRTUALBOX_NETWORKS)
450 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_hypervisor, CMDARGS_HYPERVISOR)
451 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_os, CMDARGS_OS)
452 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_backend, VIRTUALBOX_BACKEND)
453 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_name, CMDARGS_NAME)
454 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_template, VIRTUALBOX_TEMPLATE)
455 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_tags, VIRTUALBOX_TAGS)
456 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_version, constants.EXPORT_VERSION)
457 1e6fab60 Agata Murawska
458 1e6fab60 Agata Murawska
  def testParseEmptyOvf(self):
459 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
460 1e6fab60 Agata Murawska
    self.importer.Parse()
461 1e6fab60 Agata Murawska
    self.assertTrue("%s/test-instance" % OUTPUT_DIR in self.importer.output_dir)
462 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_disk, CMDARGS_DISKS)
463 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_network, CMDARGS_NETWORKS)
464 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_hypervisor, CMDARGS_HYPERVISOR)
465 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_os, CMDARGS_OS)
466 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_backend, CMDARGS_BACKEND)
467 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_name, CMDARGS_NAME)
468 1e6fab60 Agata Murawska
    self.assertEquals(self.importer.results_template, CMDARGS_TEMPLATE)
469 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_tags, CMDARGS_TAGS)
470 1e6fab60 Agata Murawska
    self.assertEqual(self.importer.results_version, constants.EXPORT_VERSION)
471 1e6fab60 Agata Murawska
472 1e6fab60 Agata Murawska
  def testParseNameOptions(self):
473 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
474 1e6fab60 Agata Murawska
    results = self.importer._ParseNameOptions()
475 1e6fab60 Agata Murawska
    self.assertEquals(results, CMDARGS_NAME)
476 1e6fab60 Agata Murawska
477 1e6fab60 Agata Murawska
  def testParseHypervisorOptions(self):
478 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
479 1e6fab60 Agata Murawska
    results = self.importer._ParseHypervisorOptions()
480 1e6fab60 Agata Murawska
    self.assertEquals(results, CMDARGS_HYPERVISOR)
481 1e6fab60 Agata Murawska
482 1e6fab60 Agata Murawska
  def testParseOSOptions(self):
483 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
484 1e6fab60 Agata Murawska
    results = self.importer._ParseOSOptions()
485 1e6fab60 Agata Murawska
    self.assertEquals(results, CMDARGS_OS)
486 1e6fab60 Agata Murawska
487 1e6fab60 Agata Murawska
  def testParseBackendOptions(self):
488 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
489 1e6fab60 Agata Murawska
    results = self.importer._ParseBackendOptions()
490 1e6fab60 Agata Murawska
    self.assertEquals(results, CMDARGS_BACKEND)
491 1e6fab60 Agata Murawska
492 1e6fab60 Agata Murawska
  def testParseTags(self):
493 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
494 1e6fab60 Agata Murawska
    results = self.importer._ParseTags()
495 1e6fab60 Agata Murawska
    self.assertEquals(results, CMDARGS_TAGS)
496 1e6fab60 Agata Murawska
497 1e6fab60 Agata Murawska
  def testParseNicOptions(self):
498 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
499 1e6fab60 Agata Murawska
    results = self.importer._ParseNicOptions()
500 1e6fab60 Agata Murawska
    self.assertEquals(results, CMDARGS_NETWORKS)
501 1e6fab60 Agata Murawska
502 1e6fab60 Agata Murawska
  def testParseDiskOptionsFromGanetiOVF(self):
503 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
504 1e6fab60 Agata Murawska
    os.mkdir(OUTPUT_DIR)
505 1e6fab60 Agata Murawska
    results = self.importer._GetDiskInfo()
506 1e6fab60 Agata Murawska
    self.assertEquals(results, GANETI_DISKS)
507 1e6fab60 Agata Murawska
508 1e6fab60 Agata Murawska
  def testParseTemplateOptions(self):
509 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
510 1e6fab60 Agata Murawska
    results = self.importer._ParseTemplateOptions()
511 1e6fab60 Agata Murawska
    self.assertEquals(results, GANETI_TEMPLATE)
512 1e6fab60 Agata Murawska
513 1e6fab60 Agata Murawska
  def testParseDiskOptionsFromCmdLine(self):
514 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
515 1e6fab60 Agata Murawska
    os.mkdir(OUTPUT_DIR)
516 1e6fab60 Agata Murawska
    results = self.importer._ParseDiskOptions()
517 1e6fab60 Agata Murawska
    self.assertEquals(results, CMDARGS_DISKS)
518 1e6fab60 Agata Murawska
519 1e6fab60 Agata Murawska
  def testGetDiskFormat(self):
520 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
521 1e6fab60 Agata Murawska
    disks_list = self.importer.ovf_reader.GetDisksNames()
522 1e6fab60 Agata Murawska
    results = [self.importer._GetDiskQemuInfo("%s/%s" %
523 1e6fab60 Agata Murawska
      (self.importer.input_dir, path), "file format: (\S+)")
524 1e6fab60 Agata Murawska
      for (path, _) in disks_list]
525 1e6fab60 Agata Murawska
    self.assertEqual(results, ["vmdk"])
526 1e6fab60 Agata Murawska
527 1e6fab60 Agata Murawska
  def testNoInstanceNameOVF(self):
528 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_EXPORT_NO_NAME)
529 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "Name of instance",
530 1e6fab60 Agata Murawska
      self.importer.Parse)
531 1e6fab60 Agata Murawska
532 1e6fab60 Agata Murawska
  def testErrorNoOSNameOVF(self):
533 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.virtualbox_ovf, OPTS_EXPORT)
534 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "OS name",
535 1e6fab60 Agata Murawska
      self.importer.Parse)
536 1e6fab60 Agata Murawska
537 1e6fab60 Agata Murawska
  def testErrorNoDiskAndNoNetwork(self):
538 1e6fab60 Agata Murawska
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_NONIC_NODISK)
539 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
540 1e6fab60 Agata Murawska
      "Either disk specification or network"
541 1e6fab60 Agata Murawska
      " description", self.importer.Parse)
542 1e6fab60 Agata Murawska
543 1e6fab60 Agata Murawska
544 d92518d3 Agata Murawska
class TestOVFExporter(BetterUnitTest):
545 d92518d3 Agata Murawska
  def setUp(self):
546 d92518d3 Agata Murawska
    self.exporter = None
547 d92518d3 Agata Murawska
    self.wrong_config_file = _GetFullFilename("wrong_config.ini")
548 d92518d3 Agata Murawska
    self.unsafe_path_to_disk = _GetFullFilename("unsafe_path.ini")
549 d92518d3 Agata Murawska
    self.disk_image_not_exist = _GetFullFilename("no_disk.ini")
550 d92518d3 Agata Murawska
    self.empty_config = _GetFullFilename("empty.ini")
551 d92518d3 Agata Murawska
    self.standard_export = _GetFullFilename("config.ini")
552 d92518d3 Agata Murawska
    self.wrong_network_mode = self.disk_image_not_exist
553 d92518d3 Agata Murawska
    self.no_memory = self.disk_image_not_exist
554 d92518d3 Agata Murawska
    self.no_vcpus = self.disk_image_not_exist
555 d92518d3 Agata Murawska
    self.no_os = _GetFullFilename("no_os.ini")
556 d92518d3 Agata Murawska
    self.no_hypervisor = self.disk_image_not_exist
557 d92518d3 Agata Murawska
558 d92518d3 Agata Murawska
  def tearDown(self):
559 d92518d3 Agata Murawska
    if self.exporter:
560 d92518d3 Agata Murawska
      self.exporter.Cleanup()
561 d92518d3 Agata Murawska
    del_dir = os.path.abspath(OUTPUT_DIR)
562 d92518d3 Agata Murawska
    try:
563 d92518d3 Agata Murawska
      shutil.rmtree(del_dir)
564 d92518d3 Agata Murawska
    except OSError:
565 d92518d3 Agata Murawska
      pass
566 d92518d3 Agata Murawska
567 d92518d3 Agata Murawska
  def testErrorWrongConfigFile(self):
568 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
569 d92518d3 Agata Murawska
      "Error when trying to read", ovf.OVFExporter,
570 d92518d3 Agata Murawska
      self.wrong_config_file, EXP_OPTS)
571 d92518d3 Agata Murawska
572 d92518d3 Agata Murawska
  def testErrorPathToTheDiskIncorrect(self):
573 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.unsafe_path_to_disk, EXP_OPTS)
574 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "contains a directory name",
575 d92518d3 Agata Murawska
      self.exporter._ParseDisks)
576 d92518d3 Agata Murawska
577 d92518d3 Agata Murawska
  def testErrorDiskImageNotExist(self):
578 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.disk_image_not_exist, EXP_OPTS)
579 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "Disk image does not exist",
580 d92518d3 Agata Murawska
      self.exporter._ParseDisks)
581 d92518d3 Agata Murawska
582 d92518d3 Agata Murawska
  def testParseNetworks(self):
583 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.standard_export, EXP_OPTS)
584 d92518d3 Agata Murawska
    results = self.exporter._ParseNetworks()
585 d92518d3 Agata Murawska
    self.assertEqual(results, EXP_NETWORKS_LIST)
586 d92518d3 Agata Murawska
587 d92518d3 Agata Murawska
  def testErrorWrongNetworkMode(self):
588 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.wrong_network_mode, EXP_OPTS)
589 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
590 d92518d3 Agata Murawska
      "Network mode nic not recognized", self.exporter._ParseNetworks)
591 d92518d3 Agata Murawska
592 d92518d3 Agata Murawska
  def testParseVCPusMem(self):
593 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.standard_export, EXP_OPTS)
594 d92518d3 Agata Murawska
    vcpus = self.exporter._ParseVCPUs()
595 d92518d3 Agata Murawska
    memory = self.exporter._ParseMemory()
596 d92518d3 Agata Murawska
    self.assertEqual(vcpus, EXP_VCPUS)
597 d92518d3 Agata Murawska
    self.assertEqual(memory, EXP_MEMORY)
598 d92518d3 Agata Murawska
599 d92518d3 Agata Murawska
  def testErrorNoVCPUs(self):
600 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.no_vcpus, EXP_OPTS)
601 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "No CPU information found",
602 d92518d3 Agata Murawska
      self.exporter._ParseVCPUs)
603 d92518d3 Agata Murawska
604 d92518d3 Agata Murawska
  def testErrorNoMemory(self):
605 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.no_memory, EXP_OPTS)
606 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "No memory information found",
607 d92518d3 Agata Murawska
      self.exporter._ParseMemory)
608 d92518d3 Agata Murawska
609 d92518d3 Agata Murawska
  def testParseGaneti(self):
610 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.standard_export, EXP_OPTS)
611 d92518d3 Agata Murawska
    results = self.exporter._ParseGaneti()
612 d92518d3 Agata Murawska
    self.assertEqual(results, EXP_GANETI_DICT)
613 d92518d3 Agata Murawska
614 d92518d3 Agata Murawska
  def testErrorNoHypervisor(self):
615 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.no_hypervisor, EXP_OPTS)
616 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
617 d92518d3 Agata Murawska
      "No hypervisor information found", self.exporter._ParseGaneti)
618 d92518d3 Agata Murawska
619 d92518d3 Agata Murawska
  def testErrorNoOS(self):
620 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.no_os, EXP_OPTS)
621 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
622 d92518d3 Agata Murawska
      "No operating system information found", self.exporter._ParseGaneti)
623 d92518d3 Agata Murawska
624 d92518d3 Agata Murawska
  def testErrorParseNoInstanceName(self):
625 d92518d3 Agata Murawska
    self.exporter = ovf.OVFExporter(self.empty_config, EXP_OPTS)
626 d92518d3 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "No instance name found",
627 d92518d3 Agata Murawska
      self.exporter.Parse)
628 d92518d3 Agata Murawska
629 d92518d3 Agata Murawska
630 1e6fab60 Agata Murawska
class TestOVFReader(BetterUnitTest):
631 1e6fab60 Agata Murawska
  def setUp(self):
632 1e6fab60 Agata Murawska
    self.wrong_xml_file = _GetFullFilename("wrong_xml.ovf")
633 1e6fab60 Agata Murawska
    self.ganeti_ovf = _GetFullFilename("ganeti.ovf")
634 1e6fab60 Agata Murawska
    self.virtualbox_ovf = _GetFullFilename("virtualbox.ovf")
635 1e6fab60 Agata Murawska
    self.corrupted_ovf = _GetFullFilename("corrupted_resources.ovf")
636 1e6fab60 Agata Murawska
    self.wrong_manifest_ovf = _GetFullFilename("wrong_manifest.ovf")
637 1e6fab60 Agata Murawska
    self.no_disk_in_ref_ovf = _GetFullFilename("no_disk_in_ref.ovf")
638 1e6fab60 Agata Murawska
    self.empty_ovf = _GetFullFilename("empty.ovf")
639 1e6fab60 Agata Murawska
    self.compressed_disk = _GetFullFilename("gzip_disk.ovf")
640 1e6fab60 Agata Murawska
641 1e6fab60 Agata Murawska
  def tearDown(self):
642 1e6fab60 Agata Murawska
    pass
643 1e6fab60 Agata Murawska
644 1e6fab60 Agata Murawska
  def testXMLParsingError(self):
645 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
646 1e6fab60 Agata Murawska
      "Error while reading .ovf", ovf.OVFReader, self.wrong_xml_file)
647 1e6fab60 Agata Murawska
648 1e6fab60 Agata Murawska
  def testFileInResourcesDoesNotExistError(self):
649 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError, "does not exist",
650 1e6fab60 Agata Murawska
      ovf.OVFReader, self.corrupted_ovf)
651 1e6fab60 Agata Murawska
652 1e6fab60 Agata Murawska
  def testWrongManifestChecksumError(self):
653 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.wrong_manifest_ovf)
654 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
655 1e6fab60 Agata Murawska
      "does not match the value in manifest file", reader.VerifyManifest)
656 1e6fab60 Agata Murawska
657 1e6fab60 Agata Murawska
  def testGoodManifestChecksum(self):
658 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
659 1e6fab60 Agata Murawska
    self.assertEqual(reader.VerifyManifest(), None)
660 1e6fab60 Agata Murawska
661 1e6fab60 Agata Murawska
  def testGetDisksNamesOVFCorruptedError(self):
662 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.no_disk_in_ref_ovf)
663 1e6fab60 Agata Murawska
    self.assertRaisesRegexp(errors.OpPrereqError,
664 1e6fab60 Agata Murawska
      "not found in references", reader.GetDisksNames)
665 1e6fab60 Agata Murawska
666 1e6fab60 Agata Murawska
  def testGetDisksNamesVirtualbox(self):
667 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.virtualbox_ovf)
668 1e6fab60 Agata Murawska
    disk_names = reader.GetDisksNames()
669 1e6fab60 Agata Murawska
    expected_names = [
670 1e6fab60 Agata Murawska
      ("new_disk.vmdk", None) ,
671 1e6fab60 Agata Murawska
      ("second_disk.vmdk", None),
672 1e6fab60 Agata Murawska
    ]
673 1e6fab60 Agata Murawska
    self.assertEqual(sorted(disk_names), sorted(expected_names))
674 1e6fab60 Agata Murawska
675 1e6fab60 Agata Murawska
  def testGetDisksNamesEmpty(self):
676 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
677 1e6fab60 Agata Murawska
    disk_names = reader.GetDisksNames()
678 1e6fab60 Agata Murawska
    self.assertEqual(disk_names, [])
679 1e6fab60 Agata Murawska
680 1e6fab60 Agata Murawska
  def testGetDisksNamesCompressed(self):
681 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.compressed_disk)
682 1e6fab60 Agata Murawska
    disk_names = reader.GetDisksNames()
683 1e6fab60 Agata Murawska
    self.assertEqual(disk_names, [("compr_disk.vmdk.gz", "gzip")])
684 1e6fab60 Agata Murawska
685 1e6fab60 Agata Murawska
  def testGetNetworkDataGaneti(self):
686 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
687 1e6fab60 Agata Murawska
    networks = reader.GetNetworkData()
688 1e6fab60 Agata Murawska
    self.assertEqual(networks, GANETI_NETWORKS)
689 1e6fab60 Agata Murawska
690 1e6fab60 Agata Murawska
  def testGetNetworkDataVirtualbox(self):
691 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.virtualbox_ovf)
692 1e6fab60 Agata Murawska
    networks = reader.GetNetworkData()
693 1e6fab60 Agata Murawska
    self.assertEqual(networks, VIRTUALBOX_NETWORKS)
694 1e6fab60 Agata Murawska
695 1e6fab60 Agata Murawska
  def testGetNetworkDataEmpty(self):
696 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
697 1e6fab60 Agata Murawska
    networks = reader.GetNetworkData()
698 1e6fab60 Agata Murawska
    self.assertEqual(networks, EMPTY_NETWORKS)
699 1e6fab60 Agata Murawska
700 1e6fab60 Agata Murawska
  def testGetHypervisorDataGaneti(self):
701 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
702 1e6fab60 Agata Murawska
    hypervisor = reader.GetHypervisorData()
703 1e6fab60 Agata Murawska
    self.assertEqual(hypervisor, GANETI_HYPERVISOR)
704 1e6fab60 Agata Murawska
705 1e6fab60 Agata Murawska
  def testGetHypervisorDataEmptyOvf(self):
706 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
707 1e6fab60 Agata Murawska
    hypervisor = reader.GetHypervisorData()
708 1e6fab60 Agata Murawska
    self.assertEqual(hypervisor, EMPTY_HYPERVISOR)
709 1e6fab60 Agata Murawska
710 1e6fab60 Agata Murawska
  def testGetOSDataGaneti(self):
711 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
712 1e6fab60 Agata Murawska
    osys = reader.GetOSData()
713 1e6fab60 Agata Murawska
    self.assertEqual(osys, GANETI_OS)
714 1e6fab60 Agata Murawska
715 1e6fab60 Agata Murawska
  def testGetOSDataEmptyOvf(self):
716 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
717 1e6fab60 Agata Murawska
    osys = reader.GetOSData()
718 1e6fab60 Agata Murawska
    self.assertEqual(osys, EMPTY_OS)
719 1e6fab60 Agata Murawska
720 1e6fab60 Agata Murawska
  def testGetBackendDataGaneti(self):
721 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
722 1e6fab60 Agata Murawska
    backend = reader.GetBackendData()
723 1e6fab60 Agata Murawska
    self.assertEqual(backend, GANETI_BACKEND)
724 1e6fab60 Agata Murawska
725 1e6fab60 Agata Murawska
  def testGetBackendDataVirtualbox(self):
726 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.virtualbox_ovf)
727 1e6fab60 Agata Murawska
    backend = reader.GetBackendData()
728 1e6fab60 Agata Murawska
    self.assertEqual(backend, VIRTUALBOX_BACKEND)
729 1e6fab60 Agata Murawska
730 1e6fab60 Agata Murawska
  def testGetBackendDataEmptyOvf(self):
731 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
732 1e6fab60 Agata Murawska
    backend = reader.GetBackendData()
733 1e6fab60 Agata Murawska
    self.assertEqual(backend, EMPTY_BACKEND)
734 1e6fab60 Agata Murawska
735 1e6fab60 Agata Murawska
  def testGetInstanceNameGaneti(self):
736 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
737 1e6fab60 Agata Murawska
    name = reader.GetInstanceName()
738 1e6fab60 Agata Murawska
    self.assertEqual(name, GANETI_NAME)
739 1e6fab60 Agata Murawska
740 1e6fab60 Agata Murawska
  def testGetInstanceNameDataEmptyOvf(self):
741 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
742 1e6fab60 Agata Murawska
    name = reader.GetInstanceName()
743 1e6fab60 Agata Murawska
    self.assertEqual(name, EMPTY_NAME)
744 1e6fab60 Agata Murawska
745 1e6fab60 Agata Murawska
  def testGetDiskTemplateGaneti(self):
746 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
747 1e6fab60 Agata Murawska
    name = reader.GetDiskTemplate()
748 1e6fab60 Agata Murawska
    self.assertEqual(name, GANETI_TEMPLATE)
749 1e6fab60 Agata Murawska
750 1e6fab60 Agata Murawska
  def testGetDiskTemplateEmpty(self):
751 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
752 1e6fab60 Agata Murawska
    name = reader.GetDiskTemplate()
753 1e6fab60 Agata Murawska
    self.assertEqual(name, EMPTY_TEMPLATE)
754 1e6fab60 Agata Murawska
755 1e6fab60 Agata Murawska
  def testGetTagsGaneti(self):
756 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
757 1e6fab60 Agata Murawska
    tags = reader.GetTagsData()
758 1e6fab60 Agata Murawska
    self.assertEqual(tags, GANETI_TAGS)
759 1e6fab60 Agata Murawska
760 1e6fab60 Agata Murawska
  def testGetTagsEmpty(self):
761 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
762 1e6fab60 Agata Murawska
    tags = reader.GetTagsData()
763 1e6fab60 Agata Murawska
    self.assertEqual(tags, EMPTY_TAGS)
764 1e6fab60 Agata Murawska
765 1e6fab60 Agata Murawska
  def testGetVersionGaneti(self):
766 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.ganeti_ovf)
767 1e6fab60 Agata Murawska
    version = reader.GetVersionData()
768 1e6fab60 Agata Murawska
    self.assertEqual(version, GANETI_VERSION)
769 1e6fab60 Agata Murawska
770 1e6fab60 Agata Murawska
  def testGetVersionEmpty(self):
771 1e6fab60 Agata Murawska
    reader = ovf.OVFReader(self.empty_ovf)
772 1e6fab60 Agata Murawska
    version = reader.GetVersionData()
773 1e6fab60 Agata Murawska
    self.assertEqual(version, EMPTY_VERSION)
774 1e6fab60 Agata Murawska
775 1e6fab60 Agata Murawska
776 d92518d3 Agata Murawska
class TestOVFWriter(BetterUnitTest):
777 d92518d3 Agata Murawska
  def setUp(self):
778 d92518d3 Agata Murawska
    self.writer = ovf.OVFWriter(True)
779 d92518d3 Agata Murawska
780 d92518d3 Agata Murawska
  def tearDown(self):
781 d92518d3 Agata Murawska
    pass
782 d92518d3 Agata Murawska
783 d92518d3 Agata Murawska
  def testOVFWriterInit(self):
784 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
785 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_EMPTY in result)
786 d92518d3 Agata Murawska
787 d92518d3 Agata Murawska
  def testSaveDisksDataEmpty(self):
788 d92518d3 Agata Murawska
    self.writer.SaveDisksData([])
789 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
790 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_DISKS_EMPTY in result)
791 d92518d3 Agata Murawska
792 d92518d3 Agata Murawska
  def testSaveDisksData(self):
793 d92518d3 Agata Murawska
    self.writer.SaveDisksData(EXP_DISKS_LIST)
794 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
795 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_DISKS in result)
796 d92518d3 Agata Murawska
797 d92518d3 Agata Murawska
  def testSaveNetworkDataEmpty(self):
798 d92518d3 Agata Murawska
    self.writer.SaveNetworksData([])
799 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
800 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_NETWORKS_EMPTY in result)
801 d92518d3 Agata Murawska
802 d92518d3 Agata Murawska
  def testSaveNetworksData(self):
803 d92518d3 Agata Murawska
    self.writer.SaveNetworksData(EXP_NETWORKS_LIST)
804 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
805 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_NETWORKS in result)
806 d92518d3 Agata Murawska
807 d92518d3 Agata Murawska
  def testSaveGanetiDataIncomplete(self):
808 d92518d3 Agata Murawska
    self.writer.SaveGanetiData(EXP_PARTIAL_GANETI_DICT, EXP_NETWORKS_LIST)
809 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
810 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_GANETI_INCOMPLETE in result)
811 d92518d3 Agata Murawska
812 d92518d3 Agata Murawska
  def testSaveGanetiDataComplete(self):
813 d92518d3 Agata Murawska
    self.writer.SaveGanetiData(EXP_GANETI_DICT, EXP_NETWORKS_LIST)
814 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
815 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_GANETI in result)
816 d92518d3 Agata Murawska
817 d92518d3 Agata Murawska
  def testSaveVirtualSystem(self):
818 d92518d3 Agata Murawska
    self.writer.SaveDisksData(EXP_DISKS_LIST)
819 d92518d3 Agata Murawska
    self.writer.SaveNetworksData(EXP_NETWORKS_LIST)
820 d92518d3 Agata Murawska
    self.writer.SaveVirtualSystemData(EXP_NAME, EXP_VCPUS, EXP_MEMORY)
821 d92518d3 Agata Murawska
    result = ET.tostring(self.writer.tree)
822 d92518d3 Agata Murawska
    self.assertTrue(EXPORT_SYSTEM in result)
823 d92518d3 Agata Murawska
824 d92518d3 Agata Murawska
825 1e6fab60 Agata Murawska
if __name__ == "__main__":
826 1e6fab60 Agata Murawska
  testutils.GanetiTestProgram()