Allow to clear extra routes from router
Ensure that we can handle None field for routes as no neutron client has the ability to clear arbitrary fields. Some refactoring for the unit tests is done to reduce duplication. Fixes bug #1193143 Change-Id: I067e70ee87354e50a5a7d91c383449464bb33eb0
This commit is contained in:
parent
d364d03127
commit
d104fd2e21
@ -40,6 +40,7 @@ EXTENDED_ATTRIBUTES_2_0 = {
|
|||||||
'routers': {
|
'routers': {
|
||||||
'routes': {'allow_post': False, 'allow_put': True,
|
'routes': {'allow_post': False, 'allow_put': True,
|
||||||
'validate': {'type:hostroutes': None},
|
'validate': {'type:hostroutes': None},
|
||||||
|
'convert_to': attr.convert_none_to_empty_list,
|
||||||
'is_visible': True, 'default': attr.ATTR_NOT_SPECIFIED},
|
'is_visible': True, 'default': attr.ATTR_NOT_SPECIFIED},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,52 +76,57 @@ class ExtraRouteDBTestCase(test_l3.L3NatDBTestCase):
|
|||||||
notifier_api._drivers = None
|
notifier_api._drivers = None
|
||||||
cfg.CONF.set_override("notification_driver", [test_notifier.__name__])
|
cfg.CONF.set_override("notification_driver", [test_notifier.__name__])
|
||||||
|
|
||||||
|
def _routes_update_prepare(self, router_id, subnet_id,
|
||||||
|
port_id, routes, skip_add=False):
|
||||||
|
if not skip_add:
|
||||||
|
self._router_interface_action('add', router_id, subnet_id, port_id)
|
||||||
|
self._update('routers', router_id, {'router': {'routes': routes}})
|
||||||
|
return self._show('routers', router_id)
|
||||||
|
|
||||||
|
def _routes_update_cleanup(self, port_id, subnet_id, router_id, routes):
|
||||||
|
self._update('routers', router_id, {'router': {'routes': routes}})
|
||||||
|
self._router_interface_action('remove', router_id, subnet_id, port_id)
|
||||||
|
|
||||||
def test_route_update_with_one_route(self):
|
def test_route_update_with_one_route(self):
|
||||||
|
routes = [{'destination': '135.207.0.0/16', 'nexthop': '10.0.1.3'}]
|
||||||
with self.router() as r:
|
with self.router() as r:
|
||||||
with self.subnet(cidr='10.0.1.0/24') as s:
|
with self.subnet(cidr='10.0.1.0/24') as s:
|
||||||
with self.port(subnet=s, no_delete=True) as p:
|
with self.port(subnet=s, no_delete=True) as p:
|
||||||
body = self._show('routers', r['router']['id'])
|
body = self._routes_update_prepare(r['router']['id'],
|
||||||
body = self._router_interface_action('add',
|
None, p['port']['id'],
|
||||||
r['router']['id'],
|
routes)
|
||||||
None,
|
self.assertEqual(body['router']['routes'], routes)
|
||||||
p['port']['id'])
|
self._routes_update_cleanup(p['port']['id'],
|
||||||
|
None, r['router']['id'], [])
|
||||||
routes = [{'destination': '135.207.0.0/16',
|
|
||||||
'nexthop': '10.0.1.3'}]
|
|
||||||
|
|
||||||
|
def test_route_clear_routes_with_None(self):
|
||||||
|
routes = [{'destination': '135.207.0.0/16',
|
||||||
|
'nexthop': '10.0.1.3'},
|
||||||
|
{'destination': '12.0.0.0/8',
|
||||||
|
'nexthop': '10.0.1.4'},
|
||||||
|
{'destination': '141.212.0.0/16',
|
||||||
|
'nexthop': '10.0.1.5'}]
|
||||||
|
with self.router() as r:
|
||||||
|
with self.subnet(cidr='10.0.1.0/24') as s:
|
||||||
|
with self.port(subnet=s, no_delete=True) as p:
|
||||||
|
self._routes_update_prepare(r['router']['id'],
|
||||||
|
None, p['port']['id'], routes)
|
||||||
body = self._update('routers', r['router']['id'],
|
body = self._update('routers', r['router']['id'],
|
||||||
{'router': {'routes': routes}})
|
{'router': {'routes': None}})
|
||||||
|
self.assertEqual(body['router']['routes'], [])
|
||||||
body = self._show('routers', r['router']['id'])
|
self._routes_update_cleanup(p['port']['id'],
|
||||||
self.assertEqual(body['router']['routes'],
|
None, r['router']['id'], [])
|
||||||
routes)
|
|
||||||
self._update('routers', r['router']['id'],
|
|
||||||
{'router': {'routes': []}})
|
|
||||||
# clean-up
|
|
||||||
self._router_interface_action('remove',
|
|
||||||
r['router']['id'],
|
|
||||||
None,
|
|
||||||
p['port']['id'])
|
|
||||||
|
|
||||||
def test_router_interface_in_use_by_route(self):
|
def test_router_interface_in_use_by_route(self):
|
||||||
|
routes = [{'destination': '135.207.0.0/16',
|
||||||
|
'nexthop': '10.0.1.3'}]
|
||||||
with self.router() as r:
|
with self.router() as r:
|
||||||
with self.subnet(cidr='10.0.1.0/24') as s:
|
with self.subnet(cidr='10.0.1.0/24') as s:
|
||||||
with self.port(subnet=s, no_delete=True) as p:
|
with self.port(subnet=s, no_delete=True) as p:
|
||||||
body = self._router_interface_action('add',
|
body = self._routes_update_prepare(r['router']['id'],
|
||||||
r['router']['id'],
|
None, p['port']['id'],
|
||||||
None,
|
routes)
|
||||||
p['port']['id'])
|
self.assertEqual(body['router']['routes'], routes)
|
||||||
|
|
||||||
routes = [{'destination': '135.207.0.0/16',
|
|
||||||
'nexthop': '10.0.1.3'}]
|
|
||||||
|
|
||||||
body = self._update('routers', r['router']['id'],
|
|
||||||
{'router': {'routes': routes}})
|
|
||||||
|
|
||||||
body = self._show('routers', r['router']['id'])
|
|
||||||
self.assertEqual(body['router']['routes'],
|
|
||||||
routes)
|
|
||||||
|
|
||||||
self._router_interface_action(
|
self._router_interface_action(
|
||||||
'remove',
|
'remove',
|
||||||
r['router']['id'],
|
r['router']['id'],
|
||||||
@ -129,95 +134,54 @@ class ExtraRouteDBTestCase(test_l3.L3NatDBTestCase):
|
|||||||
p['port']['id'],
|
p['port']['id'],
|
||||||
expected_code=exc.HTTPConflict.code)
|
expected_code=exc.HTTPConflict.code)
|
||||||
|
|
||||||
self._update('routers', r['router']['id'],
|
self._routes_update_cleanup(p['port']['id'],
|
||||||
{'router': {'routes': []}})
|
None, r['router']['id'], [])
|
||||||
# clean-up
|
|
||||||
self._router_interface_action('remove',
|
|
||||||
r['router']['id'],
|
|
||||||
None,
|
|
||||||
p['port']['id'])
|
|
||||||
|
|
||||||
def test_route_update_with_multi_routes(self):
|
def test_route_update_with_multi_routes(self):
|
||||||
|
routes = [{'destination': '135.207.0.0/16',
|
||||||
|
'nexthop': '10.0.1.3'},
|
||||||
|
{'destination': '12.0.0.0/8',
|
||||||
|
'nexthop': '10.0.1.4'},
|
||||||
|
{'destination': '141.212.0.0/16',
|
||||||
|
'nexthop': '10.0.1.5'}]
|
||||||
with self.router() as r:
|
with self.router() as r:
|
||||||
with self.subnet(cidr='10.0.1.0/24') as s:
|
with self.subnet(cidr='10.0.1.0/24') as s:
|
||||||
with self.port(subnet=s, no_delete=True) as p:
|
with self.port(subnet=s, no_delete=True) as p:
|
||||||
body = self._router_interface_action('add',
|
body = self._routes_update_prepare(r['router']['id'],
|
||||||
r['router']['id'],
|
None, p['port']['id'],
|
||||||
None,
|
routes)
|
||||||
p['port']['id'])
|
|
||||||
|
|
||||||
routes = [{'destination': '135.207.0.0/16',
|
|
||||||
'nexthop': '10.0.1.3'},
|
|
||||||
{'destination': '12.0.0.0/8',
|
|
||||||
'nexthop': '10.0.1.4'},
|
|
||||||
{'destination': '141.212.0.0/16',
|
|
||||||
'nexthop': '10.0.1.5'}]
|
|
||||||
|
|
||||||
body = self._update('routers', r['router']['id'],
|
|
||||||
{'router': {'routes': routes}})
|
|
||||||
|
|
||||||
body = self._show('routers', r['router']['id'])
|
|
||||||
self.assertEqual(sorted(body['router']['routes']),
|
self.assertEqual(sorted(body['router']['routes']),
|
||||||
sorted(routes))
|
sorted(routes))
|
||||||
|
self._routes_update_cleanup(p['port']['id'],
|
||||||
# clean-up
|
None, r['router']['id'], [])
|
||||||
self._update('routers', r['router']['id'],
|
|
||||||
{'router': {'routes': []}})
|
|
||||||
self._router_interface_action('remove',
|
|
||||||
r['router']['id'],
|
|
||||||
None,
|
|
||||||
p['port']['id'])
|
|
||||||
|
|
||||||
def test_router_update_delete_routes(self):
|
def test_router_update_delete_routes(self):
|
||||||
|
routes_orig = [{'destination': '135.207.0.0/16',
|
||||||
|
'nexthop': '10.0.1.3'},
|
||||||
|
{'destination': '12.0.0.0/8',
|
||||||
|
'nexthop': '10.0.1.4'},
|
||||||
|
{'destination': '141.212.0.0/16',
|
||||||
|
'nexthop': '10.0.1.5'}]
|
||||||
|
routes_left = [{'destination': '135.207.0.0/16',
|
||||||
|
'nexthop': '10.0.1.3'},
|
||||||
|
{'destination': '141.212.0.0/16',
|
||||||
|
'nexthop': '10.0.1.5'}]
|
||||||
with self.router() as r:
|
with self.router() as r:
|
||||||
with self.subnet(cidr='10.0.1.0/24') as s:
|
with self.subnet(cidr='10.0.1.0/24') as s:
|
||||||
with self.port(subnet=s, no_delete=True) as p:
|
with self.port(subnet=s, no_delete=True) as p:
|
||||||
body = self._router_interface_action('add',
|
body = self._routes_update_prepare(r['router']['id'],
|
||||||
r['router']['id'],
|
None, p['port']['id'],
|
||||||
None,
|
routes_orig)
|
||||||
p['port']['id'])
|
|
||||||
|
|
||||||
routes_orig = [{'destination': '135.207.0.0/16',
|
|
||||||
'nexthop': '10.0.1.3'},
|
|
||||||
{'destination': '12.0.0.0/8',
|
|
||||||
'nexthop': '10.0.1.4'},
|
|
||||||
{'destination': '141.212.0.0/16',
|
|
||||||
'nexthop': '10.0.1.5'}]
|
|
||||||
|
|
||||||
body = self._update('routers', r['router']['id'],
|
|
||||||
{'router': {'routes':
|
|
||||||
routes_orig}})
|
|
||||||
|
|
||||||
body = self._show('routers', r['router']['id'])
|
|
||||||
self.assertEqual(sorted(body['router']['routes']),
|
self.assertEqual(sorted(body['router']['routes']),
|
||||||
sorted(routes_orig))
|
sorted(routes_orig))
|
||||||
|
body = self._routes_update_prepare(r['router']['id'],
|
||||||
routes_left = [{'destination': '135.207.0.0/16',
|
None, p['port']['id'],
|
||||||
'nexthop': '10.0.1.3'},
|
routes_left,
|
||||||
{'destination': '141.212.0.0/16',
|
skip_add=True)
|
||||||
'nexthop': '10.0.1.5'}]
|
|
||||||
|
|
||||||
body = self._update('routers', r['router']['id'],
|
|
||||||
{'router': {'routes':
|
|
||||||
routes_left}})
|
|
||||||
|
|
||||||
body = self._show('routers', r['router']['id'])
|
|
||||||
self.assertEqual(sorted(body['router']['routes']),
|
self.assertEqual(sorted(body['router']['routes']),
|
||||||
sorted(routes_left))
|
sorted(routes_left))
|
||||||
|
self._routes_update_cleanup(p['port']['id'],
|
||||||
body = self._update('routers', r['router']['id'],
|
None, r['router']['id'], [])
|
||||||
{'router': {'routes': []}})
|
|
||||||
|
|
||||||
body = self._show('routers', r['router']['id'])
|
|
||||||
self.assertEqual(body['router']['routes'], [])
|
|
||||||
|
|
||||||
# clean-up
|
|
||||||
self._update('routers', r['router']['id'],
|
|
||||||
{'router': {'routes': []}})
|
|
||||||
self._router_interface_action('remove',
|
|
||||||
r['router']['id'],
|
|
||||||
None,
|
|
||||||
p['port']['id'])
|
|
||||||
|
|
||||||
def _test_malformed_route(self, routes):
|
def _test_malformed_route(self, routes):
|
||||||
with self.router() as r:
|
with self.router() as r:
|
||||||
|
Loading…
Reference in New Issue
Block a user