Revision 23d95cff test/py/ganeti.bdev_unittest.py
b/test/py/ganeti.bdev_unittest.py | ||
---|---|---|
1 | 1 |
#!/usr/bin/python |
2 | 2 |
# |
3 | 3 |
|
4 |
# Copyright (C) 2006, 2007, 2010, 2012 Google Inc. |
|
4 |
# Copyright (C) 2006, 2007, 2010, 2012, 2013 Google Inc.
|
|
5 | 5 |
# |
6 | 6 |
# This program is free software; you can redistribute it and/or modify |
7 | 7 |
# it under the terms of the GNU General Public License as published by |
... | ... | |
23 | 23 |
|
24 | 24 |
|
25 | 25 |
import os |
26 |
import random |
|
26 | 27 |
import unittest |
27 | 28 |
|
28 | 29 |
from ganeti import bdev |
29 |
from ganeti import errors
|
|
30 |
from ganeti import compat
|
|
30 | 31 |
from ganeti import constants |
32 |
from ganeti import errors |
|
33 |
from ganeti import objects |
|
31 | 34 |
from ganeti import utils |
32 |
from ganeti import pathutils |
|
33 | 35 |
|
34 | 36 |
import testutils |
35 | 37 |
|
... | ... | |
493 | 495 |
]) |
494 | 496 |
|
495 | 497 |
|
498 |
class TestExclusiveStoragePvs(unittest.TestCase): |
|
499 |
"""Test cases for functions dealing with LVM PV and exclusive storage""" |
|
500 |
# Allowance for rounding |
|
501 |
_EPS = 1e-4 |
|
502 |
_MARGIN = constants.PART_MARGIN + constants.PART_RESERVED + _EPS |
|
503 |
|
|
504 |
@staticmethod |
|
505 |
def _GenerateRandomPvInfo(rnd, name, vg): |
|
506 |
# Granularity is .01 MiB |
|
507 |
size = rnd.randint(1024 * 100, 10 * 1024 * 1024 * 100) |
|
508 |
if rnd.choice([False, True]): |
|
509 |
free = float(rnd.randint(0, size)) / 100.0 |
|
510 |
else: |
|
511 |
free = float(size) / 100.0 |
|
512 |
size = float(size) / 100.0 |
|
513 |
attr = "a-" |
|
514 |
return objects.LvmPvInfo(name=name, vg_name=vg, size=size, free=free, |
|
515 |
attributes=attr) |
|
516 |
|
|
517 |
def testGetStdPvSize(self): |
|
518 |
"""Test cases for bdev.LogicalVolume._GetStdPvSize()""" |
|
519 |
rnd = random.Random(9517) |
|
520 |
for _ in range(0, 50): |
|
521 |
# Identical volumes |
|
522 |
pvi = self._GenerateRandomPvInfo(rnd, "disk", "myvg") |
|
523 |
onesize = bdev.LogicalVolume._GetStdPvSize([pvi]) |
|
524 |
self.assertTrue(onesize <= pvi.size) |
|
525 |
self.assertTrue(onesize > pvi.size * (1 - self._MARGIN)) |
|
526 |
for length in range(2, 10): |
|
527 |
n_size = bdev.LogicalVolume._GetStdPvSize([pvi] * length) |
|
528 |
self.assertEqual(onesize, n_size) |
|
529 |
|
|
530 |
# Mixed volumes |
|
531 |
for length in range(1, 10): |
|
532 |
pvlist = [self._GenerateRandomPvInfo(rnd, "disk", "myvg") |
|
533 |
for _ in range(0, length)] |
|
534 |
std_size = bdev.LogicalVolume._GetStdPvSize(pvlist) |
|
535 |
self.assertTrue(compat.all(std_size <= pvi.size for pvi in pvlist)) |
|
536 |
self.assertTrue(compat.any(std_size > pvi.size * (1 - self._MARGIN) |
|
537 |
for pvi in pvlist)) |
|
538 |
pvlist.append(pvlist[0]) |
|
539 |
p1_size = bdev.LogicalVolume._GetStdPvSize(pvlist) |
|
540 |
self.assertEqual(std_size, p1_size) |
|
541 |
|
|
542 |
def testComputeNumPvs(self): |
|
543 |
"""Test cases for bdev.LogicalVolume._ComputeNumPvs()""" |
|
544 |
rnd = random.Random(8067) |
|
545 |
for _ in range(0, 1000): |
|
546 |
pvlist = [self._GenerateRandomPvInfo(rnd, "disk", "myvg")] |
|
547 |
lv_size = float(rnd.randint(10 * 100, 1024 * 1024 * 100)) / 100.0 |
|
548 |
num_pv = bdev.LogicalVolume._ComputeNumPvs(lv_size, pvlist) |
|
549 |
std_size = bdev.LogicalVolume._GetStdPvSize(pvlist) |
|
550 |
self.assertTrue(num_pv >= 1) |
|
551 |
self.assertTrue(num_pv * std_size >= lv_size) |
|
552 |
self.assertTrue((num_pv - 1) * std_size < lv_size * (1 + self._EPS)) |
|
553 |
|
|
554 |
def testGetEmptyPvNames(self): |
|
555 |
"""Test cases for bdev.LogicalVolume._GetEmptyPvNames()""" |
|
556 |
rnd = random.Random(21126) |
|
557 |
for _ in range(0, 100): |
|
558 |
num_pvs = rnd.randint(1, 20) |
|
559 |
pvlist = [self._GenerateRandomPvInfo(rnd, "disk%d" % n, "myvg") |
|
560 |
for n in range(0, num_pvs)] |
|
561 |
for num_req in range(1, num_pvs + 2): |
|
562 |
epvs = bdev.LogicalVolume._GetEmptyPvNames(pvlist, num_req) |
|
563 |
epvs_set = compat.UniqueFrozenset(epvs) |
|
564 |
if len(epvs) > 1: |
|
565 |
self.assertEqual(len(epvs), len(epvs_set)) |
|
566 |
for pvi in pvlist: |
|
567 |
if pvi.name in epvs_set: |
|
568 |
self.assertEqual(pvi.size, pvi.free) |
|
569 |
else: |
|
570 |
# There should be no remaining empty PV when less than the |
|
571 |
# requeste number of PVs has been returned |
|
572 |
self.assertTrue(len(epvs) == num_req or pvi.free != pvi.size) |
|
573 |
|
|
574 |
|
|
496 | 575 |
if __name__ == "__main__": |
497 | 576 |
testutils.GanetiTestProgram() |
Also available in: Unified diff