Merge "PowerMax driver - rebranding VMAX to PowerMax"
This commit is contained in:
commit
c068ce071b
@ -77,6 +77,8 @@ from cinder.volume.drivers.datacore import iscsi as \
|
|||||||
cinder_volume_drivers_datacore_iscsi
|
cinder_volume_drivers_datacore_iscsi
|
||||||
from cinder.volume.drivers.datera import datera_iscsi as \
|
from cinder.volume.drivers.datera import datera_iscsi as \
|
||||||
cinder_volume_drivers_datera_dateraiscsi
|
cinder_volume_drivers_datera_dateraiscsi
|
||||||
|
from cinder.volume.drivers.dell_emc.powermax import common as \
|
||||||
|
cinder_volume_drivers_dell_emc_powermax_common
|
||||||
from cinder.volume.drivers.dell_emc import ps as \
|
from cinder.volume.drivers.dell_emc import ps as \
|
||||||
cinder_volume_drivers_dell_emc_ps
|
cinder_volume_drivers_dell_emc_ps
|
||||||
from cinder.volume.drivers.dell_emc.sc import storagecenter_common as \
|
from cinder.volume.drivers.dell_emc.sc import storagecenter_common as \
|
||||||
@ -85,8 +87,6 @@ from cinder.volume.drivers.dell_emc.scaleio import driver as \
|
|||||||
cinder_volume_drivers_dell_emc_scaleio_driver
|
cinder_volume_drivers_dell_emc_scaleio_driver
|
||||||
from cinder.volume.drivers.dell_emc.unity import driver as \
|
from cinder.volume.drivers.dell_emc.unity import driver as \
|
||||||
cinder_volume_drivers_dell_emc_unity_driver
|
cinder_volume_drivers_dell_emc_unity_driver
|
||||||
from cinder.volume.drivers.dell_emc.vmax import common as \
|
|
||||||
cinder_volume_drivers_dell_emc_vmax_common
|
|
||||||
from cinder.volume.drivers.dell_emc.vnx import common as \
|
from cinder.volume.drivers.dell_emc.vnx import common as \
|
||||||
cinder_volume_drivers_dell_emc_vnx_common
|
cinder_volume_drivers_dell_emc_vnx_common
|
||||||
from cinder.volume.drivers.dell_emc import xtremio as \
|
from cinder.volume.drivers.dell_emc import xtremio as \
|
||||||
@ -284,12 +284,12 @@ def list_opts():
|
|||||||
cinder_volume_driver.iser_opts,
|
cinder_volume_driver.iser_opts,
|
||||||
cinder_volume_driver.nvmet_opts,
|
cinder_volume_driver.nvmet_opts,
|
||||||
cinder_volume_drivers_datera_dateraiscsi.d_opts,
|
cinder_volume_drivers_datera_dateraiscsi.d_opts,
|
||||||
|
cinder_volume_drivers_dell_emc_powermax_common.powermax_opts,
|
||||||
cinder_volume_drivers_dell_emc_ps.eqlx_opts,
|
cinder_volume_drivers_dell_emc_ps.eqlx_opts,
|
||||||
cinder_volume_drivers_dell_emc_sc_storagecentercommon.
|
cinder_volume_drivers_dell_emc_sc_storagecentercommon.
|
||||||
common_opts,
|
common_opts,
|
||||||
cinder_volume_drivers_dell_emc_scaleio_driver.scaleio_opts,
|
cinder_volume_drivers_dell_emc_scaleio_driver.scaleio_opts,
|
||||||
cinder_volume_drivers_dell_emc_unity_driver.UNITY_OPTS,
|
cinder_volume_drivers_dell_emc_unity_driver.UNITY_OPTS,
|
||||||
cinder_volume_drivers_dell_emc_vmax_common.vmax_opts,
|
|
||||||
cinder_volume_drivers_dell_emc_vnx_common.VNX_OPTS,
|
cinder_volume_drivers_dell_emc_vnx_common.VNX_OPTS,
|
||||||
cinder_volume_drivers_dell_emc_xtremio.XTREMIO_OPTS,
|
cinder_volume_drivers_dell_emc_xtremio.XTREMIO_OPTS,
|
||||||
cinder_volume_drivers_drbdmanagedrv.drbd_opts,
|
cinder_volume_drivers_drbdmanagedrv.drbd_opts,
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2017 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -31,11 +31,11 @@ from cinder import exception
|
|||||||
from cinder.i18n import _
|
from cinder.i18n import _
|
||||||
from cinder.objects import fields
|
from cinder.objects import fields
|
||||||
from cinder.volume import configuration
|
from cinder.volume import configuration
|
||||||
from cinder.volume.drivers.dell_emc.vmax import masking
|
from cinder.volume.drivers.dell_emc.powermax import masking
|
||||||
from cinder.volume.drivers.dell_emc.vmax import metadata as volume_metadata
|
from cinder.volume.drivers.dell_emc.powermax import metadata as volume_metadata
|
||||||
from cinder.volume.drivers.dell_emc.vmax import provision
|
from cinder.volume.drivers.dell_emc.powermax import provision
|
||||||
from cinder.volume.drivers.dell_emc.vmax import rest
|
from cinder.volume.drivers.dell_emc.powermax import rest
|
||||||
from cinder.volume.drivers.dell_emc.vmax import utils
|
from cinder.volume.drivers.dell_emc.powermax import utils
|
||||||
from cinder.volume import utils as volume_utils
|
from cinder.volume import utils as volume_utils
|
||||||
from cinder.volume import volume_types
|
from cinder.volume import volume_types
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
@ -53,7 +53,7 @@ FAILOVER_ERROR = fields.ReplicationStatus.FAILOVER_ERROR
|
|||||||
REPLICATION_ERROR = fields.ReplicationStatus.ERROR
|
REPLICATION_ERROR = fields.ReplicationStatus.ERROR
|
||||||
|
|
||||||
|
|
||||||
vmax_opts = [
|
powermax_opts = [
|
||||||
cfg.IntOpt('interval',
|
cfg.IntOpt('interval',
|
||||||
default=3,
|
default=3,
|
||||||
help='Use this value to specify '
|
help='Use this value to specify '
|
||||||
@ -64,10 +64,9 @@ vmax_opts = [
|
|||||||
'number of retries.'),
|
'number of retries.'),
|
||||||
cfg.IntOpt(utils.VMAX_SNAPVX_UNLINK_LIMIT,
|
cfg.IntOpt(utils.VMAX_SNAPVX_UNLINK_LIMIT,
|
||||||
default=3,
|
default=3,
|
||||||
help='Use this value to specify '
|
help='DEPRECATED: vmax_snapvc_unlink_limit.',
|
||||||
'the maximum number of unlinks '
|
deprecated_for_removal=True,
|
||||||
'for the temporary snapshots '
|
deprecated_reason='Replaced by powermax_snapvx_unlink_limit.'),
|
||||||
'before a clone operation.'),
|
|
||||||
cfg.BoolOpt('initiator_check',
|
cfg.BoolOpt('initiator_check',
|
||||||
default=False,
|
default=False,
|
||||||
help='Use this value to enable '
|
help='Use this value to enable '
|
||||||
@ -81,21 +80,25 @@ vmax_opts = [
|
|||||||
default=8443,
|
default=8443,
|
||||||
help='REST server port number.'),
|
help='REST server port number.'),
|
||||||
cfg.StrOpt(utils.VMAX_ARRAY,
|
cfg.StrOpt(utils.VMAX_ARRAY,
|
||||||
help='Serial number of the array to connect to.'),
|
help='DEPRECATED: vmax_array.',
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason='Replaced by powermax_array.'),
|
||||||
cfg.StrOpt(utils.VMAX_SRP,
|
cfg.StrOpt(utils.VMAX_SRP,
|
||||||
help='Storage resource pool on array to use for '
|
help='DEPRECATED: vmax_srp.',
|
||||||
'provisioning.'),
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason='Replaced by powermax_srp.'),
|
||||||
cfg.StrOpt(utils.VMAX_SERVICE_LEVEL,
|
cfg.StrOpt(utils.VMAX_SERVICE_LEVEL,
|
||||||
help='Service level to use for provisioning storage. '
|
help='DEPRECATED: vmax_service_level.',
|
||||||
'Setting this as an extra spec in pool_name '
|
deprecated_for_removal=True,
|
||||||
'is preferable.'),
|
deprecated_reason='Replaced by powermax_service_level.'),
|
||||||
cfg.StrOpt(utils.VMAX_WORKLOAD,
|
cfg.StrOpt(utils.VMAX_WORKLOAD,
|
||||||
help='Workload, setting this as an extra spec in '
|
help='Workload, setting this as an extra spec in '
|
||||||
'pool_name is preferable.'),
|
'pool_name is preferable.'),
|
||||||
cfg.ListOpt(utils.VMAX_PORT_GROUPS,
|
cfg.ListOpt(utils.VMAX_PORT_GROUPS,
|
||||||
bounds=True,
|
bounds=True,
|
||||||
help='List of port groups containing frontend ports '
|
help='DEPRECATED: vmax_port_groups.',
|
||||||
'configured prior for server connection.'),
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason='Replaced by powermax_port_groups.'),
|
||||||
cfg.IntOpt(utils.U4P_FAILOVER_TIMEOUT,
|
cfg.IntOpt(utils.U4P_FAILOVER_TIMEOUT,
|
||||||
default=20.0,
|
default=20.0,
|
||||||
help='How long to wait for the server to send data before '
|
help='How long to wait for the server to send data before '
|
||||||
@ -120,17 +123,37 @@ vmax_opts = [
|
|||||||
'connection is re-established.'),
|
'connection is re-established.'),
|
||||||
cfg.MultiOpt(utils.U4P_FAILOVER_TARGETS,
|
cfg.MultiOpt(utils.U4P_FAILOVER_TARGETS,
|
||||||
item_type=types.Dict(),
|
item_type=types.Dict(),
|
||||||
help='Dictionary of Unisphere failover target info.')]
|
help='Dictionary of Unisphere failover target info.'),
|
||||||
|
cfg.IntOpt(utils.POWERMAX_SNAPVX_UNLINK_LIMIT,
|
||||||
CONF.register_opts(vmax_opts, group=configuration.SHARED_CONF_GROUP)
|
default=3,
|
||||||
|
help='Use this value to specify '
|
||||||
|
'the maximum number of unlinks '
|
||||||
|
'for the temporary snapshots '
|
||||||
|
'before a clone operation.'),
|
||||||
|
cfg.StrOpt(utils.POWERMAX_ARRAY,
|
||||||
|
help='Serial number of the array to connect to.'),
|
||||||
|
cfg.StrOpt(utils.POWERMAX_SRP,
|
||||||
|
help='Storage resource pool on array to use for '
|
||||||
|
'provisioning.'),
|
||||||
|
cfg.StrOpt(utils.POWERMAX_SERVICE_LEVEL,
|
||||||
|
help='Service level to use for provisioning storage. '
|
||||||
|
'Setting this as an extra spec in pool_name '
|
||||||
|
'is preferable.'),
|
||||||
|
cfg.ListOpt(utils.POWERMAX_PORT_GROUPS,
|
||||||
|
bounds=True,
|
||||||
|
help='List of port groups containing frontend ports '
|
||||||
|
'configured prior for server connection.')]
|
||||||
|
|
||||||
|
|
||||||
class VMAXCommon(object):
|
CONF.register_opts(powermax_opts, group=configuration.SHARED_CONF_GROUP)
|
||||||
"""Common class for Rest based VMAX volume drivers.
|
|
||||||
|
|
||||||
This common class is for Dell EMC VMAX volume drivers
|
|
||||||
|
class PowerMaxCommon(object):
|
||||||
|
"""Common class for Rest based PowerMax volume drivers.
|
||||||
|
|
||||||
|
This common class is for Dell EMC PowerMax volume drivers
|
||||||
based on UniSphere Rest API.
|
based on UniSphere Rest API.
|
||||||
It supports VMAX 3 and VMAX All Flash arrays.
|
It supports VMAX 3 and VMAX All Flash and PowerMax arrays.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
pool_info = {'backend_name': None,
|
pool_info = {'backend_name': None,
|
||||||
@ -145,13 +168,13 @@ class VMAXCommon(object):
|
|||||||
|
|
||||||
self.protocol = prtcl
|
self.protocol = prtcl
|
||||||
self.configuration = configuration
|
self.configuration = configuration
|
||||||
self.configuration.append_config_values(vmax_opts)
|
self.configuration.append_config_values(powermax_opts)
|
||||||
self.rest = rest.VMAXRest()
|
self.rest = rest.PowerMaxRest()
|
||||||
self.utils = utils.VMAXUtils()
|
self.utils = utils.PowerMaxUtils()
|
||||||
self.masking = masking.VMAXMasking(prtcl, self.rest)
|
self.masking = masking.PowerMaxMasking(prtcl, self.rest)
|
||||||
self.provision = provision.VMAXProvision(self.rest)
|
self.provision = provision.PowerMaxProvision(self.rest)
|
||||||
self.version = version
|
self.version = version
|
||||||
self.volume_metadata = volume_metadata.VMAXVolumeMetadata(
|
self.volume_metadata = volume_metadata.PowerMaxVolumeMetadata(
|
||||||
self.rest, version, LOG.isEnabledFor(logging.DEBUG))
|
self.rest, version, LOG.isEnabledFor(logging.DEBUG))
|
||||||
# replication
|
# replication
|
||||||
self.replication_enabled = False
|
self.replication_enabled = False
|
||||||
@ -186,8 +209,9 @@ class VMAXCommon(object):
|
|||||||
"""Get relevent details from configuration file."""
|
"""Get relevent details from configuration file."""
|
||||||
self.interval = self.configuration.safe_get('interval')
|
self.interval = self.configuration.safe_get('interval')
|
||||||
self.retries = self.configuration.safe_get('retries')
|
self.retries = self.configuration.safe_get('retries')
|
||||||
self.snapvx_unlink_limit = self.configuration.safe_get(
|
self.snapvx_unlink_limit = self._get_unlink_configuration_value(
|
||||||
utils.VMAX_SNAPVX_UNLINK_LIMIT)
|
utils.VMAX_SNAPVX_UNLINK_LIMIT,
|
||||||
|
utils.POWERMAX_SNAPVX_UNLINK_LIMIT)
|
||||||
self.pool_info['backend_name'] = (
|
self.pool_info['backend_name'] = (
|
||||||
self.configuration.safe_get('volume_backend_name'))
|
self.configuration.safe_get('volume_backend_name'))
|
||||||
mosr = volume_utils.get_max_over_subscription_ratio(
|
mosr = volume_utils.get_max_over_subscription_ratio(
|
||||||
@ -247,13 +271,13 @@ class VMAXCommon(object):
|
|||||||
LOG.warning("There has been no failover instances of Unisphere "
|
LOG.warning("There has been no failover instances of Unisphere "
|
||||||
"configured for this instance of Cinder. If your "
|
"configured for this instance of Cinder. If your "
|
||||||
"primary instance of Unisphere goes down then your "
|
"primary instance of Unisphere goes down then your "
|
||||||
"VMAX will be inaccessible until the Unisphere REST "
|
"PowerMax/VMAX will be inaccessible until the "
|
||||||
"API is responsive again.")
|
"Unisphere REST API is responsive again.")
|
||||||
|
|
||||||
def retest_primary_u4p(self):
|
def retest_primary_u4p(self):
|
||||||
"""Retest connection to the primary instance of Unisphere."""
|
"""Retest connection to the primary instance of Unisphere."""
|
||||||
primary_array_info = self.get_attributes_from_cinder_config()
|
primary_array_info = self.get_attributes_from_cinder_config()
|
||||||
temp_conn = rest.VMAXRest()
|
temp_conn = rest.PowerMaxRest()
|
||||||
temp_conn.set_rest_credentials(primary_array_info)
|
temp_conn.set_rest_credentials(primary_array_info)
|
||||||
LOG.debug(
|
LOG.debug(
|
||||||
"Running connection check to primary instance of Unisphere "
|
"Running connection check to primary instance of Unisphere "
|
||||||
@ -310,8 +334,8 @@ class VMAXCommon(object):
|
|||||||
{'rep_config': self.rep_config})
|
{'rep_config': self.rep_config})
|
||||||
elif self.rep_devices and len(self.rep_devices) > 1:
|
elif self.rep_devices and len(self.rep_devices) > 1:
|
||||||
LOG.error("More than one replication target is configured. "
|
LOG.error("More than one replication target is configured. "
|
||||||
"Dell EMC VMAX only suppports a single replication "
|
"Dell EMC PowerMax/VMAX only suppports a single "
|
||||||
"target. Replication will not be enabled.")
|
"replication target. Replication will not be enabled.")
|
||||||
|
|
||||||
def _get_slo_workload_combinations(self, array_info):
|
def _get_slo_workload_combinations(self, array_info):
|
||||||
"""Method to query the array for SLO and Workloads.
|
"""Method to query the array for SLO and Workloads.
|
||||||
@ -383,7 +407,7 @@ class VMAXCommon(object):
|
|||||||
return finalarrayinfolist
|
return finalarrayinfolist
|
||||||
|
|
||||||
def create_volume(self, volume):
|
def create_volume(self, volume):
|
||||||
"""Creates a EMC(VMAX) volume from a storage group.
|
"""Creates a EMC(PowerMax/VMAX) volume from a storage group.
|
||||||
|
|
||||||
:param volume: volume object
|
:param volume: volume object
|
||||||
:returns: model_update - dict
|
:returns: model_update - dict
|
||||||
@ -548,7 +572,7 @@ class VMAXCommon(object):
|
|||||||
replication_driver_data)}, rep_info_dict)
|
replication_driver_data)}, rep_info_dict)
|
||||||
|
|
||||||
def delete_volume(self, volume):
|
def delete_volume(self, volume):
|
||||||
"""Deletes a EMC(VMAX) volume.
|
"""Deletes a EMC(PowerMax/VMAX) volume.
|
||||||
|
|
||||||
:param volume: volume object
|
:param volume: volume object
|
||||||
"""
|
"""
|
||||||
@ -617,7 +641,7 @@ class VMAXCommon(object):
|
|||||||
Removes volume from the storage group that belongs to a masking view.
|
Removes volume from the storage group that belongs to a masking view.
|
||||||
:param array: the array serial number
|
:param array: the array serial number
|
||||||
:param volume: volume object
|
:param volume: volume object
|
||||||
:param device_id: the VMAX volume device id
|
:param device_id: the PowerMax/VMAX volume device id
|
||||||
:param extra_specs: extra specifications
|
:param extra_specs: extra specifications
|
||||||
:param connector: the connector object
|
:param connector: the connector object
|
||||||
:param is_multiattach: flag to indicate if this is a multiattach case
|
:param is_multiattach: flag to indicate if this is a multiattach case
|
||||||
@ -839,9 +863,9 @@ class VMAXCommon(object):
|
|||||||
extra_specs, rep_extra_specs):
|
extra_specs, rep_extra_specs):
|
||||||
"""Helper method to attach a metro volume.
|
"""Helper method to attach a metro volume.
|
||||||
|
|
||||||
Metro protected volumes point to two VMAX devices on different arrays,
|
Metro protected volumes point to two PowerMax/VMAX devices on
|
||||||
which are presented as a single device to the host. This method
|
different arrays, which are presented as a single device to the host.
|
||||||
masks the remote device to the host.
|
This method masks the remote device to the host.
|
||||||
:param volume: the volume object
|
:param volume: the volume object
|
||||||
:param connector: the connector dict
|
:param connector: the connector dict
|
||||||
:param is_multiattach: flag to indicate if this a multiattach case
|
:param is_multiattach: flag to indicate if this a multiattach case
|
||||||
@ -941,8 +965,8 @@ class VMAXCommon(object):
|
|||||||
exception_message = (
|
exception_message = (
|
||||||
_("The volume: %(volume)s is a snapshot source. "
|
_("The volume: %(volume)s is a snapshot source. "
|
||||||
"Extending a volume with snapVx snapshots is only "
|
"Extending a volume with snapVx snapshots is only "
|
||||||
"supported on VMAX from HyperMaxOS version 5978 "
|
"supported on PowerMax/VMAX from HyperMaxOS version "
|
||||||
"onwards. Exiting...") % {'volume': volume_name})
|
"5978 onwards. Exiting...") % {'volume': volume_name})
|
||||||
LOG.error(exception_message)
|
LOG.error(exception_message)
|
||||||
raise exception.VolumeBackendAPIException(
|
raise exception.VolumeBackendAPIException(
|
||||||
message=exception_message)
|
message=exception_message)
|
||||||
@ -1020,7 +1044,7 @@ class VMAXCommon(object):
|
|||||||
'array': array_info['SerialNumber']})
|
'array': array_info['SerialNumber']})
|
||||||
|
|
||||||
if already_queried:
|
if already_queried:
|
||||||
# The dictionary will only have one key per VMAX
|
# The dictionary will only have one key per PowerMax/VMAX
|
||||||
# Construct the location info
|
# Construct the location info
|
||||||
try:
|
try:
|
||||||
temp_location_info = (
|
temp_location_info = (
|
||||||
@ -1181,7 +1205,7 @@ class VMAXCommon(object):
|
|||||||
return extra_specs, qos_specs
|
return extra_specs, qos_specs
|
||||||
|
|
||||||
def _find_device_on_array(self, volume, extra_specs):
|
def _find_device_on_array(self, volume, extra_specs):
|
||||||
"""Given the volume get the VMAX device Id.
|
"""Given the volume get the PowerMax/VMAX device Id.
|
||||||
|
|
||||||
:param volume: volume object
|
:param volume: volume object
|
||||||
:param extra_specs: the extra Specs
|
:param extra_specs: the extra Specs
|
||||||
@ -1663,7 +1687,7 @@ class VMAXCommon(object):
|
|||||||
return volume_dict
|
return volume_dict
|
||||||
|
|
||||||
def _set_vmax_extra_specs(self, extra_specs, pool_record):
|
def _set_vmax_extra_specs(self, extra_specs, pool_record):
|
||||||
"""Set the VMAX extra specs.
|
"""Set the PowerMax/PowerMax/VMAX extra specs.
|
||||||
|
|
||||||
The pool_name extra spec must be set, otherwise a default slo/workload
|
The pool_name extra spec must be set, otherwise a default slo/workload
|
||||||
will be chosen. The portgroup can either be passed as an extra spec
|
will be chosen. The portgroup can either be passed as an extra spec
|
||||||
@ -1944,7 +1968,7 @@ class VMAXCommon(object):
|
|||||||
clone_id = clone_volume.id
|
clone_id = clone_volume.id
|
||||||
clone_name = self.utils.get_volume_element_name(clone_id)
|
clone_name = self.utils.get_volume_element_name(clone_id)
|
||||||
create_snap = False
|
create_snap = False
|
||||||
# VMAX supports using a target volume that is bigger than
|
# PowerMax/VMAX supports using a target volume that is bigger than
|
||||||
# the source volume, so we create the target volume the desired
|
# the source volume, so we create the target volume the desired
|
||||||
# size at this point to avoid having to extend later
|
# size at this point to avoid having to extend later
|
||||||
try:
|
try:
|
||||||
@ -2105,7 +2129,7 @@ class VMAXCommon(object):
|
|||||||
do_delete_temp_volume_snap(source)
|
do_delete_temp_volume_snap(source)
|
||||||
|
|
||||||
def manage_existing(self, volume, external_ref):
|
def manage_existing(self, volume, external_ref):
|
||||||
"""Manages an existing VMAX Volume (import to Cinder).
|
"""Manages an existing PowerMax/VMAX Volume (import to Cinder).
|
||||||
|
|
||||||
Renames the existing volume to match the expected name for the volume.
|
Renames the existing volume to match the expected name for the volume.
|
||||||
Also need to consider things like QoS, Emulation, account/tenant.
|
Also need to consider things like QoS, Emulation, account/tenant.
|
||||||
@ -2176,7 +2200,7 @@ class VMAXCommon(object):
|
|||||||
:param device_id: the device id
|
:param device_id: the device id
|
||||||
:param volume_id: the cinder volume id
|
:param volume_id: the cinder volume id
|
||||||
:param external_ref: the external reference
|
:param external_ref: the external reference
|
||||||
:returns volume_identifier - name of the volume on VMAX
|
:returns volume_identifier - name of the volume on PowerMax/VMAX
|
||||||
:returns sg - the storage group which the LUN belongs to
|
:returns sg - the storage group which the LUN belongs to
|
||||||
:raises: ManageExistingInvalidReference, ManageExistingAlreadyManaged:
|
:raises: ManageExistingInvalidReference, ManageExistingAlreadyManaged:
|
||||||
"""
|
"""
|
||||||
@ -2229,7 +2253,7 @@ class VMAXCommon(object):
|
|||||||
return volume_identifier, sg
|
return volume_identifier, sg
|
||||||
|
|
||||||
def manage_existing_get_size(self, volume, external_ref):
|
def manage_existing_get_size(self, volume, external_ref):
|
||||||
"""Return size of an existing VMAX volume to manage_existing.
|
"""Return size of an existing PowerMax/VMAX volume to manage_existing.
|
||||||
|
|
||||||
:param self: reference to class
|
:param self: reference to class
|
||||||
:param volume: the volume object including the volume_type_id
|
:param volume: the volume object including the volume_type_id
|
||||||
@ -2251,7 +2275,7 @@ class VMAXCommon(object):
|
|||||||
size = float(self.rest.get_size_of_device_on_array(array, device_id))
|
size = float(self.rest.get_size_of_device_on_array(array, device_id))
|
||||||
if not size.is_integer():
|
if not size.is_integer():
|
||||||
exception_message = (
|
exception_message = (
|
||||||
_("Cannot manage existing VMAX volume %(device_id)s "
|
_("Cannot manage existing PowerMax/VMAX volume %(device_id)s "
|
||||||
"- it has a size of %(vol_size)s but only whole GB "
|
"- it has a size of %(vol_size)s but only whole GB "
|
||||||
"sizes are supported. Please extend the "
|
"sizes are supported. Please extend the "
|
||||||
"volume to the nearest GB value before importing.")
|
"volume to the nearest GB value before importing.")
|
||||||
@ -2265,7 +2289,7 @@ class VMAXCommon(object):
|
|||||||
return int(size)
|
return int(size)
|
||||||
|
|
||||||
def unmanage(self, volume):
|
def unmanage(self, volume):
|
||||||
"""Export VMAX volume from Cinder.
|
"""Export PowerMax/VMAX volume from Cinder.
|
||||||
|
|
||||||
Leave the volume intact on the backend array.
|
Leave the volume intact on the backend array.
|
||||||
|
|
||||||
@ -2313,7 +2337,7 @@ class VMAXCommon(object):
|
|||||||
volume_id, extra_specs)
|
volume_id, extra_specs)
|
||||||
|
|
||||||
def manage_existing_snapshot(self, snapshot, existing_ref):
|
def manage_existing_snapshot(self, snapshot, existing_ref):
|
||||||
"""Manage an existing VMAX Snapshot (import to Cinder).
|
"""Manage an existing PowerMax/VMAX Snapshot (import to Cinder).
|
||||||
|
|
||||||
Renames the Snapshot to prefix it with OS- to indicate
|
Renames the Snapshot to prefix it with OS- to indicate
|
||||||
it is managed by Cinder
|
it is managed by Cinder
|
||||||
@ -2409,7 +2433,7 @@ class VMAXCommon(object):
|
|||||||
extra_specs[utils.ARRAY], device_id)
|
extra_specs[utils.ARRAY], device_id)
|
||||||
|
|
||||||
def unmanage_snapshot(self, snapshot):
|
def unmanage_snapshot(self, snapshot):
|
||||||
"""Export VMAX Snapshot from Cinder.
|
"""Export PowerMax/VMAX Snapshot from Cinder.
|
||||||
|
|
||||||
Leaves the snapshot intact on the backend VMAX
|
Leaves the snapshot intact on the backend VMAX
|
||||||
|
|
||||||
@ -2425,7 +2449,7 @@ class VMAXCommon(object):
|
|||||||
exception_message = (
|
exception_message = (
|
||||||
_("It is not possible to unmanage a snapshot where the "
|
_("It is not possible to unmanage a snapshot where the "
|
||||||
"source volume is failed-over, revert back to source "
|
"source volume is failed-over, revert back to source "
|
||||||
"VMAX to unmanage snapshot %(snap_name)s")
|
"PowerMax/VMAX to unmanage snapshot %(snap_name)s")
|
||||||
% {'snap_name': snap_name})
|
% {'snap_name': snap_name})
|
||||||
|
|
||||||
LOG.exception(exception_message)
|
LOG.exception(exception_message)
|
||||||
@ -2452,7 +2476,7 @@ class VMAXCommon(object):
|
|||||||
self._sync_check(array, device_id, volume.name, extra_specs)
|
self._sync_check(array, device_id, volume.name, extra_specs)
|
||||||
|
|
||||||
LOG.info("Snapshot %(snap_name)s is no longer managed in "
|
LOG.info("Snapshot %(snap_name)s is no longer managed in "
|
||||||
"OpenStack but still remains on VMAX source "
|
"OpenStack but still remains on PowerMax/VMAX source "
|
||||||
"%(array_id)s", {'snap_name': snap_name, 'array_id': array})
|
"%(array_id)s", {'snap_name': snap_name, 'array_id': array})
|
||||||
|
|
||||||
def get_manageable_volumes(self, marker, limit, offset, sort_keys,
|
def get_manageable_volumes(self, marker, limit, offset, sort_keys,
|
||||||
@ -2477,11 +2501,11 @@ class VMAXCommon(object):
|
|||||||
'array_id': array})
|
'array_id': array})
|
||||||
volumes = self.rest.get_private_volume_list(array)
|
volumes = self.rest.get_private_volume_list(array)
|
||||||
|
|
||||||
# No volumes returned from VMAX
|
# No volumes returned from PowerMax/VMAX
|
||||||
if not volumes:
|
if not volumes:
|
||||||
LOG.info("There were no volumes found on the backend VMAX. "
|
LOG.info("There were no volumes found on the backend "
|
||||||
"You need to create some volumes before they can be "
|
"PowerMax/VMAX. You need to create some volumes before "
|
||||||
"managed into Cinder.")
|
"they can be managed into Cinder.")
|
||||||
return manageable_vols
|
return manageable_vols
|
||||||
|
|
||||||
for device in volumes:
|
for device in volumes:
|
||||||
@ -2561,11 +2585,11 @@ class VMAXCommon(object):
|
|||||||
'array_id': array})
|
'array_id': array})
|
||||||
volumes = self.rest.get_private_volume_list(array)
|
volumes = self.rest.get_private_volume_list(array)
|
||||||
|
|
||||||
# No volumes returned from VMAX
|
# No volumes returned from PowerMax/VMAX
|
||||||
if not volumes:
|
if not volumes:
|
||||||
LOG.info("There were no volumes found on the backend VMAX. "
|
LOG.info("There were no volumes found on the backend "
|
||||||
"You need to create some volumes before snapshots can "
|
"PowerMax/VMAX. You need to create some volumes "
|
||||||
"be created and managed into Cinder.")
|
"before snashot can be created and managed into Cinder.")
|
||||||
return manageable_snaps
|
return manageable_snaps
|
||||||
|
|
||||||
for device in volumes:
|
for device in volumes:
|
||||||
@ -2638,7 +2662,8 @@ class VMAXCommon(object):
|
|||||||
manageable_snaps = manageable_snaps[snap_index:]
|
manageable_snaps = manageable_snaps[snap_index:]
|
||||||
else:
|
else:
|
||||||
msg = (_("Snapshot marker %(marker)s not found, marker "
|
msg = (_("Snapshot marker %(marker)s not found, marker "
|
||||||
"provided must be a valid VMAX snapshot ID") %
|
"provided must be a valid PowerMax/VMAX "
|
||||||
|
"snapshot ID") %
|
||||||
{'marker': marker})
|
{'marker': marker})
|
||||||
raise exception.VolumeBackendAPIException(msg)
|
raise exception.VolumeBackendAPIException(msg)
|
||||||
|
|
||||||
@ -3625,7 +3650,7 @@ class VMAXCommon(object):
|
|||||||
self, array, device_id, volume_name, extra_specs):
|
self, array, device_id, volume_name, extra_specs):
|
||||||
"""Add a volume to the default replication group.
|
"""Add a volume to the default replication group.
|
||||||
|
|
||||||
Replication groups are VMAX storage groups that contain only
|
Replication groups are PowerMax/VMAX storage groups that contain only
|
||||||
RDF-paired volumes. We can use our normal storage group operations.
|
RDF-paired volumes. We can use our normal storage group operations.
|
||||||
:param array: array serial number
|
:param array: array serial number
|
||||||
:param device_id: the device id
|
:param device_id: the device id
|
||||||
@ -4264,8 +4289,8 @@ class VMAXCommon(object):
|
|||||||
LOG.error(error_msg)
|
LOG.error(error_msg)
|
||||||
raise exception.VolumeBackendAPIException(message=error_msg)
|
raise exception.VolumeBackendAPIException(message=error_msg)
|
||||||
|
|
||||||
LOG.debug("Enter VMAX create_volume group_from_src. Group to be "
|
LOG.debug("Enter PowerMax/VMAX create_volume group_from_src. Group "
|
||||||
"created: %(grpId)s, Source : %(SourceGrpId)s.",
|
"to be created: %(grpId)s, Source : %(SourceGrpId)s.",
|
||||||
{'grpId': group.id, 'SourceGrpId': source_id})
|
{'grpId': group.id, 'SourceGrpId': source_id})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -4632,19 +4657,22 @@ class VMAXCommon(object):
|
|||||||
username = self.configuration.safe_get(utils.VMAX_USER_NAME)
|
username = self.configuration.safe_get(utils.VMAX_USER_NAME)
|
||||||
password = self.configuration.safe_get(utils.VMAX_PASSWORD)
|
password = self.configuration.safe_get(utils.VMAX_PASSWORD)
|
||||||
if username and password:
|
if username and password:
|
||||||
serial_number = self.configuration.safe_get(utils.VMAX_ARRAY)
|
serial_number = self._get_configuration_value(
|
||||||
|
utils.VMAX_ARRAY, utils.POWERMAX_ARRAY)
|
||||||
if serial_number is None:
|
if serial_number is None:
|
||||||
LOG.error("Array Serial Number must be set in cinder.conf")
|
LOG.error("Array Serial Number must be set in cinder.conf")
|
||||||
srp_name = self.configuration.safe_get(utils.VMAX_SRP)
|
srp_name = self._get_configuration_value(
|
||||||
|
utils.VMAX_SRP, utils.POWERMAX_SRP)
|
||||||
if srp_name is None:
|
if srp_name is None:
|
||||||
LOG.error("SRP Name must be set in cinder.conf")
|
LOG.error("SRP Name must be set in cinder.conf")
|
||||||
slo = self.configuration.safe_get(utils.VMAX_SERVICE_LEVEL)
|
slo = self._get_configuration_value(
|
||||||
|
utils.VMAX_SERVICE_LEVEL, utils.POWERMAX_SERVICE_LEVEL)
|
||||||
workload = self.configuration.safe_get(utils.VMAX_WORKLOAD)
|
workload = self.configuration.safe_get(utils.VMAX_WORKLOAD)
|
||||||
port_groups = self.configuration.safe_get(utils.VMAX_PORT_GROUPS)
|
port_groups = self._get_configuration_value(
|
||||||
|
utils.VMAX_PORT_GROUPS, utils.POWERMAX_PORT_GROUPS)
|
||||||
random_portgroup = None
|
random_portgroup = None
|
||||||
if port_groups:
|
if port_groups:
|
||||||
random_portgroup = random.choice(self.configuration.safe_get(
|
random_portgroup = random.choice(port_groups)
|
||||||
utils.VMAX_PORT_GROUPS))
|
|
||||||
|
|
||||||
kwargs = (
|
kwargs = (
|
||||||
{'RestServerIp': self.configuration.safe_get(
|
{'RestServerIp': self.configuration.safe_get(
|
||||||
@ -4670,6 +4698,41 @@ class VMAXCommon(object):
|
|||||||
|
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
|
def _get_configuration_value(self, first_key, second_key):
|
||||||
|
"""Get the configuration value of the first or second key
|
||||||
|
|
||||||
|
:param first_key: the first key
|
||||||
|
:param second_key: the second key
|
||||||
|
:returns: value
|
||||||
|
"""
|
||||||
|
return_value = None
|
||||||
|
if (self.configuration.safe_get(first_key)
|
||||||
|
and self.configuration.safe_get(second_key)):
|
||||||
|
LOG.error("Cannot specifiy both %(first_key)s. "
|
||||||
|
"and %(second_key)s.",
|
||||||
|
{'first_key': first_key, 'second_key': second_key})
|
||||||
|
else:
|
||||||
|
return_value = self.configuration.safe_get(first_key)
|
||||||
|
if return_value is None:
|
||||||
|
return_value = self.configuration.safe_get(second_key)
|
||||||
|
return return_value
|
||||||
|
|
||||||
|
def _get_unlink_configuration_value(self, first_key, second_key):
|
||||||
|
"""Get the configuration value of snapvx_unlink_limit
|
||||||
|
|
||||||
|
This will give back the value of the default snapvx_unlink_limit
|
||||||
|
unless either powermax_snapvx_unlink_limit or vmax_snapvx_unlink_limit
|
||||||
|
is set to something else
|
||||||
|
|
||||||
|
:param first_key: the first key
|
||||||
|
:param second_key: the second key
|
||||||
|
:returns: value
|
||||||
|
"""
|
||||||
|
return_value = self.configuration.safe_get(second_key)
|
||||||
|
if return_value == 3:
|
||||||
|
return_value = self.configuration.safe_get(first_key)
|
||||||
|
return return_value
|
||||||
|
|
||||||
def _get_unisphere_port(self):
|
def _get_unisphere_port(self):
|
||||||
"""Get unisphere port from the configuration file
|
"""Get unisphere port from the configuration file
|
||||||
|
|
||||||
@ -4680,7 +4743,7 @@ class VMAXCommon(object):
|
|||||||
elif self.configuration.safe_get(utils.VMAX_SERVER_PORT_NEW):
|
elif self.configuration.safe_get(utils.VMAX_SERVER_PORT_NEW):
|
||||||
return self.configuration.safe_get(utils.VMAX_SERVER_PORT_NEW)
|
return self.configuration.safe_get(utils.VMAX_SERVER_PORT_NEW)
|
||||||
else:
|
else:
|
||||||
LOG.debug("VMAX port is not set, using default port: %s",
|
LOG.debug("PowerMax/VMAX port is not set, using default port: %s",
|
||||||
utils.DEFAULT_PORT)
|
utils.DEFAULT_PORT)
|
||||||
return utils.DEFAULT_PORT
|
return utils.DEFAULT_PORT
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2017 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -19,7 +19,7 @@ from oslo_log import log as logging
|
|||||||
|
|
||||||
from cinder import interface
|
from cinder import interface
|
||||||
from cinder.volume import driver
|
from cinder.volume import driver
|
||||||
from cinder.volume.drivers.dell_emc.vmax import common
|
from cinder.volume.drivers.dell_emc.powermax import common
|
||||||
from cinder.volume.drivers.san import san
|
from cinder.volume.drivers.san import san
|
||||||
from cinder.zonemanager import utils as fczm_utils
|
from cinder.zonemanager import utils as fczm_utils
|
||||||
|
|
||||||
@ -27,8 +27,8 @@ LOG = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
@interface.volumedriver
|
@interface.volumedriver
|
||||||
class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
class PowerMaxFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
||||||
"""FC Drivers for VMAX using REST.
|
"""FC Drivers for PowerMax using REST.
|
||||||
|
|
||||||
Version history:
|
Version history:
|
||||||
|
|
||||||
@ -98,23 +98,24 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
|||||||
- Fix for SSL verification/cert application (bug #1772924)
|
- Fix for SSL verification/cert application (bug #1772924)
|
||||||
- Log VMAX metadata of a volume (bp vmax-metadata)
|
- Log VMAX metadata of a volume (bp vmax-metadata)
|
||||||
- Fix for get-pools command (bug #1784856)
|
- Fix for get-pools command (bug #1784856)
|
||||||
3.3.0 - Fix for initiator retrieval and short hostname unmapping
|
4.0.0 - Fix for initiator retrieval and short hostname unmapping
|
||||||
(bugs #1783855 #1783867)
|
(bugs #1783855 #1783867)
|
||||||
- Fix for HyperMax OS Upgrade Bug (bug #1790141)
|
- Fix for HyperMax OS Upgrade Bug (bug #1790141)
|
||||||
- Support for failover to secondary Unisphere
|
- Support for failover to secondary Unisphere
|
||||||
(bp/vmax-unisphere-failover)
|
(bp/vmax-unisphere-failover)
|
||||||
|
- Rebrand from VMAX to PowerMax(bp/vmax-powermax-rebrand)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
VERSION = "3.3.0"
|
VERSION = "4.0.0"
|
||||||
|
|
||||||
# ThirdPartySystems wiki
|
# ThirdPartySystems wiki
|
||||||
CI_WIKI_NAME = "EMC_VMAX_CI"
|
CI_WIKI_NAME = "EMC_VMAX_CI"
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|
||||||
super(VMAXFCDriver, self).__init__(*args, **kwargs)
|
super(PowerMaxFCDriver, self).__init__(*args, **kwargs)
|
||||||
self.active_backend_id = kwargs.get('active_backend_id', None)
|
self.active_backend_id = kwargs.get('active_backend_id', None)
|
||||||
self.common = common.VMAXCommon(
|
self.common = common.PowerMaxCommon(
|
||||||
'FC',
|
'FC',
|
||||||
self.VERSION,
|
self.VERSION,
|
||||||
configuration=self.configuration,
|
configuration=self.configuration,
|
||||||
@ -125,7 +126,7 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def create_volume(self, volume):
|
def create_volume(self, volume):
|
||||||
"""Creates a VMAX volume.
|
"""Creates a PowerMax/VMAX volume.
|
||||||
|
|
||||||
:param volume: the cinder volume object
|
:param volume: the cinder volume object
|
||||||
:returns: provider location dict
|
:returns: provider location dict
|
||||||
@ -152,7 +153,7 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
|||||||
return self.common.create_cloned_volume(volume, src_vref)
|
return self.common.create_cloned_volume(volume, src_vref)
|
||||||
|
|
||||||
def delete_volume(self, volume):
|
def delete_volume(self, volume):
|
||||||
"""Deletes a VMAX volume.
|
"""Deletes a PowerMax/VMAX volume.
|
||||||
|
|
||||||
:param volume: the cinder volume object
|
:param volume: the cinder volume object
|
||||||
"""
|
"""
|
||||||
@ -474,18 +475,18 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
|||||||
self._stats = data
|
self._stats = data
|
||||||
|
|
||||||
def manage_existing(self, volume, external_ref):
|
def manage_existing(self, volume, external_ref):
|
||||||
"""Manages an existing VMAX Volume (import to Cinder).
|
"""Manages an existing PowerMax/VMAX Volume (import to Cinder).
|
||||||
|
|
||||||
Renames the Volume to match the expected name for the volume.
|
Renames the Volume to match the expected name for the volume.
|
||||||
Also need to consider things like QoS, Emulation, account/tenant.
|
Also need to consider things like QoS, Emulation, account/tenant.
|
||||||
:param volume: the volume object
|
:param volume: the volume object
|
||||||
:param external_ref: the reference for the VMAX volume
|
:param external_ref: the reference for the PowerMax/VMAX volume
|
||||||
:returns: model_update
|
:returns: model_update
|
||||||
"""
|
"""
|
||||||
return self.common.manage_existing(volume, external_ref)
|
return self.common.manage_existing(volume, external_ref)
|
||||||
|
|
||||||
def manage_existing_get_size(self, volume, external_ref):
|
def manage_existing_get_size(self, volume, external_ref):
|
||||||
"""Return size of an existing VMAX volume to manage_existing.
|
"""Return size of an existing PowerMax/VMAX volume to manage_existing.
|
||||||
|
|
||||||
:param self: reference to class
|
:param self: reference to class
|
||||||
:param volume: the volume object including the volume_type_id
|
:param volume: the volume object including the volume_type_id
|
||||||
@ -495,20 +496,20 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
|||||||
return self.common.manage_existing_get_size(volume, external_ref)
|
return self.common.manage_existing_get_size(volume, external_ref)
|
||||||
|
|
||||||
def unmanage(self, volume):
|
def unmanage(self, volume):
|
||||||
"""Export VMAX volume from Cinder.
|
"""Export PowerMax/VMAX volume from Cinder.
|
||||||
|
|
||||||
Leave the volume intact on the backend array.
|
Leave the volume intact on the backend array.
|
||||||
"""
|
"""
|
||||||
return self.common.unmanage(volume)
|
return self.common.unmanage(volume)
|
||||||
|
|
||||||
def manage_existing_snapshot(self, snapshot, existing_ref):
|
def manage_existing_snapshot(self, snapshot, existing_ref):
|
||||||
"""Manage an existing VMAX Snapshot (import to Cinder).
|
"""Manage an existing PowerMax/VMAX Snapshot (import to Cinder).
|
||||||
|
|
||||||
Renames the Snapshot to prefix it with OS- to indicate
|
Renames the Snapshot to prefix it with OS- to indicate
|
||||||
it is managed by Cinder.
|
it is managed by Cinder.
|
||||||
|
|
||||||
:param snapshot: the snapshot object
|
:param snapshot: the snapshot object
|
||||||
:param existing_ref: the snapshot name on the backend VMAX
|
:param existing_ref: the snapshot name on the backend PowerMax/VMAX
|
||||||
:returns: model_update
|
:returns: model_update
|
||||||
"""
|
"""
|
||||||
return self.common.manage_existing_snapshot(snapshot, existing_ref)
|
return self.common.manage_existing_snapshot(snapshot, existing_ref)
|
||||||
@ -517,15 +518,15 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
|||||||
"""Return the size of the source volume for manage-existing-snapshot.
|
"""Return the size of the source volume for manage-existing-snapshot.
|
||||||
|
|
||||||
:param snapshot: the snapshot object
|
:param snapshot: the snapshot object
|
||||||
:param existing_ref: the snapshot name on the backend VMAX
|
:param existing_ref: the snapshot name on the backend PowerMax/VMAX
|
||||||
:returns: size of the source volume in GB
|
:returns: size of the source volume in GB
|
||||||
"""
|
"""
|
||||||
return self.common.manage_existing_snapshot_get_size(snapshot)
|
return self.common.manage_existing_snapshot_get_size(snapshot)
|
||||||
|
|
||||||
def unmanage_snapshot(self, snapshot):
|
def unmanage_snapshot(self, snapshot):
|
||||||
"""Export VMAX Snapshot from Cinder.
|
"""Export PowerMax/VMAX Snapshot from Cinder.
|
||||||
|
|
||||||
Leaves the snapshot intact on the backend VMAX.
|
Leaves the snapshot intact on the backend PowerMax/VMAX.
|
||||||
|
|
||||||
:param snapshot: the snapshot object
|
:param snapshot: the snapshot object
|
||||||
"""
|
"""
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2017 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -13,7 +13,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
"""
|
"""
|
||||||
ISCSI Drivers for Dell EMC VMAX arrays based on REST.
|
ISCSI Drivers for Dell EMC PowerMax/PowerMax/VMAX arrays based on REST.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
@ -23,15 +23,15 @@ import six
|
|||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.i18n import _
|
from cinder.i18n import _
|
||||||
from cinder import interface
|
from cinder import interface
|
||||||
from cinder.volume.drivers.dell_emc.vmax import common
|
from cinder.volume.drivers.dell_emc.powermax import common
|
||||||
from cinder.volume.drivers.san import san
|
from cinder.volume.drivers.san import san
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@interface.volumedriver
|
@interface.volumedriver
|
||||||
class VMAXISCSIDriver(san.SanISCSIDriver):
|
class PowerMaxISCSIDriver(san.SanISCSIDriver):
|
||||||
"""ISCSI Drivers for VMAX using Rest.
|
"""ISCSI Drivers for PowerMax using Rest.
|
||||||
|
|
||||||
Version history:
|
Version history:
|
||||||
|
|
||||||
@ -103,24 +103,25 @@ class VMAXISCSIDriver(san.SanISCSIDriver):
|
|||||||
- Fix for SSL verification/cert application (bug #1772924)
|
- Fix for SSL verification/cert application (bug #1772924)
|
||||||
- Log VMAX metadata of a volume (bp vmax-metadata)
|
- Log VMAX metadata of a volume (bp vmax-metadata)
|
||||||
- Fix for get-pools command (bug #1784856)
|
- Fix for get-pools command (bug #1784856)
|
||||||
3.3.0 - Fix for initiator retrieval and short hostname unmapping
|
4.0.0 - Fix for initiator retrieval and short hostname unmapping
|
||||||
(bugs #1783855 #1783867)
|
(bugs #1783855 #1783867)
|
||||||
- Fix for HyperMax OS Upgrade Bug (bug #1790141)
|
- Fix for HyperMax OS Upgrade Bug (bug #1790141)
|
||||||
- Support for failover to secondary Unisphere
|
- Support for failover to secondary Unisphere
|
||||||
(bp/vmax-unisphere-failover)
|
(bp/vmax-unisphere-failover)
|
||||||
|
- Rebrand from VMAX to PowerMax(bp/vmax-powermax-rebrand)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
VERSION = "3.3.0"
|
VERSION = "4.0.0"
|
||||||
|
|
||||||
# ThirdPartySystems wiki
|
# ThirdPartySystems wiki
|
||||||
CI_WIKI_NAME = "EMC_VMAX_CI"
|
CI_WIKI_NAME = "EMC_VMAX_CI"
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|
||||||
super(VMAXISCSIDriver, self).__init__(*args, **kwargs)
|
super(PowerMaxISCSIDriver, self).__init__(*args, **kwargs)
|
||||||
self.active_backend_id = kwargs.get('active_backend_id', None)
|
self.active_backend_id = kwargs.get('active_backend_id', None)
|
||||||
self.common = (
|
self.common = (
|
||||||
common.VMAXCommon(
|
common.PowerMaxCommon(
|
||||||
'iSCSI',
|
'iSCSI',
|
||||||
self.VERSION,
|
self.VERSION,
|
||||||
configuration=self.configuration,
|
configuration=self.configuration,
|
||||||
@ -130,7 +131,7 @@ class VMAXISCSIDriver(san.SanISCSIDriver):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def create_volume(self, volume):
|
def create_volume(self, volume):
|
||||||
"""Creates a VMAX volume.
|
"""Creates a PowerMax/VMAX volume.
|
||||||
|
|
||||||
:param volume: the cinder volume object
|
:param volume: the cinder volume object
|
||||||
:returns: provider location dict
|
:returns: provider location dict
|
||||||
@ -157,7 +158,7 @@ class VMAXISCSIDriver(san.SanISCSIDriver):
|
|||||||
return self.common.create_cloned_volume(volume, src_vref)
|
return self.common.create_cloned_volume(volume, src_vref)
|
||||||
|
|
||||||
def delete_volume(self, volume):
|
def delete_volume(self, volume):
|
||||||
"""Deletes a VMAX volume.
|
"""Deletes a PowerMax/VMAX volume.
|
||||||
|
|
||||||
:param volume: the cinder volume object
|
:param volume: the cinder volume object
|
||||||
"""
|
"""
|
||||||
@ -397,7 +398,7 @@ class VMAXISCSIDriver(san.SanISCSIDriver):
|
|||||||
self._stats = data
|
self._stats = data
|
||||||
|
|
||||||
def manage_existing(self, volume, external_ref):
|
def manage_existing(self, volume, external_ref):
|
||||||
"""Manages an existing VMAX Volume (import to Cinder).
|
"""Manages an existing PowerMax/VMAX Volume (import to Cinder).
|
||||||
|
|
||||||
Renames the Volume to match the expected name for the volume.
|
Renames the Volume to match the expected name for the volume.
|
||||||
Also need to consider things like QoS, Emulation, account/tenant.
|
Also need to consider things like QoS, Emulation, account/tenant.
|
||||||
@ -405,7 +406,7 @@ class VMAXISCSIDriver(san.SanISCSIDriver):
|
|||||||
return self.common.manage_existing(volume, external_ref)
|
return self.common.manage_existing(volume, external_ref)
|
||||||
|
|
||||||
def manage_existing_get_size(self, volume, external_ref):
|
def manage_existing_get_size(self, volume, external_ref):
|
||||||
"""Return size of an existing VMAX volume to manage_existing.
|
"""Return size of an existing PowerMax/VMAX volume to manage_existing.
|
||||||
|
|
||||||
:param self: reference to class
|
:param self: reference to class
|
||||||
:param volume: the volume object including the volume_type_id
|
:param volume: the volume object including the volume_type_id
|
||||||
@ -415,20 +416,20 @@ class VMAXISCSIDriver(san.SanISCSIDriver):
|
|||||||
return self.common.manage_existing_get_size(volume, external_ref)
|
return self.common.manage_existing_get_size(volume, external_ref)
|
||||||
|
|
||||||
def unmanage(self, volume):
|
def unmanage(self, volume):
|
||||||
"""Export VMAX volume from Cinder.
|
"""Export PowerMax/VMAX volume from Cinder.
|
||||||
|
|
||||||
Leave the volume intact on the backend array.
|
Leave the volume intact on the backend array.
|
||||||
"""
|
"""
|
||||||
return self.common.unmanage(volume)
|
return self.common.unmanage(volume)
|
||||||
|
|
||||||
def manage_existing_snapshot(self, snapshot, existing_ref):
|
def manage_existing_snapshot(self, snapshot, existing_ref):
|
||||||
"""Manage an existing VMAX Snapshot (import to Cinder).
|
"""Manage an existing PowerMax/VMAX Snapshot (import to Cinder).
|
||||||
|
|
||||||
Renames the Snapshot to prefix it with OS- to indicate
|
Renames the Snapshot to prefix it with OS- to indicate
|
||||||
it is managed by Cinder.
|
it is managed by Cinder.
|
||||||
|
|
||||||
:param snapshot: the snapshot object
|
:param snapshot: the snapshot object
|
||||||
:param existing_ref: the snapshot name on the backend VMAX
|
:param existing_ref: the snapshot name on the backend PowerMax/VMAX
|
||||||
:returns: model_update
|
:returns: model_update
|
||||||
"""
|
"""
|
||||||
return self.common.manage_existing_snapshot(snapshot, existing_ref)
|
return self.common.manage_existing_snapshot(snapshot, existing_ref)
|
||||||
@ -437,15 +438,15 @@ class VMAXISCSIDriver(san.SanISCSIDriver):
|
|||||||
"""Return the size of the source volume for manage-existing-snapshot.
|
"""Return the size of the source volume for manage-existing-snapshot.
|
||||||
|
|
||||||
:param snapshot: the snapshot object
|
:param snapshot: the snapshot object
|
||||||
:param existing_ref: the snapshot name on the backend VMAX
|
:param existing_ref: the snapshot name on the backend PowerMax/VMAX
|
||||||
:returns: size of the source volume in GB
|
:returns: size of the source volume in GB
|
||||||
"""
|
"""
|
||||||
return self.common.manage_existing_snapshot_get_size(snapshot)
|
return self.common.manage_existing_snapshot_get_size(snapshot)
|
||||||
|
|
||||||
def unmanage_snapshot(self, snapshot):
|
def unmanage_snapshot(self, snapshot):
|
||||||
"""Export VMAX Snapshot from Cinder.
|
"""Export PowerMax/VMAX Snapshot from Cinder.
|
||||||
|
|
||||||
Leaves the snapshot intact on the backend VMAX.
|
Leaves the snapshot intact on the backend PowerMax/VMAX.
|
||||||
|
|
||||||
:param snapshot: the snapshot object
|
:param snapshot: the snapshot object
|
||||||
"""
|
"""
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2017 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -24,24 +24,24 @@ import six
|
|||||||
from cinder import coordination
|
from cinder import coordination
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.i18n import _
|
from cinder.i18n import _
|
||||||
from cinder.volume.drivers.dell_emc.vmax import provision
|
from cinder.volume.drivers.dell_emc.powermax import provision
|
||||||
from cinder.volume.drivers.dell_emc.vmax import utils
|
from cinder.volume.drivers.dell_emc.powermax import utils
|
||||||
from cinder.volume import utils as volume_utils
|
from cinder.volume import utils as volume_utils
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class VMAXMasking(object):
|
class PowerMaxMasking(object):
|
||||||
"""Masking class for Dell EMC VMAX.
|
"""Masking class for Dell EMC PowerMax.
|
||||||
|
|
||||||
Masking code to dynamically create a masking view.
|
Masking code to dynamically create a masking view.
|
||||||
It supports VMAX arrays.
|
It supports VMAX 3, All Flash and PowerMax arrays.
|
||||||
"""
|
"""
|
||||||
def __init__(self, prtcl, rest):
|
def __init__(self, prtcl, rest):
|
||||||
self.protocol = prtcl
|
self.protocol = prtcl
|
||||||
self.utils = utils.VMAXUtils()
|
self.utils = utils.PowerMaxUtils()
|
||||||
self.rest = rest
|
self.rest = rest
|
||||||
self.provision = provision.VMAXProvision(self.rest)
|
self.provision = provision.PowerMaxProvision(self.rest)
|
||||||
|
|
||||||
def setup_masking_view(
|
def setup_masking_view(
|
||||||
self, serial_number, volume, masking_view_dict, extra_specs):
|
self, serial_number, volume, masking_view_dict, extra_specs):
|
||||||
@ -877,8 +877,8 @@ class VMAXMasking(object):
|
|||||||
contains the correct initiators. If it does not contain the correct
|
contains the correct initiators. If it does not contain the correct
|
||||||
initiators then we delete the initiator group from the masking view,
|
initiators then we delete the initiator group from the masking view,
|
||||||
re-create it with the correct initiators and add it to the masking view
|
re-create it with the correct initiators and add it to the masking view
|
||||||
NOTE: VMAX does not support ModifyMaskingView so we must first
|
NOTE: PowerMax/VMAX does not support ModifyMaskingView so we must
|
||||||
delete the masking view and recreate it.
|
first delete the masking view and recreate it.
|
||||||
:param serial_number: the array serial number
|
:param serial_number: the array serial number
|
||||||
:param maskingview_name: name of the masking view
|
:param maskingview_name: name of the masking view
|
||||||
:param maskingview_dict: the masking view dict
|
:param maskingview_dict: the masking view dict
|
||||||
@ -1551,8 +1551,8 @@ class VMAXMasking(object):
|
|||||||
self, serial_number, initiatorgroup_name, host):
|
self, serial_number, initiatorgroup_name, host):
|
||||||
"""Delete the initiator group.
|
"""Delete the initiator group.
|
||||||
|
|
||||||
Delete the Initiator group if it has been created by the VMAX driver,
|
Delete the Initiator group if it has been created by the PowerMax
|
||||||
and if there are no masking views associated with it.
|
driver, and if there are no masking views associated with it.
|
||||||
:param serial_number: the array serial number
|
:param serial_number: the array serial number
|
||||||
:param initiatorgroup_name: initiator group name
|
:param initiatorgroup_name: initiator group name
|
||||||
:param host: the short name of the host
|
:param host: the short name of the host
|
||||||
@ -1591,8 +1591,8 @@ class VMAXMasking(object):
|
|||||||
'nmv': len(maskingview_names)})
|
'nmv': len(maskingview_names)})
|
||||||
else:
|
else:
|
||||||
LOG.warning("Initiator group %(ig_name)s was "
|
LOG.warning("Initiator group %(ig_name)s was "
|
||||||
"not created by the VMAX driver so will "
|
"not created by the PowerMax driver so will "
|
||||||
"not be deleted by the VMAX driver.",
|
"not be deleted by the PowerMax driver.",
|
||||||
{'ig_name': initiatorgroup_name})
|
{'ig_name': initiatorgroup_name})
|
||||||
else:
|
else:
|
||||||
LOG.warning("Cannot get host name from connector object - "
|
LOG.warning("Cannot get host name from connector object - "
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2018 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -24,7 +24,7 @@ from oslo_log import log as logging
|
|||||||
from cinder.objects import volume
|
from cinder.objects import volume
|
||||||
from cinder import version
|
from cinder import version
|
||||||
|
|
||||||
from cinder.volume.drivers.dell_emc.vmax import utils
|
from cinder.volume.drivers.dell_emc.powermax import utils
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
CLEANUP_LIST = ['masking_view', 'child_storage_group', 'parent_storage_group',
|
CLEANUP_LIST = ['masking_view', 'child_storage_group', 'parent_storage_group',
|
||||||
'initiator_group', 'port_group', 'storage_group']
|
'initiator_group', 'port_group', 'storage_group']
|
||||||
@ -46,8 +46,8 @@ def debug_required(func):
|
|||||||
return func_wrapper
|
return func_wrapper
|
||||||
|
|
||||||
|
|
||||||
class VMAXVolumeMetadata(object):
|
class PowerMaxVolumeMetadata(object):
|
||||||
"""Gathers VMAX specific volume information.
|
"""Gathers PowerMax/VMAX specific volume information.
|
||||||
|
|
||||||
Also gathers Unisphere, Microcode OS/distribution and python versions.
|
Also gathers Unisphere, Microcode OS/distribution and python versions.
|
||||||
"""
|
"""
|
||||||
@ -55,7 +55,7 @@ class VMAXVolumeMetadata(object):
|
|||||||
def __init__(self, rest, version, is_debug):
|
def __init__(self, rest, version, is_debug):
|
||||||
self.version_dict = {}
|
self.version_dict = {}
|
||||||
self.rest = rest
|
self.rest = rest
|
||||||
self.utils = utils.VMAXUtils()
|
self.utils = utils.PowerMaxUtils()
|
||||||
self.volume_trace_list = []
|
self.volume_trace_list = []
|
||||||
self.is_debug = is_debug
|
self.is_debug = is_debug
|
||||||
self.vmax_driver_version = version
|
self.vmax_driver_version = version
|
||||||
@ -137,7 +137,7 @@ class VMAXVolumeMetadata(object):
|
|||||||
self._update_info_from_version_info()
|
self._update_info_from_version_info()
|
||||||
|
|
||||||
def _update_vmax_info(self, serial_number):
|
def _update_vmax_info(self, serial_number):
|
||||||
"""Update VMAX info.
|
"""Update PowerMax/VMAX info.
|
||||||
|
|
||||||
:param serial_number: the serial number of the array
|
:param serial_number: the serial number of the array
|
||||||
"""
|
"""
|
||||||
@ -583,7 +583,7 @@ class VMAXVolumeMetadata(object):
|
|||||||
|
|
||||||
:param volume: volume object
|
:param volume: volume object
|
||||||
:param rep_info_dict: information gathered from replication
|
:param rep_info_dict: information gathered from replication
|
||||||
:param device_id: the VMAX device id
|
:param device_id: the PowerMax/VMAX device id
|
||||||
:param extra_specs: the extra specs
|
:param extra_specs: the extra specs
|
||||||
"""
|
"""
|
||||||
operation = "manage_existing_volume"
|
operation = "manage_existing_volume"
|
||||||
@ -632,11 +632,11 @@ class VMAXVolumeMetadata(object):
|
|||||||
|
|
||||||
:param volume_id: volume identifier
|
:param volume_id: volume identifier
|
||||||
:param volume_size: volume size
|
:param volume_size: volume size
|
||||||
:param device_id: the VMAX device id
|
:param device_id: the PowerMax/VMAX device id
|
||||||
:param array: the VMAX serialnumber
|
:param array: the PowerMax/VMAX serialnumber
|
||||||
:param srp: VMAX SRP
|
:param srp: PowerMax/VMAX SRP
|
||||||
:param target_slo: volume name
|
:param target_slo: volume name
|
||||||
:param target_workload: the VMAX device id
|
:param target_workload: the PowerMax/VMAX device id
|
||||||
:param is_rep_enabled: replication enabled flag
|
:param is_rep_enabled: replication enabled flag
|
||||||
:param rep_mode: replication mode
|
:param rep_mode: replication mode
|
||||||
:param is_compression_disabled: compression disabled flag
|
:param is_compression_disabled: compression disabled flag
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2017 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -21,7 +21,7 @@ from oslo_service import loopingcall
|
|||||||
from cinder import coordination
|
from cinder import coordination
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.i18n import _
|
from cinder.i18n import _
|
||||||
from cinder.volume.drivers.dell_emc.vmax import utils
|
from cinder.volume.drivers.dell_emc.powermax import utils
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -30,13 +30,13 @@ UNLINK_INTERVAL = 15
|
|||||||
UNLINK_RETRIES = 30
|
UNLINK_RETRIES = 30
|
||||||
|
|
||||||
|
|
||||||
class VMAXProvision(object):
|
class PowerMaxProvision(object):
|
||||||
"""Provisioning Class for Dell EMC VMAX volume drivers.
|
"""Provisioning Class for Dell EMC PowerMax volume drivers.
|
||||||
|
|
||||||
It supports VMAX arrays.
|
It supports VMAX 3, All Flash and PowerMax arrays.
|
||||||
"""
|
"""
|
||||||
def __init__(self, rest):
|
def __init__(self, rest):
|
||||||
self.utils = utils.VMAXUtils()
|
self.utils = utils.PowerMaxUtils()
|
||||||
self.rest = rest
|
self.rest = rest
|
||||||
|
|
||||||
def create_storage_group(
|
def create_storage_group(
|
||||||
@ -392,7 +392,7 @@ class VMAXProvision(object):
|
|||||||
_extend_replicated_volume(rdf_group)
|
_extend_replicated_volume(rdf_group)
|
||||||
else:
|
else:
|
||||||
self.rest.extend_volume(array, device_id, new_size, extra_specs)
|
self.rest.extend_volume(array, device_id, new_size, extra_specs)
|
||||||
LOG.debug("Extend VMAX volume took: %(delta)s H:MM:SS.",
|
LOG.debug("Extend PowerMax/VMAX volume took: %(delta)s H:MM:SS.",
|
||||||
{'delta': self.utils.get_time_delta(start_time,
|
{'delta': self.utils.get_time_delta(start_time,
|
||||||
time.time())})
|
time.time())})
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2018 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -31,7 +31,7 @@ from cinder import coordination
|
|||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.i18n import _
|
from cinder.i18n import _
|
||||||
from cinder.utils import retry
|
from cinder.utils import retry
|
||||||
from cinder.volume.drivers.dell_emc.vmax import utils
|
from cinder.volume.drivers.dell_emc.powermax import utils
|
||||||
|
|
||||||
requests.packages.urllib3.disable_warnings(urllib_exp.InsecureRequestWarning)
|
requests.packages.urllib3.disable_warnings(urllib_exp.InsecureRequestWarning)
|
||||||
|
|
||||||
@ -60,11 +60,11 @@ SUCCEEDED = 'succeeded'
|
|||||||
CREATE_VOL_STRING = "Creating new Volumes"
|
CREATE_VOL_STRING = "Creating new Volumes"
|
||||||
|
|
||||||
|
|
||||||
class VMAXRest(object):
|
class PowerMaxRest(object):
|
||||||
"""Rest class based on Unisphere for VMAX Rest API."""
|
"""Rest class based on Unisphere for PowerMax Rest API."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.utils = utils.VMAXUtils()
|
self.utils = utils.PowerMaxUtils()
|
||||||
self.session = None
|
self.session = None
|
||||||
self.base_uri = None
|
self.base_uri = None
|
||||||
self.user = None
|
self.user = None
|
||||||
@ -169,14 +169,15 @@ class VMAXRest(object):
|
|||||||
self.set_rest_credentials(self.u4p_failover_targets[0])
|
self.set_rest_credentials(self.u4p_failover_targets[0])
|
||||||
self.u4p_failover_targets.pop(0)
|
self.u4p_failover_targets.pop(0)
|
||||||
if self.u4p_in_failover:
|
if self.u4p_in_failover:
|
||||||
LOG.warning("VMAX driver still in u4p failover mode. A "
|
LOG.warning("PowerMax driver still in u4p failover mode. A "
|
||||||
"periodic check will be made to see if primary "
|
"periodic check will be made to see if primary "
|
||||||
"Unisphere comes back online for seamless "
|
"Unisphere comes back online for seamless "
|
||||||
"restoration.")
|
"restoration.")
|
||||||
else:
|
else:
|
||||||
LOG.warning("VMAX driver set to u4p failover mode. A periodic "
|
LOG.warning("PowerMax driver set to u4p failover mode. A "
|
||||||
"check will be made to see if primary Unisphere "
|
"periodic check will be made to see if primary "
|
||||||
"comes back online for seamless restoration.")
|
"Unisphere comes back online for seamless "
|
||||||
|
"restoration.")
|
||||||
self.u4p_in_failover = True
|
self.u4p_in_failover = True
|
||||||
else:
|
else:
|
||||||
msg = _("A connection could not be established with the "
|
msg = _("A connection could not be established with the "
|
||||||
@ -639,10 +640,10 @@ class VMAXRest(object):
|
|||||||
return workload_setting
|
return workload_setting
|
||||||
|
|
||||||
def get_vmax_model(self, array):
|
def get_vmax_model(self, array):
|
||||||
"""Get the VMAX model.
|
"""Get the PowerMax/VMAX model.
|
||||||
|
|
||||||
:param array: the array serial number
|
:param array: the array serial number
|
||||||
:return: the VMAX model
|
:return: the PowerMax/VMAX model
|
||||||
"""
|
"""
|
||||||
vmax_version = ''
|
vmax_version = ''
|
||||||
system_uri = ("/%(version)s/system/symmetrix/%(array)s" % {
|
system_uri = ("/%(version)s/system/symmetrix/%(array)s" % {
|
||||||
@ -1120,7 +1121,7 @@ class VMAXRest(object):
|
|||||||
job, extra_specs)
|
job, extra_specs)
|
||||||
|
|
||||||
def get_volume(self, array, device_id):
|
def get_volume(self, array, device_id):
|
||||||
"""Get a VMAX volume from array.
|
"""Get a PowerMax/VMAX volume from array.
|
||||||
|
|
||||||
:param array: the array serial number
|
:param array: the array serial number
|
||||||
:param device_id: the volume device id
|
:param device_id: the volume device id
|
||||||
@ -1161,7 +1162,7 @@ class VMAXRest(object):
|
|||||||
return volume_dict
|
return volume_dict
|
||||||
|
|
||||||
def get_volume_list(self, array, params):
|
def get_volume_list(self, array, params):
|
||||||
"""Get a filtered list of VMAX volumes from array.
|
"""Get a filtered list of PowerMax/VMAX volumes from array.
|
||||||
|
|
||||||
Filter parameters are required as the unfiltered volume list could be
|
Filter parameters are required as the unfiltered volume list could be
|
||||||
very large and could affect performance if called often.
|
very large and could affect performance if called often.
|
||||||
@ -1205,7 +1206,7 @@ class VMAXRest(object):
|
|||||||
payload, resource_name=device_id)
|
payload, resource_name=device_id)
|
||||||
|
|
||||||
def extend_volume(self, array, device_id, new_size, extra_specs):
|
def extend_volume(self, array, device_id, new_size, extra_specs):
|
||||||
"""Extend a VMAX volume.
|
"""Extend a PowerMax/VMAX volume.
|
||||||
|
|
||||||
:param array: the array serial number
|
:param array: the array serial number
|
||||||
:param device_id: volume device id
|
:param device_id: volume device id
|
||||||
@ -1344,7 +1345,7 @@ class VMAXRest(object):
|
|||||||
return device_id
|
return device_id
|
||||||
|
|
||||||
def find_volume_identifier(self, array, device_id):
|
def find_volume_identifier(self, array, device_id):
|
||||||
"""Get the volume identifier of a VMAX volume.
|
"""Get the volume identifier of a PowerMax/VMAX volume.
|
||||||
|
|
||||||
:param array: array serial number
|
:param array: array serial number
|
||||||
:param device_id: the device id
|
:param device_id: the device id
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2017 Dell Inc. or its subsidiaries.
|
# Copyright (c) 2017-2018 Dell Inc. or its subsidiaries.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@ -101,16 +101,22 @@ U4P_FAILOVER_RETRIES = 'u4p_failover_retries'
|
|||||||
U4P_FAILOVER_BACKOFF_FACTOR = 'u4p_failover_backoff_factor'
|
U4P_FAILOVER_BACKOFF_FACTOR = 'u4p_failover_backoff_factor'
|
||||||
U4P_FAILOVER_AUTOFAILBACK = 'u4p_failover_autofailback'
|
U4P_FAILOVER_AUTOFAILBACK = 'u4p_failover_autofailback'
|
||||||
U4P_FAILOVER_TARGETS = 'u4p_failover_target'
|
U4P_FAILOVER_TARGETS = 'u4p_failover_target'
|
||||||
|
POWERMAX_ARRAY = 'powermax_array'
|
||||||
|
POWERMAX_SRP = 'powermax_srp'
|
||||||
|
POWERMAX_SERVICE_LEVEL = 'powermax_service_level'
|
||||||
|
POWERMAX_PORT_GROUPS = 'powermax_port_groups'
|
||||||
|
POWERMAX_SNAPVX_UNLINK_LIMIT = 'powermax_snapvx_unlink_limit'
|
||||||
|
|
||||||
|
|
||||||
class VMAXUtils(object):
|
class PowerMaxUtils(object):
|
||||||
"""Utility class for Rest based VMAX volume drivers.
|
"""Utility class for Rest based PowerMax volume drivers.
|
||||||
|
|
||||||
This Utility class is for VMAX volume drivers based on Unisphere Rest API.
|
This Utility class is for PowerMax volume drivers based on Unisphere
|
||||||
|
Rest API.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Utility class for Rest based VMAX volume drivers."""
|
"""Utility class for Rest based PowerMax volume drivers."""
|
||||||
|
|
||||||
def get_host_short_name(self, host_name):
|
def get_host_short_name(self, host_name):
|
||||||
"""Returns the short name for a given qualified host name.
|
"""Returns the short name for a given qualified host name.
|
||||||
@ -245,7 +251,7 @@ class VMAXUtils(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def modify_snapshot_prefix(snapshot_name, manage=False, unmanage=False):
|
def modify_snapshot_prefix(snapshot_name, manage=False, unmanage=False):
|
||||||
"""Modify a Snapshot prefix on VMAX backend.
|
"""Modify a Snapshot prefix on PowerMax/VMAX backend.
|
||||||
|
|
||||||
Prepare a snapshot name for manage/unmanage snapshot process either
|
Prepare a snapshot name for manage/unmanage snapshot process either
|
||||||
by adding or removing 'OS-' prefix.
|
by adding or removing 'OS-' prefix.
|
||||||
@ -253,7 +259,7 @@ class VMAXUtils(object):
|
|||||||
:param snapshot_name: the old snapshot backend display name
|
:param snapshot_name: the old snapshot backend display name
|
||||||
:param manage: (bool) if the operation is managing a snapshot
|
:param manage: (bool) if the operation is managing a snapshot
|
||||||
:param unmanage: (bool) if the operation is unmanaging a snapshot
|
:param unmanage: (bool) if the operation is unmanaging a snapshot
|
||||||
:return: snapshot name ready for backend VMAX assignment
|
:return: snapshot name ready for backend PowerMax/VMAX assignment
|
||||||
"""
|
"""
|
||||||
new_snap_name = None
|
new_snap_name = None
|
||||||
if manage:
|
if manage:
|
||||||
@ -813,8 +819,8 @@ class VMAXUtils(object):
|
|||||||
"""
|
"""
|
||||||
vol_head = source_vol['volumeHeader']
|
vol_head = source_vol['volumeHeader']
|
||||||
|
|
||||||
# VMAX disk geometry uses cylinders, so volume sizes are matched to
|
# PowerMax/VMAX disk geometry uses cylinders, so volume sizes are
|
||||||
# the nearest full cylinder size: 1GB = 547cyl = 1026MB
|
# matched to the nearest full cylinder size: 1GB = 547cyl = 1026MB
|
||||||
if vol_head['capMB'] < 1026 or not vol_head['capGB'].is_integer():
|
if vol_head['capMB'] < 1026 or not vol_head['capGB'].is_integer():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -857,8 +863,8 @@ class VMAXUtils(object):
|
|||||||
if not source_vol['timeFinderInfo']['snapVXSrc']:
|
if not source_vol['timeFinderInfo']['snapVXSrc']:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# VMAX disk geometry uses cylinders, so volume sizes are matched to
|
# PowerMax/VMAX disk geometry uses cylinders, so volume sizes are
|
||||||
# the nearest full cylinder size: 1GB = 547cyl = 1026MB
|
# matched to the nearest full cylinder size: 1GB = 547cyl = 1026MB
|
||||||
if (vol_head['capMB'] < 1026 or
|
if (vol_head['capMB'] < 1026 or
|
||||||
not vol_head['capGB'].is_integer()):
|
not vol_head['capGB'].is_integer()):
|
||||||
return False
|
return False
|
@ -173,6 +173,10 @@ CONF.register_opts(volume_backend_opts, group=config.SHARED_CONF_GROUP)
|
|||||||
# new name (the dict value) for at least a cycle to allow time for deployments
|
# new name (the dict value) for at least a cycle to allow time for deployments
|
||||||
# to transition.
|
# to transition.
|
||||||
MAPPING = {
|
MAPPING = {
|
||||||
|
'cinder.volume.drivers.dell_emc.vmax.iscsi.VMAXISCSIDriver':
|
||||||
|
'cinder.volume.drivers.dell_emc.powermax.iscsi.PowerMaxISCSIDriver',
|
||||||
|
'cinder.volume.drivers.dell_emc.vmax.fc.VMAXFCDriver':
|
||||||
|
'cinder.volume.drivers.dell_emc.powermax.fc.PowerMaxFCDriver',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,16 +1,24 @@
|
|||||||
==================================
|
======================================
|
||||||
Dell EMC VMAX iSCSI and FC drivers
|
Dell EMC POWERMAX iSCSI and FC drivers
|
||||||
==================================
|
======================================
|
||||||
|
|
||||||
The Dell EMC VMAX drivers, ``VMAXISCSIDriver`` and ``VMAXFCDriver``, support
|
The Dell EMC PowerMax drivers, ``PowerMaxISCSIDriver`` and ``PowerMaxFCDriver``,
|
||||||
the use of Dell EMC VMAX storage arrays with the Cinder Block Storage project.
|
support the use of Dell EMC PowerMax and VMAX storage arrays with the Cinder
|
||||||
They both provide equivalent functions and differ only in support for their
|
Block Storage project. They both provide equivalent functions and differ only
|
||||||
respective host attachment methods.
|
in support for their respective host attachment methods.
|
||||||
|
|
||||||
The drivers perform volume operations by communicating with the back-end VMAX
|
The drivers perform volume operations by communicating with the back-end
|
||||||
storage management software. They use the Requests HTTP library to communicate
|
PowerMax storage management software. They use the Requests HTTP library to
|
||||||
with a Unisphere for VMAX instance, using a RESTAPI interface in the backend
|
communicate with a Unisphere for PowerMax instance, using a RESTAPI interface
|
||||||
to perform VMAX storage operations.
|
in the backend to perform PowerMax and VMAX storage operations.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
While ``PowerMax`` will be used throughout this document, it will be used
|
||||||
|
to collectively categorize the following supported arrays, PowerMax 2000,
|
||||||
|
8000, VMAX All Flash 250F, 450F, 850F and 950F and VMAX Hybrid. Please note
|
||||||
|
That we will no longer be supporting the VMAX Hybrid in the ``T`` release
|
||||||
|
of OpenStack.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -20,17 +28,18 @@ to perform VMAX storage operations.
|
|||||||
leveraged workload i.e. DSS, DSS_REP, OLTP and OLTP_REP, attaching and
|
leveraged workload i.e. DSS, DSS_REP, OLTP and OLTP_REP, attaching and
|
||||||
detaching will no longer work and the volume type will be unusable.
|
detaching will no longer work and the volume type will be unusable.
|
||||||
Refrain from upgrading to PowerMax OS 5978 or greater on an All Flash
|
Refrain from upgrading to PowerMax OS 5978 or greater on an All Flash
|
||||||
until a fix is merged. Please contact your Dell EMC VMAX customer support
|
until a fix is merged. Please contact your Dell EMC PowerMax customer
|
||||||
representative if in any doubt.
|
support representative if in any doubt.
|
||||||
|
|
||||||
System requirements and licensing
|
System requirements and licensing
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
The Dell EMC VMAX Cinder driver supports the VMAX-3 hybrid series, VMAX
|
The Dell EMC PowerMax Cinder driver supports the VMAX-3 hybrid series, VMAX
|
||||||
All-Flash series and the PowerMax arrays.
|
All-Flash series and the PowerMax arrays. Please note we will be no longer
|
||||||
|
supporting the VMAX hybrid series in the ``T`` release of OpenStack.
|
||||||
|
|
||||||
The array operating system software, Solutions Enabler 9.0.x series, and
|
The array operating system software, Solutions Enabler 9.0.x series, and
|
||||||
Unisphere for PowerMax 9.0.x series are required to run Dell EMC VMAX
|
Unisphere for PowerMax 9.0.x series are required to run Dell EMC PowerMax
|
||||||
Cinder driver.
|
Cinder driver.
|
||||||
|
|
||||||
Download Solutions Enabler and Unisphere from the Dell EMC's support web site
|
Download Solutions Enabler and Unisphere from the Dell EMC's support web site
|
||||||
@ -38,8 +47,8 @@ Download Solutions Enabler and Unisphere from the Dell EMC's support web site
|
|||||||
and Configuration Guide`` and ``Dell EMC Unisphere for PowerMax Installation
|
and Configuration Guide`` and ``Dell EMC Unisphere for PowerMax Installation
|
||||||
Guide`` at ``support.emc.com``.
|
Guide`` at ``support.emc.com``.
|
||||||
|
|
||||||
Required VMAX software suites for OpenStack
|
Required PowerMax software suites for OpenStack
|
||||||
-------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
There are five Dell EMC Software Suites sold with the VMAX Hybrid arrays:
|
There are five Dell EMC Software Suites sold with the VMAX Hybrid arrays:
|
||||||
|
|
||||||
@ -49,17 +58,17 @@ There are five Dell EMC Software Suites sold with the VMAX Hybrid arrays:
|
|||||||
- Remote Replication Suite
|
- Remote Replication Suite
|
||||||
- Total Productivity Pack
|
- Total Productivity Pack
|
||||||
|
|
||||||
The Dell EMC VMAX Cinder driver requires the Advanced Suite and the Local
|
The Dell EMC PowerMax Cinder driver requires the Advanced Suite and the Local
|
||||||
Replication Suite or the Total Productivity Pack (it includes the Advanced
|
Replication Suite or the Total Productivity Pack (it includes the Advanced
|
||||||
Suite and the Local Replication Suite) for the VMAX Hybrid.
|
Suite and the Local Replication Suite) for the VMAX Hybrid.
|
||||||
|
|
||||||
Using VMAX Remote Replication functionality will also require the Remote
|
Using PowerMax Remote Replication functionality will also require the Remote
|
||||||
Replication Suite.
|
Replication Suite.
|
||||||
|
|
||||||
For full functionality including SRDF for the VMAX All Flash, the FX package,
|
For full functionality including SRDF for the VMAX All Flash, the FX package,
|
||||||
or the F package plus the SRDF ``a la carte`` add on is required.
|
or the F package plus the SRDF ``a la carte`` add on is required.
|
||||||
|
|
||||||
The storage system also requires a Unisphere for VMAX (SMC) eLicence.
|
The storage system also requires a Unisphere for PowerMax (SMC) eLicence.
|
||||||
|
|
||||||
Each are licensed separately. For further details on how to get the
|
Each are licensed separately. For further details on how to get the
|
||||||
relevant license(s), reference eLicensing Support below.
|
relevant license(s), reference eLicensing Support below.
|
||||||
@ -68,7 +77,7 @@ relevant license(s), reference eLicensing Support below.
|
|||||||
eLicensing support
|
eLicensing support
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
To activate your entitlements and obtain your VMAX license files, visit the
|
To activate your entitlements and obtain your PowerMax license files, visit the
|
||||||
Service Center on `<https://support.emc.com>`_, as directed on your License
|
Service Center on `<https://support.emc.com>`_, as directed on your License
|
||||||
Authorization Code (LAC) letter emailed to you.
|
Authorization Code (LAC) letter emailed to you.
|
||||||
|
|
||||||
@ -92,7 +101,7 @@ Authorization Code (LAC) letter emailed to you.
|
|||||||
Supported operations
|
Supported operations
|
||||||
====================
|
====================
|
||||||
|
|
||||||
VMAX drivers support these operations:
|
PowerMax drivers support these operations:
|
||||||
|
|
||||||
- Create, list, delete, attach, and detach volumes
|
- Create, list, delete, attach, and detach volumes
|
||||||
- Create, list, and delete volume snapshots
|
- Create, list, and delete volume snapshots
|
||||||
@ -112,7 +121,7 @@ VMAX drivers support these operations:
|
|||||||
- Manage and unmanage volumes and snapshots
|
- Manage and unmanage volumes and snapshots
|
||||||
- List Manageable Volumes/Snapshots
|
- List Manageable Volumes/Snapshots
|
||||||
|
|
||||||
VMAX drivers also support the following features:
|
PowerMax drivers also support the following features:
|
||||||
|
|
||||||
- Dynamic masking view creation
|
- Dynamic masking view creation
|
||||||
- Dynamic determination of the target iSCSI IP address
|
- Dynamic determination of the target iSCSI IP address
|
||||||
@ -137,15 +146,15 @@ VMAX drivers also support the following features:
|
|||||||
compressed.
|
compressed.
|
||||||
|
|
||||||
|
|
||||||
VMAX naming conventions
|
PowerMax naming conventions
|
||||||
=======================
|
===========================
|
||||||
|
|
||||||
Masking view names
|
Masking view names
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
Masking views are dynamically created by the VMAX FC and iSCSI drivers using
|
Masking views are dynamically created by the PowerMax FC and iSCSI drivers
|
||||||
the following naming conventions. ``[protocol]`` is either ``I`` for volumes
|
using the following naming conventions. ``[protocol]`` is either ``I`` for
|
||||||
attached over iSCSI or ``F`` for volumes attached over Fiber Channel.
|
volumes attached over iSCSI or ``F`` for volumes attached over Fiber Channel.
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
@ -154,11 +163,11 @@ attached over iSCSI or ``F`` for volumes attached over Fiber Channel.
|
|||||||
Initiator group names
|
Initiator group names
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
For each host that is attached to VMAX volumes using the drivers, an initiator
|
For each host that is attached to PowerMax volumes using the drivers, an
|
||||||
group is created or re-used (per attachment type). All initiators of the
|
initiator group is created or re-used (per attachment type). All initiators
|
||||||
appropriate type known for that host are included in the group. At each new
|
of the appropriate type known for that host are included in the group. At
|
||||||
attach volume operation, the VMAX driver retrieves the initiators (either
|
each new attach volume operation, the PowerMax driver retrieves the initiators
|
||||||
WWNNs or IQNs) from OpenStack and adds or updates the contents of the
|
(either WWNNs or IQNs) from OpenStack and adds or updates the contents of the
|
||||||
Initiator Group as required. Names are of the following format. ``[protocol]``
|
Initiator Group as required. Names are of the following format. ``[protocol]``
|
||||||
is either ``I`` for volumes attached over iSCSI or ``F`` for volumes attached
|
is either ``I`` for volumes attached over iSCSI or ``F`` for volumes attached
|
||||||
over Fiber Channel.
|
over Fiber Channel.
|
||||||
@ -169,13 +178,13 @@ over Fiber Channel.
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
Hosts attaching to OpenStack managed VMAX storage cannot also attach to
|
Hosts attaching to OpenStack managed PowerMax storage cannot also attach to
|
||||||
storage on the same VMAX that are not managed by OpenStack.
|
storage on the same PowerMax that are not managed by OpenStack.
|
||||||
|
|
||||||
FA port groups
|
FA port groups
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
VMAX array FA ports to be used in a new masking view are retrieved from the
|
PowerMax array FA ports to be used in a new masking view are retrieved from the
|
||||||
port group provided as the extra spec on the volume type, or chosen from the
|
port group provided as the extra spec on the volume type, or chosen from the
|
||||||
list provided in the Dell EMC configuration file.
|
list provided in the Dell EMC configuration file.
|
||||||
|
|
||||||
@ -187,7 +196,7 @@ storage group (if it exists) or a new storage group is created and the volume
|
|||||||
is then added. Storage groups contain volumes created from a pool, attached
|
is then added. Storage groups contain volumes created from a pool, attached
|
||||||
to a single host, over a single connection type (iSCSI or FC). ``[protocol]``
|
to a single host, over a single connection type (iSCSI or FC). ``[protocol]``
|
||||||
is either ``I`` for volumes attached over iSCSI or ``F`` for volumes attached
|
is either ``I`` for volumes attached over iSCSI or ``F`` for volumes attached
|
||||||
over Fiber Channel. VMAX Cinder driver utilizes cascaded storage groups -
|
over Fiber Channel. PowerMax Cinder driver utilizes cascaded storage groups -
|
||||||
a ``parent`` storage group which is associated with the masking view, which
|
a ``parent`` storage group which is associated with the masking view, which
|
||||||
contains ``child`` storage groups for each configured
|
contains ``child`` storage groups for each configured
|
||||||
SRP/slo/workload/compression-enabled or disabled/replication-enabled or
|
SRP/slo/workload/compression-enabled or disabled/replication-enabled or
|
||||||
@ -218,8 +227,8 @@ Child storage groups:
|
|||||||
is NONE
|
is NONE
|
||||||
|
|
||||||
|
|
||||||
VMAX Driver Integration
|
PowerMax Driver Integration
|
||||||
=======================
|
===========================
|
||||||
|
|
||||||
1. Prerequisites
|
1. Prerequisites
|
||||||
----------------
|
----------------
|
||||||
@ -237,7 +246,7 @@ VMAX Driver Integration
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
You must discover storage arrays before you can use the VMAX drivers.
|
You must discover storage arrays before you can use the PowerMax drivers.
|
||||||
Follow instructions in ```Dell EMC Solutions Enabler 9.0.x Installation
|
Follow instructions in ```Dell EMC Solutions Enabler 9.0.x Installation
|
||||||
and Configuration Guide`` on ``support.emc.com`` for more details.
|
and Configuration Guide`` on ``support.emc.com`` for more details.
|
||||||
|
|
||||||
@ -247,26 +256,26 @@ VMAX Driver Integration
|
|||||||
- i.e., on the same server running Solutions Enabler; on a server
|
- i.e., on the same server running Solutions Enabler; on a server
|
||||||
connected to the Solutions Enabler server; or using the eManagement
|
connected to the Solutions Enabler server; or using the eManagement
|
||||||
container application (containing Solutions Enabler and Unisphere for
|
container application (containing Solutions Enabler and Unisphere for
|
||||||
VMAX). See ``Dell EMC Solutions Enabler 9.0.x Installation and Configuration
|
PowerMax). See ``Dell EMC Solutions Enabler 9.0.x Installation and Configuration
|
||||||
Guide`` at ``support.emc.com``.
|
Guide`` at ``support.emc.com``.
|
||||||
|
|
||||||
|
|
||||||
2. FC Zoning with VMAX
|
2. FC Zoning with PowerMax
|
||||||
----------------------
|
--------------------------
|
||||||
|
|
||||||
Zone Manager is required when there is a fabric between the host and array.
|
Zone Manager is required when there is a fabric between the host and array.
|
||||||
This is necessary for larger configurations where pre-zoning would be too
|
This is necessary for larger configurations where pre-zoning would be too
|
||||||
complex and open-zoning would raise security concerns.
|
complex and open-zoning would raise security concerns.
|
||||||
|
|
||||||
3. iSCSI with VMAX
|
3. iSCSI with PowerMax
|
||||||
------------------
|
----------------------
|
||||||
|
|
||||||
- Make sure the ``iscsi-initiator-utils`` package is installed on all Compute
|
- Make sure the ``iscsi-initiator-utils`` package is installed on all Compute
|
||||||
nodes.
|
nodes.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
You can only ping the VMAX iSCSI target ports when there is a valid masking
|
You can only ping the PowerMax iSCSI target ports when there is a valid masking
|
||||||
view. An attach operation creates this masking view.
|
view. An attach operation creates this masking view.
|
||||||
|
|
||||||
|
|
||||||
@ -274,13 +283,13 @@ complex and open-zoning would raise security concerns.
|
|||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
|
|
||||||
.. config-table::
|
.. config-table::
|
||||||
:config-target: VMAX
|
:config-target: PowerMax
|
||||||
|
|
||||||
cinder.volume.drivers.dell_emc.vmax.common
|
cinder.volume.drivers.dell_emc.powermax.common
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
For security and backend uniformity, the use of the XML file for VMAX
|
For security and backend uniformity, the use of the XML file for PowerMax
|
||||||
backend configuration was deprecated in Queens and removed entirely
|
backend configuration was deprecated in Queens and removed entirely
|
||||||
in Rocky.
|
in Rocky.
|
||||||
|
|
||||||
@ -293,11 +302,11 @@ complex and open-zoning would raise security concerns.
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
VMAX ``PortGroups`` must be pre-configured to expose volumes managed
|
PowerMax ``PortGroups`` must be pre-configured to expose volumes managed
|
||||||
by the array. Port groups can be supplied in the ``cinder.conf``, or
|
by the array. Port groups can be supplied in the ``cinder.conf``, or
|
||||||
can be specified as an extra spec ``storagetype:portgroupname`` on a
|
can be specified as an extra spec ``storagetype:portgroupname`` on a
|
||||||
volume type. The latter gives the user more control. When a dynamic
|
volume type. The latter gives the user more control. When a dynamic
|
||||||
masking view is created by the VMAX driver, if there is no port group
|
masking view is created by the PowerMax driver, if there is no port group
|
||||||
specified as an extra specification, the port group is chosen randomly
|
specified as an extra specification, the port group is chosen randomly
|
||||||
from the PortGroup list, to evenly distribute load across the set of
|
from the PortGroup list, to evenly distribute load across the set of
|
||||||
groups provided.
|
groups provided.
|
||||||
@ -310,13 +319,13 @@ complex and open-zoning would raise security concerns.
|
|||||||
Workload is NONE for PowerMax and any All Flash with PowerMax OS
|
Workload is NONE for PowerMax and any All Flash with PowerMax OS
|
||||||
(5978) or greater.
|
(5978) or greater.
|
||||||
|
|
||||||
+-----------------+------------------------+---------+----------+
|
+--------------------+------------------------+---------+----------+
|
||||||
| VMAX parameter | cinder.conf parameter | Default | Required |
|
| PowerMAX parameter | cinder.conf parameter | Default | Required |
|
||||||
+=================+========================+=========+==========+
|
+====================+========================+=========+==========+
|
||||||
| ServiceLevel | vmax_service_level | None | No |
|
| ServiceLevel | vmax_service_level | None | No |
|
||||||
+-----------------+------------------------+---------+----------+
|
+--------------------+------------------------+---------+----------+
|
||||||
| Workload | vmax_workload | None | No |
|
| Workload | vmax_workload | None | No |
|
||||||
+-----------------+------------------------+---------+----------+
|
+--------------------+------------------------+---------+----------+
|
||||||
|
|
||||||
Configure Block Storage in cinder.conf
|
Configure Block Storage in cinder.conf
|
||||||
|
|
||||||
@ -327,8 +336,8 @@ complex and open-zoning would raise security concerns.
|
|||||||
enabled_backends = CONF_GROUP_ISCSI, CONF_GROUP_FC
|
enabled_backends = CONF_GROUP_ISCSI, CONF_GROUP_FC
|
||||||
|
|
||||||
[CONF_GROUP_ISCSI]
|
[CONF_GROUP_ISCSI]
|
||||||
volume_driver = cinder.volume.drivers.dell_emc.vmax.iscsi.VMAXISCSIDriver
|
volume_driver = cinder.volume.drivers.dell_emc.powermax.iscsi.PowerMaxISCSIDriver
|
||||||
volume_backend_name = VMAX_ISCSI
|
volume_backend_name = POWERMAX_ISCSI
|
||||||
vmax_port_groups = [OS-ISCSI-PG]
|
vmax_port_groups = [OS-ISCSI-PG]
|
||||||
san_ip = 10.10.10.10
|
san_ip = 10.10.10.10
|
||||||
san_login = my_username
|
san_login = my_username
|
||||||
@ -338,8 +347,8 @@ complex and open-zoning would raise security concerns.
|
|||||||
|
|
||||||
|
|
||||||
[CONF_GROUP_FC]
|
[CONF_GROUP_FC]
|
||||||
volume_driver = cinder.volume.drivers.dell_emc.vmax.fc.VMAXFCDriver
|
volume_driver = cinder.volume.drivers.dell_emc.powermax.fc.PowerMaxFCDriver
|
||||||
volume_backend_name = VMAX_FC
|
volume_backend_name = POWERMAX_FC
|
||||||
vmax_port_groups = [OS-FC-PG]
|
vmax_port_groups = [OS-FC-PG]
|
||||||
san_ip = 10.10.10.10
|
san_ip = 10.10.10.10
|
||||||
san_login = my_username
|
san_login = my_username
|
||||||
@ -369,8 +378,8 @@ complex and open-zoning would raise security concerns.
|
|||||||
Where ``my_unisphere_host`` is the hostname of the unisphere instance and
|
Where ``my_unisphere_host`` is the hostname of the unisphere instance and
|
||||||
``my_unisphere_host.pem`` is the name of the .pem file.
|
``my_unisphere_host.pem`` is the name of the .pem file.
|
||||||
|
|
||||||
#. Add this path to ``cinder.conf`` under the VMAX backend stanza and set SSL
|
#. Add this path to ``cinder.conf`` under the PowerMax backend stanza and set
|
||||||
verify to True
|
SSL verify to True
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -401,8 +410,8 @@ complex and open-zoning would raise security concerns.
|
|||||||
|
|
||||||
# export REQUESTS_CA_BUNDLE = /etc/ssl/certs/ca-certificates.crt
|
# export REQUESTS_CA_BUNDLE = /etc/ssl/certs/ca-certificates.crt
|
||||||
|
|
||||||
#. OPTIONAL: Set cert verification to ``true`` under the VMAX backend stanza in
|
#. OPTIONAL: Set cert verification to ``true`` under the PowerMax backend
|
||||||
``cinder.conf``:
|
stanza in ``cinder.conf``:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -440,24 +449,24 @@ complex and open-zoning would raise security concerns.
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ openstack volume type create VMAX_ISCSI_SILVER_OLTP
|
$ openstack volume type create POWERMAX_ISCSI_SILVER_OLTP
|
||||||
$ openstack volume type set --property volume_backend_name=ISCSI_backend \
|
$ openstack volume type set --property volume_backend_name=ISCSI_backend \
|
||||||
--property pool_name=Silver+OLTP+SRP_1+000123456789 \
|
--property pool_name=Silver+OLTP+SRP_1+000123456789 \
|
||||||
--property storagetype:portgroupname=OS-PG2 \
|
--property storagetype:portgroupname=OS-PG2 \
|
||||||
VMAX_ISCSI_SILVER_OLTP
|
POWERMAX_ISCSI_SILVER_OLTP
|
||||||
$ openstack volume type create VMAX_FC_DIAMOND_DSS
|
$ openstack volume type create POWERMAX_FC_DIAMOND_DSS
|
||||||
$ openstack volume type set --property volume_backend_name=FC_backend \
|
$ openstack volume type set --property volume_backend_name=FC_backend \
|
||||||
--property pool_name=Diamond+DSS+SRP_1+000123456789 \
|
--property pool_name=Diamond+DSS+SRP_1+000123456789 \
|
||||||
--property storagetype:portgroupname=OS-PG1 \
|
--property storagetype:portgroupname=OS-PG1 \
|
||||||
VMAX_FC_DIAMOND_DSS
|
POWERMAX_FC_DIAMOND_DSS
|
||||||
|
|
||||||
|
|
||||||
By issuing these commands, the Block Storage volume type
|
By issuing these commands, the Block Storage volume type
|
||||||
``VMAX_ISCSI_SILVER_OLTP`` is associated with the ``ISCSI_backend``, a Silver
|
``POWERMAX_ISCSI_SILVER_OLTP`` is associated with the ``ISCSI_backend``,
|
||||||
Service Level, and an OLTP workload.
|
a Silver Service Level, and an OLTP workload.
|
||||||
|
|
||||||
The type ``VMAX_FC_DIAMOND_DSS`` is associated with the ``FC_backend``, a
|
The type ``POWERMAX_FC_DIAMOND_DSS`` is associated with the ``FC_backend``,
|
||||||
Diamond Service Level, and a DSS workload.
|
a Diamond Service Level, and a DSS workload.
|
||||||
|
|
||||||
The ``ServiceLevel`` manages the underlying storage to provide expected
|
The ``ServiceLevel`` manages the underlying storage to provide expected
|
||||||
performance. Setting the ``ServiceLevel`` to ``None`` means that non-FAST
|
performance. Setting the ``ServiceLevel`` to ``None`` means that non-FAST
|
||||||
@ -502,13 +511,13 @@ should be increased so calls will not timeout prematurely.
|
|||||||
In the example below, the driver checks every 3 seconds for the status of the
|
In the example below, the driver checks every 3 seconds for the status of the
|
||||||
job. It will continue checking for 200 retries before it times out.
|
job. It will continue checking for 200 retries before it times out.
|
||||||
|
|
||||||
Add the following lines to the VMAX backend in the cinder.conf:
|
Add the following lines to the PowerMax backend in the cinder.conf:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
[CONF_GROUP_ISCSI]
|
[CONF_GROUP_ISCSI]
|
||||||
volume_driver = cinder.volume.drivers.dell_emc.vmax.iscsi.VMAXISCSIDriver
|
volume_driver = cinder.volume.drivers.dell_emc.powermax.iscsi.PowerMaxISCSIDriver
|
||||||
volume_backend_name = VMAX_ISCSI
|
volume_backend_name = POWERMAX_ISCSI
|
||||||
vmax_port_groups = [OS-ISCSI-PG]
|
vmax_port_groups = [OS-ISCSI-PG]
|
||||||
san_ip = 10.10.10.10
|
san_ip = 10.10.10.10
|
||||||
san_login = my_username
|
san_login = my_username
|
||||||
@ -522,15 +531,16 @@ Add the following lines to the VMAX backend in the cinder.conf:
|
|||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
This supports one way initiator CHAP authentication functionality into the
|
This supports one way initiator CHAP authentication functionality into the
|
||||||
VMAX backend. With CHAP one-way authentication, the storage array challenges
|
PowerMax backend. With CHAP one-way authentication, the storage array
|
||||||
the host during the initial link negotiation process and expects to receive
|
challenges the host during the initial link negotiation process and expects
|
||||||
a valid credential and CHAP secret in response. When challenged, the host
|
to receive a valid credential and CHAP secret in response. When challenged,
|
||||||
transmits a CHAP credential and CHAP secret to the storage array. The storage
|
the host transmits a CHAP credential and CHAP secret to the storage array.
|
||||||
array looks for this credential and CHAP secret which stored in the host
|
The storagearray looks for this credential and CHAP secret which stored in
|
||||||
initiator's initiator group (IG) information in the ACLX database. Once a
|
the host initiator's initiator group (IG) information in the ACLX database.
|
||||||
positive authentication occurs, the storage array sends an acceptance message
|
Once a positive authentication occurs, the storage array sends an acceptance
|
||||||
to the host. However, if the storage array fails to find any record of the
|
message to the host. However, if the storage array fails to find any record
|
||||||
credential/secret pair, it sends a rejection message, and the link is closed.
|
of the credential/secret pair, it sends a rejection message, and the link is
|
||||||
|
closed.
|
||||||
|
|
||||||
Assumptions, Restrictions and Pre-Requisites
|
Assumptions, Restrictions and Pre-Requisites
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -559,7 +569,7 @@ Assumptions, Restrictions and Pre-Requisites
|
|||||||
Settings and Configuration
|
Settings and Configuration
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
#. Set the configuration in the VMAX backend group in cinder.conf using the
|
#. Set the configuration in the PowerMax backend group in cinder.conf using the
|
||||||
following parameters and restart cinder.
|
following parameters and restart cinder.
|
||||||
|
|
||||||
+-----------------------+-------------------------+-------------------+
|
+-----------------------+-------------------------+-------------------+
|
||||||
@ -574,9 +584,9 @@ Settings and Configuration
|
|||||||
|
|
||||||
.. code-block:: ini
|
.. code-block:: ini
|
||||||
|
|
||||||
[VMAX_ISCSI]
|
[POWERMAX_ISCSI]
|
||||||
volume_driver = cinder.volume.drivers.dell_emc.vmax.iscsi.VMAXISCSIDriver
|
volume_driver = cinder.volume.drivers.dell_emc.powermax.iscsi.PowerMaxISCSIDriver
|
||||||
volume_backend_name = VMAX_ISCSI
|
volume_backend_name = POWERMAX_ISCSI
|
||||||
san_ip = 10.10.10.10
|
san_ip = 10.10.10.10
|
||||||
san_login = my_u4v_username
|
san_login = my_u4v_username
|
||||||
san_password = my_u4v_password
|
san_password = my_u4v_password
|
||||||
@ -645,21 +655,22 @@ limits the following:
|
|||||||
|
|
||||||
QoS enforcement in Cinder is done either at the hypervisor (front end),
|
QoS enforcement in Cinder is done either at the hypervisor (front end),
|
||||||
the storage subsystem (back end), or both. This section focuses on QoS
|
the storage subsystem (back end), or both. This section focuses on QoS
|
||||||
limits that are enforced by either the VMAX backend and the hypervisor
|
limits that are enforced by either the PowerMax backend and the hypervisor
|
||||||
front end interchangeably or just back end (Vendor Specific). The VMAX driver
|
front end interchangeably or just back end (Vendor Specific). The PowerMax
|
||||||
offers support for Total bytes/sec limit in throughput and Total IOPS/sec
|
driver offers support for Total bytes/sec limit in throughput and Total
|
||||||
limit of IOPS.
|
IOPS/sec limit of IOPS.
|
||||||
|
|
||||||
The VMAX driver supports the following attributes that are front end/back end
|
The PowerMax driver supports the following attributes that are front
|
||||||
agnostic
|
end/back end agnostic
|
||||||
|
|
||||||
- total_iops_sec - Maximum IOPs (in I/Os per second). Valid values range from
|
- total_iops_sec - Maximum IOPs (in I/Os per second). Valid values range from
|
||||||
100 IO/Sec to 100,000 IO/sec.
|
100 IO/Sec to 100,000 IO/sec.
|
||||||
- total_bytes_sec - Maximum bandwidth (throughput) in bytes per second. Valid
|
- total_bytes_sec - Maximum bandwidth (throughput) in bytes per second. Valid
|
||||||
values range from 1048576 bytes (1MB) to 104857600000 bytes (100, 000MB)
|
values range from 1048576 bytes (1MB) to 104857600000 bytes (100, 000MB)
|
||||||
|
|
||||||
The VMAX driver offers the following attribute that is vendor specific to the
|
The PowerMax driver offers the following attribute that is vendor specific to
|
||||||
VMAX and dependent on the total_iops_sec and/or total_bytes_sec being set.
|
the PowerMax and dependent on the total_iops_sec and/or total_bytes_sec being
|
||||||
|
set.
|
||||||
|
|
||||||
- Dynamic Distribution - Enables/Disables dynamic distribution of host I/O
|
- Dynamic Distribution - Enables/Disables dynamic distribution of host I/O
|
||||||
limits. Possible values are:
|
limits. Possible values are:
|
||||||
@ -676,7 +687,7 @@ VMAX and dependent on the total_iops_sec and/or total_bytes_sec being set.
|
|||||||
USE CASE 1 - Default values
|
USE CASE 1 - Default values
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Prerequisites - VMAX
|
Prerequisites - PowerMax
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - No Limit
|
- Host I/O Limit (MB/Sec) - No Limit
|
||||||
- Host I/O Limit (IO/Sec) - No Limit
|
- Host I/O Limit (IO/Sec) - No Limit
|
||||||
@ -716,7 +727,7 @@ Prerequisites - VMAX
|
|||||||
|
|
||||||
$ openstack volume create --size 1 --type my_volume_type my_volume
|
$ openstack volume create --size 1 --type my_volume_type my_volume
|
||||||
|
|
||||||
**Outcome - VMAX (storage group)**
|
**Outcome - PowerMax (storage group)**
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - 100
|
- Host I/O Limit (MB/Sec) - 100
|
||||||
- Host I/O Limit (IO/Sec) - 500
|
- Host I/O Limit (IO/Sec) - 500
|
||||||
@ -730,7 +741,7 @@ above.
|
|||||||
USE CASE 2 - Preset limits
|
USE CASE 2 - Preset limits
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Prerequisites - VMAX
|
Prerequisites - PowerMax
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - 2000
|
- Host I/O Limit (MB/Sec) - 2000
|
||||||
- Host I/O Limit (IO/Sec) - 2000
|
- Host I/O Limit (IO/Sec) - 2000
|
||||||
@ -777,7 +788,7 @@ Prerequisites - VMAX
|
|||||||
|
|
||||||
$ openstack server add volume my_volume my_instance
|
$ openstack server add volume my_volume my_instance
|
||||||
|
|
||||||
**Outcome - VMAX (storage group)**
|
**Outcome - PowerMax (storage group)**
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - 100
|
- Host I/O Limit (MB/Sec) - 100
|
||||||
- Host I/O Limit (IO/Sec) - 500
|
- Host I/O Limit (IO/Sec) - 500
|
||||||
@ -854,7 +865,7 @@ The output of the command contains the xml below. It is found between the
|
|||||||
USE CASE 3 - Preset limits
|
USE CASE 3 - Preset limits
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Prerequisites - VMAX
|
Prerequisites - PowerMax
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - 100
|
- Host I/O Limit (MB/Sec) - 100
|
||||||
- Host I/O Limit (IO/Sec) - 500
|
- Host I/O Limit (IO/Sec) - 500
|
||||||
@ -894,7 +905,7 @@ Prerequisites - VMAX
|
|||||||
|
|
||||||
$ openstack volume create --size 1 --type my_volume_type my_volume
|
$ openstack volume create --size 1 --type my_volume_type my_volume
|
||||||
|
|
||||||
**Outcome - VMAX (storage group)**
|
**Outcome - PowerMax (storage group)**
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - 100
|
- Host I/O Limit (MB/Sec) - 100
|
||||||
- Host I/O Limit (IO/Sec) - 500
|
- Host I/O Limit (IO/Sec) - 500
|
||||||
@ -908,7 +919,7 @@ Volume is created against volume type and QOS is enforced with the parameters ab
|
|||||||
USE CASE 4 - Default values
|
USE CASE 4 - Default values
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Prerequisites - VMAX
|
Prerequisites - PowerMax
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - No Limit
|
- Host I/O Limit (MB/Sec) - No Limit
|
||||||
- Host I/O Limit (IO/Sec) - No Limit
|
- Host I/O Limit (IO/Sec) - No Limit
|
||||||
@ -943,7 +954,7 @@ Prerequisites - VMAX
|
|||||||
|
|
||||||
$ openstack volume create --size 1 --type my_volume_type my_volume
|
$ openstack volume create --size 1 --type my_volume_type my_volume
|
||||||
|
|
||||||
**Outcome - VMAX (storage group)**
|
**Outcome - PowerMax (storage group)**
|
||||||
|
|
||||||
- Host I/O Limit (MB/Sec) - No Limit
|
- Host I/O Limit (MB/Sec) - No Limit
|
||||||
- Host I/O Limit (IO/Sec) - No Limit
|
- Host I/O Limit (IO/Sec) - No Limit
|
||||||
@ -996,7 +1007,7 @@ performance. Log in as a privileged user and make the following changes to
|
|||||||
.. code-block:: vim
|
.. code-block:: vim
|
||||||
|
|
||||||
devices {
|
devices {
|
||||||
# Device attributed for EMC VMAX
|
# Device attributed for EMC PowerMax
|
||||||
device {
|
device {
|
||||||
vendor "EMC"
|
vendor "EMC"
|
||||||
product "SYMMETRIX"
|
product "SYMMETRIX"
|
||||||
@ -1053,7 +1064,7 @@ On Compute (Nova) node, add the following flag in the ``[libvirt]`` section of
|
|||||||
volume_use_multipath = True
|
volume_use_multipath = True
|
||||||
|
|
||||||
On Cinder controller node, iSCSI MPIO can be set globally in the
|
On Cinder controller node, iSCSI MPIO can be set globally in the
|
||||||
[DEFAULT] section or set individually in the VMAX backend stanza in
|
[DEFAULT] section or set individually in the PowerMax backend stanza in
|
||||||
:file:`/etc/cinder/cinder.conf`:
|
:file:`/etc/cinder/cinder.conf`:
|
||||||
|
|
||||||
.. code-block:: ini
|
.. code-block:: ini
|
||||||
@ -1065,8 +1076,8 @@ Restart ``nova-compute`` and ``cinder-volume`` services after the change.
|
|||||||
Verify you have multiple initiators available on the compute node for I/O
|
Verify you have multiple initiators available on the compute node for I/O
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
#. Create a 3GB VMAX volume.
|
#. Create a 3GB PowerMax volume.
|
||||||
#. Create an instance from image out of native LVM storage or from VMAX
|
#. Create an instance from image out of native LVM storage or from PowerMax
|
||||||
storage, for example, from a bootable volume
|
storage, for example, from a bootable volume
|
||||||
#. Attach the 3GB volume to the new instance:
|
#. Attach the 3GB volume to the new instance:
|
||||||
|
|
||||||
@ -1111,7 +1122,7 @@ uncompressed.
|
|||||||
Use case 1 - Compression disabled create, attach, detach, and delete volume
|
Use case 1 - Compression disabled create, attach, detach, and delete volume
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
#. Create a new volume type called ``VMAX_COMPRESSION_DISABLED``.
|
#. Create a new volume type called ``POWERMAX_COMPRESSION_DISABLED``.
|
||||||
#. Set an extra spec ``volume_backend_name``.
|
#. Set an extra spec ``volume_backend_name``.
|
||||||
#. Set a new extra spec ``storagetype:disablecompression = True``.
|
#. Set a new extra spec ``storagetype:disablecompression = True``.
|
||||||
#. Create a new volume.
|
#. Create a new volume.
|
||||||
@ -1134,12 +1145,12 @@ Use case 2 - Retype from compression disabled to compression enabled
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
#. Repeat steps 1-4 of Use case 1.
|
#. Repeat steps 1-4 of Use case 1.
|
||||||
#. Create a new volume type. For example ``VMAX_COMPRESSION_ENABLED``.
|
#. Create a new volume type. For example ``POWERMAX_COMPRESSION_ENABLED``.
|
||||||
#. Set extra spec ``volume_backend_name`` as before.
|
#. Set extra spec ``volume_backend_name`` as before.
|
||||||
#. Set the new extra spec's compression as
|
#. Set the new extra spec's compression as
|
||||||
``storagetype:disablecompression = False`` or DO NOT set this extra spec.
|
``storagetype:disablecompression = False`` or DO NOT set this extra spec.
|
||||||
#. Retype from volume type ``VMAX_COMPRESSION_DISABLED`` to
|
#. Retype from volume type ``POWERMAX_COMPRESSION_DISABLED`` to
|
||||||
``VMAX_COMPRESSION_ENABLED``.
|
``POWERMAX_COMPRESSION_ENABLED``.
|
||||||
#. Check in Unisphere or symcli to see if the volume exists in storage group
|
#. Check in Unisphere or symcli to see if the volume exists in storage group
|
||||||
``OS-<srp>-<servicelevel>-<workload>-SG``, and compression is enabled on
|
``OS-<srp>-<servicelevel>-<workload>-SG``, and compression is enabled on
|
||||||
that storage group.
|
that storage group.
|
||||||
@ -1173,22 +1184,22 @@ of live migration are:
|
|||||||
read-only devices such as CD-ROMs and Configuration Drive (config_drive).
|
read-only devices such as CD-ROMs and Configuration Drive (config_drive).
|
||||||
|
|
||||||
- Volume-backed live migration. Instances are backed by volumes rather than
|
- Volume-backed live migration. Instances are backed by volumes rather than
|
||||||
ephemeral disk. For VMAX volume-backed live migration, shared storage
|
ephemeral disk. For PowerMax volume-backed live migration, shared storage
|
||||||
is required.
|
is required.
|
||||||
|
|
||||||
The VMAX driver supports shared volume-backed live migration.
|
The PowerMax driver supports shared volume-backed live migration.
|
||||||
|
|
||||||
Architecture
|
Architecture
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
In VMAX, A volume cannot belong to two or more FAST storage groups at the
|
In PowerMax, A volume cannot belong to two or more FAST storage groups at the
|
||||||
same time. To get around this limitation we leverage both cascaded storage
|
same time. To get around this limitation we leverage both cascaded storage
|
||||||
groups and a temporary non FAST storage group.
|
groups and a temporary non FAST storage group.
|
||||||
|
|
||||||
A volume can remain 'live' if moved between masking views that have the same
|
A volume can remain 'live' if moved between masking views that have the same
|
||||||
initiator group and port groups which preserves the host path.
|
initiator group and port groups which preserves the host path.
|
||||||
|
|
||||||
During live migration, the following steps are performed by the VMAX plugin
|
During live migration, the following steps are performed by the PowerMax driver
|
||||||
on the volume:
|
on the volume:
|
||||||
|
|
||||||
#. Within the originating masking view, the volume is moved from the FAST
|
#. Within the originating masking view, the volume is moved from the FAST
|
||||||
@ -1345,7 +1356,7 @@ nodes. The following were also used in live migration.
|
|||||||
14. Multi-attach support
|
14. Multi-attach support
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
VMAX cinder driver supports the ability to attach a volume to multiple
|
PowerMax cinder driver supports the ability to attach a volume to multiple
|
||||||
hosts/servers simultaneously. Please see
|
hosts/servers simultaneously. Please see
|
||||||
https://docs.openstack.org/cinder/latest/admin/blockstorage-volume-multiattach.html
|
https://docs.openstack.org/cinder/latest/admin/blockstorage-volume-multiattach.html
|
||||||
for configuration information.
|
for configuration information.
|
||||||
@ -1353,7 +1364,7 @@ for configuration information.
|
|||||||
Multi-attach Architecture
|
Multi-attach Architecture
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
In VMAX, a volume cannot belong to two or more FAST storage groups at the same
|
In PowerMax, a volume cannot belong to two or more FAST storage groups at the same
|
||||||
time. This can cause issues when we are attaching a volume to multiple
|
time. This can cause issues when we are attaching a volume to multiple
|
||||||
instances on different hosts. To get around this limitation, we leverage both
|
instances on different hosts. To get around this limitation, we leverage both
|
||||||
cascaded storage groups and non-FAST storage groups (i.e. a storage group with
|
cascaded storage groups and non-FAST storage groups (i.e. a storage group with
|
||||||
@ -1411,7 +1422,7 @@ https://docs.openstack.org/cinder/latest/configuration/block-storage/volume-encr
|
|||||||
16. Volume metadata in logs
|
16. Volume metadata in logs
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
If debug is enabled in the default section of the cinder.conf, VMAX Cinder
|
If debug is enabled in the default section of the cinder.conf, PowerMax Cinder
|
||||||
driver will log additional volume information in the Cinder volume log,
|
driver will log additional volume information in the Cinder volume log,
|
||||||
on each successful operation. The facilitates bridging the gap between
|
on each successful operation. The facilitates bridging the gap between
|
||||||
OpenStack and the Array by tracing and describing the volume from a VMAX/
|
OpenStack and the Array by tracing and describing the volume from a VMAX/
|
||||||
@ -1456,8 +1467,8 @@ Configure the source and target arrays
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
#. Configure an SRDF group between the chosen source and target
|
#. Configure an SRDF group between the chosen source and target
|
||||||
arrays for the VMAX Cinder driver to use. The source array must correspond
|
arrays for the PowerMax Cinder driver to use. The source array must
|
||||||
with the 'vmax_array' entry in the cinder.conf.
|
correspond with the 'vmax_array' entry in the cinder.conf.
|
||||||
#. Select both the director and the ports for the SRDF emulation to use on
|
#. Select both the director and the ports for the SRDF emulation to use on
|
||||||
both sides. Bear in mind that network topology is important when choosing
|
both sides. Bear in mind that network topology is important when choosing
|
||||||
director endpoints. Supported modes are `Synchronous`, `Asynchronous`,
|
director endpoints. Supported modes are `Synchronous`, `Asynchronous`,
|
||||||
@ -1486,7 +1497,7 @@ Configure the source and target arrays
|
|||||||
https://www.emc.com/collateral/technical-documentation/h14556-vmax3-srdf-metro-overview-and-best-practices-tech-note.pdf
|
https://www.emc.com/collateral/technical-documentation/h14556-vmax3-srdf-metro-overview-and-best-practices-tech-note.pdf
|
||||||
|
|
||||||
#. Enable replication in ``/etc/cinder/cinder.conf``.
|
#. Enable replication in ``/etc/cinder/cinder.conf``.
|
||||||
To enable the replication functionality in VMAX Cinder driver, it is
|
To enable the replication functionality in PowerMax Cinder driver, it is
|
||||||
necessary to create a replication volume-type. The corresponding
|
necessary to create a replication volume-type. The corresponding
|
||||||
back-end stanza in the ``cinder.conf`` for this volume-type must then
|
back-end stanza in the ``cinder.conf`` for this volume-type must then
|
||||||
include a ``replication_device`` parameter. This parameter defines a
|
include a ``replication_device`` parameter. This parameter defines a
|
||||||
@ -1495,16 +1506,16 @@ Configure the source and target arrays
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
enabled_backends = VMAX_FC_REPLICATION
|
enabled_backends = POWERMAX_FC_REPLICATION
|
||||||
[VMAX_FC_REPLICATION]
|
[POWERMAX_FC_REPLICATION]
|
||||||
volume_driver = cinder.volume.drivers.dell_emc.vmax_fc.VMAXFCDriver
|
volume_driver = cinder.volume.drivers.dell_emc.powermax.fc.PowerMaxFCDriver
|
||||||
san_ip = 10.10.10.10
|
san_ip = 10.10.10.10
|
||||||
san_login = my_u4v_username
|
san_login = my_u4v_username
|
||||||
san_password = my_u4v_password
|
san_password = my_u4v_password
|
||||||
vmax_srp = SRP_1
|
vmax_srp = SRP_1
|
||||||
vmax_array = 000123456789
|
vmax_array = 000123456789
|
||||||
vmax_port_groups = [OS-FC-PG]
|
vmax_port_groups = [OS-FC-PG]
|
||||||
volume_backend_name = VMAX_FC_REPLICATION
|
volume_backend_name = POWERMAX_FC_REPLICATION
|
||||||
replication_device = target_device_id:000197811111,
|
replication_device = target_device_id:000197811111,
|
||||||
remote_port_group:os-failover-pg,
|
remote_port_group:os-failover-pg,
|
||||||
remote_pool:SRP_1,
|
remote_pool:SRP_1,
|
||||||
@ -1520,11 +1531,11 @@ Configure the source and target arrays
|
|||||||
(separated by commas) in cinder.conf. They are displayed on separated lines
|
(separated by commas) in cinder.conf. They are displayed on separated lines
|
||||||
above for readiblity.
|
above for readiblity.
|
||||||
|
|
||||||
* ``target_device_id`` is a unique VMAX array serial number of the target
|
* ``target_device_id`` is a unique PowerMax array serial number of the target
|
||||||
array. For full failover functionality, the source and target VMAX arrays
|
array. For full failover functionality, the source and target PowerMax arrays
|
||||||
must be discovered and managed by the same U4V server.
|
must be discovered and managed by the same U4V server.
|
||||||
|
|
||||||
* ``remote_port_group`` is the name of a VMAX port group that has been
|
* ``remote_port_group`` is the name of a PowerMax port group that has been
|
||||||
pre-configured to expose volumes managed by this backend in the event
|
pre-configured to expose volumes managed by this backend in the event
|
||||||
of a failover. Make sure that this portgroup contains either all FC or
|
of a failover. Make sure that this portgroup contains either all FC or
|
||||||
all iSCSI port groups (for a given back end), as appropriate for the
|
all iSCSI port groups (for a given back end), as appropriate for the
|
||||||
@ -1532,8 +1543,8 @@ Configure the source and target arrays
|
|||||||
|
|
||||||
* ``remote_pool`` is the unique pool name for the given target array.
|
* ``remote_pool`` is the unique pool name for the given target array.
|
||||||
|
|
||||||
* ``rdf_group_label`` is the name of a VMAX SRDF group that has been pre-configured
|
* ``rdf_group_label`` is the name of a PowerMax SRDF group that has been
|
||||||
between the source and target arrays.
|
pre-configured between the source and target arrays.
|
||||||
|
|
||||||
* ``allow_extend`` is a flag for allowing the extension of replicated volumes.
|
* ``allow_extend`` is a flag for allowing the extension of replicated volumes.
|
||||||
To extend a volume in an SRDF relationship, this relationship must first be
|
To extend a volume in an SRDF relationship, this relationship must first be
|
||||||
@ -1570,21 +1581,21 @@ Configure the source and target arrays
|
|||||||
configured), no service level will be applied.
|
configured), no service level will be applied.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
The VMAX Cinder drivers can support a single replication target per
|
The PowerMax Cinder drivers can support a single replication target per
|
||||||
back-end, that is we do not support Concurrent SRDF or Cascaded SRDF.
|
back-end, that is we do not support Concurrent SRDF or Cascaded SRDF.
|
||||||
Ensure there is only a single ``replication_device`` entry per
|
Ensure there is only a single ``replication_device`` entry per
|
||||||
back-end stanza.
|
back-end stanza.
|
||||||
|
|
||||||
#. Create a ``replication-enabled`` volume type. Once the
|
#. Create a ``replication-enabled`` volume type. Once the
|
||||||
``replication_device`` parameter has been entered in the VMAX
|
``replication_device`` parameter has been entered in the PowerMax
|
||||||
backend entry in the ``cinder.conf``, a corresponding volume type
|
backend entry in the ``cinder.conf``, a corresponding volume type
|
||||||
needs to be created ``replication_enabled`` property set. See
|
needs to be created ``replication_enabled`` property set. See
|
||||||
above ``Setup VMAX drivers`` for details.
|
above ``Setup PowerMax drivers`` for details.
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# openstack volume type set --property replication_enabled="<is> True" \
|
# openstack volume type set --property replication_enabled="<is> True" \
|
||||||
VMAX_FC_REPLICATION
|
POWERMAX_FC_REPLICATION
|
||||||
|
|
||||||
|
|
||||||
Volume replication interoperability with other features
|
Volume replication interoperability with other features
|
||||||
@ -1594,7 +1605,7 @@ Most features are supported, except for the following:
|
|||||||
|
|
||||||
* Replication Group operations are available for volumes in Synchronous mode only.
|
* Replication Group operations are available for volumes in Synchronous mode only.
|
||||||
|
|
||||||
* Storage-assisted retype operations on replication-enabled VMAX volumes
|
* Storage-assisted retype operations on replication-enabled PowerMax volumes
|
||||||
(moving from a non-replicated type to a replicated-type and vice-versa.
|
(moving from a non-replicated type to a replicated-type and vice-versa.
|
||||||
Moving to another service level/workload combination, for example) are
|
Moving to another service level/workload combination, for example) are
|
||||||
not supported.
|
not supported.
|
||||||
@ -1629,14 +1640,14 @@ host command to failover to the configured target:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# cinder failover-host cinder_host@VMAX_FC_REPLICATION
|
# cinder failover-host cinder_host@POWERMAX_FC_REPLICATION
|
||||||
|
|
||||||
If the primary array becomes available again, you can initiate a failback
|
If the primary array becomes available again, you can initiate a failback
|
||||||
using the same command and specifying ``--backend_id default``:
|
using the same command and specifying ``--backend_id default``:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# cinder failover-host cinder_host@VMAX_FC_REPLICATION --backend_id default
|
# cinder failover-host cinder_host@POWERMAX_FC_REPLICATION --backend_id default
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -1682,7 +1693,7 @@ Volume retype - storage assisted volume migration
|
|||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
Volume retype with storage assisted migration is supported now for
|
Volume retype with storage assisted migration is supported now for
|
||||||
VMAX3 arrays. Cinder requires that for storage assisted migration, a
|
PowerMax arrays. Cinder requires that for storage assisted migration, a
|
||||||
volume cannot be retyped across backends. For using storage assisted volume
|
volume cannot be retyped across backends. For using storage assisted volume
|
||||||
retype, follow these steps:
|
retype, follow these steps:
|
||||||
|
|
||||||
@ -1690,7 +1701,7 @@ retype, follow these steps:
|
|||||||
another, use volume retype with the migration-policy to on-demand. The
|
another, use volume retype with the migration-policy to on-demand. The
|
||||||
target volume type should have the same volume_backend_name configured and
|
target volume type should have the same volume_backend_name configured and
|
||||||
should have the desired pool_name to which you are trying to retype to
|
should have the desired pool_name to which you are trying to retype to
|
||||||
(please refer to ``Setup VMAX Drivers`` for details).
|
(please refer to ``Setup PowerMax Drivers`` for details).
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -1711,7 +1722,7 @@ Generic volume group support
|
|||||||
|
|
||||||
Generic volume group operations are performed through the CLI using API
|
Generic volume group operations are performed through the CLI using API
|
||||||
version 3.1x of the Cinder API. Generic volume groups are multi-purpose
|
version 3.1x of the Cinder API. Generic volume groups are multi-purpose
|
||||||
groups which can be used for various features. The VMAX plugin supports
|
groups which can be used for various features. The PowerMax driver supports
|
||||||
consistent group snapshots and replication groups. Consistent group
|
consistent group snapshots and replication groups. Consistent group
|
||||||
snapshots allows the user to take group snapshots which
|
snapshots allows the user to take group snapshots which
|
||||||
are consistent based on the group specs. Replication groups allow for/
|
are consistent based on the group specs. Replication groups allow for/
|
||||||
@ -1735,14 +1746,14 @@ while creating the group.
|
|||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
# openstack volume type set --property replication_enabled="<is> True" /
|
# openstack volume type set --property replication_enabled="<is> True" /
|
||||||
VMAX_REPLICATION
|
POWERMAX_REPLICATION
|
||||||
|
|
||||||
If this key is not set on the group-spec or volume type, then the generic
|
If this key is not set on the group-spec or volume type, then the generic
|
||||||
volume group will be created/managed by Cinder (not the VMAX plugin).
|
volume group will be created/managed by Cinder (not the PowerMax driver).
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
The consistent group snapshot should not be confused with the VMAX
|
The consistent group snapshot should not be confused with the PowerMax
|
||||||
consistency group which is an SRDF construct.
|
consistency group which is an SRDF construct.
|
||||||
|
|
||||||
Replication groups
|
Replication groups
|
||||||
@ -1766,7 +1777,7 @@ without failing over the entire host. See below for usage.
|
|||||||
Storage Group Names
|
Storage Group Names
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Storage groups are created on the VMAX as a result of creation of generic
|
Storage groups are created on the PowerMax as a result of creation of generic
|
||||||
volume groups. These storage groups follow a different naming convention
|
volume groups. These storage groups follow a different naming convention
|
||||||
and are of the following format depending upon whether the groups have a
|
and are of the following format depending upon whether the groups have a
|
||||||
name.
|
name.
|
||||||
@ -1955,7 +1966,7 @@ the same format:
|
|||||||
+----------------+-------------------------------------------------------------+
|
+----------------+-------------------------------------------------------------+
|
||||||
| SRP | The Storage Resource Pool configured for use by the backend |
|
| SRP | The Storage Resource Pool configured for use by the backend |
|
||||||
+----------------+-------------------------------------------------------------+
|
+----------------+-------------------------------------------------------------+
|
||||||
| array_id | The VMAX serial number (12 digit numerical) |
|
| array_id | The PowerMax serial number (12 digit numerical) |
|
||||||
+----------------+-------------------------------------------------------------+
|
+----------------+-------------------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
@ -1979,18 +1990,18 @@ Command Example:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ cinder manage --name vmax_managed_volume --volume-type VMAX_ISCSI_DIAMOND \
|
$ cinder manage --name vmax_managed_volume --volume-type POWERMAX_ISCSI_DIAMOND \
|
||||||
--availability-zone nova demo@VMAX_ISCSI_DIAMOND#Diamond+SRP_1+111111111111 031D8
|
--availability-zone nova demo@POWERMAX_ISCSI_DIAMOND#Diamond+SRP_1+111111111111 031D8
|
||||||
|
|
||||||
After the above command has been run, the volume will be available for use in
|
After the above command has been run, the volume will be available for use in
|
||||||
the same way as any other OpenStack VMAX volume.
|
the same way as any other OpenStack PowerMax volume.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
An unmanaged volume with a prefix of 'OS-' in its identifier name cannot be
|
An unmanaged volume with a prefix of 'OS-' in its identifier name cannot be
|
||||||
managed into OpenStack, as this is a reserved keyword for managed volumes.
|
managed into OpenStack, as this is a reserved keyword for managed volumes.
|
||||||
If the identifier name has this prefix, an exception will be thrown by the
|
If the identifier name has this prefix, an exception will be thrown by the
|
||||||
VMAX driver on a manage operation.
|
PowerMax driver on a manage operation.
|
||||||
|
|
||||||
|
|
||||||
Managing Volumes with Replication Enabled
|
Managing Volumes with Replication Enabled
|
||||||
@ -1999,19 +2010,19 @@ Managing Volumes with Replication Enabled
|
|||||||
Whilst it is not possible to manage volumes into OpenStack that are part of a
|
Whilst it is not possible to manage volumes into OpenStack that are part of a
|
||||||
SRDF relationship, it is possible to manage a volume into OpenStack and
|
SRDF relationship, it is possible to manage a volume into OpenStack and
|
||||||
enable replication at the same time. This is done by having a replication
|
enable replication at the same time. This is done by having a replication
|
||||||
enabled VMAX volume type (for more information see section Volume Replication)
|
enabled PowerMax volume type (for more information see section Volume
|
||||||
during the manage volume process you specify the replication volume type as
|
Replication) during the manage volume process you specify the replication
|
||||||
the chosen volume type. Once managed, replication will be enabled for that
|
volume type as the chosen volume type. Once managed, replication will be
|
||||||
volume.
|
enabled for that volume.
|
||||||
|
|
||||||
|
|
||||||
Unmanage Volume
|
Unmanage Volume
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Unmanaging a volume is not the same as deleting a volume. When a volume is
|
Unmanaging a volume is not the same as deleting a volume. When a volume is
|
||||||
deleted from OpenStack, it is also deleted from the VMAX at the same time.
|
deleted from OpenStack, it is also deleted from the PowerMax at the same time.
|
||||||
Unmanaging a volume is the process whereby a volume is removed from OpenStack
|
Unmanaging a volume is the process whereby a volume is removed from OpenStack
|
||||||
but it remains for further use on the VMAX. The volume can also be managed
|
but it remains for further use on the PowerMax. The volume can also be managed
|
||||||
back into OpenStack at a later date using the process discussed in the
|
back into OpenStack at a later date using the process discussed in the
|
||||||
previous section. Unmanaging volume is carried out using the Cinder
|
previous section. Unmanaging volume is carried out using the Cinder
|
||||||
unmanage CLI command:
|
unmanage CLI command:
|
||||||
@ -2037,7 +2048,7 @@ the volume is no longer managed by OpenStack.
|
|||||||
Manage/Unmanage Snapshots
|
Manage/Unmanage Snapshots
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
Users can manage VMAX SnapVX snapshots into OpenStack if the source volume
|
Users can manage PowerMax SnapVX snapshots into OpenStack if the source volume
|
||||||
already exists in Cinder. Similarly, users will be able to unmanage OpenStack
|
already exists in Cinder. Similarly, users will be able to unmanage OpenStack
|
||||||
snapshots to remove them from Cinder but keep them on the storage backend.
|
snapshots to remove them from Cinder but keep them on the storage backend.
|
||||||
|
|
||||||
@ -2046,7 +2057,7 @@ Set-up, restrictions and requirements:
|
|||||||
#. No additional settings or configuration is required to support this
|
#. No additional settings or configuration is required to support this
|
||||||
functionality.
|
functionality.
|
||||||
|
|
||||||
#. Manage/Unmanage snapshots requires SnapVX functionality support on VMAX.
|
#. Manage/Unmanage snapshots requires SnapVX functionality support on PowerMax.
|
||||||
|
|
||||||
#. Manage/Unmanage Snapshots in OpenStack Cinder is only supported at present
|
#. Manage/Unmanage Snapshots in OpenStack Cinder is only supported at present
|
||||||
through Cinder CLI commands.
|
through Cinder CLI commands.
|
||||||
@ -2056,7 +2067,7 @@ Set-up, restrictions and requirements:
|
|||||||
Manage SnapVX Snapshot
|
Manage SnapVX Snapshot
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
It is possible to manage VMAX SnapVX snapshots into OpenStack, where the
|
It is possible to manage PowerMax SnapVX snapshots into OpenStack, where the
|
||||||
source volume from which the snapshot is taken already exists in, and is
|
source volume from which the snapshot is taken already exists in, and is
|
||||||
managed by OpenStack Cinder. The source volume may have been created in
|
managed by OpenStack Cinder. The source volume may have been created in
|
||||||
OpenStack Cinder, or it may have been managed in to OpenStack Cinder also.
|
OpenStack Cinder, or it may have been managed in to OpenStack Cinder also.
|
||||||
@ -2083,7 +2094,7 @@ Requirements/Restrictions:
|
|||||||
|
|
||||||
Command Structure:
|
Command Structure:
|
||||||
|
|
||||||
#. Identify your SnapVX snapshot for management on the VMAX, note the name.
|
#. Identify your SnapVX snapshot for management on the PowerMax, note the name.
|
||||||
|
|
||||||
#. Ensure the source volume is already managed into OpenStack Cinder, note
|
#. Ensure the source volume is already managed into OpenStack Cinder, note
|
||||||
the device ID.
|
the device ID.
|
||||||
@ -2104,7 +2115,7 @@ Positional arguments:
|
|||||||
|
|
||||||
- <volume name/id> - Source OpenStack volume name
|
- <volume name/id> - Source OpenStack volume name
|
||||||
|
|
||||||
- <identifier> - Name of existing snapshot on VMAX backend
|
- <identifier> - Name of existing snapshot on PowerMax backend
|
||||||
|
|
||||||
Optional arguments:
|
Optional arguments:
|
||||||
|
|
||||||
@ -2121,7 +2132,7 @@ Example:
|
|||||||
|
|
||||||
$ cinder snapshot-manage --name SnapshotManaged \
|
$ cinder snapshot-manage --name SnapshotManaged \
|
||||||
--description "Managed Queens Feb18" \
|
--description "Managed Queens Feb18" \
|
||||||
0021A VMAXSnapshot
|
0021A PowerMaxSnapshot
|
||||||
|
|
||||||
Where:
|
Where:
|
||||||
|
|
||||||
@ -2132,13 +2143,14 @@ Where:
|
|||||||
|
|
||||||
- The source volume device ID is ``0021A``.
|
- The source volume device ID is ``0021A``.
|
||||||
|
|
||||||
- The name of the SnapVX snapshot on the VMAX backend is ``VMAXSnapshot``.
|
- The name of the SnapVX snapshot on the PowerMax backend is
|
||||||
|
``PowerMaxSnapshot``.
|
||||||
|
|
||||||
Outcome:
|
Outcome:
|
||||||
|
|
||||||
After the process of managing the Snapshot has completed, the SnapVX snapshot
|
After the process of managing the Snapshot has completed, the SnapVX snapshot
|
||||||
on the VMAX backend will be prefixed by the letters ``OS-``, leaving the
|
on the PowerMax backend will be prefixed by the letters ``OS-``, leaving the
|
||||||
snapshot in this example named ``OS-VMAXSnapshot``. The associated snapshot
|
snapshot in this example named ``OS-PowerMaxSnapshot``. The associated snapshot
|
||||||
managed by Cinder will be present for use under the name ``SnapshotManaged``.
|
managed by Cinder will be present for use under the name ``SnapshotManaged``.
|
||||||
|
|
||||||
|
|
||||||
@ -2148,8 +2160,8 @@ Unmanage Cinder Snapshot
|
|||||||
Unmanaging a snapshot in Cinder is the process whereby the snapshot is removed
|
Unmanaging a snapshot in Cinder is the process whereby the snapshot is removed
|
||||||
from and no longer managed by Cinder, but it still exists on the storage
|
from and no longer managed by Cinder, but it still exists on the storage
|
||||||
backend. Unmanaging a SnapVX snapshot in OpenStack Cinder follows this
|
backend. Unmanaging a SnapVX snapshot in OpenStack Cinder follows this
|
||||||
behaviour, whereby after unmanaging a VMAX SnapVX snapshot from Cinder, the
|
behaviour, whereby after unmanaging a PowerMax SnapVX snapshot from Cinder, the
|
||||||
snapshot is removed from OpenStack but is still present for use on the VMAX
|
snapshot is removed from OpenStack but is still present for use on the PowerMax
|
||||||
backend.
|
backend.
|
||||||
|
|
||||||
Requirements/Restrictions:
|
Requirements/Restrictions:
|
||||||
@ -2181,9 +2193,9 @@ Where:
|
|||||||
- The SnapVX snapshot name in OpenStack Cinder is SnapshotManaged.
|
- The SnapVX snapshot name in OpenStack Cinder is SnapshotManaged.
|
||||||
|
|
||||||
After the process of unmanaging the SnapVX snapshot in Cinder, the snapshot on
|
After the process of unmanaging the SnapVX snapshot in Cinder, the snapshot on
|
||||||
the VMAX backend will have the ``OS-`` prefix removed to indicate it is no
|
the PowerMax backend will have the ``OS-`` prefix removed to indicate it is no
|
||||||
longer OpenStack managed. In the example above, the snapshot after unmanaging
|
longer OpenStack managed. In the example above, the snapshot after unmanaging
|
||||||
from OpenStack will be named ``VMAXSnapshot`` on the storage backend.
|
from OpenStack will be named ``PowerMaxSnapshot`` on the storage backend.
|
||||||
|
|
||||||
List manageable volumes and snapshots
|
List manageable volumes and snapshots
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
@ -2195,7 +2207,7 @@ Volumes that can be managed by and imported into Openstack.
|
|||||||
|
|
||||||
List manageable volume is filtered by:
|
List manageable volume is filtered by:
|
||||||
|
|
||||||
- Volume size should be 1026MB or greater (1GB VMAX Cinder Vol = 1026 MB)
|
- Volume size should be 1026MB or greater (1GB PowerMax Cinder Vol = 1026 MB)
|
||||||
- Volume size should be a whole integer GB capacity
|
- Volume size should be a whole integer GB capacity
|
||||||
- Volume should not be a part of masking view.
|
- Volume should not be a part of masking view.
|
||||||
- Volume status should be ``Ready``
|
- Volume status should be ``Ready``
|
@ -37,7 +37,7 @@ Driver Configuration Reference
|
|||||||
drivers/dell-storagecenter-driver
|
drivers/dell-storagecenter-driver
|
||||||
drivers/dell-emc-unity-driver
|
drivers/dell-emc-unity-driver
|
||||||
drivers/dell-emc-vnx-driver
|
drivers/dell-emc-vnx-driver
|
||||||
drivers/dell-emc-vmax-driver
|
drivers/dell-emc-powermax-driver
|
||||||
drivers/dell-emc-vxflex-driver
|
drivers/dell-emc-vxflex-driver
|
||||||
drivers/dell-emc-xtremio-driver
|
drivers/dell-emc-xtremio-driver
|
||||||
drivers/drbd-driver
|
drivers/drbd-driver
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
PowerMax driver - 'PowerMax' is to replace 'VMAX' in release notes,
|
||||||
|
online documentation, directory structure and driver name.
|
Loading…
x
Reference in New Issue
Block a user