X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plstackapi%2Fopenstack%2Fmanager.py;h=6f37e5aad069a88afd33fbc5fe19031e615bf4a8;hb=585160ecca3ac3323f5391b3d87b7de7604c0fef;hp=96947c93f28f0d3378a5cfdb7e41f95628e984c4;hpb=620f0f3899ad9215925856498890fc552c58f744;p=plstackapi.git diff --git a/plstackapi/openstack/manager.py b/plstackapi/openstack/manager.py index 96947c9..6f37e5a 100644 --- a/plstackapi/openstack/manager.py +++ b/plstackapi/openstack/manager.py @@ -1,3 +1,4 @@ +from netaddr import IPAddress, IPNetwork from plstackapi.planetstack import settings from django.core import management management.setup_environ(settings) @@ -38,7 +39,7 @@ class OpenStackManager: self.driver = OpenStackDriver(client=self.client) if caller: - self.caller = caller: + self.caller = caller else: self.caller = self.driver.admin_user self.caller.user_id = self.caller.id @@ -77,7 +78,13 @@ class OpenStackManager: 'enabled': True} keystone_user = self.driver.create_user(**user_fields) user.user_id = keystone_user.id - + if user.site: + if user.is_admin: + role = 'admin' + else: + role = 'user' + self.driver.add_user_role(user.user_id, user.site.tenant_id, role) + @require_enabled def delete_user(self, user): if user.user_id: @@ -131,6 +138,23 @@ class OpenStackManager: router = self.driver.create_router(slice.name) slice.router_id = router['id'] + # create subnet + next_subnet = self.get_next_subnet() + cidr = str(next_subnet.cidr) + ip_version = next_subnet.version + start = str(next_subnet[2]) + end = str(next_subnet[-2]) + subnet = self.driver.create_subnet(name=slice.name, + network_id = network['id'], + cidr_ip = cidr, + ip_version = ip_version, + start = start, + end = end) + slice.subnet_id = subnet['id'] + # add subnet as interface to slice's router + self.driver.add_router_interface(router['id'], subnet['id']) + + if slice.id and slice.tenant_id: self.driver.update_tenant(slice.tenant_id, description=slice.description, @@ -139,10 +163,26 @@ class OpenStackManager: @require_enabled def delete_slice(self, slice): if slice.tenant_id: + self.driver.delete_router_interface(slice.router_id, slice.subnet_id) + self.driver.delete_subnet(slice.subnet_id) self.driver.delete_router(slice.router_id) self.driver.delete_network(slice.network_id) self.driver.delete_tenant(slice.tenant_id) + + + def get_next_subnet(self): + # limit ourself to 10.0.x.x for now + valid_subnet = lambda net: net.startswith('10.0') + subnets = self.driver.shell.quantum.list_subnets()['subnets'] + ints = [int(IPNetwork(subnet['cidr']).ip) for subnet in subnets \ + if valid_subnet(subnet['cidr'])] + ints.sort() + last_ip = IPAddress(ints[-1]) + last_network = IPNetwork(str(last_ip) + "/24") + next_network = IPNetwork(str(IPAddress(last_network) + last_network.size) + "/24") + return next_network + @require_enabled def save_subnet(self, subnet): if not subnet.subnet_id: @@ -166,7 +206,7 @@ class OpenStackManager: self.driver.delete_subnet(subnet.subnet_id) #del_route = 'route del -net %s' % self.cidr #commands.getstatusoutput(del_route) - + @require_enabled def save_sliver(self, sliver): if not sliver.instance_id: @@ -177,6 +217,9 @@ class OpenStackManager: sliver.instance_id = instance.id sliver.instance_name = getattr(instance, 'OS-EXT-SRV-ATTR:instance_name') + if sliver.instance_id: + self.driver.update_instance_metadata(sliver.instance_id, {"cpu_cores": str(sliver.numberCores)}) + @require_enabled def delete_sliver(self, sliver): if sliver.instance_id: