Merge "Lightos - add lightos new volume states"
This commit is contained in:
commit
1961107aca
|
@ -399,7 +399,7 @@ class LightOSStorageVolumeDriverTest(test.TestCase):
|
|||
self.driver.delete_volume(volume)
|
||||
db.volume_destroy(self.ctxt, volume.id)
|
||||
|
||||
def test_create_volume_in_failed_state(self):
|
||||
def _create_volume_in_failed_state(self, vol_state):
|
||||
"""Verify scenario of created volume in failed state:
|
||||
|
||||
Driver is expected to issue a deletion command and raise exception
|
||||
|
@ -415,25 +415,16 @@ class LightOSStorageVolumeDriverTest(test.TestCase):
|
|||
"compression": kwargs["compression"],
|
||||
"src_snapshot_name": kwargs["src_snapshot_name"],
|
||||
"acl": {'values': kwargs.get('acl')},
|
||||
"state": "Failed",
|
||||
"state": vol_state,
|
||||
}
|
||||
volume["ETag"] = get_vol_etag(volume)
|
||||
code, new_vol = self.db.create_volume(volume)
|
||||
return (code, new_vol)
|
||||
elif cmd == "delete_volume":
|
||||
return self.db.delete_volume(kwargs["project_name"],
|
||||
kwargs["volume_uuid"])
|
||||
elif cmd == "get_volume":
|
||||
return self.db.get_volume_by_uuid(kwargs["project_name"],
|
||||
kwargs["volume_uuid"])
|
||||
elif cmd == "get_volume_by_name":
|
||||
return self.db.get_volume_by_name(kwargs["project_name"],
|
||||
kwargs["volume_name"])
|
||||
else:
|
||||
raise RuntimeError(
|
||||
f"'{cmd}' is not implemented. kwargs: {kwargs}")
|
||||
return cluster_send_cmd(cmd, **kwargs)
|
||||
|
||||
self.driver.do_setup(None)
|
||||
cluster_send_cmd = deepcopy(self.driver.cluster.send_cmd)
|
||||
self.driver.cluster.send_cmd = send_cmd_mock
|
||||
vol_type = test_utils.create_volume_type(self.ctxt, self,
|
||||
name='my_vol_type')
|
||||
|
@ -446,6 +437,48 @@ class LightOSStorageVolumeDriverTest(test.TestCase):
|
|||
self.assertEqual(0, len(actual_volumes))
|
||||
db.volume_destroy(self.ctxt, volume.id)
|
||||
|
||||
def test_create_volume_in_failed_state(self):
|
||||
self._create_volume_in_failed_state("Failed")
|
||||
|
||||
def test_create_volume_in_rollback_state(self):
|
||||
self._create_volume_in_failed_state("Rollback")
|
||||
|
||||
def test_create_volume_in_migrating_state_succeed(self):
|
||||
"""Verify scenario of created volume in migrating state:
|
||||
|
||||
Driver is expected to succeed.
|
||||
"""
|
||||
def send_cmd_mock(cmd, **kwargs):
|
||||
if cmd == "create_volume":
|
||||
project_name = kwargs["project_name"]
|
||||
volume = {
|
||||
"project_name": project_name,
|
||||
"name": kwargs["name"],
|
||||
"size": kwargs["size"],
|
||||
"n_replicas": kwargs["n_replicas"],
|
||||
"compression": kwargs["compression"],
|
||||
"src_snapshot_name": kwargs["src_snapshot_name"],
|
||||
"acl": {'values': kwargs.get('acl')},
|
||||
"state": "Migrating",
|
||||
}
|
||||
volume["ETag"] = get_vol_etag(volume)
|
||||
code, new_vol = self.db.create_volume(volume)
|
||||
return (code, new_vol)
|
||||
else:
|
||||
return cluster_send_cmd(cmd, **kwargs)
|
||||
self.driver.do_setup(None)
|
||||
cluster_send_cmd = deepcopy(self.driver.cluster.send_cmd)
|
||||
self.driver.cluster.send_cmd = send_cmd_mock
|
||||
vol_type = test_utils.create_volume_type(self.ctxt, self,
|
||||
name='my_vol_type')
|
||||
volume = test_utils.create_volume(self.ctxt, size=4,
|
||||
volume_type_id=vol_type.id)
|
||||
self.driver.create_volume(volume)
|
||||
proj = self.db.data["projects"][lightos.LIGHTOS_DEFAULT_PROJECT_NAME]
|
||||
actual_volumes = proj["volumes"]
|
||||
self.assertEqual(1, len(actual_volumes))
|
||||
db.volume_destroy(self.ctxt, volume.id)
|
||||
|
||||
def test_delete_volume_fail_if_not_created(self):
|
||||
"""Test that lightos_client fail creating an already exists volume."""
|
||||
self.driver.do_setup(None)
|
||||
|
@ -617,6 +650,50 @@ class LightOSStorageVolumeDriverTest(test.TestCase):
|
|||
self.driver.delete_volume(volume)
|
||||
db.volume_destroy(self.ctxt, volume.id)
|
||||
|
||||
def test_initialize_connection_mirgrating_volume(self):
|
||||
InitialConnectorMock.nqn = "hostnqn1"
|
||||
InitialConnectorMock.found_discovery_client = True
|
||||
|
||||
def send_cmd_mock(cmd, **kwargs):
|
||||
if cmd == "create_volume":
|
||||
project_name = kwargs["project_name"]
|
||||
volume = {
|
||||
"project_name": project_name,
|
||||
"name": kwargs["name"],
|
||||
"size": kwargs["size"],
|
||||
"n_replicas": kwargs["n_replicas"],
|
||||
"compression": kwargs["compression"],
|
||||
"src_snapshot_name": kwargs["src_snapshot_name"],
|
||||
"acl": {'values': kwargs.get('acl')},
|
||||
"state": "Migrating",
|
||||
}
|
||||
volume["ETag"] = get_vol_etag(volume)
|
||||
code, new_vol = self.db.create_volume(volume)
|
||||
return (code, new_vol)
|
||||
else:
|
||||
return cluster_send_cmd(cmd, **kwargs)
|
||||
self.driver.do_setup(None)
|
||||
cluster_send_cmd = deepcopy(self.driver.cluster.send_cmd)
|
||||
self.driver.cluster.send_cmd = send_cmd_mock
|
||||
vol_type = test_utils.create_volume_type(self.ctxt, self,
|
||||
name='my_vol_type')
|
||||
volume = test_utils.create_volume(self.ctxt, size=4,
|
||||
volume_type_id=vol_type.id)
|
||||
self.driver.create_volume(volume)
|
||||
connection_props = (
|
||||
self.driver.initialize_connection(volume,
|
||||
get_connector_properties()))
|
||||
self.assertIn('driver_volume_type', connection_props)
|
||||
self.assertEqual('lightos', connection_props['driver_volume_type'])
|
||||
self.assertEqual(FAKE_LIGHTOS_CLUSTER_INFO['subsystemNQN'],
|
||||
connection_props['data']['subsysnqn'])
|
||||
self.assertEqual(
|
||||
self.db.data['projects']['default']['volumes'][0]['UUID'],
|
||||
connection_props['data']['uuid'])
|
||||
|
||||
self.driver.delete_volume(volume)
|
||||
db.volume_destroy(self.ctxt, volume.id)
|
||||
|
||||
def test_initialize_connection_no_hostnqn_should_fail(self):
|
||||
InitialConnectorMock.nqn = ""
|
||||
InitialConnectorMock.found_discovery_client = True
|
||||
|
|
|
@ -537,8 +537,9 @@ class LightOSVolumeDriver(driver.VolumeDriver):
|
|||
must be supplied'
|
||||
# while creating lightos volume we can stop on any terminal status
|
||||
# possible states: Unknown, Creating, Available, Deleting, Deleted,
|
||||
# Failed, Updating
|
||||
states = ('Available', 'Deleting', 'Deleted', 'Failed', 'UNKNOWN')
|
||||
# Failed, Updating, Migrating, Rollback
|
||||
states = ('Available', 'Deleting', 'Deleted', 'Failed', 'UNKNOWN',
|
||||
'Migrating', 'Rollback')
|
||||
|
||||
stop = time.time() + timeout
|
||||
while time.time() <= stop:
|
||||
|
@ -664,7 +665,8 @@ class LightOSVolumeDriver(driver.VolumeDriver):
|
|||
project_name,
|
||||
timeout=self.logical_op_timeout,
|
||||
vol_uuid=lightos_uuid)
|
||||
if vol_state == 'Available':
|
||||
allowed_states = ['Available', 'Migrating']
|
||||
if vol_state in allowed_states:
|
||||
LOG.debug(
|
||||
"LIGHTOS created volume name %s lightos_uuid \
|
||||
%s project %s",
|
||||
|
@ -1226,7 +1228,8 @@ class LightOSVolumeDriver(driver.VolumeDriver):
|
|||
# for the volume to stabilize
|
||||
vol_state = self._wait_for_volume_available(
|
||||
project_name, timeout=end - time.time(), vol_name=lightos_volname)
|
||||
if vol_state != 'Available':
|
||||
allowed_states = ['Available', 'Migrating']
|
||||
if vol_state not in allowed_states:
|
||||
LOG.warning(
|
||||
'Timed out waiting for volume %s project %s to stabilize, \
|
||||
last state %s',
|
||||
|
|
Loading…
Reference in New Issue