Merge "Allow setting Pure host personality"

This commit is contained in:
Zuul 2019-05-02 17:42:31 +00:00 committed by Gerrit Code Review
commit ea835e1550
4 changed files with 81 additions and 0 deletions

View File

@ -3229,6 +3229,7 @@ class PureISCSIDriverTestCase(PureBaseSharedDriverTestCase):
mock_generate.assert_called_with(HOSTNAME) mock_generate.assert_called_with(HOSTNAME)
self.array.create_host.assert_called_with(PURE_HOST_NAME, self.array.create_host.assert_called_with(PURE_HOST_NAME,
iqnlist=[INITIATOR_IQN]) iqnlist=[INITIATOR_IQN])
self.assertFalse(self.array.set_host.called)
self.assertEqual(result, real_result) self.assertEqual(result, real_result)
mock_generate.reset_mock() mock_generate.reset_mock()
@ -3250,6 +3251,25 @@ class PureISCSIDriverTestCase(PureBaseSharedDriverTestCase):
host_user=chap_user, host_user=chap_user,
host_password=chap_password) host_password=chap_password)
self.array.reset_mock()
self.mock_config.use_chap_auth = False
self.mock_config.safe_get.return_value = 'oracle-vm-server'
# Branch where we fail due to invalid version for setting personality
self.assertRaises(exception.PureDriverException, self.driver._connect,
self.array, vol_name, ISCSI_CONNECTOR, None, None)
self.assertFalse(self.array.create_host.called)
self.assertFalse(self.array.set_host.called)
self.array.get_rest_version.return_value = '1.14'
# Branch where personality is set
self.driver._connect(self.array, vol_name, ISCSI_CONNECTOR,
None, None)
self.assertDictEqual(result, real_result)
self.array.set_host.assert_called_with(PURE_HOST_NAME,
personality='oracle-vm-server')
@mock.patch(ISCSI_DRIVER_OBJ + "._get_host", autospec=True) @mock.patch(ISCSI_DRIVER_OBJ + "._get_host", autospec=True)
def test_connect_already_connected(self, mock_host): def test_connect_already_connected(self, mock_host):
vol, vol_name = self.new_fake_vol() vol, vol_name = self.new_fake_vol()

View File

@ -60,6 +60,11 @@ PURE_OPTS = [
"on the current total data reduction values. If used " "on the current total data reduction values. If used "
"this calculated value will override the " "this calculated value will override the "
"max_over_subscription_ratio config option."), "max_over_subscription_ratio config option."),
cfg.StrOpt("pure_host_personality",
choices=['aix', 'esxi', 'hitachi-vsp', 'hpux',
'oracle-vm-server', 'solaris', 'vms'],
help="Determines how the Purity system tunes the protocol used "
"between the array and the initiator."),
# These are used as default settings. In future these can be overridden # These are used as default settings. In future these can be overridden
# by settings in volume-type. # by settings in volume-type.
cfg.IntOpt("pure_replica_interval_default", default=3600, cfg.IntOpt("pure_replica_interval_default", default=3600,
@ -123,6 +128,7 @@ ASYNC_REPLICATION_REQUIRED_API_VERSIONS = [
'1.3', '1.4', '1.5'] + SYNC_REPLICATION_REQUIRED_API_VERSIONS '1.3', '1.4', '1.5'] + SYNC_REPLICATION_REQUIRED_API_VERSIONS
MANAGE_SNAP_REQUIRED_API_VERSIONS = [ MANAGE_SNAP_REQUIRED_API_VERSIONS = [
'1.4', '1.5'] + SYNC_REPLICATION_REQUIRED_API_VERSIONS '1.4', '1.5'] + SYNC_REPLICATION_REQUIRED_API_VERSIONS
PERSONALITY_REQUIRED_API_VERSIONS = ['1.14']
REPL_SETTINGS_PROPAGATE_RETRY_INTERVAL = 5 # 5 seconds REPL_SETTINGS_PROPAGATE_RETRY_INTERVAL = 5 # 5 seconds
REPL_SETTINGS_PROPAGATE_MAX_RETRIES = 36 # 36 * 5 = 180 seconds REPL_SETTINGS_PROPAGATE_MAX_RETRIES = 36 # 36 * 5 = 180 seconds
@ -2472,6 +2478,21 @@ class PureISCSIDriver(PureBaseVolumeDriver, san.SanISCSIDriver):
reason=_("Unable to re-use host with unknown CHAP " reason=_("Unable to re-use host with unknown CHAP "
"credentials configured.")) "credentials configured."))
else: else:
personality = self.configuration.safe_get('pure_host_personality')
if personality:
api_version = array.get_rest_version()
if api_version not in PERSONALITY_REQUIRED_API_VERSIONS:
# Continuing here would mean creating a host not according
# to specificiations, possibly leading to unexpected
# behavior later on.
msg = _('Unable to set host personality with Purity REST '
'API version %(api_version)s, requires '
'%(required_versions)s.') % {
'api_version': api_version,
'required_versions': PERSONALITY_REQUIRED_API_VERSIONS
}
raise exception.PureDriverException(reason=msg)
host_name = self._generate_purity_host_name(connector["host"]) host_name = self._generate_purity_host_name(connector["host"])
LOG.info("Creating host object %(host_name)r with IQN:" LOG.info("Creating host object %(host_name)r with IQN:"
" %(iqn)s.", {"host_name": host_name, "iqn": iqn}) " %(iqn)s.", {"host_name": host_name, "iqn": iqn})
@ -2486,6 +2507,18 @@ class PureISCSIDriver(PureBaseVolumeDriver, san.SanISCSIDriver):
LOG.debug('Unable to create host: %s', err.text) LOG.debug('Unable to create host: %s', err.text)
raise exception.PureRetryableException() raise exception.PureRetryableException()
if personality:
try:
array.set_host(host_name, personality=personality)
except purestorage.PureHTTPError as err:
if (err.code == 400 and
ERR_MSG_HOST_NOT_EXIST in err.text):
# If the host disappeared out from under us that's
# ok, we will just retry and snag a new host.
LOG.debug('Unable to set host personality: %s',
err.text)
raise exception.PureRetryableException()
if self.configuration.use_chap_auth: if self.configuration.use_chap_auth:
try: try:
array.set_host(host_name, array.set_host(host_name,

View File

@ -176,6 +176,28 @@ By default, auto-eradication is disabled and all deleted volumes, snapshots,
and consistency groups are retained on the Pure Storage array in a recoverable and consistency groups are retained on the Pure Storage array in a recoverable
state for 24 hours from time of deletion. state for 24 hours from time of deletion.
Setting host personality
~~~~~~~~~~~~~~~~~~~~~~~~
The host personality determines how the Purity system tunes the protocol used
between the array and the initiator. To ensure the array works optimally with
the host, set the personality to the name of the host operating or virtual
memory system. Valid values are aix, esxi, hitachi-vsp, hpux, oracle-vm-server,
solaris, and vms. If your system is not listed as one of the valid host
personalities, do not set the option. By default, the host personality is not
set.
To set the host personality, modify the following option in the ``cinder.conf``
file:
.. code-block:: ini
pure_host_personality = <personality>
.. note::
``pure_host_personality`` is available from Purity REST API version 1.14,
and affects only newly-created hosts.
SSL certification SSL certification
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~

View File

@ -0,0 +1,6 @@
---
features:
- |
Pure Storage FlashArray driver has added configuration option
``pure_host_personality`` for setting the host personality upon host
creation (existing hosts are not affected).