[Kimchi-devel] [PATCH] validate the volume parameter when the pool of template is iscsi or scsi

Zhou Zheng Sheng zhshzhou at linux.vnet.ibm.com
Wed Mar 26 05:27:48 UTC 2014


on 2014/03/26 12:07, Sheldon wrote:
> On 03/26/2014 03:33 AM, Aline Manera wrote:
>> On 03/25/2014 09:49 AM, shaohef at linux.vnet.ibm.com wrote:
>>> From: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
>>>
>>> When the pool of template is iscsi or scsi, the volume parameter can not
>>> be NULL.
>>> And as we discussion, we do not mix disks from 2 different types of
>>> storage pools, for instance: we do not create a template with 2
>>> disks, where one comes from a SCSI pool and other is a .img in
>>> a DIR pool.
>>>
>>> Signed-off-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
>>> ---
>>> src/kimchi/i18n.py | 2 ++
>>> src/kimchi/model/templates.py | 50
>>> +++++++++++++++++++++++++++++++++----------
>>> 2 files changed, 41 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
>>> index 1f84034..bcc15b7 100644
>>> --- a/src/kimchi/i18n.py
>>> +++ b/src/kimchi/i18n.py
>>> @@ -107,6 +107,8 @@ messages = {
>>> "KCHTMPL0015E": _("Invalid storage pool URI %(value)s specified for
>>> template"),
>>> "KCHTMPL0016E": _("Specify an ISO image as CDROM to create a template"),
>>> "KCHTMPL0017E": _("All networks for the template must be specified in
>>> a list."),
>>> + "KCHTMPL0018E": _("Must specify a volume to a template, when
>>> storage pool is iscsi or scsi"),
>>> + "KCHTMPL0019E": _("The volume: %(volume)s in not in storage pool
>>> %(pool)"),
>>>
>>> "KCHPOOL0001E": _("Storage pool %(name)s already exists"),
>>> "KCHPOOL0002E": _("Storage pool %(name)s does not exist"),
>>> diff --git a/src/kimchi/model/templates.py
>>> b/src/kimchi/model/templates.py
>>> index d49632e..0e5c2b2 100644
>>> --- a/src/kimchi/model/templates.py
>>> +++ b/src/kimchi/model/templates.py
>>> @@ -55,15 +55,17 @@ class TemplatesModel(object):
>>> params['name'] = name
>>>
>>> conn = self.conn.get()
>>> -
>>> pool_uri = params.get(u'storagepool', '')
>>> if pool_uri:
>>> - pool_name = pool_name_from_uri(pool_uri)
>>> try:
>>> - conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>>> + pool_name = pool_name_from_uri(pool_uri)
>>> + pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>>> except Exception:
>>> raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
>>> 'template': name})
>>> + tmp_volumes = [disk['volume'] for disk in params.get('disks', [])
>>> + if 'volume' in disk]
>>> + self.template_volume_validate(tmp_volumes, pool)
>>>
>>> for net_name in params.get(u'networks', []):
>>> try:
>>> @@ -83,6 +85,28 @@ class TemplatesModel(object):
>>> with self.objstore as session:
>>> return session.get_list('template')
>>>
>>> + def template_volume_validate(self, tmp_volumes, pool):
>>> + kwargs = {'conn': self.conn, 'objstore': self.objstore}
>>> + pool_type = xmlutils.xpath_get_text(pool.XMLDesc(0), "/pool/@type")[0]
>>> + pool_name = pool.name()
>>> +
>>> + # as we discussion, we do not mix disks from 2 different types of
>>> + # storage pools, for instance: we do not create a template with 2
>>> + # disks, where one comes from a SCSI pool and other is a .img in
>>> + # a DIR pool.
>>> + if pool_type in ['iscsi', 'scsi']:
>>> + if not tmp_volumes:
>>> + raise InvalidParameter("KCHTMPL0018E")
>>> +
>>
>>> + storagevolumes = __import__("kimchi.model.storagevolumes",
>>> + fromlist=[''])
>>> + pool_volumes = storagevolumes.StorageVolumesModel(
>>> + **kwargs).get_list(pool_name)
>>
>> Why are you importing it that way?
> this way can also works.
> I get the StorageVolumesModel from globals()
> 
> $ git diff
> diff --git a/src/kimchi/model/templates.py b/src/kimchi/model/templates.py
> index 0e5c2b2..9f45dc1 100644
> --- a/src/kimchi/model/templates.py
> +++ b/src/kimchi/model/templates.py
> @@ -98,10 +98,8 @@ class TemplatesModel(object):
> if not tmp_volumes:
> raise InvalidParameter("KCHTMPL0018E")
> 
> - storagevolumes = __import__("kimchi.model.storagevolumes",
> - fromlist=[''])
> - pool_volumes = storagevolumes.StorageVolumesModel(
> - **kwargs).get_list(pool_name)
> + StorageVolumesModel = globals()["StorageVolumesModel"]
> + pool_volumes = StorageVolumesModel(**kwargs).get_list(pool_name)
> vols = set(tmp_volumes) - set(pool_volumes)
> 

I think using globals is not a good idea. Maybe a proper refactor to
untie the circular import is better.

>>
>>> + vols = set(tmp_volumes) - set(pool_volumes)
>>> + if vols:
>>> + raise InvalidParameter("KCHTMPL0019E", {'pool': pool_name,
>>> + 'volume': vols})
>>> +
>>>
>>> class TemplateModel(object):
>>> def __init__(self, **kargs):
>>> @@ -128,18 +152,22 @@ class TemplateModel(object):
>>> new_t.update(params)
>>> ident = name
>>>
>>> + conn = self.conn.get()
>>> pool_uri = new_t.get(u'storagepool', '')
>>> - pool_name = pool_name_from_uri(pool_uri)
>>> - try:
>>> - conn = self.conn.get()
>>> - conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>>> - except Exception:
>>> - raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
>>> - 'template': name})
>>> +
>>> + if pool_uri:
>>> + try:
>>> + pool_name = pool_name_from_uri(pool_uri)
>>> + pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>>> + except Exception:
>>> + raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
>>> + 'template': name})
>>> + tmp_volumes = [disk['volume'] for disk in new_t.get('disks', [])
>>> + if 'volume' in disk]
>>> + self.templates.template_volume_validate(tmp_volumes, pool)
>>>
>>> for net_name in params.get(u'networks', []):
>>> try:
>>> - conn = self.conn.get()
>>> conn.networkLookupByName(net_name)
>>> except Exception:
>>> raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
>>
>>
>>
> 
> 


-- 
Thanks and best regards!

Zhou Zheng Sheng / 周征晟
E-mail: zhshzhou at linux.vnet.ibm.com
Telephone: 86-10-82454397




More information about the Kimchi-devel mailing list