DEDUP_API_VERSION = 30201120
FLASH_CACHE_API_VERSION = 30201200
SRSTATLD_API_VERSION = 30201200
+REMOTE_COPY_API_VERSION = 30202290
hpe3par_opts = [
cfg.StrOpt('hpe3par_api_url',
3.0.6 - Adding manage/unmanage snapshot support
3.0.7 - Enable standard capabilities based on 3PAR licenses
3.0.8 - Optimize array ID retrieval
+ 3.0.9 - Bump minimum API version for volume replication
"""
- VERSION = "3.0.8"
+ VERSION = "3.0.9"
stats = {}
self.client = self._create_client(timeout=timeout)
wsapi_version = self.client.getWsApiVersion()
self.API_VERSION = wsapi_version['build']
+
+ # If replication is properly configured, the primary array's
+ # API version must meet the minimum requirements.
+ if self._replication_enabled and (
+ self.API_VERSION < REMOTE_COPY_API_VERSION):
+ self._replication_enabled = False
+ msg = (_LE("The primary array must have an API version of "
+ "%(min_ver)s or higher, but is only on "
+ "%(current_ver)s, therefore replication is not "
+ "supported.") %
+ {'min_ver': REMOTE_COPY_API_VERSION,
+ 'current_ver': self.API_VERSION})
+ LOG.error(msg)
except hpeexceptions.UnsupportedVersion as ex:
# In the event we cannot contact the configured primary array,
# we want to allow a failover if replication is enabled.
dev.get('hpe3par_iscsi_chap_enabled') == 'True')
array_name = remote_array['target_device_id']
- # Make sure we can log into the client, that it has been
- # correctly configured, and it its version matches the
- # primary arrarys version.
+ # Make sure we can log into the array, that it has been
+ # correctly configured, and its API version meets the
+ # minimum requirement.
cl = None
try:
cl = self._create_replication_client(remote_array)
remote_array['id'] = array_id
wsapi_version = cl.getWsApiVersion()['build']
- if self.client is not None and (
- wsapi_version != self.API_VERSION):
- msg = (_LW("The target array and all of its secondary "
- "arrays must be on the same API version. "
- "Array '%(target)s' is on %(target_ver)s "
- "while the primary array is on "
- "%(primary_ver)s, therefore it will not "
- "be added as a valid replication target.") %
+ if wsapi_version < REMOTE_COPY_API_VERSION:
+ msg = (_LW("The secondary array must have an API "
+ "version of %(min_ver)s or higher. Array "
+ "'%(target)s' is on %(target_ver)s, "
+ "therefore it will not be added as a valid "
+ "replication target.") %
{'target': array_name,
- 'target_ver': wsapi_version,
- 'primary_ver': self.API_VERSION})
+ 'min_ver': REMOTE_COPY_API_VERSION,
+ 'target_ver': wsapi_version})
LOG.warning(msg)
elif not self._is_valid_replication_array(remote_array):
msg = (_LW("'%s' is not a valid replication array. "