From 54504830828757e9d72e9440dde9cff33684a74d Mon Sep 17 00:00:00 2001 From: Gorka Eguileor Date: Thu, 13 Aug 2020 13:13:02 +0200 Subject: [PATCH] ScaleIO: Connection info backward compatibility When we fixed bug 1823200 in Change-ID Iab54c515fe7be252df52b1a0503a251779805759 we made the ScaleIO connector incompatible with the old connection properties dictionary as it only supported the new 'config_group' and 'failed_over' parameters to get the password. This is a problem in any system that is upgraded and has attachments to the array, because the connection properties of those volumes will not contain the new fields and detaching them will result in error "KeyError: 'config_group'". This patch adds compatibility code to support the old connection properties format so we can detach those volumes. Related-Bug: #1823200 Change-Id: I6f01a178616b74ed9a86876ca46e7e46eb360518 --- os_brick/initiator/connectors/scaleio.py | 22 ++++++++++++------- .../initiator/connectors/test_scaleio.py | 20 +++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/os_brick/initiator/connectors/scaleio.py b/os_brick/initiator/connectors/scaleio.py index 1ae65ab1a..133884a62 100644 --- a/os_brick/initiator/connectors/scaleio.py +++ b/os_brick/initiator/connectors/scaleio.py @@ -88,12 +88,20 @@ class ScaleIOConnector(base.BaseLinuxConnector): raise exception.BrickException(message=msg) @staticmethod - def _get_connector_password(config_group, failed_over): + def _get_password_token(connection_properties): + # In old connection format we had the password and token in properties + if 'serverPassword' in connection_properties: + return (connection_properties['serverPassword'], + connection_properties['serverToken']) + + # The new format reads password from file and doesn't have the token LOG.info("Get ScaleIO connector password from configuration file") try: - return priv_scaleio.get_connector_password(CONNECTOR_CONF_PATH, - config_group, - failed_over) + password = priv_scaleio.get_connector_password( + CONNECTOR_CONF_PATH, + connection_properties['config_group'], + connection_properties['failed_over']) + return password, None except Exception as e: msg = _("Error getting ScaleIO connector password from " "configuration file: %s") % e @@ -320,10 +328,8 @@ class ScaleIOConnector(base.BaseLinuxConnector): self.server_ip = connection_properties['serverIP'] self.server_port = connection_properties['serverPort'] self.server_username = connection_properties['serverUsername'] - self.server_password = self._get_connector_password( - connection_properties['config_group'], - connection_properties['failed_over'], - ) + self.server_password, self.server_token = self._get_password_token( + connection_properties) self.iops_limit = connection_properties['iopsLimit'] self.bandwidth_limit = connection_properties['bandwidthLimit'] device_info = {'type': 'block', diff --git a/os_brick/tests/initiator/connectors/test_scaleio.py b/os_brick/tests/initiator/connectors/test_scaleio.py index 88129bde5..d33d37193 100644 --- a/os_brick/tests/initiator/connectors/test_scaleio.py +++ b/os_brick/tests/initiator/connectors/test_scaleio.py @@ -174,6 +174,26 @@ class ScaleIOConnectorTestCase(test_connector.ConnectorTestCase): self.connector.GET_GUID_OP_CODE) self.get_password_mock.assert_called_once() + def test_connect_volume_old_connection_properties(self): + """Successful connect to volume""" + connection_properties = { + 'hostIP': test_connector.MY_IP, + 'serverIP': test_connector.MY_IP, + 'scaleIO_volname': self.vol['name'], + 'scaleIO_volume_id': self.vol['provider_id'], + 'serverPort': 443, + 'serverUsername': 'test', + 'serverPassword': 'fake', + 'serverToken': 'fake_token', + 'iopsLimit': None, + 'bandwidthLimit': None + } + + self.connector.connect_volume(connection_properties) + self.get_guid_mock.assert_called_once_with( + self.connector.GET_GUID_OP_CODE) + self.get_password_mock.assert_not_called() + def test_connect_volume_without_volume_id(self): """Successful connect to volume without a Volume Id""" connection_properties = dict(self.fake_connection_properties)