X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/c1b42c18b914aa7ea650362ade7489448f71a523..cd098c41522469e462efeb1e157a8718ff7b7809:/lib/objects.py?ds=sidebyside diff --git a/lib/objects.py b/lib/objects.py index dbcf32e..51ef992 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -37,7 +37,39 @@ from ganeti import constants __all__ = ["ConfigObject", "ConfigData", "NIC", "Disk", "Instance", - "OS", "Node", "Cluster"] + "OS", "Node", "Cluster", "FillDict"] + +def FillDict(defaults_dict, custom_dict): + """Basic function to apply settings on top a default dict. + + @type defaults_dict: dict + @param defaults_dict: dictionary holding the default values + @type custom_dict: dict + @param custom_dict: dictionary holding customized value + @rtype: dict + @return: dict with the 'full' values + + """ + ret_dict = copy.deepcopy(defaults_dict) + ret_dict.update(custom_dict) + return ret_dict + + +def UpgradeGroupedParams(target, defaults): + """Update all groups for the target parameter. + + @type target: dict of dicts + @param target: {group: {parameter: value}} + @type defaults: dict + @param defaults: default parameter values + + """ + if target is None: + target = {constants.PP_DEFAULT: defaults} + else: + for group in target: + target[group] = FillDict(defaults, target[group]) + return target class ConfigObject(object): @@ -278,7 +310,35 @@ class ConfigData(ConfigObject): class NIC(ConfigObject): """Config object representing a network card.""" - __slots__ = ["mac", "ip", "bridge"] + __slots__ = ["mac", "ip", "bridge", "nicparams"] + + @classmethod + def CheckParameterSyntax(cls, nicparams): + """Check the given parameters for validity. + + @type nicparams: dict + @param nicparams: dictionary with parameter names/value + @raise errors.ConfigurationError: when a parameter is not valid + + """ + if nicparams[constants.NIC_MODE] not in constants.NIC_VALID_MODES: + err = "Invalid nic mode: %s" % nicparams[constants.NIC_MODE] + raise errors.ConfigurationError(err) + + if (nicparams[constants.NIC_MODE] is constants.NIC_MODE_BRIDGED and + not nicparams[constants.NIC_LINK]): + err = "Missing bridged nic link" + raise errors.ConfigurationError(err) + + def UpgradeConfig(self): + """Fill defaults for missing configuration values. + + """ + if self.nicparams is None: + self.nicparams = {} + if self.bridge is not None: + self.nicparams[constants.NIC_MODE] = constants.NIC_MODE_BRIDGED + self.nicparams[constants.NIC_LINK] = self.bridge class Disk(ConfigObject): @@ -734,6 +794,7 @@ class Cluster(TaggableObject): "enabled_hypervisors", "hvparams", "beparams", + "nicparams", "candidate_pool_size", "modify_etc_hosts", ] @@ -746,15 +807,17 @@ class Cluster(TaggableObject): self.hvparams = constants.HVC_DEFAULTS else: for hypervisor in self.hvparams: - self.hvparams[hypervisor] = self.FillDict( + self.hvparams[hypervisor] = FillDict( constants.HVC_DEFAULTS[hypervisor], self.hvparams[hypervisor]) - if self.beparams is None: - self.beparams = {constants.BEGR_DEFAULT: constants.BEC_DEFAULTS} - else: - for begroup in self.beparams: - self.beparams[begroup] = self.FillDict(constants.BEC_DEFAULTS, - self.beparams[begroup]) + self.beparams = UpgradeGroupedParams(self.beparams, + constants.BEC_DEFAULTS) + migrate_default_bridge = not self.nicparams + self.nicparams = UpgradeGroupedParams(self.nicparams, + constants.NICC_DEFAULTS) + if migrate_default_bridge: + self.nicparams[constants.PP_DEFAULT][constants.NIC_LINK] = \ + self.default_bridge if self.modify_etc_hosts is None: self.modify_etc_hosts = True @@ -777,22 +840,6 @@ class Cluster(TaggableObject): obj.tcpudp_port_pool = set(obj.tcpudp_port_pool) return obj - @staticmethod - def FillDict(defaults_dict, custom_dict): - """Basic function to apply settings on top a default dict. - - @type defaults_dict: dict - @param defaults_dict: dictionary holding the default values - @type custom_dict: dict - @param custom_dict: dictionary holding customized value - @rtype: dict - @return: dict with the 'full' values - - """ - ret_dict = copy.deepcopy(defaults_dict) - ret_dict.update(custom_dict) - return ret_dict - def FillHV(self, instance): """Fill an instance's hvparams dict. @@ -803,7 +850,7 @@ class Cluster(TaggableObject): the cluster defaults """ - return self.FillDict(self.hvparams.get(instance.hypervisor, {}), + return FillDict(self.hvparams.get(instance.hypervisor, {}), instance.hvparams) def FillBE(self, instance): @@ -816,8 +863,8 @@ class Cluster(TaggableObject): the cluster defaults """ - return self.FillDict(self.beparams.get(constants.BEGR_DEFAULT, {}), - instance.beparams) + return FillDict(self.beparams.get(constants.PP_DEFAULT, {}), + instance.beparams) class SerializableConfigParser(ConfigParser.SafeConfigParser):