On Tue, Dec 02, 2014 at 05:56:51PM +0100, Niklas Hambuechen wrote: > 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):
I'd like to add the following interdiff; I'll send a separate mail with the changes this implies on patch 6. commit 3ec286aed5d24c5711e5990dd5153fcef0781fcd Author: Klaus Aehlig <[email protected]> Date: Tue Dec 2 18:16:54 2014 +0100 Interdiff [PATCH master 03/10] Support replacing an instance on creation diff --git a/lib/config/__init__.py b/lib/config/__init__.py index c8b56c2..0a7e084 100644 --- a/lib/config/__init__.py +++ b/lib/config/__init__.py @@ -1734,13 +1734,16 @@ class ConfigWriter(object): """ return [(uuid, self._UnlockedGetNodeGroup(uuid)) for uuid in group_uuids] - def AddInstance(self, instance, _ec_id, replaces=False): + def AddInstance(self, instance, _ec_id, replace=False): """Add an instance to the config. This should be used after creating a new instance. @type instance: L{objects.Instance} @param instance: the instance object + @type replace: bool + @param replace: if true, expect the instance to be present and + replace rather than add. """ if not isinstance(instance, objects.Instance): @@ -1753,7 +1756,7 @@ class ConfigWriter(object): " MAC address '%s' already in use." % (instance.name, nic.mac)) - if replaces: + if replace: self._CheckUUIDpresent(instance) else: self._CheckUniqueUUID(instance, include_temporary=False) @@ -1795,10 +1798,13 @@ class ConfigWriter(object): def _CheckUUIDpresent(self, item): """Checks that an object with the given UUID exists. + @param: the instance or other UUID possessing object to verify that + its UUID is present + """ if not item.uuid: raise errors.ConfigurationError("'%s' must have an UUID" % (item.name,)) - if not item.uuid in self._AllIDs(include_temporary=False): + if item.uuid not in self._AllIDs(include_temporary=False): raise errors.ConfigurationError("Cannot replace '%s': UUID %s not present" % (item.name, item.uuid)) -- Klaus Aehlig Google Germany GmbH, Dienerstr. 12, 80331 Muenchen Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschaeftsfuehrer: Graham Law, Christine Elizabeth Flores
