diff --git a/manila/share/drivers/huawei/v3/helper.py b/manila/share/drivers/huawei/v3/helper.py index e2df939838..371c897944 100644 --- a/manila/share/drivers/huawei/v3/helper.py +++ b/manila/share/drivers/huawei/v3/helper.py @@ -190,7 +190,7 @@ class RestHelper(object): need_encode = False for key in ['UserName', 'UserPassword']: node = root.find('Storage/%s' % key) - if node.text.find(prefix_name) > -1: + if node.text.startswith(prefix_name): logininfo[key] = base64.b64decode( six.b(node.text[4:])).decode() else: diff --git a/manila/tests/share/drivers/huawei/test_huawei_nas.py b/manila/tests/share/drivers/huawei/test_huawei_nas.py index 2d3d1f3877..805af85116 100644 --- a/manila/tests/share/drivers/huawei/test_huawei_nas.py +++ b/manila/tests/share/drivers/huawei/test_huawei_nas.py @@ -26,6 +26,7 @@ import xml.dom.minidom import ddt import mock from oslo_serialization import jsonutils +from xml.etree import ElementTree as ET from manila.common import constants as common_constants from manila import context @@ -823,6 +824,45 @@ class FakeHuaweiNasDriver(huawei_nas.HuaweiNasDriver): self.plugin.private_storage = FakePrivateStorage() +class FakeConfigParseTree(object): + class FakeNode(object): + def __init__(self, text): + self._text = text + + @property + def text(self): + return self._text + + @text.setter + def text(self, text): + self._text = text + + class FakeRoot(object): + def __init__(self): + self._node_map = {} + + def findtext(self, path, default=None): + if path in self._node_map: + return self._node_map[path].text + return default + + def find(self, path): + if path in self._node_map: + return self._node_map[path] + return None + + def __init__(self, path_value): + self.root = self.FakeRoot() + for k in path_value: + self.root._node_map[k] = self.FakeNode(path_value[k]) + + def getroot(self): + return self.root + + def write(self, filename, format): + pass + + @ddt.ddt class HuaweiShareDriverTestCase(test.TestCase): """Tests GenericShareDriver.""" @@ -4492,3 +4532,36 @@ class HuaweiShareDriverTestCase(test.TestCase): logininfo = self.driver.plugin.helper._get_login_info() self.assertEqual('admin', logininfo['UserName']) self.assertEqual('Admin@storage', logininfo['UserPassword']) + + @ddt.data({ + 'username': 'abc', + 'password': '123456', + 'expect_username': 'abc', + 'expect_password': '123456', + }, { + 'username': '!$$$YWJj', + 'password': '!$$$MTIzNDU2', + 'expect_username': 'abc', + 'expect_password': '123456', + }, { + 'username': 'ab!$$$c', + 'password': '123!$$$456', + 'expect_username': 'ab!$$$c', + 'expect_password': '123!$$$456', + }) + @ddt.unpack + def test__get_login_info(self, username, password, expect_username, + expect_password): + configs = { + 'Storage/RestURL': 'https://123456', + 'Storage/UserName': username, + 'Storage/UserPassword': password, + } + self.mock_object( + ET, 'parse', + mock.Mock(return_value=FakeConfigParseTree(configs))) + + result = self.driver.plugin.helper._get_login_info() + self.assertEqual(expect_username, result['UserName']) + self.assertEqual(expect_password, result['UserPassword']) + ET.parse.assert_called_once_with(self.fake_conf_file)