update get_slices()
[plstackapi.git] / plstackapi / core / api / slices.py
index 93b7ba2..eda2249 100644 (file)
@@ -1,26 +1,33 @@
+import re
+from types import StringTypes
+from django.contrib.auth import authenticate
 from plstackapi.openstack.client import OpenStackClient
 from plstackapi.openstack.driver import OpenStackDriver
 from plstackapi.core.api.auth import auth_check
-from plstackapi.core.models import Site
-def lookup_site(fields):
-    site = None
-    if 'site' in fields:
-        if isinstance(fields['site'], int):
-            sites = Site.objects.filter(id=fields['site'])
-        else:
-            sites = Site.objects.filter(login_base=fields['site'])
-        if sites:
-            site = sites[0]
-    if not site:
-        raise Exception, "No such site: %s" % fields['site']
-    return site 
+from plstackapi.core.models import Slice
+from plstackapi.core.api.sites import _get_sites
 
+def _get_slices(filter):
+    if isinstance(filter, StringTypes) and filter.isdigit():
+        filter = int(filter)
+    if isinstance(filter, int):
+        slices = Slice.objects.filter(id=filter)
+    elif isinstance(filter, StringTypes):
+        slices = Slice.objects.filter(name=filter)
+    elif isinstance(filter, dict):
+        slices = Slice.objects.filter(**filter)
+    else:
+        slices = []
+    return slices
+    
 def add_slice(auth, fields):
     driver = OpenStackDriver(client = auth_check(auth))
-    site = lookup_site(fields) 
-    if site: fields['site'] = site     
+    login_base = fields['name'][:fields['name'].find('_')]
+    sites = _get_sites(login_base) 
+    if sites: fields['site'] = sites[0]     
     slice = Slice(**fields)
+   
     # create tenant
     nova_fields = {'tenant_name': slice.name,
                    'description': slice.description,
@@ -29,19 +36,19 @@ def add_slice(auth, fields):
     slice.tenant_id=tenant.id
     
     # create network
-    network = driver.create_network(name=self.name)
-    self.network_id = network['id']
+    network = driver.create_network(slice.name)
+    slice.network_id = network['id']
 
     # create router
-    router = driver.create_router(name=self.name)
-    self.router_id = router['id']    
+    router = driver.create_router(slice.name)
+    slice.router_id = router['id']    
 
     slice.save()
     return slice
 
 def update_slice(auth, id, **fields):
     driver = OpenStackDriver(client = auth_check(auth))
-    slices = Slice.objects.filter(id=id)
+    slices = _get_slices(id)
     if not slices:
         return
 
@@ -57,25 +64,29 @@ def update_slice(auth, id, **fields):
     driver.update_tenant(slice.tenant_id, **nova_fields)
 
     # update db record 
-    site = lookup_site(fields)
-    if site: fields['site'] = site
+    sites = _get_sites(fields.get('site'))
+    if sites: fields['site'] = sites[0]
     slice.update(**fields)
 
     return slice 
 
 def delete_slice(auth, filter={}):
     driver = OpenStackDriver(client = auth_check(auth))   
-    slices = Slice.objects.filter(**filter)
+    slices = _get_slices(id)
     for slice in slices:
+        driver.delete_network(slice.network_id)
+        driver.delete_router(slice.router_id)
         driver.delete_slice(id=slice.tenant_id) 
         slice.delete()
     return 1
 
 def get_slices(auth, filter={}):
-    client = auth_check(auth)
-    site = lookup_site(fields)
-    if site: fields['site'] = site
-    slices = Slice.objects.filter(**filter)
+    user = authenticate(username=auth.get('username'),
+                        password=auth.get('password'))
+    if 'site' in filter:
+        sites = _get_sites(filter.get('site'))
+        if sites: filter['site'] = sites[0]
+    slices = _get_slices(filter)
     return slices