Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.ovf_unittest.py @ 55ffacfa

History | View | Annotate | Download (29.9 kB)

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