Fix adding non-ascii attrs to Resource objects error

Due to these lines of code [0] we don't have an opportunity
to add attributes with non-ascii symbols to Resource objects,
but information about it will be in _info dict.

Example of side effect - quota_show command.
Because we don't have such an attr, here [1] it will be added
None value instead of real value [2].

This patch fixes this problem.

[0] - f8c93ed03b/cinderclient/apiclient/base.py (L498-L499)
[1] - f8c93ed03b/cinderclient/shell_utils.py (L179)
[2] - http://paste.openstack.org/show/593358/

Change-Id: I0493845dafc5dad836e899b9c22d563023c1dab0
Closes-Bug: #1652605
This commit is contained in:
Michael Dovgal 2016-12-26 11:16:53 +00:00
parent e04a4149f2
commit d8a6210152
2 changed files with 12 additions and 1 deletions

View File

@ -31,6 +31,7 @@ import six
from six.moves.urllib import parse
from cinderclient.apiclient import exceptions
from oslo_utils import encodeutils
from oslo_utils import strutils
@ -496,7 +497,7 @@ class Resource(RequestIdMixin):
# In this case we already defined the attribute on the class
continue
except UnicodeEncodeError:
pass
setattr(self, encodeutils.safe_encode(k), v)
self._info[k] = v
def __getattr__(self, k):

View File

@ -48,6 +48,16 @@ class BaseTest(utils.TestCase):
self.assertEqual("<Resource baz=spam, foo=bar>", repr(r))
self.assertNotIn("x_openstack_request_ids", repr(r))
def test_add_non_ascii_attr_to_resource(self):
info = {'gigabytes_тест': -1,
'volumes_тест': -1,
'id': 'admin'}
res = base.Resource(None, info)
for key, value in info.items():
self.assertEqual(value, getattr(res, key, None))
def test_getid(self):
self.assertEqual(4, base.getid(4))