Refactor neutron constraints

Add class NeutronContraint as base neutron constraint class, this class
has 3 new properties: resource_name, cmd_resource, extension.
The validation workflow will be:
 check extension available -> get resource id base on resource_name and cmd_resource

This patch also and a new function find_resourceid_by_name_or_id to
neutron client_plugin, which wrap find_resourceid_by_name_or_id from
neutronclient, so that we can avoid to import neutronclient in many places.

Change-Id: I9968444339e239ddf0b43ecf18c6aebe18fa5aea
This commit is contained in:
Ethan Lynn
2015-12-04 21:20:44 +08:00
parent ed22ac69f9
commit 390cdb9f2a
14 changed files with 245 additions and 180 deletions

View File

@@ -163,7 +163,8 @@ class NeutronFloatingIPTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
self._test_floating_ip(t, resolve_neutron=False)
@@ -173,7 +174,8 @@ class NeutronFloatingIPTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
self._test_floating_ip(t, resolve_neutron=False, r_iface=False)
@@ -205,7 +207,8 @@ class NeutronFloatingIPTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
stack = utils.parse_stack(tmpl)
@@ -269,17 +272,20 @@ class NeutronFloatingIPTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'xyz1234'
'xyz1234',
cmd_resource=None,
).MultipleTimes().AndReturn('xyz1234')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub1234'
'sub1234',
cmd_resource=None,
).MultipleTimes().AndReturn('sub1234')
neutronclient.Client.create_floatingip({
'floatingip': {'floating_network_id': u'abcd1234'}
@@ -497,7 +503,8 @@ class NeutronFloatingIPTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).AndReturn('xyz1234')
neutronclient.Client.create_floatingip({
'floatingip': {'floating_network_id': u'xyz1234',
@@ -527,17 +534,20 @@ class NeutronFloatingIPTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'xyz1234'
'xyz1234',
cmd_resource=None,
).MultipleTimes().AndReturn('xyz1234')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub1234'
'sub1234',
cmd_resource=None,
).MultipleTimes().AndReturn('sub1234')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'None'
'None',
cmd_resource=None,
).MultipleTimes().AndReturn('None')
neutronclient.Client.create_port({'port': {
@@ -560,7 +570,8 @@ class NeutronFloatingIPTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
neutronclient.Client.create_floatingip({
'floatingip': {

View File

@@ -342,13 +342,15 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).AndReturn('sub123')
if resolve_neutron and with_vip_subnet:
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub9999'
'sub9999',
cmd_resource=None,
).AndReturn('sub9999')
snippet = template_format.parse(pool_template_with_vip_subnet)
neutronclient.Client.create_vip(stvipvsn
@@ -391,7 +393,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
@@ -431,7 +434,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
@@ -468,7 +472,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
@@ -507,7 +512,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
@@ -536,7 +542,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
'pool': {
@@ -572,7 +579,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
'pool': {
@@ -638,7 +646,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
@@ -792,7 +801,8 @@ class PoolTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronclient.Client.create_pool({
'pool': {
@@ -1064,7 +1074,8 @@ class PoolUpdateHealthMonitorsTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).AndReturn('sub123')
neutronclient.Client.create_pool({
'pool': {

View File

@@ -106,7 +106,8 @@ class NeutronNetTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
# Create script

View File

@@ -117,7 +117,8 @@ class NeutronNetworkGatewayTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).MultipleTimes().AndRaise(qe.NeutronClientException(status_code=404))
# mock successful to delete the network_gateway
neutronclient.Client.delete_network_gateway(
@@ -174,7 +175,8 @@ class NeutronNetworkGatewayTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).AndReturn('6af055d3-26f6-48dd-a597-7611d7e58d35')
t = template_format.parse(gw_template)
else:
@@ -192,7 +194,8 @@ class NeutronNetworkGatewayTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).MultipleTimes().AndReturn(
'6af055d3-26f6-48dd-a597-7611d7e58d35')
@@ -278,32 +281,38 @@ class NeutronNetworkGatewayTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).AndReturn('6af055d3-26f6-48dd-a597-7611d7e58d35')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).AndReturn('6af055d3-26f6-48dd-a597-7611d7e58d35')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).AndReturn('6af055d3-26f6-48dd-a597-7611d7e58d35')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).AndReturn('6af055d3-26f6-48dd-a597-7611d7e58d35')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).AndReturn('6af055d3-26f6-48dd-a597-7611d7e58d35')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'6af055d3-26f6-48dd-a597-7611d7e58d35'
'6af055d3-26f6-48dd-a597-7611d7e58d35',
cmd_resource=None,
).AndReturn('6af055d3-26f6-48dd-a597-7611d7e58d35')
neutronclient.Client.update_network_gateway(

View File

@@ -82,7 +82,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronclient.Client.create_port({'port': {
'network_id': u'net1234',
@@ -118,12 +119,14 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub1234'
'sub1234',
cmd_resource=None,
).MultipleTimes().AndReturn('sub1234')
neutronclient.Client.create_port({'port': {
@@ -159,7 +162,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronclient.Client.create_port({'port': {
'network_id': u'net1234',
@@ -195,7 +199,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
neutronclient.Client.create_port({'port': {
'network_id': u'abcd1234',
@@ -229,7 +234,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
neutronclient.Client.create_port({'port': {
@@ -262,7 +268,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
neutronclient.Client.create_port({'port': {
'network_id': u'abcd1234',
@@ -298,7 +305,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'abcd1234'
'abcd1234',
cmd_resource=None,
).MultipleTimes().AndReturn('abcd1234')
neutronclient.Client.create_port({'port': {
'network_id': u'abcd1234',
@@ -334,12 +342,14 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub1234'
'sub1234',
cmd_resource=None,
).MultipleTimes().AndReturn('sub1234')
neutronclient.Client.create_port({'port': port_prop}).AndReturn(
{'port': {
@@ -422,7 +432,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronclient.Client.create_port(
{'port': props}
@@ -495,7 +506,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronclient.Client.create_port(
{'port': props}
@@ -557,7 +569,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronclient.Client.create_port({'port': {
'network_id': u'net1234',
@@ -619,7 +632,8 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).MultipleTimes().AndReturn('net1234')
neutronclient.Client.create_port({'port': {
'network_id': u'net1234',
@@ -688,12 +702,14 @@ class NeutronPortTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'net1234'
'net1234',
cmd_resource=None,
).AndReturn('net1234')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub1234'
'sub1234',
cmd_resource=None,
).MultipleTimes().AndReturn('sub1234')
neutronclient.Client.create_port({'port': port_prop}).AndReturn(
{'port': {

View File

@@ -465,13 +465,15 @@ class NeutronRouterTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'3e46229d-8fce-4733-819a-b5fe630550f8'
'3e46229d-8fce-4733-819a-b5fe630550f8',
cmd_resource=None,
).AndReturn('3e46229d-8fce-4733-819a-b5fe630550f8')
router_key = 'router'
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'91e47a57-7508-46fe-afc9-fc454e8580e1'
'91e47a57-7508-46fe-afc9-fc454e8580e1',
cmd_resource=None,
).AndReturn('91e47a57-7508-46fe-afc9-fc454e8580e1')
subnet_key = 'subnet'
@@ -499,13 +501,15 @@ class NeutronRouterTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'3e46229d-8fce-4733-819a-b5fe630550f8'
'3e46229d-8fce-4733-819a-b5fe630550f8',
cmd_resource=None,
).AndReturn('3e46229d-8fce-4733-819a-b5fe630550f8')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'91e47a57-7508-46fe-afc9-fc454e8580e1'
'91e47a57-7508-46fe-afc9-fc454e8580e1',
cmd_resource=None,
).AndReturn('91e47a57-7508-46fe-afc9-fc454e8580e1')
neutronclient.Client.add_interface_router(
'3e46229d-8fce-4733-819a-b5fe630550f8',
@@ -552,13 +556,15 @@ class NeutronRouterTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'ae478782-53c0-4434-ab16-49900c88016c'
'ae478782-53c0-4434-ab16-49900c88016c',
cmd_resource=None,
).AndReturn('ae478782-53c0-4434-ab16-49900c88016c')
port_key = 'port'
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'port',
'9577cafd-8e98-4059-a2e6-8a771b4d318e'
'9577cafd-8e98-4059-a2e6-8a771b4d318e',
cmd_resource=None,
).AndReturn('9577cafd-8e98-4059-a2e6-8a771b4d318e')
neutronclient.Client.add_interface_router(
@@ -646,7 +652,8 @@ class NeutronRouterTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'fc68ea2c-b60b-4b4f-bd82-94ec81110766'
'fc68ea2c-b60b-4b4f-bd82-94ec81110766',
cmd_resource=None,
).MultipleTimes().AndReturn('fc68ea2c-b60b-4b4f-bd82-94ec81110766')
neutronclient.Client.add_gateway_router(
'3e46229d-8fce-4733-819a-b5fe630550f8',
@@ -679,7 +686,8 @@ class NeutronRouterTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'public'
'public',
cmd_resource=None,
).MultipleTimes().AndReturn('fc68ea2c-b60b-4b4f-bd82-94ec81110766')
neutronclient.Client.create_router({
@@ -758,7 +766,8 @@ class NeutronRouterTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'public'
'public',
cmd_resource=None,
).AndReturn('fc68ea2c-b60b-4b4f-bd82-94ec81110766')
neutronclient.Client.create_router({
@@ -819,7 +828,8 @@ class NeutronRouterTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'other_public'
'other_public',
cmd_resource=None,
).AndReturn('91e47a57-7508-46fe-afc9-fc454e8580e1')
neutronclient.Client.update_router(

View File

@@ -128,12 +128,14 @@ class NeutronSubnetTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
stack = utils.parse_stack(t)
rsrc = self.create_subnet(t, stack, 'sub_net')
@@ -201,17 +203,20 @@ class NeutronSubnetTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnetpool',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnetpool',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
neutronclient.Client.create_subnet({
'subnet': {
@@ -267,12 +272,14 @@ class NeutronSubnetTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
self.m.ReplayAll()
scheduler.TaskRunner(rsrc.create)()
@@ -389,7 +396,8 @@ class NeutronSubnetTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
neutronclient.Client.create_subnet({
'subnet': {
@@ -513,7 +521,8 @@ class NeutronSubnetTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'network',
'None'
'None',
cmd_resource=None,
).AndReturn('None')
neutronclient.Client.create_subnet({
'subnet': {

View File

@@ -137,12 +137,14 @@ class VPNServiceTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).AndReturn('sub123')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'rou123'
'rou123',
cmd_resource=None,
).AndReturn('rou123')
if resolve_neutron:
snippet = template_format.parse(vpnservice_template)
@@ -186,12 +188,14 @@ class VPNServiceTest(common.HeatTestCase):
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'subnet',
'sub123'
'sub123',
cmd_resource=None,
).MultipleTimes().AndReturn('sub123')
neutronV20.find_resourceid_by_name_or_id(
mox.IsA(neutronclient.Client),
'router',
'rou123'
'rou123',
cmd_resource=None,
).MultipleTimes().AndReturn('rou123')
self.stub_RouterConstraint_validate()