From 23ac0ab4edd38b91b0c21d5c9e81cd1a7bdddc55 Mon Sep 17 00:00:00 2001 From: Raunak Kumar Date: Fri, 17 Nov 2017 12:07:36 -0800 Subject: [PATCH] nimble: handle unicode strings in volume create currently nimble cinder driver doesn't handle unicode strings for display_name and display_description Change-Id: Ic94cbc50d5761c7fc67d2973bed70c70cf6bf769 Closes-Bug: 1732812 --- .../tests/unit/volume/drivers/test_nimble.py | 37 +++++++++++++++++++ cinder/volume/drivers/nimble.py | 23 ++++++++++-- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/cinder/tests/unit/volume/drivers/test_nimble.py b/cinder/tests/unit/volume/drivers/test_nimble.py index ef4dca5cdc3..5f5dd9ef622 100644 --- a/cinder/tests/unit/volume/drivers/test_nimble.py +++ b/cinder/tests/unit/volume/drivers/test_nimble.py @@ -324,6 +324,43 @@ class NimbleDriverVolumeTestCase(NimbleDriverBaseTestCase): 'iSCSI', False) + @mock.patch(NIMBLE_URLLIB2) + @mock.patch(NIMBLE_CLIENT) + @mock.patch.object(obj_volume.VolumeList, 'get_all_by_host', + mock.Mock(return_value=[])) + @mock.patch.object(volume_types, 'get_volume_type_extra_specs', + mock.Mock(type_id=FAKE_TYPE_ID, return_value={ + 'nimble:perfpol-name': 'default', + 'nimble:encryption': 'yes'})) + @NimbleDriverBaseTestCase.client_mock_decorator(create_configuration( + NIMBLE_SAN_LOGIN, NIMBLE_SAN_PASS, NIMBLE_MANAGEMENT_IP, + 'default', '*')) + def test_create_volume_with_unicode(self): + self.mock_client_service.get_vol_info.return_value = ( + FAKE_GET_VOL_INFO_RESPONSE) + self.mock_client_service.get_netconfig.return_value = ( + FAKE_POSITIVE_NETCONFIG_RESPONSE) + + self.assertEqual({ + 'provider_location': '172.18.108.21:3260 iqn.test', + 'provider_auth': None}, + self.driver.create_volume({'name': 'testvolume', + 'size': 1, + 'volume_type_id': None, + 'display_name': u'unicode_name', + 'display_description': ''})) + + self.mock_client_service.create_vol.assert_called_once_with( + {'name': 'testvolume', + 'size': 1, + 'volume_type_id': None, + 'display_name': u'unicode_name', + 'display_description': ''}, + 'default', + False, + 'iSCSI', + False) + @mock.patch(NIMBLE_URLLIB2) @mock.patch(NIMBLE_CLIENT) @mock.patch.object(obj_volume.VolumeList, 'get_all_by_host', diff --git a/cinder/volume/drivers/nimble.py b/cinder/volume/drivers/nimble.py index 6a180f63b50..710ce388f15 100644 --- a/cinder/volume/drivers/nimble.py +++ b/cinder/volume/drivers/nimble.py @@ -1098,6 +1098,12 @@ class NimbleRestAPIExecutor(object): {'name': response['name']}) return response['name'] + def _is_ascii(self, value): + try: + return all(ord(c) < 128 for c in value) + except TypeError: + return False + def _execute_create_vol(self, volume, pool_name, reserve, protocol, is_gst_enabled): """Create volume @@ -1109,9 +1115,20 @@ class NimbleRestAPIExecutor(object): volume_size = volume['size'] * units.Ki reserve_size = 100 if reserve else 0 # Set volume description - display_list = [getattr(volume, 'display_name', ''), - getattr(volume, 'display_description', '')] - description = ':'.join(filter(None, display_list)) + display_name = getattr(volume, 'display_name', '') + display_description = getattr(volume, 'display_description', '') + if self._is_ascii(display_name) and self._is_ascii( + display_description): + display_list = [getattr(volume, 'display_name', ''), + getattr(volume, 'display_description', '')] + description = ':'.join(filter(None, display_list)) + elif self._is_ascii(display_name): + description = display_name + elif self._is_ascii(display_description): + description = display_description + else: + description = "" + # Limit description size to 254 characters description = description[:254] pool_id = self.get_pool_id(pool_name)