On 12/02/2014 03:32 PM, 'Klaus Aehlig' via ganeti-devel wrote:
In general, it makes sense to insist that a newly added instance has a
UUID that is not in use. Upon committing forthcoming instances,
however, the expectation is that the instance is already present in a
forthcoming variant. Add a flag to AddInstance to support this use
case.
Signed-off-by: Klaus Aehlig <[email protected]>
---
lib/config/__init__.py | 17 +++++++++++++++--
test/py/testutils/config_mock.py | 2 +-
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/lib/config/__init__.py b/lib/config/__init__.py
index bb57ef8..9d0f89b 100644
--- a/lib/config/__init__.py
+++ b/lib/config/__init__.py
@@ -1731,7 +1731,7 @@ class ConfigWriter(object):
"""
return [(uuid, self._UnlockedGetNodeGroup(uuid)) for uuid in group_uuids]
- def AddInstance(self, instance, _ec_id):
+ def AddInstance(self, instance, _ec_id, replaces=False):
Needs `@param/type replaces`.
"""Add an instance to the config.
This should be used after creating a new instance.
@@ -1750,7 +1750,10 @@ class ConfigWriter(object):
" MAC address '%s' already in use." %
(instance.name, nic.mac))
- self._CheckUniqueUUID(instance, include_temporary=False)
+ if replaces:
+ self._CheckUUIDpresent(instance)
+ else:
+ self._CheckUniqueUUID(instance, include_temporary=False)
instance.serial_no = 1
instance.ctime = instance.mtime = time.time()
@@ -1786,6 +1789,16 @@ class ConfigWriter(object):
raise errors.ConfigurationError("Cannot add '%s': UUID %s already"
" in use" % (item.name, item.uuid))
+ def _CheckUUIDpresent(self, item):
+ """Checks that an object with the given UUID exists.
+
Needs `@param/type item`.
+ """
+ if not item.uuid:
+ raise errors.ConfigurationError("'%s' must have an UUID" % (item.name,))
+ if not item.uuid in self._AllIDs(include_temporary=False):
Consider `not in`.
+ raise errors.ConfigurationError("Cannot replace '%s': UUID %s not
present"
+ % (item.name, item.uuid))
+
def _SetInstanceStatus(self, inst_uuid, status, disks_active,
admin_state_source):
"""Set the instance's status to a given value.
diff --git a/test/py/testutils/config_mock.py b/test/py/testutils/config_mock.py
index 73174ca..761f0ad 100644
--- a/test/py/testutils/config_mock.py
+++ b/test/py/testutils/config_mock.py
@@ -814,7 +814,7 @@ class ConfigMock(config.ConfigWriter):
if net_uuid:
return self._UnlockedReserveIp(net_uuid, address, ec_id, check)
- def AddInstance(self, instance, ec_id):
+ def AddInstance(self, instance, ec_id, replaces=False):
"""Add an instance to the config.
"""
--
Niklas Hambüchen
Google Germany GmbH, Dienerstr. 12, 80331 Muenchen
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschaeftsfuehrer: Graham Law, Christine Elizabeth Flores