diff --git a/heat/engine/clients/os/neutron.py b/heat/engine/clients/os/neutron.py index e5e7dc9792..cfc0033112 100644 --- a/heat/engine/clients/os/neutron.py +++ b/heat/engine/clients/os/neutron.py @@ -68,3 +68,33 @@ class NetworkConstraint(constraints.BaseCustomConstraint): neutron_client = client.client('neutron') neutronV20.find_resourceid_by_name_or_id( neutron_client, 'network', value) + + +class PortConstraint(constraints.BaseCustomConstraint): + + expected_exceptions = (exceptions.NeutronClientException,) + + def validate_with_client(self, client, value): + neutron_client = client.client('neutron') + neutronV20.find_resourceid_by_name_or_id( + neutron_client, 'port', value) + + +class RouterConstraint(constraints.BaseCustomConstraint): + + expected_exceptions = (exceptions.NeutronClientException,) + + def validate_with_client(self, client, value): + neutron_client = client.client('neutron') + neutronV20.find_resourceid_by_name_or_id( + neutron_client, 'router', value) + + +class SubnetConstraint(constraints.BaseCustomConstraint): + + expected_exceptions = (exceptions.NeutronClientException,) + + def validate_with_client(self, client, value): + neutron_client = client.client('neutron') + neutronV20.find_resourceid_by_name_or_id( + neutron_client, 'subnet', value) diff --git a/heat/tests/test_neutron.py b/heat/tests/test_neutron.py index 5f98b03f15..0f0ca16f75 100644 --- a/heat/tests/test_neutron.py +++ b/heat/tests/test_neutron.py @@ -2468,3 +2468,75 @@ class NetworkConstraintTest(HeatTestCase): self.assertFalse(constraint.validate("bar", ctx)) self.m.VerifyAll() + + +class PortConstraintTest(HeatTestCase): + + def test_validate(self): + nc = self.m.CreateMockAnything() + self.m.StubOutWithMock(neutron.NeutronClientPlugin, '_create') + neutron.NeutronClientPlugin._create().AndReturn(nc) + self.m.StubOutWithMock(neutron.neutronV20, + 'find_resourceid_by_name_or_id') + neutron.neutronV20.find_resourceid_by_name_or_id( + nc, 'port', 'foo' + ).AndReturn('foo') + neutron.neutronV20.find_resourceid_by_name_or_id( + nc, 'port', 'bar' + ).AndRaise(qe.NeutronClientException(status_code=404)) + self.m.ReplayAll() + + constraint = neutron.PortConstraint() + ctx = utils.dummy_context() + self.assertTrue(constraint.validate("foo", ctx)) + self.assertFalse(constraint.validate("bar", ctx)) + + self.m.VerifyAll() + + +class RouterConstraintTest(HeatTestCase): + + def test_validate(self): + nc = self.m.CreateMockAnything() + self.m.StubOutWithMock(neutron.NeutronClientPlugin, '_create') + neutron.NeutronClientPlugin._create().AndReturn(nc) + self.m.StubOutWithMock(neutron.neutronV20, + 'find_resourceid_by_name_or_id') + neutron.neutronV20.find_resourceid_by_name_or_id( + nc, 'router', 'foo' + ).AndReturn('foo') + neutron.neutronV20.find_resourceid_by_name_or_id( + nc, 'router', 'bar' + ).AndRaise(qe.NeutronClientException(status_code=404)) + self.m.ReplayAll() + + constraint = neutron.RouterConstraint() + ctx = utils.dummy_context() + self.assertTrue(constraint.validate("foo", ctx)) + self.assertFalse(constraint.validate("bar", ctx)) + + self.m.VerifyAll() + + +class SubnetConstraintTest(HeatTestCase): + + def test_validate(self): + nc = self.m.CreateMockAnything() + self.m.StubOutWithMock(neutron.NeutronClientPlugin, '_create') + neutron.NeutronClientPlugin._create().AndReturn(nc) + self.m.StubOutWithMock(neutron.neutronV20, + 'find_resourceid_by_name_or_id') + neutron.neutronV20.find_resourceid_by_name_or_id( + nc, 'subnet', 'foo' + ).AndReturn('foo') + neutron.neutronV20.find_resourceid_by_name_or_id( + nc, 'subnet', 'bar' + ).AndRaise(qe.NeutronClientException(status_code=404)) + self.m.ReplayAll() + + constraint = neutron.SubnetConstraint() + ctx = utils.dummy_context() + self.assertTrue(constraint.validate("foo", ctx)) + self.assertFalse(constraint.validate("bar", ctx)) + + self.m.VerifyAll() diff --git a/setup.cfg b/setup.cfg index 7b0c2d440c..d8562a5dfe 100644 --- a/setup.cfg +++ b/setup.cfg @@ -52,6 +52,9 @@ heat.clients = heat.constraints = nova.flavor = heat.engine.resources.server:FlavorConstraint neutron.network = heat.engine.clients.os.neutron:NetworkConstraint + neutron.port = heat.engine.clients.os.neutron:PortConstraint + neutron.router = heat.engine.clients.os.neutron:RouterConstraint + neutron.subnet = heat.engine.clients.os.neutron:SubnetConstraint glance.image = heat.engine.clients.os.glance:ImageConstraint iso_8601 = heat.engine.resources.iso_8601:ISO8601Constraint nova.keypair = heat.engine.resources.nova_keypair:KeypairConstraint