Commit 2d90608c authored by Iustin Pop's avatar Iustin Pop
Browse files

Change config upgrade to be explicit



Currently the config upgrade is done at each object instantiation, that
means that ganeti-noded will run UpgradeConfig on all objects received
remotely (instances, disks, nics). This is not so good, so this patch
changes it so that only the ConfigWriter runs this method at
configuration load time.
Signed-off-by: default avatarIustin Pop <iustin@google.com>
Reviewed-by: default avatarGuido Trotter <ultrotter@google.com>
(cherry picked from commit 90d726a8)
parent 59b76636
......@@ -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
......
......@@ -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."""
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment