If the user tries to clone a VM while it's already being cloned, the
name of the VM being cloned may be reused because Kimchi only avoids name
conflicts by looking at the existing VMs, not the ones being created at
the moment. When the second clone operation finishes, an error is raised
because that name is already defined.
Look at the names of the VMs being cloned, as well as the existing VMs',
in order to avoid name conflicts when cloning a VM.
Signed-off-by: Crístian Viana <vianac(a)linux.vnet.ibm.com>
---
src/kimchi/model/vms.py | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 3aa1145..9472b1c 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -314,9 +314,22 @@ class VMModel(object):
if info['state'] != u'shutoff':
raise InvalidParameter('KCHVM0033E', {'name': name})
- # this name will be used as the Task's 'target_uri' so it needs to
be
- # defined now.
- new_name = get_next_clone_name(self.vms.get_list(), name)
+ # the new VM's name will be used as the Task's 'target_uri' so it
needs
+ # to be defined now.
+
+ vms_being_created = []
+
+ # lookup names of VMs being created right now
+ with self.objstore as session:
+ task_names = session.get_list('task')
+ for tn in task_names:
+ t = session.get('task', tn)
+ if t['target_uri'].startswith('/vms/'):
+ uri_name = t['target_uri'][5:] # 5 = len('/vms/')
+ vms_being_created.append(uri_name)
+
+ current_vm_names = self.vms.get_list() + vms_being_created
+ new_name = get_next_clone_name(current_vm_names, name)
# create a task with the actual clone function
taskid = add_task(u'/vms/%s' % new_name, self._clone_task,
--
2.1.0