Extend the configuration to update the instance field 'admin_state_source' whenever there is a change to the instance field 'admin_state'.
Signed-off-by: Jose A. Lopes <[email protected]> --- lib/config.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/config.py b/lib/config.py index bd563a9..dd38a22 100644 --- a/lib/config.py +++ b/lib/config.py @@ -1509,7 +1509,8 @@ class ConfigWriter(object): raise errors.ConfigurationError("Cannot add '%s': UUID %s already" " in use" % (item.name, item.uuid)) - def _SetInstanceStatus(self, inst_uuid, status, disks_active): + def _SetInstanceStatus(self, inst_uuid, status, disks_active, + admin_state_source): """Set the instance's status to a given value. """ @@ -1522,14 +1523,18 @@ class ConfigWriter(object): status = instance.admin_state if disks_active is None: disks_active = instance.disks_active + if admin_state_source is None: + admin_state_source = instance.admin_state_source assert status in constants.ADMINST_ALL, \ "Invalid status '%s' passed to SetInstanceStatus" % (status,) if instance.admin_state != status or \ - instance.disks_active != disks_active: + instance.disks_active != disks_active or \ + instance.admin_state_source != admin_state_source: instance.admin_state = status instance.disks_active = disks_active + instance.admin_state_source = admin_state_source instance.serial_no += 1 instance.mtime = time.time() self._WriteConfig() @@ -1541,7 +1546,8 @@ class ConfigWriter(object): This also sets the instance disks active flag. """ - self._SetInstanceStatus(inst_uuid, constants.ADMINST_UP, True) + self._SetInstanceStatus(inst_uuid, constants.ADMINST_UP, True, + constants.ADMIN_SOURCE) @locking.ssynchronized(_config_lock) def MarkInstanceOffline(self, inst_uuid): @@ -1550,7 +1556,8 @@ class ConfigWriter(object): This also clears the instance disks active flag. """ - self._SetInstanceStatus(inst_uuid, constants.ADMINST_OFFLINE, False) + self._SetInstanceStatus(inst_uuid, constants.ADMINST_OFFLINE, False, + constants.ADMIN_SOURCE) @locking.ssynchronized(_config_lock) def RemoveInstance(self, inst_uuid): @@ -1614,21 +1621,34 @@ class ConfigWriter(object): can still have active disks. """ - self._SetInstanceStatus(inst_uuid, constants.ADMINST_DOWN, None) + self._SetInstanceStatus(inst_uuid, constants.ADMINST_DOWN, None, + constants.ADMIN_SOURCE) + + @locking.ssynchronized(_config_lock) + def MarkInstanceUserDown(self, inst_uuid): + """Mark the status of an instance to user down in the configuration. + + This does not touch the instance disks active flag, as user shut + down instances can still have active disks. + + """ + + self._SetInstanceStatus(inst_uuid, constants.ADMINST_DOWN, None, + constants.USER_SOURCE) @locking.ssynchronized(_config_lock) def MarkInstanceDisksActive(self, inst_uuid): """Mark the status of instance disks active. """ - self._SetInstanceStatus(inst_uuid, None, True) + self._SetInstanceStatus(inst_uuid, None, True, None) @locking.ssynchronized(_config_lock) def MarkInstanceDisksInactive(self, inst_uuid): """Mark the status of instance disks inactive. """ - self._SetInstanceStatus(inst_uuid, None, False) + self._SetInstanceStatus(inst_uuid, None, False, None) def _UnlockedGetInstanceList(self): """Get the list of instances. -- 1.9.1.423.g4596e3a
