[Kimchi-devel] [PATCH V2 1/2] Storage pool support unicode correctly

Aline Manera alinefm at linux.vnet.ibm.com
Mon Feb 10 15:12:54 UTC 2014


Reviewed-by: Aline Manera <alinefm at linux.vnet.ibm.com>

On 02/10/2014 04:28 AM, shaohef at linux.vnet.ibm.com wrote:
> From: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
>
> For unicode, we have handle the incoming text from
> kimchi server and outgoing text to kimchi server correctly.
>
> But we do not handle the incoming text from libvirt and outgoing
> text to libvirt correctly.
>
> For some variables of storage pool, such as pool name and pool xml
> do not follow our principle.
> https://github.com/kimchi-project/kimchi/wiki/support-unicode
>
> This patch will improve the follow:
> 1. Handle storage pool xml and pool name as unicode in kimchi, and
> decode them when pass them to libvirt.
> 2. Decode the pool name from libvirt.
>
> We should guarantee:
> All text strings, everywhere should be of type unicode, not str.
> If we're handling text, and our variable is a str, it's a bug!
>
> Test this patch:
> 1. create a pool
> $ curl -u <user> -H 'Accept: application/json' \
> -H 'Content-type: application/json' \
> http://localhost:8000/storagepools/ -X POST -d '
> {
>     "name":"kīмсhī-pool",
>     "type":"dir",
>     "path":"/tmp/test"
> } '
>
> 2. get this pool
> $ curl -u <user> -H 'Accept: application/json' \
> -H 'Content-type: application/json' \
> http://localhost:8000/storagepools/kīмсhī-pool
>
> 3. delete this pool
> $ curl -u <user> -H 'Accept: application/json' \
> -H 'Content-type: application/json' -X DELETE \
> http://localhost:8000/storagepools/kīмсhī-pool
>
> Signed-off-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
> ---
>   src/kimchi/model/libvirtstoragepool.py | 8 ++++----
>   src/kimchi/model/storagepools.py       | 8 ++++----
>   src/kimchi/model/templates.py          | 6 +++---
>   3 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/src/kimchi/model/libvirtstoragepool.py b/src/kimchi/model/libvirtstoragepool.py
> index f4dbf2e..9c8027f 100644
> --- a/src/kimchi/model/libvirtstoragepool.py
> +++ b/src/kimchi/model/libvirtstoragepool.py
> @@ -68,7 +68,7 @@ class DirPoolDef(StoragePoolDef):
>           # name:
>           # type:
>           # path:
> -        xml = """
> +        xml = u"""
>           <pool type='dir'>
>             <name>{name}</name>
>             <target>
> @@ -125,7 +125,7 @@ class NetfsPoolDef(StoragePoolDef):
>           # source[path]:
>           poolArgs = copy.deepcopy(self.poolArgs)
>           poolArgs['path'] = self.path
> -        xml = """
> +        xml = u"""
>           <pool type='netfs'>
>             <name>{name}</name>
>             <source>
> @@ -161,7 +161,7 @@ class LogicalPoolDef(StoragePoolDef):
>           poolArgs['source']['devices'] = ''.join(devices)
>           poolArgs['path'] = self.path
>   
> -        xml = """
> +        xml = u"""
>           <pool type='logical'>
>           <name>{name}</name>
>               <source>
> @@ -241,7 +241,7 @@ class IscsiPoolDef(StoragePoolDef):
>                                      'auth': self._format_auth(poolArgs)})
>           poolArgs['path'] = '/dev/disk/by-id'
>   
> -        xml = """
> +        xml = u"""
>           <pool type='iscsi'>
>             <name>{name}</name>
>             <source>
> diff --git a/src/kimchi/model/storagepools.py b/src/kimchi/model/storagepools.py
> index 233a8a7..53eac64 100644
> --- a/src/kimchi/model/storagepools.py
> +++ b/src/kimchi/model/storagepools.py
> @@ -53,7 +53,7 @@ class StoragePoolsModel(object):
>               conn = self.conn.get()
>               names = conn.listStoragePools()
>               names += conn.listDefinedStoragePools()
> -            return sorted(names)
> +            return sorted(map(lambda x: x.decode('utf-8'), names))
>           except libvirt.libvirtError as e:
>               raise OperationFailed(e.get_error_message())
>   
> @@ -69,7 +69,7 @@ class StoragePoolsModel(object):
>                   task_id = self._do_deep_scan(params)
>               poolDef = StoragePoolDef.create(params)
>               poolDef.prepare(conn)
> -            xml = poolDef.xml
> +            xml = poolDef.xml.encode("utf-8")
>           except KeyError, key:
>               raise MissingParameter(key)
>   
> @@ -100,7 +100,7 @@ class StoragePoolsModel(object):
>       def _clean_scan(self, pool_name):
>           try:
>               conn = self.conn.get()
> -            pool = conn.storagePoolLookupByName(pool_name)
> +            pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>               pool.destroy()
>               with self.objstore as session:
>                   session.delete('scanning', pool_name)
> @@ -141,7 +141,7 @@ class StoragePoolModel(object):
>       def get_storagepool(name, conn):
>           conn = conn.get()
>           try:
> -            return conn.storagePoolLookupByName(name)
> +            return conn.storagePoolLookupByName(name.encode("utf-8"))
>           except libvirt.libvirtError as e:
>               if e.get_error_code() == libvirt.VIR_ERR_NO_STORAGE_POOL:
>                   raise NotFoundError("Storage Pool '%s' not found" % name)
> diff --git a/src/kimchi/model/templates.py b/src/kimchi/model/templates.py
> index 03632a6..a5c73cc 100644
> --- a/src/kimchi/model/templates.py
> +++ b/src/kimchi/model/templates.py
> @@ -43,7 +43,7 @@ class TemplatesModel(object):
>           if pool_uri:
>               pool_name = pool_name_from_uri(pool_uri)
>               try:
> -                conn.storagePoolLookupByName(pool_name)
> +                conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>               except Exception as e:
>                   err = "Storagepool specified is not valid: %s."
>                   raise InvalidParameter(err % e.message)
> @@ -99,7 +99,7 @@ class TemplateModel(object):
>           pool_name = pool_name_from_uri(pool_uri)
>           try:
>               conn = self.conn.get()
> -            conn.storagePoolLookupByName(pool_name)
> +            conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>           except Exception as e:
>               err = "Storagepool specified is not valid: %s."
>               raise InvalidParameter(err % e.message)
> @@ -131,7 +131,7 @@ class LibvirtVMTemplate(VMTemplate):
>           pool_name = pool_name_from_uri(pool_uri)
>           try:
>               conn = self.conn.get()
> -            pool = conn.storagePoolLookupByName(pool_name)
> +            pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
>           except libvirt.libvirtError:
>               err = 'Storage specified by template does not exist'
>               raise InvalidParameter(err)




More information about the Kimchi-devel mailing list