mock.call.logout()]
mock_client.assert_has_calls(expected)
- @mock.patch.object(volume_types, 'get_volume_type')
- def test_retype_snap_cpg_check(self, _mock_volume_types):
- _mock_volume_types.return_value = self.RETYPE_VOLUME_TYPE_1
- mock_client = self.setup_driver(mock_conf=self.RETYPE_CONF)
- mock_client.getVolume.return_value = self.RETYPE_VOLUME_INFO_NO_SNAP
-
- self.assertRaises(exception.InvalidVolume,
- self.driver.retype,
- self.ctxt,
- self.RETYPE_VOLUME_INFO_NO_SNAP,
- self.RETYPE_VOLUME_TYPE_1,
- self.RETYPE_DIFF,
- self.RETYPE_HOST)
-
- expected = [
- mock.call.login(HP3PAR_USER_NAME, HP3PAR_USER_PASS),
- mock.call.getVolume(self.VOLUME_3PAR_NAME),
- mock.call.getStorageSystemInfo(),
- mock.call.logout()]
- mock_client.assert_has_calls(expected)
-
@mock.patch.object(volume_types, 'get_volume_type')
def test_retype_specs_error_reverts_snap_cpg(self, _mock_volume_types):
_mock_volume_types.side_effect = [
{'domain': 'cpg_domain'},
{'domain': 'cpg_domain'},
{'domain': 'snap_cpg_domain_1'},
- {'domain': 'snap_cpg_domain_2'},
]
self.assertRaises(exception.Invalid3PARDomain,
mock.call.getStorageSystemInfo(),
mock.call.getCPG(self.RETYPE_VOLUME_INFO_0['userCPG']),
mock.call.getCPG(self.RETYPE_VOLUME_TYPE_1['extra_specs']['cpg']),
- mock.call.getCPG(self.RETYPE_VOLUME_INFO_0['snapCPG']),
mock.call.getCPG(
self.RETYPE_VOLUME_TYPE_1['extra_specs']['snap_cpg']),
mock.call.logout()
2.0.18 - HP 3PAR manage_existing with volume-type support
2.0.19 - Update default persona from Generic to Generic-ALUA
2.0.20 - Configurable SSH missing key policy and known hosts file
+ 2.0.21 - Remove bogus invalid snapCPG=None exception
"""
- VERSION = "2.0.20"
+ VERSION = "2.0.21"
stats = {}
def _retype_pre_checks(self, host, new_persona,
old_cpg, new_cpg,
- old_snap_cpg, new_snap_cpg):
+ new_snap_cpg):
"""Test retype parameters before making retype changes.
Do pre-retype parameter validation. These checks will
reason = (_("Cannot retype from one 3PAR array to another."))
raise exception.InvalidHost(reason)
- if not old_snap_cpg:
- reason = (_("Invalid current snapCPG name for retype. The volume "
- "may be in a transitioning state. snapCpg='%s'.") %
- old_snap_cpg)
- raise exception.InvalidVolume(reason)
-
# Validate new_snap_cpg. A white-space snapCPG will fail eventually,
# but we'd prefer to fail fast -- if this ever happens.
if not new_snap_cpg or new_snap_cpg.isspace():
raise exception.InvalidInput(reason)
# Check to make sure CPGs are in the same domain
- if self.get_domain(old_cpg) != self.get_domain(new_cpg):
+ domain = self.get_domain(old_cpg)
+ if domain != self.get_domain(new_cpg):
reason = (_('Cannot retype to a CPG in a different domain.'))
raise exception.Invalid3PARDomain(reason)
- if self.get_domain(old_snap_cpg) != self.get_domain(new_snap_cpg):
+ if domain != self.get_domain(new_snap_cpg):
reason = (_('Cannot retype to a snap CPG in a different domain.'))
raise exception.Invalid3PARDomain(reason)
self._retype_pre_checks(host, new_persona,
old_cpg, new_cpg,
- old_snap_cpg, new_snap_cpg)
+ new_snap_cpg)
flow_name = action.replace(":", "_") + "_api"
retype_flow = linear_flow.Flow(flow_name)