Revision 0f511c8a test/py/ganeti.cmdlib_unittest.py

b/test/py/ganeti.cmdlib_unittest.py
1733 1733
  """Tests for cmdlib._GetUpdatedIPolicy()"""
1734 1734
  _OLD_CLUSTER_POLICY = {
1735 1735
    constants.IPOLICY_VCPU_RATIO: 1.5,
1736
    constants.ISPECS_MINMAX: {
1737
      constants.ISPECS_MIN: {
1738
        constants.ISPEC_MEM_SIZE: 20,
1739
        constants.ISPEC_CPU_COUNT: 2,
1740
        },
1741
      constants.ISPECS_MAX: {},
1742
      },
1743
    constants.ISPECS_STD: {},
1736
    constants.ISPECS_MINMAX: constants.ISPECS_MINMAX_DEFAULTS,
1737
    constants.ISPECS_STD: constants.IPOLICY_DEFAULTS[constants.ISPECS_STD],
1744 1738
    }
1745 1739
  _OLD_GROUP_POLICY = {
1746 1740
    constants.IPOLICY_SPINDLE_RATIO: 2.5,
1747 1741
    constants.ISPECS_MINMAX: {
1748 1742
      constants.ISPECS_MIN: {
1749
        constants.ISPEC_DISK_SIZE: 20,
1750
        constants.ISPEC_NIC_COUNT: 2,
1743
        constants.ISPEC_MEM_SIZE: 128,
1744
        constants.ISPEC_CPU_COUNT: 1,
1745
        constants.ISPEC_DISK_COUNT: 1,
1746
        constants.ISPEC_DISK_SIZE: 1024,
1747
        constants.ISPEC_NIC_COUNT: 1,
1748
        constants.ISPEC_SPINDLE_USE: 1,
1749
        },
1750
      constants.ISPECS_MAX: {
1751
        constants.ISPEC_MEM_SIZE: 32768,
1752
        constants.ISPEC_CPU_COUNT: 8,
1753
        constants.ISPEC_DISK_COUNT: 5,
1754
        constants.ISPEC_DISK_SIZE: 1024 * 1024,
1755
        constants.ISPEC_NIC_COUNT: 3,
1756
        constants.ISPEC_SPINDLE_USE: 12,
1751 1757
        },
1752
      constants.ISPECS_MAX: {},
1753 1758
      },
1754 1759
    }
1755 1760

  
1756 1761
  def _TestSetSpecs(self, old_policy, isgroup):
1757
    ispec_key = constants.ISPECS_MIN
1758
    diff_ispec = {
1759
      constants.ISPEC_MEM_SIZE: 50,
1760
      constants.ISPEC_DISK_SIZE: 30,
1762
    diff_minmax = {
1763
      constants.ISPECS_MIN: {
1764
        constants.ISPEC_MEM_SIZE: 64,
1765
        constants.ISPEC_CPU_COUNT: 1,
1766
        constants.ISPEC_DISK_COUNT: 2,
1767
        constants.ISPEC_DISK_SIZE: 64,
1768
        constants.ISPEC_NIC_COUNT: 1,
1769
        constants.ISPEC_SPINDLE_USE: 1,
1770
        },
1771
      constants.ISPECS_MAX: {
1772
        constants.ISPEC_MEM_SIZE: 16384,
1773
        constants.ISPEC_CPU_COUNT: 10,
1774
        constants.ISPEC_DISK_COUNT: 12,
1775
        constants.ISPEC_DISK_SIZE: 1024,
1776
        constants.ISPEC_NIC_COUNT: 9,
1777
        constants.ISPEC_SPINDLE_USE: 18,
1778
        },
1761 1779
      }
1780
    diff_std = {
1781
        constants.ISPEC_DISK_COUNT: 10,
1782
        constants.ISPEC_DISK_SIZE: 512,
1783
        }
1762 1784
    diff_policy = {
1763
      constants.ISPECS_MINMAX: {
1764
        ispec_key: diff_ispec,
1765
        },
1785
      constants.ISPECS_MINMAX: diff_minmax
1766 1786
      }
1767 1787
    if not isgroup:
1768
      diff_std = {
1769
        constants.ISPEC_CPU_COUNT: 3,
1770
        constants.ISPEC_DISK_COUNT: 3,
1771
        }
1772 1788
      diff_policy[constants.ISPECS_STD] = diff_std
1773 1789
    new_policy = cmdlib._GetUpdatedIPolicy(old_policy, diff_policy,
1774 1790
                                           group_policy=isgroup)
1775 1791

  
1776 1792
    self.assertTrue(constants.ISPECS_MINMAX in new_policy)
1777
    new_ispec = new_policy[constants.ISPECS_MINMAX][ispec_key]
1778
    for key in diff_ispec:
1779
      self.assertTrue(key in new_ispec)
1780
      self.assertEqual(new_ispec[key], diff_ispec[key])
1793
    self.assertEqual(new_policy[constants.ISPECS_MINMAX], diff_minmax)
1781 1794
    for key in old_policy:
1782 1795
      if not key in diff_policy:
1783 1796
        self.assertTrue(key in new_policy)
1784 1797
        self.assertEqual(new_policy[key], old_policy[key])
1785 1798

  
1786
    if constants.ISPECS_MINMAX in old_policy:
1787
      old_minmax = old_policy[constants.ISPECS_MINMAX]
1788
      for key in old_minmax:
1789
        if key != ispec_key:
1790
          self.assertTrue(key in new_policy[constants.ISPECS_MINMAX])
1791
          self.assertEqual(new_policy[constants.ISPECS_MINMAX][key],
1792
                           old_minmax[key])
1793
      old_ispec = old_policy[constants.ISPECS_MINMAX][ispec_key]
1794
      for key in old_ispec:
1795
        if not key in diff_ispec:
1796
          self.assertTrue(key in new_ispec)
1797
          self.assertEqual(new_ispec[key], old_ispec[key])
1798

  
1799 1799
    if not isgroup:
1800 1800
      new_std = new_policy[constants.ISPECS_STD]
1801 1801
      for key in diff_std:
1802 1802
        self.assertTrue(key in new_std)
1803 1803
        self.assertEqual(new_std[key], diff_std[key])
1804
      old_std = old_policy.get(constants.ISPECS_STD, {})
1805
      for key in old_std:
1806
        self.assertTrue(key in new_std)
1807
        if key not in diff_std:
1808
          self.assertEqual(new_std[key], old_std[key])
1804 1809

  
1805

  
1806
  def _TestSet(self, old_policy, isgroup):
1807
    diff_policy = {
1808
      constants.IPOLICY_VCPU_RATIO: 3,
1809
      constants.IPOLICY_SPINDLE_RATIO: 1.9,
1810
      }
1810
  def _TestSet(self, old_policy, diff_policy, isgroup):
1811 1811
    new_policy = cmdlib._GetUpdatedIPolicy(old_policy, diff_policy,
1812 1812
                                           group_policy=isgroup)
1813 1813
    for key in diff_policy:
......
1819 1819
        self.assertEqual(new_policy[key], old_policy[key])
1820 1820

  
1821 1821
  def testSet(self):
1822
    self._TestSet(self._OLD_GROUP_POLICY, True)
1822
    diff_policy = {
1823
      constants.IPOLICY_VCPU_RATIO: 3,
1824
      constants.IPOLICY_DTS: [constants.DT_FILE],
1825
      }
1826
    self._TestSet(self._OLD_GROUP_POLICY, diff_policy, True)
1823 1827
    self._TestSetSpecs(self._OLD_GROUP_POLICY, True)
1824
    self._TestSet(self._OLD_CLUSTER_POLICY, False)
1828
    self._TestSet({}, diff_policy, True)
1829
    self._TestSetSpecs({}, True)
1830
    self._TestSet(self._OLD_CLUSTER_POLICY, diff_policy, False)
1825 1831
    self._TestSetSpecs(self._OLD_CLUSTER_POLICY, False)
1826 1832

  
1827 1833
  def testUnset(self):
......
1838 1844
        self.assertTrue(key in new_policy)
1839 1845
        self.assertEqual(new_policy[key], old_policy[key])
1840 1846

  
1847
    self.assertRaises(errors.OpPrereqError, cmdlib._GetUpdatedIPolicy,
1848
                      old_policy, diff_policy, group_policy=False)
1849

  
1841 1850
  def _TestInvalidKeys(self, old_policy, isgroup):
1851
    INVALID_KEY = "this_key_shouldnt_be_allowed"
1842 1852
    INVALID_DICT = {
1843
      "this_key_shouldnt_be_allowed": 3,
1853
      INVALID_KEY: 3,
1844 1854
      }
1845 1855
    invalid_policy = INVALID_DICT
1846 1856
    self.assertRaises(errors.OpPrereqError, cmdlib._GetUpdatedIPolicy,
......
1848 1858
    invalid_ispecs = {
1849 1859
      constants.ISPECS_MINMAX: INVALID_DICT,
1850 1860
      }
1851
    self.assertRaises(errors.OpPrereqError, cmdlib._GetUpdatedIPolicy,
1861
    self.assertRaises(errors.TypeEnforcementError, cmdlib._GetUpdatedIPolicy,
1852 1862
                      old_policy, invalid_ispecs, group_policy=isgroup)
1853
    for key in constants.ISPECS_MINMAX_KEYS:
1854
      invalid_ispec = {
1855
        constants.ISPECS_MINMAX: {
1856
          key: INVALID_DICT,
1857
          },
1863
    if isgroup:
1864
      invalid_for_group = {
1865
        constants.ISPECS_STD: constants.IPOLICY_DEFAULTS[constants.ISPECS_STD],
1858 1866
        }
1867
      self.assertRaises(errors.OpPrereqError, cmdlib._GetUpdatedIPolicy,
1868
                        old_policy, invalid_for_group, group_policy=isgroup)
1869
    good_ispecs = self._OLD_CLUSTER_POLICY[constants.ISPECS_MINMAX]
1870
    invalid_ispecs = copy.deepcopy(good_ispecs)
1871
    invalid_policy = {
1872
      constants.ISPECS_MINMAX: invalid_ispecs,
1873
      }
1874
    for key in constants.ISPECS_MINMAX_KEYS:
1875
      ispec = invalid_ispecs[key]
1876
      ispec[INVALID_KEY] = None
1859 1877
      self.assertRaises(errors.TypeEnforcementError, cmdlib._GetUpdatedIPolicy,
1860
                        old_policy, invalid_ispec, group_policy=isgroup)
1878
                        old_policy, invalid_policy, group_policy=isgroup)
1879
      del ispec[INVALID_KEY]
1880
      for par in constants.ISPECS_PARAMETERS:
1881
        oldv = ispec[par]
1882
        ispec[par] = "this_is_not_good"
1883
        self.assertRaises(errors.TypeEnforcementError,
1884
                          cmdlib._GetUpdatedIPolicy,
1885
                          old_policy, invalid_policy, group_policy=isgroup)
1886
        ispec[par] = oldv
1887
    # This is to make sure that no two errors were present during the tests
1888
    cmdlib._GetUpdatedIPolicy(old_policy, invalid_policy, group_policy=isgroup)
1861 1889

  
1862 1890
  def testInvalidKeys(self):
1863 1891
    self._TestInvalidKeys(self._OLD_GROUP_POLICY, True)
1864 1892
    self._TestInvalidKeys(self._OLD_CLUSTER_POLICY, False)
1865 1893

  
1894
  def testInvalidValues(self):
1895
    for par in (constants.IPOLICY_PARAMETERS |
1896
                frozenset([constants.IPOLICY_DTS])):
1897
      bad_policy = {
1898
        par: "invalid_value",
1899
        }
1900
      self.assertRaises(errors.OpPrereqError, cmdlib._GetUpdatedIPolicy, {},
1901
                        bad_policy, group_policy=True)
1866 1902

  
1867 1903
if __name__ == "__main__":
1868 1904
  testutils.GanetiTestProgram()

Also available in: Unified diff