** Changed in: python-glanceclient Status: Fix Committed => Fix Released
-- You received this bug notification because you are a member of Yahoo! Engineering Team, which is subscribed to OpenStack Compute (nova). https://bugs.launchpad.net/bugs/1180377 Title: provisioning failed if the image have a non-ascii property and using qpid Status in OpenStack Compute (Nova): Fix Released Status in Python client library for Glance: Fix Released Bug description: If user set a non-ascii character to the key of an image property and using qpid backend, the instance provisioning will be failed. Use case: 1. Set a non-ascii character to the key of an image property: "glance image-update --property '中文'='中文' 5a7e6de5-15b9-49d2-977e-eda0a221c0b9" 2. Launch a instance with that image: "nova boot --image cirros-0.3.0-x86_64 --flavor m1.tiny --nic net-id=881cbe80-3876-4f4c-b8c8-7b23cedc14f4 lzy-1" 3. Then the provisioning failed and nova-api service catch the exception and write to log: File "/usr/lib/python2.6/site-packages/qpid/messaging/driver.py", line 1052, in process self.send(snd, msg) File "/usr/lib/python2.6/site-packages/qpid/messaging/driver.py", line 1263, in send body = enc(msg.content) File "/usr/lib/python2.6/site-packages/qpid/messaging/message.py", line 28, in encode sc.write_primitive(type, x) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 73, in write_primitive getattr(self, "write_%s" % type.NAME)(v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 257, in write_map sc.write(string.joinfields(map(self._write_map_elem, m.keys(), m.values()), "")) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 250, in _write_map_elem sc.write_primitive(type, v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 73, in write_primitive getattr(self, "write_%s" % type.NAME)(v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 257, in write_map sc.write(string.joinfields(map(self._write_map_elem, m.keys(), m.values()), "")) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 250, in _write_map_elem sc.write_primitive(type, v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 73, in write_primitive getattr(self, "write_%s" % type.NAME)(v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 257, in write_map sc.write(string.joinfields(map(self._write_map_elem, m.keys(), m.values()), "")) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 250, in _write_map_elem sc.write_primitive(type, v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 73, in write_primitive getattr(self, "write_%s" % type.NAME)(v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 257, in write_map sc.write(string.joinfields(map(self._write_map_elem, m.keys(), m.values()), "")) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 250, in _write_map_elem sc.write_primitive(type, v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 73, in write_primitive getattr(self, "write_%s" % type.NAME)(v) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 257, in write_map sc.write(string.joinfields(map(self._write_map_elem, m.keys(), m.values()), "")) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 248, in _write_map_elem sc.write_str8(k) File "/usr/lib/python2.6/site-packages/qpid/codec010.py", line 185, in write_str8 self.write_vbin8(s.encode("utf8")) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) Analysis: In nova-api service, the provisioning request will be handled in "nova/compute/api.py' file "_validate_and_provision_instance" method ("create_instance" method called), the image and its properties will be primitive and make a request spec and pass to nova-scheduler by rpc calls via message queue. And nova-api call glance api v1.0 ("get" method) to get image's infromation, under current glanceclient implementation, those non-ascii character in the image property part will be encoded by utf-8, so the root cause is that qpid (with qpid_python-0.18 lib) can not handle those utf-8 string. Solution: There are two choices to resolve this issue: 1. Resolve in glanceclient. glance-api server return utf-8 property (key/value pair) to glanceclient, so we need convert the them back to unicode from utf-8 ("_image_meta_from_headers" method in "image.py" file), this will cause client.get() method return unicode property string (key/value pair) and nova-api will get those uncode strings and pass them to nova-scheduler via rpc. this unicode encoding logic just like image property update logic ("_image_meta_to_headers" method), update method always pass unicode image property to glance-api server but not utf-8, so this change will keep the encoding consistency. And this fix also need change 2 points in nova-api code ("nova/compute/api.py"), they are call str() on the image properties, it should be unicode() after above change. 2. Resolve in nova-api. This way probably is not good then above one since the area affected is greater the it. in this way, we need convert utf-8 string to unicode then to put it into queue, so the change/fix in "to_primitive" method of "jsonutils.py" file. for now, there are two problems: a. it not take care key within a dict object, that caused utf-8 encoded key string (in this case, it's a key of an image property) will not be primitive. b. need ask to_primitive take care utf-8 string, IMO, need convert it to unicode but not pass the utf-8 (basestring object) directly. So this fix will affect more area then above glanceclient fixing way, this fix has commonality, even user use rabbitmq backend, any utf-8 encoded key within a dict will be convert include glance properties and any other dict objects which want to primitive and put into queue. IMO, I prefer use #1 way to address this issue. To manage notifications about this bug go to: https://bugs.launchpad.net/nova/+bug/1180377/+subscriptions -- Mailing list: https://launchpad.net/~yahoo-eng-team Post to : yahoo-eng-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~yahoo-eng-team More help : https://help.launchpad.net/ListHelp