Add cinder snapshot custom constraint
Add cinder snapshot custom constraint to validate the existent of the snapshot not wait creation. Change-Id: I4140dfc212eeb4830632c8450e8c8faad3d165f6 Implements: blueprint cinder-custom-constraints
This commit is contained in:
parent
bc5d34bf5d
commit
9d146f489d
@ -240,6 +240,10 @@ class VolumeNotFound(HeatException):
|
|||||||
msg_fmt = _("The Volume (%(volume)s) could not be found.")
|
msg_fmt = _("The Volume (%(volume)s) could not be found.")
|
||||||
|
|
||||||
|
|
||||||
|
class VolumeSnapshotNotFound(HeatException):
|
||||||
|
msg_fmt = _("The VolumeSnapshot (%(snapshot)s) could not be found.")
|
||||||
|
|
||||||
|
|
||||||
class PhysicalResourceNameAmbiguity(HeatException):
|
class PhysicalResourceNameAmbiguity(HeatException):
|
||||||
msg_fmt = _(
|
msg_fmt = _(
|
||||||
"Multiple physical resources were found with name (%(name)s).")
|
"Multiple physical resources were found with name (%(name)s).")
|
||||||
|
@ -94,6 +94,14 @@ class CinderClientPlugin(client_plugin.ClientPlugin):
|
|||||||
{'volume': volume, 'ex': ex})
|
{'volume': volume, 'ex': ex})
|
||||||
raise exception.VolumeNotFound(volume=volume)
|
raise exception.VolumeNotFound(volume=volume)
|
||||||
|
|
||||||
|
def get_volume_snapshot(self, snapshot):
|
||||||
|
try:
|
||||||
|
return self.client().volume_snapshots.get(snapshot)
|
||||||
|
except exceptions.NotFound as ex:
|
||||||
|
LOG.info(_LI('VolumeSnapshot (%(snapshot)s) not found: %(ex)s'),
|
||||||
|
{'snapshot': snapshot, 'ex': ex})
|
||||||
|
raise exception.VolumeSnapshotNotFound(snapshot=snapshot)
|
||||||
|
|
||||||
def is_not_found(self, ex):
|
def is_not_found(self, ex):
|
||||||
return isinstance(ex, exceptions.NotFound)
|
return isinstance(ex, exceptions.NotFound)
|
||||||
|
|
||||||
@ -111,3 +119,11 @@ class VolumeConstraint(constraints.BaseCustomConstraint):
|
|||||||
|
|
||||||
def validate_with_client(self, client, volume):
|
def validate_with_client(self, client, volume):
|
||||||
client.client_plugin('cinder').get_volume(volume)
|
client.client_plugin('cinder').get_volume(volume)
|
||||||
|
|
||||||
|
|
||||||
|
class VolumeSnapshotConstraint(constraints.BaseCustomConstraint):
|
||||||
|
|
||||||
|
expected_exceptions = (exception.VolumeSnapshotNotFound,)
|
||||||
|
|
||||||
|
def validate_with_client(self, client, snapshot):
|
||||||
|
client.client_plugin('cinder').get_volume_snapshot(snapshot)
|
||||||
|
@ -47,6 +47,20 @@ class CinderClientPluginTests(common.HeatTestCase):
|
|||||||
|
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_snapshot(self):
|
||||||
|
"""Tests the get_volume_snapshot function."""
|
||||||
|
snapshot_id = str(uuid.uuid4())
|
||||||
|
my_snapshot = self.m.CreateMockAnything()
|
||||||
|
self.cinder_client.volume_snapshots = self.m.CreateMockAnything()
|
||||||
|
self.cinder_client.volume_snapshots.get(snapshot_id).MultipleTimes().\
|
||||||
|
AndReturn(my_snapshot)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
self.assertEqual(my_snapshot,
|
||||||
|
self.cinder_plugin.get_volume_snapshot(snapshot_id))
|
||||||
|
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
|
||||||
class VolumeConstraintTest(common.HeatTestCase):
|
class VolumeConstraintTest(common.HeatTestCase):
|
||||||
|
|
||||||
@ -66,3 +80,23 @@ class VolumeConstraintTest(common.HeatTestCase):
|
|||||||
self.mock_get_volume.side_effect = exception.VolumeNotFound(
|
self.mock_get_volume.side_effect = exception.VolumeNotFound(
|
||||||
volume='bar')
|
volume='bar')
|
||||||
self.assertFalse(self.constraint.validate("bar", self.ctx))
|
self.assertFalse(self.constraint.validate("bar", self.ctx))
|
||||||
|
|
||||||
|
|
||||||
|
class VolumeSnapshotConstraintTest(common.HeatTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(VolumeSnapshotConstraintTest, self).setUp()
|
||||||
|
self.ctx = utils.dummy_context()
|
||||||
|
self.mock_get_snapshot = mock.Mock()
|
||||||
|
self.ctx.clients.client_plugin(
|
||||||
|
'cinder').get_volume_snapshot = self.mock_get_snapshot
|
||||||
|
self.constraint = cinder.VolumeSnapshotConstraint()
|
||||||
|
|
||||||
|
def test_validation(self):
|
||||||
|
self.mock_get_snapshot.return_value = 'snapshot'
|
||||||
|
self.assertTrue(self.constraint.validate("foo", self.ctx))
|
||||||
|
|
||||||
|
def test_validation_error(self):
|
||||||
|
self.mock_get_snapshot.side_effect = exception.VolumeSnapshotNotFound(
|
||||||
|
snapshot='bar')
|
||||||
|
self.assertFalse(self.constraint.validate("bar", self.ctx))
|
||||||
|
@ -59,6 +59,7 @@ heat.constraints =
|
|||||||
nova.server = heat.engine.clients.os.nova:ServerConstraint
|
nova.server = heat.engine.clients.os.nova:ServerConstraint
|
||||||
nova.keypair = heat.engine.clients.os.nova:KeypairConstraint
|
nova.keypair = heat.engine.clients.os.nova:KeypairConstraint
|
||||||
cinder.volume = heat.engine.clients.os.cinder:VolumeConstraint
|
cinder.volume = heat.engine.clients.os.cinder:VolumeConstraint
|
||||||
|
cinder.snapshot = heat.engine.clients.os.cinder:VolumeSnapshotConstraint
|
||||||
|
|
||||||
heat.stack_lifecycle_plugins =
|
heat.stack_lifecycle_plugins =
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user