Merge "add router_id to response for CRU on fw/vip objs"
This commit is contained in:
commit
a872951552
@ -26,6 +26,7 @@ from neutron.db.loadbalancer import loadbalancer_db
|
|||||||
from neutron.db import routedserviceinsertion_db as rsi_db
|
from neutron.db import routedserviceinsertion_db as rsi_db
|
||||||
from neutron.extensions import firewall as fw_ext
|
from neutron.extensions import firewall as fw_ext
|
||||||
from neutron.extensions import l3
|
from neutron.extensions import l3
|
||||||
|
from neutron.extensions import routedserviceinsertion as rsi
|
||||||
from neutron.openstack.common import excutils
|
from neutron.openstack.common import excutils
|
||||||
from neutron.openstack.common import log as logging
|
from neutron.openstack.common import log as logging
|
||||||
from neutron.plugins.common import constants as service_constants
|
from neutron.plugins.common import constants as service_constants
|
||||||
@ -801,7 +802,7 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
|
|
||||||
def _make_firewall_rule_list_by_policy_id(self, context, fw_policy_id):
|
def _make_firewall_rule_list_by_policy_id(self, context, fw_policy_id):
|
||||||
if not fw_policy_id:
|
if not fw_policy_id:
|
||||||
return None
|
return []
|
||||||
firewall_policy_db = self._get_firewall_policy(context, fw_policy_id)
|
firewall_policy_db = self._get_firewall_policy(context, fw_policy_id)
|
||||||
return [
|
return [
|
||||||
self._make_firewall_rule_dict(fw_rule_db)
|
self._make_firewall_rule_dict(fw_rule_db)
|
||||||
@ -897,17 +898,21 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
self._vcns_update_firewall(context, fw, router_id)
|
self._vcns_update_firewall(context, fw, router_id)
|
||||||
self._firewall_set_status(
|
self._firewall_set_status(
|
||||||
context, fw['id'], service_constants.ACTIVE, fw)
|
context, fw['id'], service_constants.ACTIVE, fw)
|
||||||
|
fw[rsi.ROUTER_ID] = router_id
|
||||||
return fw
|
return fw
|
||||||
|
|
||||||
def update_firewall(self, context, id, firewall):
|
def update_firewall(self, context, id, firewall):
|
||||||
LOG.debug(_("update_firewall() called"))
|
LOG.debug(_("update_firewall() called"))
|
||||||
self._ensure_firewall_update_allowed(context, id)
|
self._ensure_firewall_update_allowed(context, id)
|
||||||
|
service_router_binding = self._get_resource_router_id_binding(
|
||||||
|
context, firewall_db.Firewall, resource_id=id)
|
||||||
rule_list_pre = self._make_firewall_rule_list_by_policy_id(
|
rule_list_pre = self._make_firewall_rule_list_by_policy_id(
|
||||||
context,
|
context,
|
||||||
self.get_firewall(context, id)['firewall_policy_id'])
|
self.get_firewall(context, id)['firewall_policy_id'])
|
||||||
firewall['firewall']['status'] = service_constants.PENDING_UPDATE
|
firewall['firewall']['status'] = service_constants.PENDING_UPDATE
|
||||||
fw = super(NvpAdvancedPlugin, self).update_firewall(
|
fw = super(NvpAdvancedPlugin, self).update_firewall(
|
||||||
context, id, firewall)
|
context, id, firewall)
|
||||||
|
fw[rsi.ROUTER_ID] = service_router_binding['router_id']
|
||||||
rule_list_new = self._make_firewall_rule_list_by_policy_id(
|
rule_list_new = self._make_firewall_rule_list_by_policy_id(
|
||||||
context, fw['firewall_policy_id'])
|
context, fw['firewall_policy_id'])
|
||||||
if rule_list_pre == rule_list_new:
|
if rule_list_pre == rule_list_new:
|
||||||
@ -915,10 +920,9 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
context, fw['id'], service_constants.ACTIVE, fw)
|
context, fw['id'], service_constants.ACTIVE, fw)
|
||||||
return fw
|
return fw
|
||||||
else:
|
else:
|
||||||
service_router_binding = self._get_resource_router_id_binding(
|
|
||||||
context, firewall_db.Firewall, resource_id=id)
|
|
||||||
self._vcns_update_firewall(
|
self._vcns_update_firewall(
|
||||||
context, fw, service_router_binding.router_id)
|
context, fw, service_router_binding.router_id,
|
||||||
|
firewall_rule_list=rule_list_new)
|
||||||
self._firewall_set_status(
|
self._firewall_set_status(
|
||||||
context, fw['id'], service_constants.ACTIVE, fw)
|
context, fw['id'], service_constants.ACTIVE, fw)
|
||||||
return fw
|
return fw
|
||||||
@ -934,6 +938,31 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
self._delete_resource_router_id_binding(
|
self._delete_resource_router_id_binding(
|
||||||
context, id, firewall_db.Firewall)
|
context, id, firewall_db.Firewall)
|
||||||
|
|
||||||
|
def get_firewall(self, context, id, fields=None):
|
||||||
|
fw = super(NvpAdvancedPlugin, self).get_firewall(
|
||||||
|
context, id, fields)
|
||||||
|
if fields and rsi.ROUTER_ID not in fields:
|
||||||
|
return fw
|
||||||
|
|
||||||
|
service_router_binding = self._get_resource_router_id_binding(
|
||||||
|
context, firewall_db.Firewall, resource_id=fw['id'])
|
||||||
|
fw[rsi.ROUTER_ID] = service_router_binding['router_id']
|
||||||
|
return fw
|
||||||
|
|
||||||
|
def get_firewalls(self, context, filters=None, fields=None):
|
||||||
|
fws = super(NvpAdvancedPlugin, self).get_firewalls(
|
||||||
|
context, filters, fields)
|
||||||
|
if fields and rsi.ROUTER_ID not in fields:
|
||||||
|
return fws
|
||||||
|
service_router_bindings = self._get_resource_router_id_bindings(
|
||||||
|
context, firewall_db.Firewall,
|
||||||
|
resource_ids=[fw['id'] for fw in fws])
|
||||||
|
mapping = dict([(binding['resource_id'], binding['router_id'])
|
||||||
|
for binding in service_router_bindings])
|
||||||
|
for fw in fws:
|
||||||
|
fw[rsi.ROUTER_ID] = mapping[fw['id']]
|
||||||
|
return fws
|
||||||
|
|
||||||
def update_firewall_rule(self, context, id, firewall_rule):
|
def update_firewall_rule(self, context, id, firewall_rule):
|
||||||
LOG.debug(_("update_firewall_rule() called"))
|
LOG.debug(_("update_firewall_rule() called"))
|
||||||
self._ensure_update_or_delete_firewall_rule(context, id)
|
self._ensure_update_or_delete_firewall_rule(context, id)
|
||||||
@ -983,7 +1012,8 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
service_router_binding = self._get_resource_router_id_binding(
|
service_router_binding = self._get_resource_router_id_binding(
|
||||||
context, firewall_db.Firewall, resource_id=fw['id'])
|
context, firewall_db.Firewall, resource_id=fw['id'])
|
||||||
self._vcns_update_firewall(
|
self._vcns_update_firewall(
|
||||||
context, fw, service_router_binding.router_id)
|
context, fw, service_router_binding.router_id,
|
||||||
|
firewall_rule_list=firewall_rules)
|
||||||
return fwp
|
return fwp
|
||||||
|
|
||||||
def insert_rule(self, context, id, rule_info):
|
def insert_rule(self, context, id, rule_info):
|
||||||
@ -1043,15 +1073,14 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
#
|
#
|
||||||
def _get_edge_id_by_vip_id(self, context, vip_id):
|
def _get_edge_id_by_vip_id(self, context, vip_id):
|
||||||
try:
|
try:
|
||||||
router_binding = self._get_resource_router_id_bindings(
|
service_router_binding = self._get_resource_router_id_binding(
|
||||||
context, loadbalancer_db.Vip, resource_ids=[vip_id])[0]
|
context, loadbalancer_db.Vip, resource_id=vip_id)
|
||||||
except Exception:
|
except Exception:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
LOG.exception(_("Failed to find the edge with "
|
LOG.exception(_("Failed to find the edge with "
|
||||||
"vip_id: %s"), vip_id)
|
"vip_id: %s"), vip_id)
|
||||||
service_binding = vcns_db.get_vcns_router_binding(
|
return self._get_edge_id_by_vcns_edge_binding(
|
||||||
context.session, router_binding.router_id)
|
context, service_router_binding.router_id)
|
||||||
return service_binding.edge_id
|
|
||||||
|
|
||||||
def _get_all_vip_addrs_by_router_id(
|
def _get_all_vip_addrs_by_router_id(
|
||||||
self, context, router_id):
|
self, context, router_id):
|
||||||
@ -1202,6 +1231,7 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
super(NvpAdvancedPlugin, self).delete_vip(context, v['id'])
|
super(NvpAdvancedPlugin, self).delete_vip(context, v['id'])
|
||||||
self._resource_set_status(context, loadbalancer_db.Vip,
|
self._resource_set_status(context, loadbalancer_db.Vip,
|
||||||
v['id'], service_constants.ACTIVE, v)
|
v['id'], service_constants.ACTIVE, v)
|
||||||
|
v[rsi.ROUTER_ID] = router_id
|
||||||
|
|
||||||
return v
|
return v
|
||||||
|
|
||||||
@ -1210,6 +1240,8 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
old_vip = self.get_vip(context, id)
|
old_vip = self.get_vip(context, id)
|
||||||
vip['vip']['status'] = service_constants.PENDING_UPDATE
|
vip['vip']['status'] = service_constants.PENDING_UPDATE
|
||||||
v = super(NvpAdvancedPlugin, self).update_vip(context, id, vip)
|
v = super(NvpAdvancedPlugin, self).update_vip(context, id, vip)
|
||||||
|
v[rsi.ROUTER_ID] = self._get_resource_router_id_binding(
|
||||||
|
context, loadbalancer_db.Vip, resource_id=id)['router_id']
|
||||||
if old_vip['pool_id'] != v['pool_id']:
|
if old_vip['pool_id'] != v['pool_id']:
|
||||||
self.vcns_driver.delete_vip(context, id)
|
self.vcns_driver.delete_vip(context, id)
|
||||||
#Delete old pool/monitor on the edge
|
#Delete old pool/monitor on the edge
|
||||||
@ -1268,6 +1300,30 @@ class NvpAdvancedPlugin(sr_db.ServiceRouter_mixin,
|
|||||||
super(NvpAdvancedPlugin, self).delete_vip(context, id)
|
super(NvpAdvancedPlugin, self).delete_vip(context, id)
|
||||||
self._update_interface(context, router, sync=True)
|
self._update_interface(context, router, sync=True)
|
||||||
|
|
||||||
|
def get_vip(self, context, id, fields=None):
|
||||||
|
vip = super(NvpAdvancedPlugin, self).get_vip(context, id, fields)
|
||||||
|
if fields and rsi.ROUTER_ID not in fields:
|
||||||
|
return vip
|
||||||
|
|
||||||
|
service_router_binding = self._get_resource_router_id_binding(
|
||||||
|
context, loadbalancer_db.Vip, resource_id=vip['id'])
|
||||||
|
vip[rsi.ROUTER_ID] = service_router_binding['router_id']
|
||||||
|
return vip
|
||||||
|
|
||||||
|
def get_vips(self, context, filters=None, fields=None):
|
||||||
|
vips = super(NvpAdvancedPlugin, self).get_vips(
|
||||||
|
context, filters, fields)
|
||||||
|
if fields and rsi.ROUTER_ID not in fields:
|
||||||
|
return vips
|
||||||
|
service_router_bindings = self._get_resource_router_id_bindings(
|
||||||
|
context, loadbalancer_db.Vip,
|
||||||
|
resource_ids=[vip['id'] for vip in vips])
|
||||||
|
mapping = dict([(binding['resource_id'], binding['router_id'])
|
||||||
|
for binding in service_router_bindings])
|
||||||
|
for vip in vips:
|
||||||
|
vip[rsi.ROUTER_ID] = mapping[vip['id']]
|
||||||
|
return vips
|
||||||
|
|
||||||
def update_pool(self, context, id, pool):
|
def update_pool(self, context, id, pool):
|
||||||
pool['pool']['status'] = service_constants.PENDING_UPDATE
|
pool['pool']['status'] = service_constants.PENDING_UPDATE
|
||||||
p = super(NvpAdvancedPlugin, self).update_pool(context, id, pool)
|
p = super(NvpAdvancedPlugin, self).update_pool(context, id, pool)
|
||||||
|
@ -593,7 +593,7 @@ class TestLoadBalancer(LoadBalancerPluginDbTestCase):
|
|||||||
keys.append(('subnet_id', vip['vip']['subnet_id']))
|
keys.append(('subnet_id', vip['vip']['subnet_id']))
|
||||||
req = self.new_list_request('vips')
|
req = self.new_list_request('vips')
|
||||||
res = self.deserialize(self.fmt, req.get_response(self.ext_api))
|
res = self.deserialize(self.fmt, req.get_response(self.ext_api))
|
||||||
self.assertEqual(len(res), 1)
|
self.assertEqual(len(res['vips']), 1)
|
||||||
for k, v in keys:
|
for k, v in keys:
|
||||||
self.assertEqual(res['vips'][0][k], v)
|
self.assertEqual(res['vips'][0][k], v)
|
||||||
|
|
||||||
|
@ -96,7 +96,6 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
fw_plugin=FW_PLUGIN_CLASS)
|
fw_plugin=FW_PLUGIN_CLASS)
|
||||||
self.vcns_firewall_patch()
|
self.vcns_firewall_patch()
|
||||||
self.plugin = manager.NeutronManager.get_plugin()
|
self.plugin = manager.NeutronManager.get_plugin()
|
||||||
self.router_id = None
|
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super(FirewallPluginTestCase, self).tearDown()
|
super(FirewallPluginTestCase, self).tearDown()
|
||||||
@ -105,10 +104,10 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
self.ext_api = None
|
self.ext_api = None
|
||||||
self.plugin = None
|
self.plugin = None
|
||||||
|
|
||||||
def _fake_router_edge_mapping(self):
|
def _create_and_get_router(self):
|
||||||
req = self._create_router(self.fmt, self._tenant_id)
|
req = self._create_router(self.fmt, self._tenant_id)
|
||||||
res = self.deserialize(self.fmt, req)
|
res = self.deserialize(self.fmt, req)
|
||||||
self.router_id = res['router']['id']
|
return res['router']['id']
|
||||||
|
|
||||||
def _create_firewall(self, fmt, name, description, firewall_policy_id,
|
def _create_firewall(self, fmt, name, description, firewall_policy_id,
|
||||||
admin_state_up=True, expected_res_status=None,
|
admin_state_up=True, expected_res_status=None,
|
||||||
@ -116,7 +115,7 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
data = {'firewall': {'name': name,
|
data = {'firewall': {'name': name,
|
||||||
'description': description,
|
'description': description,
|
||||||
'firewall_policy_id': firewall_policy_id,
|
'firewall_policy_id': firewall_policy_id,
|
||||||
'router_id': self.router_id,
|
'router_id': kwargs.get('router_id'),
|
||||||
'admin_state_up': admin_state_up,
|
'admin_state_up': admin_state_up,
|
||||||
'tenant_id': self._tenant_id}}
|
'tenant_id': self._tenant_id}}
|
||||||
|
|
||||||
@ -128,17 +127,16 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
return firewall_res
|
return firewall_res
|
||||||
|
|
||||||
def test_create_firewall(self):
|
def test_create_firewall(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
name = "new_fw"
|
name = "new_fw"
|
||||||
attrs = self._get_test_firewall_attrs(name)
|
attrs = self._get_test_firewall_attrs(name)
|
||||||
|
|
||||||
with self.firewall_policy() as fwp:
|
with self.firewall_policy() as fwp:
|
||||||
fwp_id = fwp['firewall_policy']['id']
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
attrs['firewall_policy_id'] = fwp_id
|
attrs['firewall_policy_id'] = fwp_id
|
||||||
|
attrs['router_id'] = self._create_and_get_router()
|
||||||
with self.firewall(name=name,
|
with self.firewall(name=name,
|
||||||
firewall_policy_id=fwp_id,
|
firewall_policy_id=fwp_id,
|
||||||
router_id=self.router_id,
|
router_id=attrs['router_id'],
|
||||||
admin_state_up=
|
admin_state_up=
|
||||||
test_db_firewall.ADMIN_STATE_UP,
|
test_db_firewall.ADMIN_STATE_UP,
|
||||||
expected_res_status=201) as fw:
|
expected_res_status=201) as fw:
|
||||||
@ -148,16 +146,15 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
self.assertEqual(fw['firewall'][k], v)
|
self.assertEqual(fw['firewall'][k], v)
|
||||||
|
|
||||||
def test_update_firewall(self):
|
def test_update_firewall(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
name = "new_fw"
|
name = "new_fw"
|
||||||
attrs = self._get_test_firewall_attrs(name)
|
attrs = self._get_test_firewall_attrs(name)
|
||||||
|
attrs['router_id'] = self._create_and_get_router()
|
||||||
|
|
||||||
with self.firewall_policy() as fwp:
|
with self.firewall_policy() as fwp:
|
||||||
fwp_id = fwp['firewall_policy']['id']
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
attrs['firewall_policy_id'] = fwp_id
|
attrs['firewall_policy_id'] = fwp_id
|
||||||
with self.firewall(
|
with self.firewall(
|
||||||
firewall_policy_id=fwp_id, router_id=self.router_id,
|
firewall_policy_id=fwp_id, router_id=attrs['router_id'],
|
||||||
admin_state_up=test_db_firewall.ADMIN_STATE_UP) as fw:
|
admin_state_up=test_db_firewall.ADMIN_STATE_UP) as fw:
|
||||||
fw_id = fw['firewall']['id']
|
fw_id = fw['firewall']['id']
|
||||||
new_data = {'firewall': {'name': name}}
|
new_data = {'firewall': {'name': name}}
|
||||||
@ -173,13 +170,11 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
|
|
||||||
def test_delete_firewall(self):
|
def test_delete_firewall(self):
|
||||||
ctx = context.get_admin_context()
|
ctx = context.get_admin_context()
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
with self.firewall_policy() as fwp:
|
with self.firewall_policy() as fwp:
|
||||||
fwp_id = fwp['firewall_policy']['id']
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
with self.firewall(
|
with self.firewall(
|
||||||
firewall_policy_id=fwp_id,
|
firewall_policy_id=fwp_id,
|
||||||
router_id=self.router_id,
|
router_id=self._create_and_get_router(),
|
||||||
admin_state_up=test_db_firewall.ADMIN_STATE_UP,
|
admin_state_up=test_db_firewall.ADMIN_STATE_UP,
|
||||||
no_delete=True) as fw:
|
no_delete=True) as fw:
|
||||||
fw_id = fw['firewall']['id']
|
fw_id = fw['firewall']['id']
|
||||||
@ -191,10 +186,62 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
firewall.FirewallNotFound,
|
firewall.FirewallNotFound,
|
||||||
self.plugin.get_firewall, ctx, fw_id)
|
self.plugin.get_firewall, ctx, fw_id)
|
||||||
|
|
||||||
|
def test_show_firewall(self):
|
||||||
|
name = "firewall1"
|
||||||
|
attrs = self._get_test_firewall_attrs(name)
|
||||||
|
attrs['router_id'] = self._create_and_get_router()
|
||||||
|
|
||||||
|
with self.firewall_policy() as fwp:
|
||||||
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
|
attrs['firewall_policy_id'] = fwp_id
|
||||||
|
with self.firewall(
|
||||||
|
name=name,
|
||||||
|
firewall_policy_id=fwp_id, router_id=attrs['router_id'],
|
||||||
|
admin_state_up=test_db_firewall.ADMIN_STATE_UP) as firewall:
|
||||||
|
|
||||||
|
req = self.new_show_request('firewalls',
|
||||||
|
firewall['firewall']['id'],
|
||||||
|
fmt=self.fmt)
|
||||||
|
res = self.deserialize(self.fmt,
|
||||||
|
req.get_response(self.ext_api))
|
||||||
|
attrs = self._replace_firewall_status(
|
||||||
|
attrs, const.PENDING_CREATE, const.ACTIVE)
|
||||||
|
for k, v in attrs.iteritems():
|
||||||
|
self.assertEqual(res['firewall'][k], v)
|
||||||
|
|
||||||
|
def test_list_firewalls(self):
|
||||||
|
keys_list = []
|
||||||
|
for i in range(3):
|
||||||
|
keys_list.append({'name': "fw" + str(i),
|
||||||
|
'router_id': self._create_and_get_router(),
|
||||||
|
'admin_state_up': True,
|
||||||
|
'status': "ACTIVE"})
|
||||||
|
|
||||||
|
with contextlib.nested(
|
||||||
|
self.firewall(
|
||||||
|
name='fw0', router_id=keys_list[0]['router_id'],
|
||||||
|
admin_state_up=True, description='fw'),
|
||||||
|
self.firewall(
|
||||||
|
name='fw1', router_id=keys_list[1]['router_id'],
|
||||||
|
admin_state_up=True, description='fw'),
|
||||||
|
self.firewall(
|
||||||
|
name='fw2', router_id=keys_list[2]['router_id'],
|
||||||
|
admin_state_up=True, description='fw'),
|
||||||
|
) as (fw1, fw2, fw3):
|
||||||
|
self._test_list_resources(
|
||||||
|
'firewall', (fw1, fw2, fw3),
|
||||||
|
query_params='description=fw')
|
||||||
|
|
||||||
|
req = self.new_list_request('firewalls')
|
||||||
|
res = self.deserialize(
|
||||||
|
self.fmt, req.get_response(self.ext_api))
|
||||||
|
self.assertEqual(len(res['firewalls']), 3)
|
||||||
|
for index in range(len(res['firewalls'])):
|
||||||
|
for k, v in keys_list[index].items():
|
||||||
|
self.assertEqual(res['firewalls'][index][k], v)
|
||||||
|
|
||||||
def test_create_firewall_with_rules(self):
|
def test_create_firewall_with_rules(self):
|
||||||
ctx = context.get_admin_context()
|
ctx = context.get_admin_context()
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
with contextlib.nested(self.firewall_rule(name='fwr1'),
|
with contextlib.nested(self.firewall_rule(name='fwr1'),
|
||||||
self.firewall_rule(name='fwr2'),
|
self.firewall_rule(name='fwr2'),
|
||||||
self.firewall_rule(name='fwr3')) as fr:
|
self.firewall_rule(name='fwr3')) as fr:
|
||||||
@ -209,7 +256,8 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
attrs = self._get_test_firewall_attrs()
|
attrs = self._get_test_firewall_attrs()
|
||||||
attrs['firewall_policy_id'] = fwp_id
|
attrs['firewall_policy_id'] = fwp_id
|
||||||
with self.firewall(
|
with self.firewall(
|
||||||
firewall_policy_id=fwp_id, router_id=self.router_id,
|
firewall_policy_id=fwp_id,
|
||||||
|
router_id=self._create_and_get_router(),
|
||||||
admin_state_up=test_db_firewall.ADMIN_STATE_UP) as fw:
|
admin_state_up=test_db_firewall.ADMIN_STATE_UP) as fw:
|
||||||
rule_list = (
|
rule_list = (
|
||||||
self.plugin._make_firewall_rule_list_by_policy_id(
|
self.plugin._make_firewall_rule_list_by_policy_id(
|
||||||
@ -232,8 +280,6 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
self.assertEqual(res['firewall_policy'][k], v)
|
self.assertEqual(res['firewall_policy'][k], v)
|
||||||
|
|
||||||
def test_update_firewall_policy_with_firewall(self):
|
def test_update_firewall_policy_with_firewall(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
name = "new_firewall_policy1"
|
name = "new_firewall_policy1"
|
||||||
attrs = self._get_test_firewall_policy_attrs(name)
|
attrs = self._get_test_firewall_policy_attrs(name)
|
||||||
|
|
||||||
@ -242,7 +288,7 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
audited=test_db_firewall.AUDITED) as fwp:
|
audited=test_db_firewall.AUDITED) as fwp:
|
||||||
fwp_id = fwp['firewall_policy']['id']
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
with self.firewall(firewall_policy_id=fwp_id,
|
with self.firewall(firewall_policy_id=fwp_id,
|
||||||
router_id=self.router_id,
|
router_id=self._create_and_get_router(),
|
||||||
admin_state_up=
|
admin_state_up=
|
||||||
test_db_firewall.ADMIN_STATE_UP):
|
test_db_firewall.ADMIN_STATE_UP):
|
||||||
data = {'firewall_policy': {'name': name}}
|
data = {'firewall_policy': {'name': name}}
|
||||||
@ -296,8 +342,6 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
self.assertEqual(res['firewall_rule'][k], v)
|
self.assertEqual(res['firewall_rule'][k], v)
|
||||||
|
|
||||||
def test_update_firewall_rule_with_firewall(self):
|
def test_update_firewall_rule_with_firewall(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
name = "new_firewall_rule1"
|
name = "new_firewall_rule1"
|
||||||
attrs = self._get_test_firewall_rule_attrs(name)
|
attrs = self._get_test_firewall_rule_attrs(name)
|
||||||
with self.firewall_rule() as fwr:
|
with self.firewall_rule() as fwr:
|
||||||
@ -305,7 +349,7 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
fwp_id = fwp['firewall_policy']['id']
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
attrs['firewall_policy_id'] = fwp_id
|
attrs['firewall_policy_id'] = fwp_id
|
||||||
with self.firewall(firewall_policy_id=fwp_id,
|
with self.firewall(firewall_policy_id=fwp_id,
|
||||||
router_id=self.router_id,
|
router_id=self._create_and_get_router(),
|
||||||
admin_state_up=
|
admin_state_up=
|
||||||
test_db_firewall.ADMIN_STATE_UP):
|
test_db_firewall.ADMIN_STATE_UP):
|
||||||
fwr_id = fwr['firewall_rule']['id']
|
fwr_id = fwr['firewall_rule']['id']
|
||||||
@ -399,8 +443,6 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
expected_body=attrs)
|
expected_body=attrs)
|
||||||
|
|
||||||
def test_insert_rule_with_firewall(self):
|
def test_insert_rule_with_firewall(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
attrs = self._get_test_firewall_policy_attrs()
|
attrs = self._get_test_firewall_policy_attrs()
|
||||||
attrs['audited'] = False
|
attrs['audited'] = False
|
||||||
attrs['firewall_list'] = []
|
attrs['firewall_list'] = []
|
||||||
@ -414,7 +456,7 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
with self.firewall_policy() as fwp:
|
with self.firewall_policy() as fwp:
|
||||||
fwp_id = fwp['firewall_policy']['id']
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
attrs['id'] = fwp_id
|
attrs['id'] = fwp_id
|
||||||
with self.firewall(router_id=self.router_id,
|
with self.firewall(router_id=self._create_and_get_router(),
|
||||||
firewall_policy_id=fwp_id) as fw:
|
firewall_policy_id=fwp_id) as fw:
|
||||||
# test insert when rule list is empty
|
# test insert when rule list is empty
|
||||||
fwr0_id = fwr[0]['firewall_rule']['id']
|
fwr0_id = fwr[0]['firewall_rule']['id']
|
||||||
@ -517,15 +559,13 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
|
|||||||
expected_body=None)
|
expected_body=None)
|
||||||
|
|
||||||
def test_remove_rule_with_firewall(self):
|
def test_remove_rule_with_firewall(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
attrs = self._get_test_firewall_policy_attrs()
|
attrs = self._get_test_firewall_policy_attrs()
|
||||||
attrs['audited'] = False
|
attrs['audited'] = False
|
||||||
attrs['firewall_list'] = []
|
attrs['firewall_list'] = []
|
||||||
with self.firewall_policy() as fwp:
|
with self.firewall_policy() as fwp:
|
||||||
fwp_id = fwp['firewall_policy']['id']
|
fwp_id = fwp['firewall_policy']['id']
|
||||||
attrs['id'] = fwp_id
|
attrs['id'] = fwp_id
|
||||||
with self.firewall(router_id=self.router_id,
|
with self.firewall(router_id=self._create_and_get_router(),
|
||||||
firewall_policy_id=fwp_id) as fw:
|
firewall_policy_id=fwp_id) as fw:
|
||||||
attrs['firewall_list'].insert(0, fw['firewall']['id'])
|
attrs['firewall_list'].insert(0, fw['firewall']['id'])
|
||||||
with contextlib.nested(self.firewall_rule(name='fwr1'),
|
with contextlib.nested(self.firewall_rule(name='fwr1'),
|
||||||
|
@ -103,7 +103,6 @@ class TestLoadbalancerPlugin(
|
|||||||
lb_plugin=LBAAS_PLUGIN_CLASS)
|
lb_plugin=LBAAS_PLUGIN_CLASS)
|
||||||
self.vcns_loadbalancer_patch()
|
self.vcns_loadbalancer_patch()
|
||||||
self.plugin = manager.NeutronManager.get_plugin()
|
self.plugin = manager.NeutronManager.get_plugin()
|
||||||
self.router_id = None
|
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super(TestLoadbalancerPlugin, self).tearDown()
|
super(TestLoadbalancerPlugin, self).tearDown()
|
||||||
@ -112,18 +111,16 @@ class TestLoadbalancerPlugin(
|
|||||||
self.ext_api = None
|
self.ext_api = None
|
||||||
self.plugin = None
|
self.plugin = None
|
||||||
|
|
||||||
def _fake_router_edge_mapping(self):
|
def _create_and_get_router(self):
|
||||||
req = self._create_router(self.fmt, self._tenant_id)
|
req = self._create_router(self.fmt, self._tenant_id)
|
||||||
res = self.deserialize(self.fmt, req)
|
res = self.deserialize(self.fmt, req)
|
||||||
self.router_id = res['router']['id']
|
return res['router']['id']
|
||||||
|
|
||||||
def _get_vip_optional_args(self):
|
def _get_vip_optional_args(self):
|
||||||
args = super(TestLoadbalancerPlugin, self)._get_vip_optional_args()
|
args = super(TestLoadbalancerPlugin, self)._get_vip_optional_args()
|
||||||
return args + ('router_id',)
|
return args + ('router_id',)
|
||||||
|
|
||||||
def test_update_healthmonitor(self):
|
def test_update_healthmonitor(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
|
|
||||||
keys = [('type', "TCP"),
|
keys = [('type', "TCP"),
|
||||||
('tenant_id', self._tenant_id),
|
('tenant_id', self._tenant_id),
|
||||||
('delay', 20),
|
('delay', 20),
|
||||||
@ -139,8 +136,8 @@ class TestLoadbalancerPlugin(
|
|||||||
net_id = subnet['subnet']['network_id']
|
net_id = subnet['subnet']['network_id']
|
||||||
self._set_net_external(net_id)
|
self._set_net_external(net_id)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id, pool=pool,
|
router_id=self._create_and_get_router(),
|
||||||
subnet=subnet):
|
pool=pool, subnet=subnet):
|
||||||
self.plugin.create_pool_health_monitor(
|
self.plugin.create_pool_health_monitor(
|
||||||
context.get_admin_context(),
|
context.get_admin_context(),
|
||||||
health_mon, pool['pool']['id']
|
health_mon, pool['pool']['id']
|
||||||
@ -160,7 +157,6 @@ class TestLoadbalancerPlugin(
|
|||||||
|
|
||||||
def test_delete_healthmonitor(self):
|
def test_delete_healthmonitor(self):
|
||||||
ctx = context.get_admin_context()
|
ctx = context.get_admin_context()
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.subnet(),
|
self.subnet(),
|
||||||
self.pool(),
|
self.pool(),
|
||||||
@ -169,8 +165,8 @@ class TestLoadbalancerPlugin(
|
|||||||
net_id = subnet['subnet']['network_id']
|
net_id = subnet['subnet']['network_id']
|
||||||
self._set_net_external(net_id)
|
self._set_net_external(net_id)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id, pool=pool,
|
router_id=self._create_and_get_router(),
|
||||||
subnet=subnet):
|
pool=pool, subnet=subnet):
|
||||||
self.plugin.create_pool_health_monitor(
|
self.plugin.create_pool_health_monitor(
|
||||||
context.get_admin_context(),
|
context.get_admin_context(),
|
||||||
health_mon, pool['pool']['id']
|
health_mon, pool['pool']['id']
|
||||||
@ -185,7 +181,6 @@ class TestLoadbalancerPlugin(
|
|||||||
self.assertIsNone(qry.first())
|
self.assertIsNone(qry.first())
|
||||||
|
|
||||||
def test_create_vip(self, **extras):
|
def test_create_vip(self, **extras):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
expected = {
|
expected = {
|
||||||
'name': 'vip1',
|
'name': 'vip1',
|
||||||
'description': '',
|
'description': '',
|
||||||
@ -193,7 +188,8 @@ class TestLoadbalancerPlugin(
|
|||||||
'protocol': 'HTTP',
|
'protocol': 'HTTP',
|
||||||
'connection_limit': -1,
|
'connection_limit': -1,
|
||||||
'admin_state_up': True,
|
'admin_state_up': True,
|
||||||
'status': 'PENDING_CREATE',
|
'status': 'ACTIVE',
|
||||||
|
'router_id': self._create_and_get_router(),
|
||||||
'tenant_id': self._tenant_id,
|
'tenant_id': self._tenant_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,11 +210,10 @@ class TestLoadbalancerPlugin(
|
|||||||
monitor, pool['pool']['id']
|
monitor, pool['pool']['id']
|
||||||
)
|
)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id, name=name,
|
router_id=expected['router_id'], name=name,
|
||||||
pool=pool, subnet=subnet, **extras) as vip:
|
pool=pool, subnet=subnet, **extras) as vip:
|
||||||
for k in ('id', 'address', 'port_id', 'pool_id'):
|
for k in ('id', 'address', 'port_id', 'pool_id'):
|
||||||
self.assertTrue(vip['vip'].get(k, None))
|
self.assertTrue(vip['vip'].get(k, None))
|
||||||
expected['status'] = 'ACTIVE'
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
dict((k, v)
|
dict((k, v)
|
||||||
for k, v in vip['vip'].items() if k in expected),
|
for k, v in vip['vip'].items() if k in expected),
|
||||||
@ -226,9 +221,10 @@ class TestLoadbalancerPlugin(
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_update_vip(self):
|
def test_update_vip(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
name = 'new_vip'
|
name = 'new_vip'
|
||||||
keys = [('name', name),
|
router_id = self._create_and_get_router()
|
||||||
|
keys = [('router_id', router_id),
|
||||||
|
('name', name),
|
||||||
('address', "10.0.0.2"),
|
('address', "10.0.0.2"),
|
||||||
('protocol_port', 80),
|
('protocol_port', 80),
|
||||||
('connection_limit', 100),
|
('connection_limit', 100),
|
||||||
@ -247,7 +243,7 @@ class TestLoadbalancerPlugin(
|
|||||||
monitor, pool['pool']['id']
|
monitor, pool['pool']['id']
|
||||||
)
|
)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id, name=name,
|
router_id=router_id, name=name,
|
||||||
pool=pool, subnet=subnet) as vip:
|
pool=pool, subnet=subnet) as vip:
|
||||||
keys.append(('subnet_id', vip['vip']['subnet_id']))
|
keys.append(('subnet_id', vip['vip']['subnet_id']))
|
||||||
data = {'vip': {'name': name,
|
data = {'vip': {'name': name,
|
||||||
@ -264,7 +260,6 @@ class TestLoadbalancerPlugin(
|
|||||||
self.assertEqual(res['vip'][k], v)
|
self.assertEqual(res['vip'][k], v)
|
||||||
|
|
||||||
def test_delete_vip(self):
|
def test_delete_vip(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.subnet(),
|
self.subnet(),
|
||||||
self.pool(),
|
self.pool(),
|
||||||
@ -277,15 +272,83 @@ class TestLoadbalancerPlugin(
|
|||||||
monitor, pool['pool']['id']
|
monitor, pool['pool']['id']
|
||||||
)
|
)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id,
|
router_id=self._create_and_get_router(),
|
||||||
pool=pool, subnet=subnet, no_delete=True) as vip:
|
pool=pool, subnet=subnet, no_delete=True) as vip:
|
||||||
req = self.new_delete_request('vips',
|
req = self.new_delete_request('vips',
|
||||||
vip['vip']['id'])
|
vip['vip']['id'])
|
||||||
res = req.get_response(self.ext_api)
|
res = req.get_response(self.ext_api)
|
||||||
self.assertEqual(res.status_int, 204)
|
self.assertEqual(res.status_int, 204)
|
||||||
|
|
||||||
|
def test_show_vip(self):
|
||||||
|
router_id = self._create_and_get_router()
|
||||||
|
name = "vip_show"
|
||||||
|
keys = [('name', name),
|
||||||
|
('protocol_port', 80),
|
||||||
|
('protocol', 'HTTP'),
|
||||||
|
('connection_limit', -1),
|
||||||
|
('admin_state_up', True),
|
||||||
|
('status', 'ACTIVE'),
|
||||||
|
('router_id', router_id)]
|
||||||
|
|
||||||
|
with contextlib.nested(
|
||||||
|
self.subnet(),
|
||||||
|
self.pool(),
|
||||||
|
self.health_monitor()
|
||||||
|
) as (subnet, pool, monitor):
|
||||||
|
net_id = subnet['subnet']['network_id']
|
||||||
|
self._set_net_external(net_id)
|
||||||
|
self.plugin.create_pool_health_monitor(
|
||||||
|
context.get_admin_context(),
|
||||||
|
monitor, pool['pool']['id']
|
||||||
|
)
|
||||||
|
with self.vip(
|
||||||
|
router_id=router_id, name=name,
|
||||||
|
pool=pool, subnet=subnet) as vip:
|
||||||
|
req = self.new_show_request('vips',
|
||||||
|
vip['vip']['id'])
|
||||||
|
res = self.deserialize(
|
||||||
|
self.fmt, req.get_response(self.ext_api))
|
||||||
|
for k, v in keys:
|
||||||
|
self.assertEqual(res['vip'][k], v)
|
||||||
|
|
||||||
|
def test_list_vips(self):
|
||||||
|
keys_list = []
|
||||||
|
for i in range(3):
|
||||||
|
keys_list.append({'name': "vip" + str(i),
|
||||||
|
'router_id': self._create_and_get_router(),
|
||||||
|
'protocol_port': 80 + i,
|
||||||
|
'protocol': "HTTP",
|
||||||
|
'status': "ACTIVE",
|
||||||
|
'admin_state_up': True})
|
||||||
|
|
||||||
|
with self.subnet() as subnet:
|
||||||
|
net_id = subnet['subnet']['network_id']
|
||||||
|
self._set_net_external(net_id)
|
||||||
|
with contextlib.nested(
|
||||||
|
self.vip(
|
||||||
|
router_id=keys_list[0]['router_id'], name='vip0',
|
||||||
|
subnet=subnet, protocol_port=80),
|
||||||
|
self.vip(
|
||||||
|
router_id=keys_list[1]['router_id'], name='vip1',
|
||||||
|
subnet=subnet, protocol_port=81),
|
||||||
|
self.vip(
|
||||||
|
router_id=keys_list[2]['router_id'], name='vip2',
|
||||||
|
subnet=subnet, protocol_port=82),
|
||||||
|
) as (vip1, vip2, vip3):
|
||||||
|
self._test_list_with_sort(
|
||||||
|
'vip',
|
||||||
|
(vip1, vip3, vip2),
|
||||||
|
[('protocol_port', 'asc'), ('name', 'desc')]
|
||||||
|
)
|
||||||
|
req = self.new_list_request('vips')
|
||||||
|
res = self.deserialize(
|
||||||
|
self.fmt, req.get_response(self.ext_api))
|
||||||
|
self.assertEqual(len(res['vips']), 3)
|
||||||
|
for index in range(len(res['vips'])):
|
||||||
|
for k, v in keys_list[index].items():
|
||||||
|
self.assertEqual(res['vips'][index][k], v)
|
||||||
|
|
||||||
def test_update_pool(self):
|
def test_update_pool(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
data = {'pool': {'name': "new_pool",
|
data = {'pool': {'name': "new_pool",
|
||||||
'admin_state_up': False}}
|
'admin_state_up': False}}
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
@ -300,7 +363,7 @@ class TestLoadbalancerPlugin(
|
|||||||
monitor, pool['pool']['id']
|
monitor, pool['pool']['id']
|
||||||
)
|
)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id,
|
router_id=self._create_and_get_router(),
|
||||||
pool=pool, subnet=subnet):
|
pool=pool, subnet=subnet):
|
||||||
req = self.new_update_request(
|
req = self.new_update_request(
|
||||||
'pools', data, pool['pool']['id'])
|
'pools', data, pool['pool']['id'])
|
||||||
@ -310,8 +373,7 @@ class TestLoadbalancerPlugin(
|
|||||||
self.assertEqual(res['pool'][k], v)
|
self.assertEqual(res['pool'][k], v)
|
||||||
|
|
||||||
def test_create_member(self):
|
def test_create_member(self):
|
||||||
self._fake_router_edge_mapping()
|
router_id = self._create_and_get_router()
|
||||||
|
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.subnet(),
|
self.subnet(),
|
||||||
self.pool(),
|
self.pool(),
|
||||||
@ -325,13 +387,13 @@ class TestLoadbalancerPlugin(
|
|||||||
monitor, pool['pool']['id']
|
monitor, pool['pool']['id']
|
||||||
)
|
)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id,
|
router_id=router_id,
|
||||||
pool=pool, subnet=subnet):
|
pool=pool, subnet=subnet):
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.member(address='192.168.1.100',
|
self.member(address='192.168.1.100',
|
||||||
protocol_port=80,
|
protocol_port=80,
|
||||||
pool_id=pool_id),
|
pool_id=pool_id),
|
||||||
self.member(router_id=self.router_id,
|
self.member(router_id=router_id,
|
||||||
address='192.168.1.101',
|
address='192.168.1.101',
|
||||||
protocol_port=80,
|
protocol_port=80,
|
||||||
pool_id=pool_id)) as (member1, member2):
|
pool_id=pool_id)) as (member1, member2):
|
||||||
@ -354,7 +416,6 @@ class TestLoadbalancerPlugin(
|
|||||||
return self.deserialize(self.fmt, res)
|
return self.deserialize(self.fmt, res)
|
||||||
|
|
||||||
def test_update_member(self):
|
def test_update_member(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.subnet(),
|
self.subnet(),
|
||||||
self.pool(name="pool1"),
|
self.pool(name="pool1"),
|
||||||
@ -372,7 +433,7 @@ class TestLoadbalancerPlugin(
|
|||||||
monitor, pool2['pool']['id']
|
monitor, pool2['pool']['id']
|
||||||
)
|
)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id,
|
router_id=self._create_and_get_router(),
|
||||||
pool=pool1, subnet=subnet):
|
pool=pool1, subnet=subnet):
|
||||||
keys = [('address', "192.168.1.100"),
|
keys = [('address', "192.168.1.100"),
|
||||||
('tenant_id', self._tenant_id),
|
('tenant_id', self._tenant_id),
|
||||||
@ -407,7 +468,6 @@ class TestLoadbalancerPlugin(
|
|||||||
self.assertFalse(pool1_update['pool']['members'])
|
self.assertFalse(pool1_update['pool']['members'])
|
||||||
|
|
||||||
def test_delete_member(self):
|
def test_delete_member(self):
|
||||||
self._fake_router_edge_mapping()
|
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.subnet(),
|
self.subnet(),
|
||||||
self.pool(),
|
self.pool(),
|
||||||
@ -421,7 +481,7 @@ class TestLoadbalancerPlugin(
|
|||||||
monitor, pool['pool']['id']
|
monitor, pool['pool']['id']
|
||||||
)
|
)
|
||||||
with self.vip(
|
with self.vip(
|
||||||
router_id=self.router_id,
|
router_id=self._create_and_get_router(),
|
||||||
pool=pool, subnet=subnet):
|
pool=pool, subnet=subnet):
|
||||||
with self.member(pool_id=pool_id,
|
with self.member(pool_id=pool_id,
|
||||||
no_delete=True) as member:
|
no_delete=True) as member:
|
||||||
|
Loading…
Reference in New Issue
Block a user