Fix delete local route bug
Change-Id: Ia2bda7d9e2101fface35f679498fbf37ce564e2a
This commit is contained in:
parent
4da99aac24
commit
c7489afacc
@ -55,17 +55,23 @@ def replace_route(context, route_table_id, destination_cidr_block,
|
|||||||
|
|
||||||
|
|
||||||
def delete_route(context, route_table_id, destination_cidr_block):
|
def delete_route(context, route_table_id, destination_cidr_block):
|
||||||
# TODO(ft): check cidr block is valid
|
|
||||||
route_table = ec2utils.get_db_item(context, 'rtb', route_table_id)
|
route_table = ec2utils.get_db_item(context, 'rtb', route_table_id)
|
||||||
rollback_route_table_state = copy.deepcopy(route_table)
|
for route_index, route in enumerate(route_table['routes']):
|
||||||
route_count = len(route_table['routes'])
|
if route['destination_cidr_block'] != destination_cidr_block:
|
||||||
route_table['routes'] = [
|
continue
|
||||||
r for r in route_table['routes']
|
if route.get('gateway_id', 0) is None:
|
||||||
if r['destination_cidr_block'] != destination_cidr_block]
|
msg = _('cannot remove local route %(destination_cidr_block)s '
|
||||||
if route_count == len(route_table['routes']):
|
'in route table %(route_table_id)s')
|
||||||
|
msg = msg % {'route_table_id': route_table_id,
|
||||||
|
'destination_cidr_block': destination_cidr_block}
|
||||||
|
raise exception.InvalidParameterValue(msg)
|
||||||
|
break
|
||||||
|
else:
|
||||||
raise exception.InvalidRouteNotFound({
|
raise exception.InvalidRouteNotFound({
|
||||||
'route_table_id': route_table_id,
|
'route_table_id': route_table_id,
|
||||||
'destination_cidr_block': destination_cidr_block})
|
'destination_cidr_block': destination_cidr_block})
|
||||||
|
rollback_route_table_state = copy.deepcopy(route_table)
|
||||||
|
del route_table['routes'][route_index]
|
||||||
with common.OnCrashCleaner() as cleaner:
|
with common.OnCrashCleaner() as cleaner:
|
||||||
db_api.update_item(context, route_table)
|
db_api.update_item(context, route_table)
|
||||||
cleaner.addCleanup(db_api.update_item, context,
|
cleaner.addCleanup(db_api.update_item, context,
|
||||||
|
@ -336,6 +336,12 @@ class RouteTableTestCase(base.ApiTestCase):
|
|||||||
self.assertEqual(400, resp['http_status_code'])
|
self.assertEqual(400, resp['http_status_code'])
|
||||||
self.assertEqual('InvalidRoute.NotFound', resp['Error']['Code'])
|
self.assertEqual('InvalidRoute.NotFound', resp['Error']['Code'])
|
||||||
|
|
||||||
|
resp = self.execute('DeleteRoute',
|
||||||
|
{'RouteTableId': fakes.ID_EC2_ROUTE_TABLE_2,
|
||||||
|
'DestinationCidrBlock': fakes.CIDR_VPC_1})
|
||||||
|
self.assertEqual(400, resp['http_status_code'])
|
||||||
|
self.assertEqual('InvalidParameterValue', resp['Error']['Code'])
|
||||||
|
|
||||||
@mock.patch('ec2api.api.route_table._update_routes_in_associated_subnets')
|
@mock.patch('ec2api.api.route_table._update_routes_in_associated_subnets')
|
||||||
def test_delete_route_rollback(self, routes_updater):
|
def test_delete_route_rollback(self, routes_updater):
|
||||||
self.db_api.get_item_by_id.return_value = (
|
self.db_api.get_item_by_id.return_value = (
|
||||||
|
Loading…
Reference in New Issue
Block a user