Merge "Allow setting Pure host personality"
This commit is contained in:
commit
ea835e1550
@ -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()
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -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).
|
Loading…
Reference in New Issue
Block a user