Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (17.3 kB)

1
#!/usr/bin/python
2
#
3

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

    
21

    
22
"""Script for testing ganeti.ovf.
23

24
"""
25

    
26
import optparse
27
import os
28
import os.path
29
import re
30
import shutil
31
import sys
32
import tempfile
33
import unittest
34

    
35
from ganeti import constants
36
from ganeti import errors
37
from ganeti import ovf
38
from ganeti import utils
39

    
40
import testutils
41

    
42
OUTPUT_DIR = "newdir"
43

    
44
GANETI_DISKS = {
45
  "disk_count": "1",
46
  "disk0_dump": "new_disk.raw",
47
  "disk0_size": "0",
48
  "disk0_ivname": "disk/0",
49
}
50
GANETI_NETWORKS = {
51
  "nic_count": "1",
52
  "nic0_mode": "bridged",
53
  "nic0_ip": "none",
54
  "nic0_mac": "aa:00:00:d8:2c:1e",
55
  "nic0_link": "xen-br0",
56
}
57
GANETI_HYPERVISOR = {
58
  "hypervisor_name": "xen-pvm",
59
  "root-path": "/dev/sda",
60
  "kernel_args": "ro",
61
}
62
GANETI_OS = {"os_name": "lenny-image"}
63
GANETI_BACKEND = {
64
  "vcpus": "1",
65
  "memory" : "2048",
66
  "auto_balance": "False",
67
}
68
GANETI_NAME = "ganeti-test-xen"
69
GANETI_TEMPLATE = "plain"
70
GANETI_TAGS = None
71
GANETI_VERSION = "0"
72

    
73
VIRTUALBOX_DISKS = {
74
  "disk_count": "2",
75
  "disk0_ivname": "disk/0",
76
  "disk0_dump": "new_disk.raw",
77
  "disk0_size": "0",
78
  "disk1_ivname": "disk/1",
79
  "disk1_dump": "second_disk.raw",
80
  "disk1_size": "0",
81
}
82
VIRTUALBOX_NETWORKS = {
83
  "nic_count": "1",
84
  "nic0_mode": "bridged",
85
  "nic0_ip": "none",
86
  "nic0_link": "auto",
87
  "nic0_mac": "auto",
88
}
89
VIRTUALBOX_HYPERVISOR = {"hypervisor_name": "auto"}
90
VIRTUALBOX_OS = {"os_name": None}
91
VIRTUALBOX_BACKEND = {
92
 "vcpus": "1",
93
  "memory" : "2048",
94
  "auto_balance": "auto",
95
}
96
VIRTUALBOX_NAME = None
97
VIRTUALBOX_TEMPLATE = None
98
VIRTUALBOX_TAGS = None
99
VIRTUALBOX_VERSION = None
100

    
101
EMPTY_DISKS = {}
102
EMPTY_NETWORKS = {}
103
EMPTY_HYPERVISOR = {"hypervisor_name": "auto"}
104
EMPTY_OS = {}
105
EMPTY_BACKEND = {
106
  "vcpus": "auto",
107
  "memory" : "auto",
108
  "auto_balance": "auto",
109
}
110
EMPTY_NAME = None
111
EMPTY_TEMPLATE = None
112
EMPTY_TAGS = None
113
EMPTY_VERSION = None
114

    
115
CMDARGS_DISKS = {
116
  "disk_count": "1",
117
  "disk0_ivname": "disk/0",
118
  "disk0_dump": "disk0.raw",
119
  "disk0_size": "8",
120
}
121
CMDARGS_NETWORKS = {
122
  "nic0_link": "auto",
123
  "nic0_mode": "bridged",
124
  "nic0_ip": "none",
125
  "nic0_mac": "auto",
126
  "nic_count": "1",
127
}
128
CMDARGS_HYPERVISOR = {
129
  "hypervisor_name": "xen-pvm"
130
}
131
CMDARGS_OS = {"os_name": "lenny-image"}
132
CMDARGS_BACKEND = {
133
  "auto_balance": False,
134
  "vcpus": "1",
135
  "memory": "256",
136
}
137
CMDARGS_NAME = "test-instance"
138
CMDARGS_TEMPLATE = "plain"
139
CMDARGS_TAGS = "test-tag-1,test-tag-2"
140

    
141
ARGS_EMPTY = {
142
  "output_dir": None,
143
  "nics": [],
144
  "disks": [],
145
  "name": "test-instance",
146
}
147
ARGS_EXPORT_DIR = dict(ARGS_EMPTY, **{
148
  "output_dir": OUTPUT_DIR,
149
  "name": None,
150
  "hypervisor": None,
151
  "os": None,
152
  "beparams": {},
153
  "no_nics": False,
154
  "disk_template": None,
155
  "tags": None,
156
})
157
ARGS_VBOX = dict(ARGS_EXPORT_DIR, **{
158
  "output_dir": OUTPUT_DIR,
159
  "name": "test-instance",
160
  "os": "lenny-image",
161
  "hypervisor": ("xen-pvm", {}),
162
  "osparams":{},
163
  "disks": [],
164
})
165
ARGS_COMPLETE = dict(ARGS_VBOX, **{
166
  "beparams": {"vcpus":"1", "memory":"256", "auto_balance": False},
167
  "disks": [(0,{"size":"5mb"})],
168
  "nics": [("0",{"mode":"bridged"})],
169
  "disk_template": "plain",
170
  "tags": "test-tag-1,test-tag-2",
171
})
172
ARGS_BROKEN = dict(ARGS_EXPORT_DIR , **{
173
  "no_nics": True,
174
  "disk_template": "diskless",
175
  "name": "test-instance",
176
  "os": "lenny-image",
177
  "osparams": {},
178
})
179

    
180

    
181
def _GetArgs(args, with_name=False):
182
  options = optparse.Values()
183
  needed = args
184
  if with_name:
185
    needed["name"] = "test-instance"
186
  options._update_loose(needed)
187
  return options
188

    
189

    
190
OPTS_EMPTY = _GetArgs(ARGS_EMPTY)
191
OPTS_EXPORT_NO_NAME = _GetArgs(ARGS_EXPORT_DIR)
192
OPTS_EXPORT = _GetArgs(ARGS_EXPORT_DIR, with_name=True)
193
OPTS_VBOX = _GetArgs(ARGS_VBOX)
194
OPTS_COMPLETE = _GetArgs(ARGS_COMPLETE)
195
OPTS_NONIC_NODISK = _GetArgs(ARGS_BROKEN)
196

    
197

    
198
def _GetFullFilename(file_name):
199
  file_path = "%s/test/data/ovfdata/%s" % (testutils.GetSourceDir(),
200
    file_name)
201
  file_path = os.path.abspath(file_path)
202
  return file_path
203

    
204

    
205
class BetterUnitTest(unittest.TestCase):
206
  def assertRaisesRegexp(self, exception, regexp_val, function, *args):
207
    try:
208
      function(*args)
209
      self.fail("Expected raising %s" % exception)
210
    except exception, err:
211
      regexp = re.compile(regexp_val)
212
      if re.search(regexp, str(err)) == None:
213
        self.fail("Expected matching '%s', got '%s'" %
214
          (regexp_val, str(err)))
215

    
216

    
217
class TestOVFImporter(BetterUnitTest):
218
  def setUp(self):
219
    self.non_existing_file = _GetFullFilename("not_the_file.ovf")
220
    self.ganeti_ovf = _GetFullFilename("ganeti.ovf")
221
    self.virtualbox_ovf = _GetFullFilename("virtualbox.ovf")
222
    self.ova_package = _GetFullFilename("ova.ova")
223
    self.empty_ovf = _GetFullFilename("empty.ovf")
224
    self.wrong_extension = _GetFullFilename("wrong_extension.ovd")
225
    self.wrong_ova_archive = _GetFullFilename("wrong_ova.ova")
226
    self.no_ovf_in_ova = _GetFullFilename("no_ovf.ova")
227
    self.importer = None
228

    
229
  def tearDown(self):
230
    if self.importer:
231
      self.importer.Cleanup()
232
    del_dir = os.path.abspath(OUTPUT_DIR)
233
    try:
234
      shutil.rmtree(del_dir)
235
    except OSError:
236
      pass
237

    
238
  def testFileDoesNotExistError(self):
239
    self.assertRaisesRegexp(errors.OpPrereqError, "does not exist",
240
      ovf.OVFImporter, self.non_existing_file, None)
241

    
242
  def testWrongInputFileExtensionError(self):
243
    self.assertRaisesRegexp(errors.OpPrereqError,
244
      "Unknown file extension", ovf.OVFImporter,
245
      self.wrong_extension, None)
246

    
247
  def testOVAUnpackingDirectories(self):
248
    self.importer = ovf.OVFImporter(self.ova_package, OPTS_EMPTY)
249
    self.assertTrue(self.importer.input_dir != None)
250
    self.assertEquals(self.importer.output_dir , constants.EXPORT_DIR)
251
    self.assertTrue(self.importer.temp_dir != None)
252

    
253
  def testOVFUnpackingDirectories(self):
254
    self.importer = ovf.OVFImporter(self.virtualbox_ovf,
255
      OPTS_EMPTY)
256
    self.assertEquals(self.importer.input_dir , _GetFullFilename(""))
257
    self.assertEquals(self.importer.output_dir , constants.EXPORT_DIR)
258
    self.assertEquals(self.importer.temp_dir , None)
259

    
260
  def testOVFSetOutputDirDirectories(self):
261
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
262
    self.assertEquals(self.importer.input_dir , _GetFullFilename(""))
263
    self.assertTrue(OUTPUT_DIR in self.importer.output_dir)
264
    self.assertEquals(self.importer.temp_dir , None)
265

    
266
  def testWrongOVAArchiveError(self):
267
    self.assertRaisesRegexp(errors.OpPrereqError, "not a proper tar",
268
      ovf.OVFImporter, self.wrong_ova_archive, None)
269

    
270
  def testNoOVFFileInOVAPackageError(self):
271
    self.assertRaisesRegexp(errors.OpPrereqError, "No .ovf file",
272
      ovf.OVFImporter, self.no_ovf_in_ova, None)
273

    
274
  def testParseGanetiOvf(self):
275
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT_NO_NAME)
276
    self.importer.Parse()
277
    self.assertTrue("%s/ganeti-test-xen" % OUTPUT_DIR in
278
      self.importer.output_dir)
279
    self.assertEqual(self.importer.results_disk, GANETI_DISKS)
280
    self.assertEqual(self.importer.results_network, GANETI_NETWORKS)
281
    self.assertEqual(self.importer.results_hypervisor, GANETI_HYPERVISOR)
282
    self.assertEqual(self.importer.results_os, GANETI_OS)
283
    self.assertEqual(self.importer.results_backend, GANETI_BACKEND)
284
    self.assertEqual(self.importer.results_name, GANETI_NAME)
285
    self.assertEqual(self.importer.results_template, GANETI_TEMPLATE)
286
    self.assertEqual(self.importer.results_tags, GANETI_TAGS)
287
    self.assertEqual(self.importer.results_version, GANETI_VERSION)
288

    
289
  def testParseVirtualboxOvf(self):
290
    self.importer = ovf.OVFImporter(self.virtualbox_ovf, OPTS_VBOX)
291
    self.importer.Parse()
292
    self.assertTrue("%s/test-instance" % OUTPUT_DIR in self.importer.output_dir)
293
    self.assertEquals(self.importer.results_disk, VIRTUALBOX_DISKS)
294
    self.assertEquals(self.importer.results_network, VIRTUALBOX_NETWORKS)
295
    self.assertEquals(self.importer.results_hypervisor, CMDARGS_HYPERVISOR)
296
    self.assertEquals(self.importer.results_os, CMDARGS_OS)
297
    self.assertEquals(self.importer.results_backend, VIRTUALBOX_BACKEND)
298
    self.assertEquals(self.importer.results_name, CMDARGS_NAME)
299
    self.assertEquals(self.importer.results_template, VIRTUALBOX_TEMPLATE)
300
    self.assertEqual(self.importer.results_tags, VIRTUALBOX_TAGS)
301
    self.assertEqual(self.importer.results_version, constants.EXPORT_VERSION)
302

    
303
  def testParseEmptyOvf(self):
304
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
305
    self.importer.Parse()
306
    self.assertTrue("%s/test-instance" % OUTPUT_DIR in self.importer.output_dir)
307
    self.assertEquals(self.importer.results_disk, CMDARGS_DISKS)
308
    self.assertEquals(self.importer.results_network, CMDARGS_NETWORKS)
309
    self.assertEquals(self.importer.results_hypervisor, CMDARGS_HYPERVISOR)
310
    self.assertEquals(self.importer.results_os, CMDARGS_OS)
311
    self.assertEquals(self.importer.results_backend, CMDARGS_BACKEND)
312
    self.assertEquals(self.importer.results_name, CMDARGS_NAME)
313
    self.assertEquals(self.importer.results_template, CMDARGS_TEMPLATE)
314
    self.assertEqual(self.importer.results_tags, CMDARGS_TAGS)
315
    self.assertEqual(self.importer.results_version, constants.EXPORT_VERSION)
316

    
317
  def testParseNameOptions(self):
318
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
319
    results = self.importer._ParseNameOptions()
320
    self.assertEquals(results, CMDARGS_NAME)
321

    
322
  def testParseHypervisorOptions(self):
323
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
324
    results = self.importer._ParseHypervisorOptions()
325
    self.assertEquals(results, CMDARGS_HYPERVISOR)
326

    
327
  def testParseOSOptions(self):
328
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
329
    results = self.importer._ParseOSOptions()
330
    self.assertEquals(results, CMDARGS_OS)
331

    
332
  def testParseBackendOptions(self):
333
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
334
    results = self.importer._ParseBackendOptions()
335
    self.assertEquals(results, CMDARGS_BACKEND)
336

    
337
  def testParseTags(self):
338
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
339
    results = self.importer._ParseTags()
340
    self.assertEquals(results, CMDARGS_TAGS)
341

    
342
  def testParseNicOptions(self):
343
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
344
    results = self.importer._ParseNicOptions()
345
    self.assertEquals(results, CMDARGS_NETWORKS)
346

    
347
  def testParseDiskOptionsFromGanetiOVF(self):
348
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
349
    os.mkdir(OUTPUT_DIR)
350
    results = self.importer._GetDiskInfo()
351
    self.assertEquals(results, GANETI_DISKS)
352

    
353
  def testParseTemplateOptions(self):
354
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
355
    results = self.importer._ParseTemplateOptions()
356
    self.assertEquals(results, GANETI_TEMPLATE)
357

    
358
  def testParseDiskOptionsFromCmdLine(self):
359
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
360
    os.mkdir(OUTPUT_DIR)
361
    results = self.importer._ParseDiskOptions()
362
    self.assertEquals(results, CMDARGS_DISKS)
363

    
364
  def testGetDiskFormat(self):
365
    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
366
    disks_list = self.importer.ovf_reader.GetDisksNames()
367
    results = [self.importer._GetDiskQemuInfo("%s/%s" %
368
      (self.importer.input_dir, path), "file format: (\S+)")
369
      for (path, _) in disks_list]
370
    self.assertEqual(results, ["vmdk"])
371

    
372
  def testNoInstanceNameOVF(self):
373
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_EXPORT_NO_NAME)
374
    self.assertRaisesRegexp(errors.OpPrereqError, "Name of instance",
375
      self.importer.Parse)
376

    
377
  def testErrorNoOSNameOVF(self):
378
    self.importer = ovf.OVFImporter(self.virtualbox_ovf, OPTS_EXPORT)
379
    self.assertRaisesRegexp(errors.OpPrereqError, "OS name",
380
      self.importer.Parse)
381

    
382
  def testErrorNoDiskAndNoNetwork(self):
383
    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_NONIC_NODISK)
384
    self.assertRaisesRegexp(errors.OpPrereqError,
385
      "Either disk specification or network"
386
      " description", self.importer.Parse)
387

    
388

    
389
class TestOVFReader(BetterUnitTest):
390
  def setUp(self):
391
    self.wrong_xml_file = _GetFullFilename("wrong_xml.ovf")
392
    self.ganeti_ovf = _GetFullFilename("ganeti.ovf")
393
    self.virtualbox_ovf = _GetFullFilename("virtualbox.ovf")
394
    self.corrupted_ovf = _GetFullFilename("corrupted_resources.ovf")
395
    self.wrong_manifest_ovf = _GetFullFilename("wrong_manifest.ovf")
396
    self.no_disk_in_ref_ovf = _GetFullFilename("no_disk_in_ref.ovf")
397
    self.empty_ovf = _GetFullFilename("empty.ovf")
398
    self.compressed_disk = _GetFullFilename("gzip_disk.ovf")
399

    
400
  def tearDown(self):
401
    pass
402

    
403
  def testXMLParsingError(self):
404
    self.assertRaisesRegexp(errors.OpPrereqError,
405
      "Error while reading .ovf", ovf.OVFReader, self.wrong_xml_file)
406

    
407
  def testFileInResourcesDoesNotExistError(self):
408
    self.assertRaisesRegexp(errors.OpPrereqError, "does not exist",
409
      ovf.OVFReader, self.corrupted_ovf)
410

    
411
  def testWrongManifestChecksumError(self):
412
    reader = ovf.OVFReader(self.wrong_manifest_ovf)
413
    self.assertRaisesRegexp(errors.OpPrereqError,
414
      "does not match the value in manifest file", reader.VerifyManifest)
415

    
416
  def testGoodManifestChecksum(self):
417
    reader = ovf.OVFReader(self.ganeti_ovf)
418
    self.assertEqual(reader.VerifyManifest(), None)
419

    
420
  def testGetDisksNamesOVFCorruptedError(self):
421
    reader = ovf.OVFReader(self.no_disk_in_ref_ovf)
422
    self.assertRaisesRegexp(errors.OpPrereqError,
423
      "not found in references", reader.GetDisksNames)
424

    
425
  def testGetDisksNamesVirtualbox(self):
426
    reader = ovf.OVFReader(self.virtualbox_ovf)
427
    disk_names = reader.GetDisksNames()
428
    expected_names = [
429
      ("new_disk.vmdk", None) ,
430
      ("second_disk.vmdk", None),
431
    ]
432
    self.assertEqual(sorted(disk_names), sorted(expected_names))
433

    
434
  def testGetDisksNamesEmpty(self):
435
    reader = ovf.OVFReader(self.empty_ovf)
436
    disk_names = reader.GetDisksNames()
437
    self.assertEqual(disk_names, [])
438

    
439
  def testGetDisksNamesCompressed(self):
440
    reader = ovf.OVFReader(self.compressed_disk)
441
    disk_names = reader.GetDisksNames()
442
    self.assertEqual(disk_names, [("compr_disk.vmdk.gz", "gzip")])
443

    
444
  def testGetNetworkDataGaneti(self):
445
    reader = ovf.OVFReader(self.ganeti_ovf)
446
    networks = reader.GetNetworkData()
447
    self.assertEqual(networks, GANETI_NETWORKS)
448

    
449
  def testGetNetworkDataVirtualbox(self):
450
    reader = ovf.OVFReader(self.virtualbox_ovf)
451
    networks = reader.GetNetworkData()
452
    self.assertEqual(networks, VIRTUALBOX_NETWORKS)
453

    
454
  def testGetNetworkDataEmpty(self):
455
    reader = ovf.OVFReader(self.empty_ovf)
456
    networks = reader.GetNetworkData()
457
    self.assertEqual(networks, EMPTY_NETWORKS)
458

    
459
  def testGetHypervisorDataGaneti(self):
460
    reader = ovf.OVFReader(self.ganeti_ovf)
461
    hypervisor = reader.GetHypervisorData()
462
    self.assertEqual(hypervisor, GANETI_HYPERVISOR)
463

    
464
  def testGetHypervisorDataEmptyOvf(self):
465
    reader = ovf.OVFReader(self.empty_ovf)
466
    hypervisor = reader.GetHypervisorData()
467
    self.assertEqual(hypervisor, EMPTY_HYPERVISOR)
468

    
469
  def testGetOSDataGaneti(self):
470
    reader = ovf.OVFReader(self.ganeti_ovf)
471
    osys = reader.GetOSData()
472
    self.assertEqual(osys, GANETI_OS)
473

    
474
  def testGetOSDataEmptyOvf(self):
475
    reader = ovf.OVFReader(self.empty_ovf)
476
    osys = reader.GetOSData()
477
    self.assertEqual(osys, EMPTY_OS)
478

    
479
  def testGetBackendDataGaneti(self):
480
    reader = ovf.OVFReader(self.ganeti_ovf)
481
    backend = reader.GetBackendData()
482
    self.assertEqual(backend, GANETI_BACKEND)
483

    
484
  def testGetBackendDataVirtualbox(self):
485
    reader = ovf.OVFReader(self.virtualbox_ovf)
486
    backend = reader.GetBackendData()
487
    self.assertEqual(backend, VIRTUALBOX_BACKEND)
488

    
489
  def testGetBackendDataEmptyOvf(self):
490
    reader = ovf.OVFReader(self.empty_ovf)
491
    backend = reader.GetBackendData()
492
    self.assertEqual(backend, EMPTY_BACKEND)
493

    
494
  def testGetInstanceNameGaneti(self):
495
    reader = ovf.OVFReader(self.ganeti_ovf)
496
    name = reader.GetInstanceName()
497
    self.assertEqual(name, GANETI_NAME)
498

    
499
  def testGetInstanceNameDataEmptyOvf(self):
500
    reader = ovf.OVFReader(self.empty_ovf)
501
    name = reader.GetInstanceName()
502
    self.assertEqual(name, EMPTY_NAME)
503

    
504
  def testGetDiskTemplateGaneti(self):
505
    reader = ovf.OVFReader(self.ganeti_ovf)
506
    name = reader.GetDiskTemplate()
507
    self.assertEqual(name, GANETI_TEMPLATE)
508

    
509
  def testGetDiskTemplateEmpty(self):
510
    reader = ovf.OVFReader(self.empty_ovf)
511
    name = reader.GetDiskTemplate()
512
    self.assertEqual(name, EMPTY_TEMPLATE)
513

    
514
  def testGetTagsGaneti(self):
515
    reader = ovf.OVFReader(self.ganeti_ovf)
516
    tags = reader.GetTagsData()
517
    self.assertEqual(tags, GANETI_TAGS)
518

    
519
  def testGetTagsEmpty(self):
520
    reader = ovf.OVFReader(self.empty_ovf)
521
    tags = reader.GetTagsData()
522
    self.assertEqual(tags, EMPTY_TAGS)
523

    
524
  def testGetVersionGaneti(self):
525
    reader = ovf.OVFReader(self.ganeti_ovf)
526
    version = reader.GetVersionData()
527
    self.assertEqual(version, GANETI_VERSION)
528

    
529
  def testGetVersionEmpty(self):
530
    reader = ovf.OVFReader(self.empty_ovf)
531
    version = reader.GetVersionData()
532
    self.assertEqual(version, EMPTY_VERSION)
533

    
534

    
535
if __name__ == "__main__":
536
  testutils.GanetiTestProgram()