diff --git a/lib/objects.py b/lib/objects.py index b952520ffc11d51f8b608fc0fc6f01866d29b76d..4e6874b6eabb8edccfe63c0658a7da1091df968b 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -933,6 +933,30 @@ class Cluster(TaggableObject): obj.tcpudp_port_pool = set(obj.tcpudp_port_pool) return obj + def GetHVDefaults(self, hypervisor, os_name=None, skip_keys=None): + """Get the default hypervisor parameters for the cluster. + + @param hypervisor: the hypervisor name + @param os_name: if specified, we'll also update the defaults for this OS + @param skip_keys: if passed, list of keys not to use + @return: the defaults dict + + """ + if skip_keys is None: + skip_keys = [] + + fill_stack = [self.hvparams.get(hypervisor, {})] + if os_name is not None: + os_hvp = self.os_hvp.get(os_name, {}).get(hypervisor, {}) + fill_stack.append(os_hvp) + + ret_dict = {} + for o_dict in fill_stack: + ret_dict = FillDict(ret_dict, o_dict, skip_keys=skip_keys) + + return ret_dict + + def FillHV(self, instance, skip_globals=False): """Fill an instance's hvparams dict. @@ -951,18 +975,9 @@ class Cluster(TaggableObject): else: skip_keys = [] - # We fill the list from least to most important override - fill_stack = [ - self.hvparams.get(instance.hypervisor, {}), - self.os_hvp.get(instance.os, {}).get(instance.hypervisor, {}), - instance.hvparams, - ] - - ret_dict = {} - for o_dict in fill_stack: - ret_dict = FillDict(ret_dict, o_dict, skip_keys=skip_keys) - - return ret_dict + def_dict = self.GetHVDefaults(instance.hypervisor, instance.os, + skip_keys=skip_keys) + return FillDict(def_dict, instance.hvparams, skip_keys=skip_keys) def FillBE(self, instance): """Fill an instance's beparams dict. diff --git a/test/ganeti.objects_unittest.py b/test/ganeti.objects_unittest.py index 5acddf2bdeface1f7a6386349dbfc0629fa26af2..6b5cfe716a3988c000b9d1dd1768626f768b226c 100755 --- a/test/ganeti.objects_unittest.py +++ b/test/ganeti.objects_unittest.py @@ -79,6 +79,16 @@ class TestClusterObject(unittest.TestCase): self.fake_cl = objects.Cluster(hvparams=hvparams, os_hvp=os_hvp) self.fake_cl.UpgradeConfig() + def testGetHVDefaults(self): + cl = self.fake_cl + self.failUnlessEqual(cl.GetHVDefaults(constants.HT_FAKE), + cl.hvparams[constants.HT_FAKE]) + self.failUnlessEqual(cl.GetHVDefaults(None), {}) + self.failUnlessEqual(cl.GetHVDefaults(constants.HT_XEN_PVM, + os_name="lenny-image"), + cl.os_hvp["lenny-image"][constants.HT_XEN_PVM]) + + def testFillHvFullMerge(self): inst_hvparams = { "blah": "blubb",