X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fopenstack%2Fdriver.py;h=c01fede85363f0629c2fd493cead211326064dff;hb=16f51e03dee4023612e054908e9cfc8a02bac5f3;hp=530d93b955bbbf9459ac51c8496ca91ab916dec9;hpb=6795fbebdf1c348f1539dbd32e255f50e9ff4e12;p=plstackapi.git diff --git a/planetstack/openstack/driver.py b/planetstack/openstack/driver.py index 530d93b..c01fede 100644 --- a/planetstack/openstack/driver.py +++ b/planetstack/openstack/driver.py @@ -51,8 +51,17 @@ class OpenStackDriver: return self.shell.keystone.tenants.update(id, **kwds) def delete_tenant(self, id): + ctx = self.shell.nova_db.ctx tenants = self.shell.keystone.tenants.findall(id=id) for tenant in tenants: + # nova does not automatically delete the tenant's instances + # so we manually delete instances before deleteing the tenant + instances = self.shell.nova_db.instance_get_all_by_filters(ctx, + {'project_id': tenant.id}, 'id', 'asc') + client = OpenStackClient(tenant=tenant) + driver = OpenStackDriver(client=client) + for instance in instances: + driver.destroy_instance(instance.id) self.shell.keystone.tenants.delete(tenant) return 1 @@ -230,7 +239,15 @@ class OpenStackDriver: self.delete_external_route(subnet) return 1 - def add_external_route(self, subnet): + def get_external_routes(self): + status, output = commands.getstatusoutput('route') + routes = output.split('\n')[3:] + return routes + + def add_external_route(self, subnet, routes=[]): + if not routes: + routes = self.get_external_routes() + ports = self.shell.quantum.list_ports()['ports'] gw_ip = subnet['gateway_ip'] @@ -247,14 +264,23 @@ class OpenStackDriver: 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 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) + # check if external route already exists + route_exists = False + if routes: + for route in routes: + if subnet['cidr'] in route and ip_address in route: + route_exists = True + if not route_exists: + cmd = "route add -net %s dev br-ex gw %s" % (subnet['cidr'], ip_address) + s, o = commands.getstatusoutput(cmd) + #print cmd, "\n", s, o return 1 @@ -312,9 +338,9 @@ class OpenStackDriver: if not security_group: security_group = self.config.nova_default_security_group - #authorized_keys = "\n".join(pubkeys) - #files = {'/root/.ssh/authorized_keys': authorized_keys} files = {} + if pubkeys: + files['/root/.ssh/authorized_keys'] = "\n".join(pubkeys) hints = {} availability_zone = None