Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 13e52b6ca285c1dbf67f38276be0f3b5d0acfa82
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Wed Mar 18 16:52:24 2015 +0100
[backend] Added limit to acquire_vm based on VMs used by the same username at the
current moment.
---------------------------------------------------------------
backend/backend/helpers.py | 4 ++--
backend/backend/vm_manage/manager.py | 17 +++++++++++++++++
backend/tests/vm_manager/test_manager.py | 20 +++++++++++++++++++-
3 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/backend/backend/helpers.py b/backend/backend/helpers.py
index 0604992..b12f786 100644
--- a/backend/backend/helpers.py
+++ b/backend/backend/helpers.py
@@ -141,10 +141,10 @@ class BackendConfigReader(object):
"max_vm_total": _get_conf(
cp, "backend",
"group{}_max_vm_total".format(group_id),
# default=16, mode="int"),
- default=2, mode="int"),
+ default=8, mode="int"),
"max_vm_per_user": _get_conf(
cp, "backend",
"group{}_max_vm_total".format(group_id),
- default=2, mode="int"),
+ default=4, mode="int"),
"max_spawn_processes": _get_conf(
cp, "backend",
"group{}_max_spawn_processes".format(group_id),
default=2, mode="int"),
diff --git a/backend/backend/vm_manage/manager.py b/backend/backend/vm_manage/manager.py
index f1466b9..b4f059f 100644
--- a/backend/backend/vm_manage/manager.py
+++ b/backend/backend/vm_manage/manager.py
@@ -132,6 +132,15 @@ class VmManager(object):
return range(self.opts.build_groups_count)
def add_vm_to_pool(self, vm_ip, vm_name, group):
+ """
+ Adds newly spawned VM into the pool of available builders
+
+ :param vm_ip: IP
+ :param vm_name: VM name
+ :param group: builder group
+ :type group: int
+ :rtype: VmDescriptor
+ """
# print("\n ADD VM TO POOL")
if self.rc.sismember(KEY_VM_POOL.format(group=group), vm_name):
raise VmError("Can't add VM `{}` to the pool, such name already
used".format(vm_name))
@@ -186,6 +195,14 @@ class VmManager(object):
"""
# TODO: reject request if user acquired #machines > threshold_vm_per_user
vmd_list = self.get_all_vm_in_group(group)
+ vm_count_used_by_user = len([
+ vmd for vmd in vmd_list if
+ vmd.bound_to_user==username and vmd.state==VmStates.IN_USE
+ ])
+ if vm_count_used_by_user >=
self.opts.build_groups[group]["max_vm_per_user"]:
+ raise NoVmAvailable("No VM are available, user `{}` already acquired #{}
VMs"
+ .format(username, vm_count_used_by_user))
+
ready_vmd_list = [vmd for vmd in vmd_list if vmd.state == VmStates.READY]
# trying to find VM used by this user
dirtied_by_user = [vmd for vmd in ready_vmd_list if vmd.bound_to_user ==
username]
diff --git a/backend/tests/vm_manager/test_manager.py
b/backend/tests/vm_manager/test_manager.py
index 4383c2e..0faff78 100644
--- a/backend/tests/vm_manager/test_manager.py
+++ b/backend/tests/vm_manager/test_manager.py
@@ -56,7 +56,8 @@ class TestManager(object):
build_groups={
0: {
"name": "base",
- "archs": ["i386", "x86_64"]
+ "archs": ["i386", "x86_64"],
+ "max_vm_per_user": 3,
}
},
@@ -219,6 +220,23 @@ class TestManager(object):
with pytest.raises(NoVmAvailable):
self.vmm.acquire_vm(group=self.group, username=self.username, pid=self.pid)
+ def test_acquire_vm_per_user_limit(self):
+ max_vm_per_user = self.opts.build_groups[0]["max_vm_per_user"]
+ acquired_vmd_list = []
+ for idx in range(max_vm_per_user + 1):
+ vmd = self.vmm.add_vm_to_pool("127.0.{}.1".format(idx),
"vm_{}".format(idx), self.group)
+ vmd.store_field(self.rc, "state", VmStates.READY)
+ acquired_vmd_list.append(vmd)
+
+ for idx in range(max_vm_per_user):
+ vmd = self.vmm.acquire_vm(0, self.username, idx)
+
+ with pytest.raises(NoVmAvailable):
+ self.vmm.acquire_vm(0, self.username, 42)
+
+ acquired_vmd_list[-1].store_field(self.rc, "state", VmStates.READY)
+ self.vmm.acquire_vm(0, self.username, 42)
+
def test_acquire_only_ready_state(self):
vmd_main = self.vmm.add_vm_to_pool(self.vm_ip, self.vm_name, self.group)