X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fopenstack%2Fdriver.py;h=eba424a5768e1270a181fac54a125ec1f279d740;hb=732913407cc255ab864e39522585e1b98e654af1;hp=6b04b5d81bd1bb6cfe25f7430538771bf3b0b224;hpb=30fd4291ad7fdb809bb8ebbf738c3195436c2455;p=plstackapi.git diff --git a/planetstack/openstack/driver.py b/planetstack/openstack/driver.py index 6b04b5d..eba424a 100644 --- a/planetstack/openstack/driver.py +++ b/planetstack/openstack/driver.py @@ -1,3 +1,4 @@ +import commands from planetstack.config import Config from openstack.client import OpenStackClient @@ -206,7 +207,7 @@ class OpenStackDriver: 'dns_nameservers': ['8.8.8.8', '8.8.4.4'], 'allocation_pools': allocation_pools}} subnet = self.shell.quantum.create_subnet(subnet)['subnet'] - + self.add_external_route(subnet) # TODO: Add route to external network # e.g. # route add -net 10.0.3.0/24 dev br-ex gw 10.100.0.5 return subnet @@ -222,7 +223,64 @@ class OpenStackDriver: if subnet['id'] == id: self.delete_subnet_ports(subnet['id']) self.shell.quantum.delete_subnet(id) - return + 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 def create_keypair(self, name, key): keys = self.shell.nova.keypairs.findall(name=name)