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

Reply via email to