Merge "[Unity] Driver supports the mode that does not create and destory share servers (DHSS=False)"
This commit is contained in:
commit
89383d9bfa
|
@ -121,21 +121,67 @@ for the Unity driver.
|
||||||
emc_nas_server = <management IP address of the Unity system>
|
emc_nas_server = <management IP address of the Unity system>
|
||||||
emc_nas_login = <user with administrator privilege>
|
emc_nas_login = <user with administrator privilege>
|
||||||
emc_nas_password = <password>
|
emc_nas_password = <password>
|
||||||
emc_nas_server_container = [SPA|SPB]
|
unity_server_meta_pool = <pool name>
|
||||||
emc_nas_pool_names = <Comma separated pool names>
|
unity_share_data_pools = <comma separated pool names>
|
||||||
emc_interface_ports = <Comma separated ports list>
|
unity_ethernet_ports = <comma separated ports list>
|
||||||
|
driver_handles_share_servers = True/False
|
||||||
|
unity_share_server = <name of NAS server in Unity system>
|
||||||
|
|
||||||
- `emc_share_backend` is the plugin name. Set it to `unity` for the Unity
|
- `emc_share_backend`
|
||||||
driver.
|
The plugin name. Set it to `unity` for the Unity driver.
|
||||||
- `emc_nas_server` is the management IP for Unity.
|
|
||||||
- `emc_nas_server_container` is the SP that will be used as share server.
|
- `emc_nas_server`
|
||||||
- `emc_nas_pool_names` is the name of the pools to be used by this backend.
|
The management IP for Unity.
|
||||||
If no name is specified, all storage pools on the system will be managed.
|
|
||||||
Wild card character is supported.
|
- `unity_server_meta_pool`
|
||||||
Examples: pool_1, pool_*, *
|
The name of the pool to persist the meta-data of NAS server.
|
||||||
- `emc_interface_ports` is the white list of the ports to be used for
|
This option is required.
|
||||||
connection. Wild card character is supported.
|
|
||||||
Examples: spa_eth1, spa_*, *
|
- `unity_share_data_pools`
|
||||||
|
Comma separated list specifying the name of the pools to be used
|
||||||
|
by this backend. Do not set this option if all storage pools
|
||||||
|
on the system can be used.
|
||||||
|
Wild card character is supported.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
# Only use pool_1
|
||||||
|
unity_share_data_pools = pool_1
|
||||||
|
# Only use pools whose name stars from pool_
|
||||||
|
unity_share_data_pools = pool_*
|
||||||
|
# Use all pools on Unity
|
||||||
|
unity_share_data_pools = *
|
||||||
|
|
||||||
|
- `unity_ethernet_ports`
|
||||||
|
Comma separated list specifying the ethernet ports of Unity system
|
||||||
|
that can be used for share. Do not set this option if all ethernet ports
|
||||||
|
can be used.
|
||||||
|
Wild card character is supported. Both the normal ethernet port and link
|
||||||
|
aggregation port can be used by Unity share driver.
|
||||||
|
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
# Only use spa_eth1
|
||||||
|
unity_ethernet_ports = spa_eth1
|
||||||
|
# Use port whose name stars from spa_
|
||||||
|
unity_ethernet_ports = spa_*
|
||||||
|
# Use all Link Aggregation ports
|
||||||
|
unity_ethernet_ports = sp*_la_*
|
||||||
|
# Use all available ports
|
||||||
|
unity_ethernet_ports = *
|
||||||
|
|
||||||
|
- `driver_handles_share_servers`
|
||||||
|
Unity driver requires this option to be as `True` or `False`.
|
||||||
|
Need to set `unity_share_server` when the value is `False`.
|
||||||
|
|
||||||
|
- `unity_share_server`
|
||||||
|
One of NAS server names in Unity, it is used for share creation when
|
||||||
|
the driver is in `DHSS=False` mode.
|
||||||
|
|
||||||
Restart of :term:`manila-share` service is needed for the configuration changes to take
|
Restart of :term:`manila-share` service is needed for the configuration changes to take
|
||||||
effect.
|
effect.
|
||||||
|
@ -149,22 +195,6 @@ into two parts:
|
||||||
1. The driver is able to manage share or snapshot in the Neutron IPv6 network.
|
1. The driver is able to manage share or snapshot in the Neutron IPv6 network.
|
||||||
2. The driver is able to connect Unity management interface using its IPv6 address.
|
2. The driver is able to connect Unity management interface using its IPv6 address.
|
||||||
|
|
||||||
Pre-Configurations for IPv6 support
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The following parameters need to be configured in `/etc/manila/manila.conf`
|
|
||||||
for the Unity driver:
|
|
||||||
|
|
||||||
network_plugin_ipv6_enabled = True
|
|
||||||
|
|
||||||
- `network_plugin_ipv6_enabled` indicates IPv6 is enabled.
|
|
||||||
|
|
||||||
If you want to connect Unity using IPv6 address, you should configure IPv6 address
|
|
||||||
by `/net/if/mgmt` uemcli command, `mgmtInterfaceSettings` RESTful api or the system
|
|
||||||
settings of Unity GUI for Unity and specify the address in `/etc/manila/manila.conf`:
|
|
||||||
|
|
||||||
emc_nas_server = <IPv6 address>
|
|
||||||
|
|
||||||
Snapshot support
|
Snapshot support
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
@ -176,44 +206,6 @@ create snapshots on shares of this share type. The feature is divided into two p
|
||||||
1. The driver is able to create/delete snapshot of share.
|
1. The driver is able to create/delete snapshot of share.
|
||||||
2. The driver is able to create share from snapshot.
|
2. The driver is able to create share from snapshot.
|
||||||
|
|
||||||
Pre-Configurations for Snapshot support
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The following extra specifications need to be configured with share type.
|
|
||||||
|
|
||||||
- snapshot_support = True
|
|
||||||
- create_share_from_snapshot_support = True
|
|
||||||
|
|
||||||
For new share type, these extra specifications can be set directly when creating share type:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
manila type-create --snapshot_support True --create_share_from_snapshot_support True ${share_type_name} True
|
|
||||||
|
|
||||||
Or you can update already existing share type with command:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
manila type-key ${share_type_name} set snapshot_support=True
|
|
||||||
manila type-key ${share_type_name} set create_share_from_snapshot_support=True
|
|
||||||
|
|
||||||
To snapshot a share and create share from the snapshot
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Firstly, you need create a share from share type that has extra specifications(snapshot_support=True, create_share_from_snapshot_support=True).
|
|
||||||
Then snapshot the share with command:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
manila snapshot-create ${source_share_name} --name ${target_snapshot_name} --description " "
|
|
||||||
|
|
||||||
After creating the snapshot from previous step, you can create share from that snapshot.
|
|
||||||
Use command:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
manila create nfs 1 --name ${target_share_name} --metadata source=snapshot --description " " --snapshot-id ${source_snapshot_id}
|
|
||||||
|
|
||||||
Restrictions
|
Restrictions
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,10 @@ Requirements
|
||||||
|
|
||||||
- Thin Provisioning
|
- Thin Provisioning
|
||||||
|
|
||||||
|
- Fiber Channel (FC)
|
||||||
|
|
||||||
|
- Internet Small Computer System Interface (iSCSI)
|
||||||
|
|
||||||
|
|
||||||
Supported shared filesystems and operations
|
Supported shared filesystems and operations
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -96,6 +100,109 @@ change the above mtu size from Unity Unisphere:
|
||||||
The Unity driver will select the port where mtu is equal to the mtu
|
The Unity driver will select the port where mtu is equal to the mtu
|
||||||
of share network during share server creation.
|
of share network during share server creation.
|
||||||
|
|
||||||
|
IPv6 support
|
||||||
|
------------
|
||||||
|
|
||||||
|
IPv6 support for Unity driver is introduced in Queens release. The feature is divided
|
||||||
|
into two parts:
|
||||||
|
|
||||||
|
#. The driver is able to manage share or snapshot in the Neutron IPv6 network.
|
||||||
|
#. The driver is able to connect Unity management interface using its IPv6 address.
|
||||||
|
|
||||||
|
Pre-Configurations for IPv6 support
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The following parameters need to be configured in `/etc/manila/manila.conf`
|
||||||
|
for the Unity driver:
|
||||||
|
|
||||||
|
network_plugin_ipv6_enabled = True
|
||||||
|
|
||||||
|
- `network_plugin_ipv6_enabled` indicates IPv6 is enabled.
|
||||||
|
|
||||||
|
If you want to connect Unity using IPv6 address, you should configure IPv6 address
|
||||||
|
by `/net/if/mgmt` uemcli command, `mgmtInterfaceSettings` RESTful api or the system
|
||||||
|
settings of Unity GUI for Unity and specify the address in `/etc/manila/manila.conf`:
|
||||||
|
|
||||||
|
emc_nas_server = <IPv6 address>
|
||||||
|
|
||||||
|
Supported share creation in mode that driver does not create and destroy share servers (DHSS=False)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To create a file share in this mode, you need to:
|
||||||
|
|
||||||
|
#. Create NAS server with network interface in Unity system.
|
||||||
|
#. Set 'driver_handles_share_servers=False' and 'unity_share_server' in ``/etc/manila/manila.conf``:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
driver_handles_share_servers = False
|
||||||
|
unity_share_server = <name of NAS server in Unity system>
|
||||||
|
|
||||||
|
#. Specify the share type with driver_handles_share_servers = False extra specification:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ manila type-create <share_type_name> False
|
||||||
|
|
||||||
|
#. Create share.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ manila create <share_protocol> <size> --name <share_name> --share-type <share_type_name>
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Do not specify the share network in share creation command because no share servers will be created.
|
||||||
|
Driver will use the unity_share_server specified for share creation.
|
||||||
|
|
||||||
|
Snapshot support
|
||||||
|
----------------
|
||||||
|
|
||||||
|
In the Mitaka and Newton release of OpenStack, Snapshot support is enabled by default for a newly created share type.
|
||||||
|
Starting with the Ocata release, the snapshot_support extra spec must be set to True in order to allow snapshots for
|
||||||
|
a share type. If the 'snapshot_support' extra_spec is omitted or if it is set to False, users would not be able to
|
||||||
|
create snapshots on shares of this share type. The feature is divided into two parts:
|
||||||
|
|
||||||
|
1. The driver is able to create/delete snapshot of share.
|
||||||
|
2. The driver is able to create share from snapshot.
|
||||||
|
|
||||||
|
Pre-Configurations for Snapshot support
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The following extra specifications need to be configured with share type.
|
||||||
|
|
||||||
|
- snapshot_support = True
|
||||||
|
- create_share_from_snapshot_support = True
|
||||||
|
|
||||||
|
For new share type, these extra specifications can be set directly when creating share type:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
manila type-create --snapshot_support True --create_share_from_snapshot_support True ${share_type_name} True
|
||||||
|
|
||||||
|
Or you can update already existing share type with command:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
manila type-key ${share_type_name} set snapshot_support=True
|
||||||
|
manila type-key ${share_type_name} set create_share_from_snapshot_support=True
|
||||||
|
|
||||||
|
To snapshot a share and create share from the snapshot
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Firstly, you need create a share from share type that has extra specifications(snapshot_support=True, create_share_from_snapshot_support=True).
|
||||||
|
Then snapshot the share with command:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
manila snapshot-create ${source_share_name} --name ${target_snapshot_name} --description " "
|
||||||
|
|
||||||
|
After creating the snapshot from previous step, you can create share from that snapshot.
|
||||||
|
Use command:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
manila create nfs 1 --name ${target_share_name} --metadata source=snapshot --description " " --snapshot-id ${source_snapshot_id}
|
||||||
|
|
||||||
Supported security services
|
Supported security services
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -164,7 +271,8 @@ for the Unity driver.
|
||||||
unity_server_meta_pool = <pool name>
|
unity_server_meta_pool = <pool name>
|
||||||
unity_share_data_pools = <comma separated pool names>
|
unity_share_data_pools = <comma separated pool names>
|
||||||
unity_ethernet_ports = <comma separated ports list>
|
unity_ethernet_ports = <comma separated ports list>
|
||||||
driver_handles_share_servers = True
|
driver_handles_share_servers = True/False
|
||||||
|
unity_share_server = <name of NAS server in Unity system>
|
||||||
|
|
||||||
- ``emc_share_backend``
|
- ``emc_share_backend``
|
||||||
The plugin name. Set it to `unity` for the Unity driver.
|
The plugin name. Set it to `unity` for the Unity driver.
|
||||||
|
@ -227,8 +335,12 @@ for the Unity driver.
|
||||||
impact.
|
impact.
|
||||||
|
|
||||||
- ``driver_handles_share_servers``
|
- ``driver_handles_share_servers``
|
||||||
Unity driver requires this option to be as ``True``.
|
Unity driver requires this option to be as ``True`` or ``False``.
|
||||||
|
Need to set ``unity_share_server`` when the value is ``False``.
|
||||||
|
|
||||||
|
- ``unity_share_server``
|
||||||
|
One of NAS server names in Unity, it is used for share creation when
|
||||||
|
the driver is in ``DHSS=False`` mode.
|
||||||
|
|
||||||
Restart of ``manila-share`` service is needed for the configuration
|
Restart of ``manila-share`` service is needed for the configuration
|
||||||
changes to take effect.
|
changes to take effect.
|
||||||
|
|
|
@ -24,3 +24,5 @@
|
||||||
- (String) Pool to persist the meta-data of NAS server.
|
- (String) Pool to persist the meta-data of NAS server.
|
||||||
* - ``unity_share_data_pools`` = ``None``
|
* - ``unity_share_data_pools`` = ``None``
|
||||||
- (List) Comma separated list of pools that can be used to persist share data.
|
- (List) Comma separated list of pools that can be used to persist share data.
|
||||||
|
* - ``unity_share_server`` = ``None``
|
||||||
|
- One of NAS server names in Unity, it is used for share creation when the driver is in ``DHSS=False`` mode..
|
||||||
|
|
|
@ -37,7 +37,11 @@ from manila.share.drivers.dell_emc.plugins.unity import utils as unity_utils
|
||||||
from manila.share import utils as share_utils
|
from manila.share import utils as share_utils
|
||||||
from manila import utils
|
from manila import utils
|
||||||
|
|
||||||
VERSION = "6.1.0"
|
"""Version history:
|
||||||
|
7.0.0 - Supports DHSS=False mode
|
||||||
|
"""
|
||||||
|
|
||||||
|
VERSION = "7.0.0"
|
||||||
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
SUPPORTED_NETWORK_TYPES = (None, 'flat', 'vlan')
|
SUPPORTED_NETWORK_TYPES = (None, 'flat', 'vlan')
|
||||||
|
@ -61,6 +65,10 @@ UNITY_OPTS = [
|
||||||
deprecated_reason='Unity driver supports nas server auto load '
|
deprecated_reason='Unity driver supports nas server auto load '
|
||||||
'balance.',
|
'balance.',
|
||||||
help='Storage processor to host the NAS server. Obsolete.'),
|
help='Storage processor to host the NAS server. Obsolete.'),
|
||||||
|
cfg.StrOpt('unity_share_server',
|
||||||
|
help='NAS server used for creating share when driver '
|
||||||
|
'is in DHSS=False mode. It is required when '
|
||||||
|
'driver_handles_share_servers=False in manila.conf.'),
|
||||||
]
|
]
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
@ -86,12 +94,13 @@ class UnityStorageConnection(driver.StorageConnection):
|
||||||
self.reserved_percentage = None
|
self.reserved_percentage = None
|
||||||
self.max_over_subscription_ratio = None
|
self.max_over_subscription_ratio = None
|
||||||
self.port_ids_conf = None
|
self.port_ids_conf = None
|
||||||
|
self.unity_share_server = None
|
||||||
self.ipv6_implemented = True
|
self.ipv6_implemented = True
|
||||||
self.revert_to_snap_support = True
|
self.revert_to_snap_support = True
|
||||||
self.shrink_share_support = True
|
self.shrink_share_support = True
|
||||||
|
|
||||||
# props from super class.
|
# props from super class.
|
||||||
self.driver_handles_share_servers = True
|
self.driver_handles_share_servers = (True, False)
|
||||||
|
|
||||||
def connect(self, emc_share_driver, context):
|
def connect(self, emc_share_driver, context):
|
||||||
"""Connect to Unity storage."""
|
"""Connect to Unity storage."""
|
||||||
|
@ -112,10 +121,25 @@ class UnityStorageConnection(driver.StorageConnection):
|
||||||
self.max_over_subscription_ratio = config.safe_get(
|
self.max_over_subscription_ratio = config.safe_get(
|
||||||
'max_over_subscription_ratio')
|
'max_over_subscription_ratio')
|
||||||
self.port_ids_conf = config.safe_get('unity_ethernet_ports')
|
self.port_ids_conf = config.safe_get('unity_ethernet_ports')
|
||||||
|
self.unity_share_server = config.safe_get('unity_share_server')
|
||||||
|
self.driver_handles_share_servers = config.safe_get(
|
||||||
|
'driver_handles_share_servers')
|
||||||
|
if (not self.driver_handles_share_servers) and (
|
||||||
|
not self.unity_share_server):
|
||||||
|
msg = ("Make sure there is NAS server name "
|
||||||
|
"configured for share creation when driver "
|
||||||
|
"is in DHSS=False mode.")
|
||||||
|
raise exception.BadConfigurationException(reason=msg)
|
||||||
self.validate_port_configuration(self.port_ids_conf)
|
self.validate_port_configuration(self.port_ids_conf)
|
||||||
pool_name = config.unity_server_meta_pool
|
pool_name = config.unity_server_meta_pool
|
||||||
self._config_pool(pool_name)
|
self._config_pool(pool_name)
|
||||||
|
|
||||||
|
def get_server_name(self, share_server=None):
|
||||||
|
if not self.driver_handles_share_servers:
|
||||||
|
return self.unity_share_server
|
||||||
|
else:
|
||||||
|
return self._get_server_name(share_server)
|
||||||
|
|
||||||
def validate_port_configuration(self, port_ids_conf):
|
def validate_port_configuration(self, port_ids_conf):
|
||||||
"""Initializes the SP and ports based on the port option."""
|
"""Initializes the SP and ports based on the port option."""
|
||||||
|
|
||||||
|
@ -165,9 +189,8 @@ class UnityStorageConnection(driver.StorageConnection):
|
||||||
|
|
||||||
# Get pool name from share host field
|
# Get pool name from share host field
|
||||||
pool_name = self._get_pool_name_from_host(share['host'])
|
pool_name = self._get_pool_name_from_host(share['host'])
|
||||||
# Get share server name from share server
|
# Get share server name from share server or manila.conf.
|
||||||
server_name = self._get_server_name(share_server)
|
server_name = self.get_server_name(share_server)
|
||||||
|
|
||||||
pool = self.client.get_pool(pool_name)
|
pool = self.client.get_pool(pool_name)
|
||||||
try:
|
try:
|
||||||
nas_server = self.client.get_nas_server(server_name)
|
nas_server = self.client.get_nas_server(server_name)
|
||||||
|
@ -207,7 +230,7 @@ class UnityStorageConnection(driver.StorageConnection):
|
||||||
self._validate_share_protocol(share_proto)
|
self._validate_share_protocol(share_proto)
|
||||||
|
|
||||||
# Get share server name from share server
|
# Get share server name from share server
|
||||||
server_name = self._get_server_name(share_server)
|
server_name = self.get_server_name(share_server)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
nas_server = self.client.get_nas_server(server_name)
|
nas_server = self.client.get_nas_server(server_name)
|
||||||
|
|
|
@ -188,6 +188,42 @@ nfs_share:
|
||||||
export_locations: []
|
export_locations: []
|
||||||
is_public: False
|
is_public: False
|
||||||
|
|
||||||
|
dhss_false_cifs_share:
|
||||||
|
_type: 'share'
|
||||||
|
_properties: &dhss_false_cifs_share_prop
|
||||||
|
share_id: '708e753c-aacb-411f-9c8a-8b8175da4e73'
|
||||||
|
availability_zone_id: 'de628fb6-1c99-41f6-a06a-adb61ff693b5'
|
||||||
|
share_network_id: '232d8218-2743-41d1-832b-4194626e691e'
|
||||||
|
share_server_id: 'test-dhss-false-427f-b4de-0ad83el5j8'
|
||||||
|
id: '716100cc-e0b4-416b-ac27-d38dd019330d'
|
||||||
|
size: 1
|
||||||
|
user_id: '19bbda71b578471a93363653dcb4c61d'
|
||||||
|
status: 'creating'
|
||||||
|
share_type_id: '57679eab-3e67-4052-b180-62b609670e93'
|
||||||
|
host: 'openstack@VNX#Pool_2'
|
||||||
|
display_name: 'cifs_share'
|
||||||
|
share_proto: 'CIFS'
|
||||||
|
export_locations: []
|
||||||
|
is_public: False
|
||||||
|
|
||||||
|
dhss_false_nfs_share:
|
||||||
|
_type: 'share'
|
||||||
|
_properties: &dhss_false_nfs_share_prop
|
||||||
|
share_id: '12eb3777-7008-4721-8243-422507db8f9d'
|
||||||
|
availability_zone_id: 'de628fb6-1c99-41f6-a06a-adb61ff693b5'
|
||||||
|
share_network_id: '232d8218-2743-41d1-832b-4194626e691e'
|
||||||
|
share_server_id: 'test-dhss-false-427f-b4de-0ad83el5j8'
|
||||||
|
id: 'cb532599-8dc6-4c3e-bb21-74ea54be566c'
|
||||||
|
size: 1
|
||||||
|
user_id: '19bbda71b578471a93363653dcb4c61d'
|
||||||
|
status: 'creating'
|
||||||
|
share_type_id: '57679eab-3e67-4052-b180-62b609670e93'
|
||||||
|
host: 'openstack@VNX#Pool_2'
|
||||||
|
display_name: 'nfs_share'
|
||||||
|
share_proto: 'NFS'
|
||||||
|
export_locations: []
|
||||||
|
is_public: False
|
||||||
|
|
||||||
shrink_cifs_share:
|
shrink_cifs_share:
|
||||||
_type: 'share'
|
_type: 'share'
|
||||||
_properties: &shrink_cifs_share_prop
|
_properties: &shrink_cifs_share_prop
|
||||||
|
|
|
@ -190,6 +190,9 @@ unity_base: &unity_base
|
||||||
test_connect: &test_connect
|
test_connect: &test_connect
|
||||||
unity: *unity_base
|
unity: *unity_base
|
||||||
|
|
||||||
|
test_dhss_false_connect: &test_dhss_false_connect
|
||||||
|
unity: *unity_base
|
||||||
|
|
||||||
test_connect__invalid_sp_configuration:
|
test_connect__invalid_sp_configuration:
|
||||||
unity:
|
unity:
|
||||||
_methods:
|
_methods:
|
||||||
|
@ -247,6 +250,55 @@ test_create_cifs_share:
|
||||||
_side_effect: [*pool__test_create_cifs_share]
|
_side_effect: [*pool__test_create_cifs_share]
|
||||||
get_nas_server: *nas_server
|
get_nas_server: *nas_server
|
||||||
|
|
||||||
|
test_dhss_false_create_nfs_share:
|
||||||
|
nfs_share: &nfs_share__test_dhss_false_create_nfs_share
|
||||||
|
_properties:
|
||||||
|
<<: *nfs_share_base_prop
|
||||||
|
name: 'cb532599-8dc6-4c3e-bb21-74ea54be566c'
|
||||||
|
|
||||||
|
pool: &pool__test_dhss_false_create_nfs_share
|
||||||
|
_properties:
|
||||||
|
<<: *pool_base_prop
|
||||||
|
name: 'Pool_2'
|
||||||
|
_methods:
|
||||||
|
create_nfs_share: None
|
||||||
|
|
||||||
|
unity:
|
||||||
|
_methods:
|
||||||
|
<<: *unity_base_method
|
||||||
|
get_pool:
|
||||||
|
_side_effect: [*pool__test_dhss_false_create_nfs_share]
|
||||||
|
get_nas_server: *nas_server
|
||||||
|
|
||||||
|
test_dhss_false_create_cifs_share:
|
||||||
|
cifs_share: &cifs_share__test_dhss_false_create_cifs_share
|
||||||
|
_properties:
|
||||||
|
<<: *cifs_share_base_prop
|
||||||
|
name: '716100cc-e0b4-416b-ac27-d38dd019330d'
|
||||||
|
_methods:
|
||||||
|
enable_ace:
|
||||||
|
|
||||||
|
filesystem: &filesystem__test_dhss_false_create_cifs_share
|
||||||
|
_properties: &filesystem_prop__test_dhss_false_create_cifs_share
|
||||||
|
<<: *filesystem_base_prop
|
||||||
|
name: '716100cc-e0b4-416b-ac27-d38dd4587340'
|
||||||
|
_methods:
|
||||||
|
create_cifs_share: *cifs_share__test_dhss_false_create_cifs_share
|
||||||
|
|
||||||
|
pool: &pool__test_dhss_false_create_cifs_share
|
||||||
|
_properties:
|
||||||
|
<<: *pool_base_prop
|
||||||
|
name: 'Pool_2'
|
||||||
|
_methods:
|
||||||
|
create_filesystem: *filesystem__test_dhss_false_create_cifs_share
|
||||||
|
|
||||||
|
unity:
|
||||||
|
_methods:
|
||||||
|
<<: *unity_base_method
|
||||||
|
get_pool:
|
||||||
|
_side_effect: [*pool__test_dhss_false_create_cifs_share]
|
||||||
|
get_nas_server: *nas_server
|
||||||
|
|
||||||
test_create_share_with_invalid_share_server:
|
test_create_share_with_invalid_share_server:
|
||||||
pool: &pool__test_create_share_with_invalid_share_server
|
pool: &pool__test_create_share_with_invalid_share_server
|
||||||
_properties:
|
_properties:
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
|
from oslo_config import cfg
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
|
|
||||||
from manila.share import configuration as conf
|
from manila.share import configuration as conf
|
||||||
|
@ -34,6 +35,7 @@ SYMBOL_PROPERTIES = '_properties'
|
||||||
SYMBOL_METHODS = '_methods'
|
SYMBOL_METHODS = '_methods'
|
||||||
SYMBOL_SIDE_EFFECT = '_side_effect'
|
SYMBOL_SIDE_EFFECT = '_side_effect'
|
||||||
SYMBOL_RAISE = '_raise'
|
SYMBOL_RAISE = '_raise'
|
||||||
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
|
||||||
def _has_side_effect(node):
|
def _has_side_effect(node):
|
||||||
|
@ -84,7 +86,9 @@ def fake_access(**kwargs):
|
||||||
|
|
||||||
|
|
||||||
class FakeEMCShareDriver(object):
|
class FakeEMCShareDriver(object):
|
||||||
def __init__(self):
|
def __init__(self, dhss=None):
|
||||||
|
if dhss in (True, False):
|
||||||
|
CONF.set_default('driver_handles_share_servers', dhss)
|
||||||
self.configuration = conf.Configuration(None)
|
self.configuration = conf.Configuration(None)
|
||||||
self.configuration.emc_share_backend = 'unity'
|
self.configuration.emc_share_backend = 'unity'
|
||||||
self.configuration.emc_nas_server = '192.168.1.1'
|
self.configuration.emc_nas_server = '192.168.1.1'
|
||||||
|
@ -258,6 +262,7 @@ unity_res = StorageResourceMock('mocked_unity.yaml')
|
||||||
STORAGE_RES_MAPPING = {
|
STORAGE_RES_MAPPING = {
|
||||||
'TestClient': unity_res,
|
'TestClient': unity_res,
|
||||||
'TestConnection': unity_res,
|
'TestConnection': unity_res,
|
||||||
|
'TestConnectionDHSSFalse': unity_res,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ class TestConnection(test.TestCase):
|
||||||
|
|
||||||
@res_mock.patch_connection_init
|
@res_mock.patch_connection_init
|
||||||
def test_connect(self, connection):
|
def test_connect(self, connection):
|
||||||
connection.connect(res_mock.FakeEMCShareDriver(), None)
|
connection.connect(res_mock.FakeEMCShareDriver(dhss=True), None)
|
||||||
|
|
||||||
@res_mock.patch_connection
|
@res_mock.patch_connection
|
||||||
def test_connect__invalid_pool_configuration(self, connection):
|
def test_connect__invalid_pool_configuration(self, connection):
|
||||||
|
@ -692,3 +692,45 @@ class TestConnection(test.TestCase):
|
||||||
|
|
||||||
connection.revert_to_snapshot(context, snapshot, share_access_rules,
|
connection.revert_to_snapshot(context, snapshot, share_access_rules,
|
||||||
snapshot_access_rules)
|
snapshot_access_rules)
|
||||||
|
|
||||||
|
@res_mock.patch_connection_init
|
||||||
|
def test_dhss_false_connect_without_nas_server(self, connection):
|
||||||
|
self.assertRaises(exception.BadConfigurationException,
|
||||||
|
connection.connect,
|
||||||
|
res_mock.FakeEMCShareDriver(dhss=False), None)
|
||||||
|
|
||||||
|
@res_mock.mock_manila_input
|
||||||
|
@res_mock.patch_connection
|
||||||
|
def test_dhss_false_create_nfs_share(self, connection, mocked_input):
|
||||||
|
connection.driver_handles_share_servers = False
|
||||||
|
connection.unity_share_server = 'test-dhss-false-427f-b4de-0ad83el5j8'
|
||||||
|
share = mocked_input['dhss_false_nfs_share']
|
||||||
|
share_server = mocked_input['share_server']
|
||||||
|
|
||||||
|
location = connection.create_share(None, share, share_server)
|
||||||
|
|
||||||
|
exp_location = [
|
||||||
|
{'path': 'fake_ip_addr_1:/cb532599-8dc6-4c3e-bb21-74ea54be566c'},
|
||||||
|
{'path': 'fake_ip_addr_2:/cb532599-8dc6-4c3e-bb21-74ea54be566c'},
|
||||||
|
]
|
||||||
|
exp_location = sorted(exp_location, key=lambda x: sorted(x['path']))
|
||||||
|
location = sorted(location, key=lambda x: sorted(x['path']))
|
||||||
|
self.assertEqual(exp_location, location)
|
||||||
|
|
||||||
|
@res_mock.mock_manila_input
|
||||||
|
@res_mock.patch_connection
|
||||||
|
def test_dhss_false_create_cifs_share(self, connection, mocked_input):
|
||||||
|
connection.driver_handles_share_servers = False
|
||||||
|
connection.unity_share_server = 'test-dhss-false-427f-b4de-0ad83el5j8'
|
||||||
|
share = mocked_input['dhss_false_cifs_share']
|
||||||
|
share_server = mocked_input['share_server']
|
||||||
|
|
||||||
|
location = connection.create_share(None, share, share_server)
|
||||||
|
|
||||||
|
exp_location = [
|
||||||
|
{'path': r'\\fake_ip_addr_1\716100cc-e0b4-416b-ac27-d38dd019330d'},
|
||||||
|
{'path': r'\\fake_ip_addr_2\716100cc-e0b4-416b-ac27-d38dd019330d'},
|
||||||
|
]
|
||||||
|
exp_location = sorted(exp_location, key=lambda x: sorted(x['path']))
|
||||||
|
location = sorted(location, key=lambda x: sorted(x['path']))
|
||||||
|
self.assertEqual(exp_location, location)
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
features:
|
||||||
|
- Dell EMC Unity Manila driver now supports the mode in which it does
|
||||||
|
not itself create and destroy share servers (DHSS=False).
|
Loading…
Reference in New Issue