Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.ovf_unittest.py @ 1a2eb2dc

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