Fix delete local route bug

Change-Id: Ia2bda7d9e2101fface35f679498fbf37ce564e2a
This commit is contained in:
Feodor Tersin 2015-01-24 12:30:05 +04:00
parent 4da99aac24
commit c7489afacc
2 changed files with 19 additions and 7 deletions

View File

@ -55,17 +55,23 @@ def replace_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)
rollback_route_table_state = copy.deepcopy(route_table)
route_count = len(route_table['routes'])
route_table['routes'] = [
r for r in route_table['routes']
if r['destination_cidr_block'] != destination_cidr_block]
if route_count == len(route_table['routes']):
for route_index, route in enumerate(route_table['routes']):
if route['destination_cidr_block'] != destination_cidr_block:
continue
if route.get('gateway_id', 0) is None:
msg = _('cannot remove local route %(destination_cidr_block)s '
'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({
'route_table_id': route_table_id,
'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:
db_api.update_item(context, route_table)
cleaner.addCleanup(db_api.update_item, context,

View File

@ -336,6 +336,12 @@ class RouteTableTestCase(base.ApiTestCase):
self.assertEqual(400, resp['http_status_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')
def test_delete_route_rollback(self, routes_updater):
self.db_api.get_item_by_id.return_value = (