Revision 41044e04 test/py/ganeti.objects_unittest.py
b/test/py/ganeti.objects_unittest.py | ||
---|---|---|
22 | 22 |
"""Script for unittesting the objects module""" |
23 | 23 |
|
24 | 24 |
|
25 |
import copy |
|
25 | 26 |
import unittest |
26 | 27 |
|
27 | 28 |
from ganeti import constants |
... | ... | |
414 | 415 |
|
415 | 416 |
def _AssertIPolicyIsFull(self, policy): |
416 | 417 |
self.assertEqual(frozenset(policy.keys()), constants.IPOLICY_ALL_KEYS) |
417 |
minmax = policy[constants.ISPECS_MINMAX] |
|
418 |
self.assertEqual(frozenset(minmax.keys()), constants.ISPECS_MINMAX_KEYS) |
|
419 |
for key in constants.ISPECS_MINMAX_KEYS: |
|
420 |
self.assertEqual(frozenset(minmax[key].keys()), |
|
421 |
constants.ISPECS_PARAMETERS) |
|
418 |
self.assertTrue(len(policy[constants.ISPECS_MINMAX]) > 0) |
|
419 |
for minmax in policy[constants.ISPECS_MINMAX]: |
|
420 |
self.assertEqual(frozenset(minmax.keys()), constants.ISPECS_MINMAX_KEYS) |
|
421 |
for key in constants.ISPECS_MINMAX_KEYS: |
|
422 |
self.assertEqual(frozenset(minmax[key].keys()), |
|
423 |
constants.ISPECS_PARAMETERS) |
|
422 | 424 |
self.assertEqual(frozenset(policy[constants.ISPECS_STD].keys()), |
423 | 425 |
constants.ISPECS_PARAMETERS) |
424 | 426 |
|
... | ... | |
427 | 429 |
True) |
428 | 430 |
self._AssertIPolicyIsFull(constants.IPOLICY_DEFAULTS) |
429 | 431 |
|
432 |
def _AssertPolicyIsBad(self, ipolicy, do_check_std=None): |
|
433 |
if do_check_std is None: |
|
434 |
check_std_vals = [False, True] |
|
435 |
else: |
|
436 |
check_std_vals = [do_check_std] |
|
437 |
for check_std in check_std_vals: |
|
438 |
self.assertRaises(errors.ConfigurationError, |
|
439 |
objects.InstancePolicy.CheckISpecSyntax, |
|
440 |
ipolicy, check_std) |
|
441 |
|
|
430 | 442 |
def testCheckISpecSyntax(self): |
431 | 443 |
default_stdspec = constants.IPOLICY_DEFAULTS[constants.ISPECS_STD] |
432 | 444 |
incomplete_ipolicies = [ |
433 | 445 |
{ |
434 |
constants.ISPECS_MINMAX: {},
|
|
446 |
constants.ISPECS_MINMAX: [],
|
|
435 | 447 |
constants.ISPECS_STD: default_stdspec, |
436 | 448 |
}, |
437 | 449 |
{ |
438 |
constants.ISPECS_MINMAX: { |
|
450 |
constants.ISPECS_MINMAX: [{}], |
|
451 |
constants.ISPECS_STD: default_stdspec, |
|
452 |
}, |
|
453 |
{ |
|
454 |
constants.ISPECS_MINMAX: [{ |
|
439 | 455 |
constants.ISPECS_MIN: NotImplemented, |
440 |
}, |
|
456 |
}],
|
|
441 | 457 |
constants.ISPECS_STD: default_stdspec, |
442 | 458 |
}, |
443 | 459 |
{ |
444 |
constants.ISPECS_MINMAX: { |
|
460 |
constants.ISPECS_MINMAX: [{
|
|
445 | 461 |
constants.ISPECS_MAX: NotImplemented, |
446 |
}, |
|
462 |
}],
|
|
447 | 463 |
constants.ISPECS_STD: default_stdspec, |
448 | 464 |
}, |
449 | 465 |
{ |
450 |
constants.ISPECS_MINMAX: { |
|
466 |
constants.ISPECS_MINMAX: [{
|
|
451 | 467 |
constants.ISPECS_MIN: NotImplemented, |
452 | 468 |
constants.ISPECS_MAX: NotImplemented, |
453 |
}, |
|
469 |
}],
|
|
454 | 470 |
}, |
455 | 471 |
] |
456 | 472 |
for ipol in incomplete_ipolicies: |
457 | 473 |
self.assertRaises(errors.ConfigurationError, |
458 | 474 |
objects.InstancePolicy.CheckISpecSyntax, |
459 | 475 |
ipol, True) |
476 |
oldminmax = ipol[constants.ISPECS_MINMAX] |
|
477 |
if oldminmax: |
|
478 |
# Prepending valid specs shouldn't change the error |
|
479 |
ipol[constants.ISPECS_MINMAX] = ([constants.ISPECS_MINMAX_DEFAULTS] + |
|
480 |
oldminmax) |
|
481 |
self.assertRaises(errors.ConfigurationError, |
|
482 |
objects.InstancePolicy.CheckISpecSyntax, |
|
483 |
ipol, True) |
|
484 |
|
|
485 |
good_ipolicy = { |
|
486 |
constants.ISPECS_MINMAX: [ |
|
487 |
{ |
|
488 |
constants.ISPECS_MIN: { |
|
489 |
constants.ISPEC_MEM_SIZE: 64, |
|
490 |
constants.ISPEC_CPU_COUNT: 1, |
|
491 |
constants.ISPEC_DISK_COUNT: 2, |
|
492 |
constants.ISPEC_DISK_SIZE: 64, |
|
493 |
constants.ISPEC_NIC_COUNT: 1, |
|
494 |
constants.ISPEC_SPINDLE_USE: 1, |
|
495 |
}, |
|
496 |
constants.ISPECS_MAX: { |
|
497 |
constants.ISPEC_MEM_SIZE: 16384, |
|
498 |
constants.ISPEC_CPU_COUNT: 5, |
|
499 |
constants.ISPEC_DISK_COUNT: 12, |
|
500 |
constants.ISPEC_DISK_SIZE: 1024, |
|
501 |
constants.ISPEC_NIC_COUNT: 9, |
|
502 |
constants.ISPEC_SPINDLE_USE: 18, |
|
503 |
}, |
|
504 |
}, |
|
505 |
{ |
|
506 |
constants.ISPECS_MIN: { |
|
507 |
constants.ISPEC_MEM_SIZE: 32768, |
|
508 |
constants.ISPEC_CPU_COUNT: 8, |
|
509 |
constants.ISPEC_DISK_COUNT: 1, |
|
510 |
constants.ISPEC_DISK_SIZE: 1024, |
|
511 |
constants.ISPEC_NIC_COUNT: 1, |
|
512 |
constants.ISPEC_SPINDLE_USE: 1, |
|
513 |
}, |
|
514 |
constants.ISPECS_MAX: { |
|
515 |
constants.ISPEC_MEM_SIZE: 65536, |
|
516 |
constants.ISPEC_CPU_COUNT: 10, |
|
517 |
constants.ISPEC_DISK_COUNT: 5, |
|
518 |
constants.ISPEC_DISK_SIZE: 1024 * 1024, |
|
519 |
constants.ISPEC_NIC_COUNT: 3, |
|
520 |
constants.ISPEC_SPINDLE_USE: 12, |
|
521 |
}, |
|
522 |
}, |
|
523 |
], |
|
524 |
} |
|
525 |
good_ipolicy[constants.ISPECS_STD] = copy.deepcopy( |
|
526 |
good_ipolicy[constants.ISPECS_MINMAX][0][constants.ISPECS_MAX]) |
|
527 |
# Check that it's really good before making it bad |
|
528 |
objects.InstancePolicy.CheckISpecSyntax(good_ipolicy, True) |
|
529 |
|
|
530 |
bad_ipolicy = copy.deepcopy(good_ipolicy) |
|
531 |
for minmax in bad_ipolicy[constants.ISPECS_MINMAX]: |
|
532 |
for (key, spec) in minmax.items(): |
|
533 |
for param in spec: |
|
534 |
oldv = spec[param] |
|
535 |
del spec[param] |
|
536 |
self._AssertPolicyIsBad(bad_ipolicy) |
|
537 |
if key == constants.ISPECS_MIN: |
|
538 |
spec[param] = minmax[constants.ISPECS_MAX][param] + 1 |
|
539 |
self._AssertPolicyIsBad(bad_ipolicy) |
|
540 |
spec[param] = oldv |
|
541 |
assert bad_ipolicy == good_ipolicy |
|
542 |
|
|
543 |
stdspec = bad_ipolicy[constants.ISPECS_STD] |
|
544 |
for param in stdspec: |
|
545 |
oldv = stdspec[param] |
|
546 |
del stdspec[param] |
|
547 |
self._AssertPolicyIsBad(bad_ipolicy, True) |
|
548 |
# Note that std spec is the same as a max spec |
|
549 |
stdspec[param] = oldv + 1 |
|
550 |
self._AssertPolicyIsBad(bad_ipolicy, True) |
|
551 |
stdspec[param] = oldv |
|
552 |
assert bad_ipolicy == good_ipolicy |
|
553 |
|
|
554 |
for minmax in good_ipolicy[constants.ISPECS_MINMAX]: |
|
555 |
for spec in minmax.values(): |
|
556 |
good_ipolicy[constants.ISPECS_STD] = spec |
|
557 |
objects.InstancePolicy.CheckISpecSyntax(good_ipolicy, True) |
|
460 | 558 |
|
461 | 559 |
def testCheckISpecParamSyntax(self): |
462 | 560 |
par = "my_parameter" |
... | ... | |
558 | 656 |
def _AssertIPolicyMerged(self, default_pol, diff_pol, merged_pol): |
559 | 657 |
for (key, value) in merged_pol.items(): |
560 | 658 |
if key in diff_pol: |
561 |
if key == constants.ISPECS_MINMAX: |
|
562 |
self.assertEqual(frozenset(value), constants.ISPECS_MINMAX_KEYS) |
|
563 |
for k in constants.ISPECS_MINMAX_KEYS: |
|
564 |
self._AssertISpecsMerged(default_pol[key][k], diff_pol[key][k], |
|
565 |
value[k]) |
|
566 |
elif key == constants.ISPECS_STD: |
|
659 |
if key == constants.ISPECS_STD: |
|
567 | 660 |
self._AssertISpecsMerged(default_pol[key], diff_pol[key], value) |
568 | 661 |
else: |
569 | 662 |
self.assertEqual(value, diff_pol[key]) |
... | ... | |
575 | 668 |
{constants.IPOLICY_VCPU_RATIO: 3.14}, |
576 | 669 |
{constants.IPOLICY_SPINDLE_RATIO: 2.72}, |
577 | 670 |
{constants.IPOLICY_DTS: [constants.DT_FILE]}, |
671 |
{constants.ISPECS_STD: {constants.ISPEC_DISK_COUNT: 3}}, |
|
672 |
{constants.ISPECS_MINMAX: [constants.ISPECS_MINMAX_DEFAULTS, |
|
673 |
constants.ISPECS_MINMAX_DEFAULTS]} |
|
578 | 674 |
] |
579 | 675 |
for diff_pol in partial_policies: |
580 | 676 |
policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, diff_pol) |
Also available in: Unified diff