From 43da3cd47b3cc23d4f0f046bc16e34d5267a5b38 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. This patch includes the release note from Change Ib98043358d51426ca650104ad59a7e09911ee8e9 Related-Bug: #1823200 Change-Id: I6f01a178616b74ed9a86876ca46e7e46eb360518 (cherry picked from commit 54504830828757e9d72e9440dde9cff33684a74d) (cherry picked from commit 31589a624fe8d2ebb56ccbd9c94a8dd559a7da89) Conflicts: os_brick/initiator/connectors/scaleio.py (cherry picked from commit db95b001e2fe53a71ec0b881407ecdf7c3db32fc) (cherry picked from commit 173601116eb5e00274b10898b56b37dc42d685ac) Conflicts: os_brick/initiator/connectors/scaleio.py os_brick/tests/initiator/connectors/test_scaleio.py --- os_brick/initiator/connectors/scaleio.py | 16 +++++++++++++--- .../tests/initiator/connectors/test_scaleio.py | 18 ++++++++++++++++++ ...23200-scaleio-upgrade-3e83b5c9dd148714.yaml | 10 ++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/bug-1823200-scaleio-upgrade-3e83b5c9dd148714.yaml diff --git a/os_brick/initiator/connectors/scaleio.py b/os_brick/initiator/connectors/scaleio.py index f278a56a8..28e7ae216 100644 --- a/os_brick/initiator/connectors/scaleio.py +++ b/os_brick/initiator/connectors/scaleio.py @@ -67,6 +67,17 @@ class ScaleIOConnector(base.BaseLinuxConnector): self.iops_limit = None self.bandwidth_limit = None + def _get_password_token(self, 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 + password = self._get_connector_password( + connection_properties['config_group']) + return password, None + @staticmethod def get_connector_properties(root_helper, *args, **kwargs): """The ScaleIO connector properties.""" @@ -300,9 +311,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'], - ) + 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 4e5bfbcea..63a1fefb4 100644 --- a/os_brick/tests/initiator/connectors/test_scaleio.py +++ b/os_brick/tests/initiator/connectors/test_scaleio.py @@ -175,6 +175,24 @@ class ScaleIOConnectorTestCase(test_connector.ConnectorTestCase): self.connector.connect_volume(self.fake_connection_properties) 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_password_mock.assert_not_called() + def test_connect_with_bandwidth_limit(self): """Successful connect to volume with bandwidth limit""" self.fake_connection_properties['bandwidthLimit'] = '500' diff --git a/releasenotes/notes/bug-1823200-scaleio-upgrade-3e83b5c9dd148714.yaml b/releasenotes/notes/bug-1823200-scaleio-upgrade-3e83b5c9dd148714.yaml new file mode 100644 index 000000000..ccce93f89 --- /dev/null +++ b/releasenotes/notes/bug-1823200-scaleio-upgrade-3e83b5c9dd148714.yaml @@ -0,0 +1,10 @@ +--- +fixes: + - | + `Bug #1823200 `_: + Prior fixes for this bug changed the connection properties but did + not take into account an upgrade scenario in which currently attached + volumes had the old format connection properties and could fail on + detatch with "KeyError: 'config_group'". This release updates the + 'scaleio' connector to handle this situation. It is only applicable + to deployments using a Dell EMC PowerFlex/VxFlex OS/ScaleIO backend.