Merge "PureStorage FlashArray: Add active/active replication"
This commit is contained in:
commit
db0f997401
@ -2881,7 +2881,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase):
|
|||||||
array2.get_volume.return_value = REPLICATED_VOLUME_SNAPS
|
array2.get_volume.return_value = REPLICATED_VOLUME_SNAPS
|
||||||
|
|
||||||
context = mock.MagicMock()
|
context = mock.MagicMock()
|
||||||
new_active_id, volume_updates, __ = self.driver.failover_host(
|
new_active_id, volume_updates, __ = self.driver.failover(
|
||||||
context,
|
context,
|
||||||
REPLICATED_VOLUME_OBJS,
|
REPLICATED_VOLUME_OBJS,
|
||||||
None,
|
None,
|
||||||
@ -2959,7 +2959,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase):
|
|||||||
{"name": sync_replicated_vol_name}
|
{"name": sync_replicated_vol_name}
|
||||||
]
|
]
|
||||||
|
|
||||||
new_active_id, volume_updates, __ = self.driver.failover_host(
|
new_active_id, volume_updates, __ = self.driver.failover(
|
||||||
context,
|
context,
|
||||||
[
|
[
|
||||||
not_replicated_vol,
|
not_replicated_vol,
|
||||||
@ -3022,7 +3022,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase):
|
|||||||
mock_get_array,
|
mock_get_array,
|
||||||
array2.get_volume,
|
array2.get_volume,
|
||||||
self.async_array2.copy_volume],
|
self.async_array2.copy_volume],
|
||||||
self.driver.failover_host,
|
self.driver.failover,
|
||||||
mock.Mock(), REPLICATED_VOLUME_OBJS, None
|
mock.Mock(), REPLICATED_VOLUME_OBJS, None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1929,6 +1929,31 @@ class PureBaseVolumeDriver(san.SanDriver):
|
|||||||
|
|
||||||
@pure_driver_debug_trace
|
@pure_driver_debug_trace
|
||||||
def failover_host(self, context, volumes, secondary_id=None, groups=None):
|
def failover_host(self, context, volumes, secondary_id=None, groups=None):
|
||||||
|
"""Failover to replication target.
|
||||||
|
|
||||||
|
This function combines calls to failover() and failover_completed() to
|
||||||
|
perform failover when Active/Active is not enabled.
|
||||||
|
"""
|
||||||
|
active_backend_id, volume_update_list, group_update_list = (
|
||||||
|
self.failover(context, volumes, secondary_id, groups))
|
||||||
|
self.failover_completed(context, secondary_id)
|
||||||
|
return active_backend_id, volume_update_list, group_update_list
|
||||||
|
|
||||||
|
@pure_driver_debug_trace
|
||||||
|
def failover_completed(self, context, secondary_id=None):
|
||||||
|
"""Failover to replication target."""
|
||||||
|
LOG.info('Driver failover completion started.')
|
||||||
|
if secondary_id == 'default':
|
||||||
|
self._swap_replication_state(self._get_current_array(),
|
||||||
|
self._failed_over_primary_array,
|
||||||
|
failback=True)
|
||||||
|
else:
|
||||||
|
self._swap_replication_state(self._get_current_array(),
|
||||||
|
self._find_sync_failover_target())
|
||||||
|
LOG.info('Driver failover completion completed.')
|
||||||
|
|
||||||
|
@pure_driver_debug_trace
|
||||||
|
def failover(self, context, volumes, secondary_id=None, groups=None):
|
||||||
"""Failover backend to a secondary array
|
"""Failover backend to a secondary array
|
||||||
|
|
||||||
This action will not affect the original volumes in any
|
This action will not affect the original volumes in any
|
||||||
@ -1964,9 +1989,6 @@ class PureBaseVolumeDriver(san.SanDriver):
|
|||||||
'status': 'error',
|
'status': 'error',
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
self._swap_replication_state(current_array,
|
|
||||||
self._failed_over_primary_array,
|
|
||||||
failback=True)
|
|
||||||
return secondary_id, model_updates, []
|
return secondary_id, model_updates, []
|
||||||
else:
|
else:
|
||||||
msg = _('Unable to failback to "default", this can only be '
|
msg = _('Unable to failback to "default", this can only be '
|
||||||
@ -2037,7 +2059,6 @@ class PureBaseVolumeDriver(san.SanDriver):
|
|||||||
model_updates = self._sync_failover_host(volumes, secondary_array)
|
model_updates = self._sync_failover_host(volumes, secondary_array)
|
||||||
|
|
||||||
current_array = self._get_current_array()
|
current_array = self._get_current_array()
|
||||||
self._swap_replication_state(current_array, secondary_array)
|
|
||||||
|
|
||||||
return secondary_array.backend_id, model_updates, []
|
return secondary_array.backend_id, model_updates, []
|
||||||
|
|
||||||
@ -2097,7 +2118,7 @@ class PureBaseVolumeDriver(san.SanDriver):
|
|||||||
if secondary_array in self._uniform_active_cluster_target_arrays:
|
if secondary_array in self._uniform_active_cluster_target_arrays:
|
||||||
self._uniform_active_cluster_target_arrays.remove(
|
self._uniform_active_cluster_target_arrays.remove(
|
||||||
secondary_array)
|
secondary_array)
|
||||||
current_array.unform = True
|
current_array.uniform = True
|
||||||
self._uniform_active_cluster_target_arrays.append(current_array)
|
self._uniform_active_cluster_target_arrays.append(current_array)
|
||||||
|
|
||||||
self._set_current_array(secondary_array)
|
self._set_current_array(secondary_array)
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Pure Storage FlashArray driver: Enabled support for Active/Active
|
||||||
|
replication for the FlashArray driver. This allows users to configure
|
||||||
|
FlashArray backends in clustered environments.
|
Loading…
Reference in New Issue
Block a user