Reviewed-by: Rodrigo Trujillo <rodrigo.trujillo(a)linux.vnet.ibm.com>
On 04/17/2014 06:04 PM, Aline Manera wrote:
From: Aline Manera <alinefm(a)br.ibm.com>
Use the APIs /host/users and /host/groups to check user input
That way we can check the input data at once instead of checking item by item.
Signed-off-by: Aline Manera <alinefm(a)br.ibm.com>
---
src/kimchi/i18n.py | 4 ++--
src/kimchi/mockmodel.py | 24 ++++++++++++++++++------
src/kimchi/model/vms.py | 20 ++++++++++++--------
3 files changed, 32 insertions(+), 16 deletions(-)
diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
index 3fc3013..89bcd02 100644
--- a/src/kimchi/i18n.py
+++ b/src/kimchi/i18n.py
@@ -84,8 +84,8 @@ messages = {
"KCHVM0024E": _("User name must be a string"),
"KCHVM0025E": _("Group names list must be an array"),
"KCHVM0026E": _("Group name must be a string"),
- "KCHVM0027E": _("User %(user)s does not exist"),
- "KCHVM0028E": _("Group %(group)s does not exist"),
+ "KCHVM0027E": _("User(s) '%(users)s' do not exist"),
+ "KCHVM0028E": _("Group(s) '%(groups)s' do not exist"),
"KCHVMIF0001E": _("Interface %(iface)s does not exist in virtual
machine %(name)s"),
"KCHVMIF0002E": _("Network %(network)s specified for virtual machine
%(name)s does not exist"),
diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
index b235e1e..866ad2c 100644
--- a/src/kimchi/mockmodel.py
+++ b/src/kimchi/mockmodel.py
@@ -91,14 +91,26 @@ class MockModel(object):
if state == 'running' or params['name'] in
self.vms_get_list():
msg_args = {'name': dom.name, 'new_name':
params['name']}
raise InvalidParameter("KCHVM0003E", msg_args)
- else:
- del self._mock_vms[dom.name]
- dom.name = params['name']
- self._mock_vms[dom.name] = dom
+
+ del self._mock_vms[dom.name]
+ dom.name = params['name']
+ self._mock_vms[dom.name] = dom
for key, val in params.items():
- if key in dom.info:
- dom.info[key] = val
+ if key == 'users':
+ invalid_users = set(val) - set(self.users_get_list())
+ if len(invalid_users) != 0:
+ raise InvalidParameter("KCHVM0027E",
+ {'users': ",
".join(invalid_users)})
+
+ elif key == 'groups':
+ invalid_groups = set(val) - set(self.groups_get_list())
+ if len(invalid_groups) != 0:
+ raise InvalidParameter("KCHVM0028E",
+ {'groups':
+ ", ".join(invalid_groups)})
+
+ dom.info[key] = val
def _live_vm_update(self, dom, params):
pass
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 90e9537..ede54a3 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -29,7 +29,6 @@ from lxml.builder import E
from kimchi import vnc
from kimchi import xmlutils
-from kimchi.auth import Group, User
from kimchi.config import READONLY_POOL_TYPE
from kimchi.exception import InvalidOperation, InvalidParameter
from kimchi.exception import NotFoundError, OperationFailed
@@ -37,7 +36,7 @@ from kimchi.model.config import CapabilitiesModel
from kimchi.model.templates import TemplateModel
from kimchi.model.utils import get_vm_name
from kimchi.screenshot import VMScreenshot
-from kimchi.utils import kimchi_log, run_setfacl_set_attr
+from kimchi.utils import import_class, kimchi_log, run_setfacl_set_attr
from kimchi.utils import template_name_from_uri
from kimchi.xmlutils import xpath_get_text
@@ -236,6 +235,8 @@ class VMModel(object):
self.conn = kargs['conn']
self.objstore = kargs['objstore']
self.vmscreenshot = VMScreenshotModel(**kargs)
+ self.users = import_class('kimchi.model.host.UsersModel')(**kargs)
+ self.groups = import_class('kimchi.model.host.GroupsModel')(**kargs)
def update(self, name, params):
dom = self.get_vm(name, self.conn)
@@ -264,14 +265,17 @@ class VMModel(object):
for key, val in params.items():
if key == 'users':
- for user in val:
- if not User(user).exists():
- raise OperationFailed("KCHVM0027E", {'user':
user})
+ invalid_users = set(val) - set(self.users.get_list())
+ if len(invalid_users) != 0:
+ raise InvalidParameter("KCHVM0027E",
+ {'users': ",
".join(invalid_users)})
users = val
elif key == 'groups':
- for group in val:
- if not Group(group).exists():
- raise OperationFailed("KCHVM0028E", {'group':
group})
+ invalid_groups = set(val) - set(self.groups.get_list())
+ if len(invalid_groups) != 0:
+ raise InvalidParameter("KCHVM0028E",
+ {'groups':
+ ", ".join(invalid_groups)})
groups = val
else:
if key in VM_STATIC_UPDATE_PARAMS: