+ self.delete_external_route(subnet)
+ return 1
+
+ def add_external_route(self, subnet):
+ ports = self.shell.quantum.list_ports()['ports']
+
+ gw_ip = subnet['gateway_ip']
+ subnet_id = subnet['id']
+
+ # 1. Find the port associated with the subnet's gateway
+ # 2. Find the router associated with that port
+ # 3. Find the port associated with this router and on the external net
+ # 4. Set up route to the subnet through the port from step 3
+ ip_address = None
+ for port in ports:
+ for fixed_ip in port['fixed_ips']:
+ if fixed_ip['subnet_id'] == subnet_id and fixed_ip['ip_address'] == gw_ip:
+ gw_port = port
+ router_id = gw_port['device_id']
+ router = self.shell.quantum.show_router(router_id)['router']
+ ext_net = router['external_gateway_info']['network_id']
+ for port in ports:
+ if port['device_id'] == router_id and port['network_id'] == ext_net:
+ ip_address = port['fixed_ips'][0]['ip_address']
+
+ if ip_address:
+ cmd = "route add -net %s dev br-ex gw %s" % (subnet['cidr'], ip_address)
+ commands.getstatusoutput(cmd)
+
+ return 1
+
+ def delete_external_route(self, subnet):
+ ports = self.shell.quantum.list_ports()['ports']
+
+ gw_ip = subnet['gateway_ip']
+ subnet_id = subnet['id']
+
+ # 1. Find the port associated with the subnet's gateway
+ # 2. Find the router associated with that port
+ # 3. Find the port associated with this router and on the external net
+ # 4. Set up route to the subnet through the port from step 3
+ ip_address = None
+ for port in ports:
+ for fixed_ip in port['fixed_ips']:
+ if fixed_ip['subnet_id'] == subnet_id and fixed_ip['ip_address'] == gw_ip:
+ gw_port = port
+ router_id = gw_port['device_id']
+ router = self.shell.quantum.show_router(router_id)['router']
+ ext_net = router['external_gateway_info']['network_id']
+ for port in ports:
+ if port['device_id'] == router_id and port['network_id'] == ext_net:
+ ip_address = port['fixed_ips'][0]['ip_address']
+
+ if ip_address:
+ cmd = "route delete -net %s" % (subnet['cidr'])
+ commands.getstatusoutput(cmd)
+
+ return 1