Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 6dd9543f5f3dfe4732765d77a3fdff779cb7a038
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Apr 17 18:11:07 2015 +0200
[backend] bugfix VMM.get_all_vm_in_group : VM could be removed before load occures
---------------------------------------------------------------
backend/backend/vm_manage/manager.py | 20 +++++++++++++++-----
backend/backend/vm_manage/models.py | 7 +++++++
backend/tests/vm_manager/test_manager.py | 6 +++---
3 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/backend/backend/vm_manage/manager.py b/backend/backend/vm_manage/manager.py
index e9f92d7..546b360 100644
--- a/backend/backend/vm_manage/manager.py
+++ b/backend/backend/vm_manage/manager.py
@@ -11,7 +11,7 @@ import time
import weakref
from cStringIO import StringIO
import datetime
-from backend.exceptions import VmError, NoVmAvailable
+from backend.exceptions import VmError, NoVmAvailable, VmDescriptorNotFound
from backend.helpers import get_redis_connection
from .models import VmDescriptor
@@ -331,21 +331,31 @@ class VmManager(object):
pipe.execute()
self.log.info("removed vm `{}` from pool".format(vm_name))
+ def _load_multi_safe(self, vm_name_list):
+ result = []
+ for vm_name in vm_name_list:
+ try:
+ result.append(VmDescriptor.load(self.rc, vm_name))
+ except VmDescriptorNotFound:
+ self.log.debug("Failed to load VMD: {}".format(vm_name))
+ pass
+ return result
+
def get_all_vm_in_group(self, group):
"""
:rtype: list of VmDescriptor
"""
vm_name_list = self.rc.smembers(KEY_VM_POOL.format(group=group))
- return [VmDescriptor.load(self.rc, vm_name) for vm_name in vm_name_list]
+ return self._load_multi_safe(vm_name_list)
def get_all_vm(self):
"""
:rtype: list of VmDescriptor
"""
- vm_name_list = []
+ vmd_list = []
for group in self.vm_groups:
- vm_name_list.extend(self.rc.smembers(KEY_VM_POOL.format(group=group)))
- return [VmDescriptor.load(self.rc, vm_name) for vm_name in vm_name_list]
+ vmd_list.extend(self.get_all_vm_in_group(group))
+ return vmd_list
def get_vm_by_name(self, vm_name):
"""
diff --git a/backend/backend/vm_manage/models.py b/backend/backend/vm_manage/models.py
index 17b4a0f..6f6b26e 100644
--- a/backend/backend/vm_manage/models.py
+++ b/backend/backend/vm_manage/models.py
@@ -40,6 +40,13 @@ class VmDescriptor(object):
@classmethod
def load(cls, rc, vm_name):
+ """
+
+ :param rc:
+ :param vm_name:
+ :rtype: VmDescriptor
+ :raises VmDescriptorNotFound:
+ """
raw = rc.hgetall(KEY_VM_INSTANCE.format(vm_name=vm_name))
if not raw:
raise VmDescriptorNotFound("VmDescriptor for `{}` not
found".format(vm_name))
diff --git a/backend/tests/vm_manager/test_manager.py
b/backend/tests/vm_manager/test_manager.py
index b77ca02..270d087 100644
--- a/backend/tests/vm_manager/test_manager.py
+++ b/backend/tests/vm_manager/test_manager.py
@@ -428,19 +428,19 @@ class TestManager(object):
self.vmm.info()
def test_look_up_vms_by_ip(self, f_second_group, capsys):
- vmd_1 = self.vmm.add_vm_to_pool(self.vm_ip, "a1", self.group)
+ self.vmm.add_vm_to_pool(self.vm_ip, "a1", self.group)
r1 = self.vmm.lookup_vms_by_ip(self.vm_ip)
assert len(r1) == 1
assert r1[0].vm_name == "a1"
- vmd_2 = self.vmm.add_vm_to_pool(self.vm_ip, "a2", self.group)
+ self.vmm.add_vm_to_pool(self.vm_ip, "a2", self.group)
r2 = self.vmm.lookup_vms_by_ip(self.vm_ip)
assert len(r2) == 2
r2 = sorted(r2, key=lambda vmd: vmd.vm_name)
assert r2[0].vm_name == "a1"
assert r2[1].vm_name == "a2"
- vmd_3 = self.vmm.add_vm_to_pool("127.1.1.111", "b1", 1)
+ self.vmm.add_vm_to_pool("127.1.1.111", "b1", 1)
r3 = self.vmm.lookup_vms_by_ip(self.vm_ip)
assert len(r3) == 2