diff --git a/lib/config.py b/lib/config.py index 58871d511557b051c0ca5283619b02fdd4ac7b64..b43b3e8c1da4e9b54abbf4b738284c82931b20b7 100644 --- a/lib/config.py +++ b/lib/config.py @@ -1052,6 +1052,10 @@ class ConfigWriter: not hasattr(data.cluster, 'rsahostkeypub')): raise errors.ConfigurationError("Incomplete configuration" " (missing cluster.rsahostkeypub)") + + # Upgrade configuration if needed + data.UpgradeConfig() + self._config_data = data # reset the last serial as -1 so that the next write will cause # ssconf update diff --git a/lib/objects.py b/lib/objects.py index d5f446ed7c25ea0742f7e2a202d263f36549295a..43cea750dd87d3e1123e2c896dd4ac2ebbeac3d2 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -58,7 +58,6 @@ class ConfigObject(object): def __init__(self, **kwargs): for k, v in kwargs.iteritems(): setattr(self, k, v) - self.UpgradeConfig() def __getattr__(self, name): if name not in self.__slots__: @@ -169,8 +168,8 @@ class ConfigObject(object): def UpgradeConfig(self): """Fill defaults for missing configuration values. - This method will be called at object init time, and its implementation will - be object dependent. + This method will be called at configuration load time, and its + implementation will be object dependent. """ pass @@ -283,6 +282,16 @@ class ConfigData(ConfigObject): obj.instances = cls._ContainerFromDicts(obj.instances, dict, Instance) return obj + def UpgradeConfig(self): + """Fill defaults for missing configuration values. + + """ + self.cluster.UpgradeConfig() + for node in self.nodes.values(): + node.UpgradeConfig() + for instance in self.instances.values(): + instance.UpgradeConfig() + class NIC(ConfigObject): """Config object representing a network card.""" @@ -536,6 +545,15 @@ class Disk(ConfigObject): all_errors.append("Disk access mode '%s' is invalid" % (self.mode, )) return all_errors + def UpgradeConfig(self): + """Fill defaults for missing configuration values. + + """ + if self.children: + for child in self.children: + child.UpgradeConfig() + # add here config upgrade for this disk + class Instance(TaggableObject): """Config object representing an instance.""" @@ -685,6 +703,15 @@ class Instance(TaggableObject): obj.disks = cls._ContainerFromDicts(obj.disks, list, Disk) return obj + def UpgradeConfig(self): + """Fill defaults for missing configuration values. + + """ + for nic in self.nics: + nic.UpgradeConfig() + for disk in self.disks: + disk.UpgradeConfig() + class OS(ConfigObject): """Config object representing an operating system."""