Renamed SliceDeployment back to SliceDeployments
[plstackapi.git] / planetstack / openstack_observer / steps / sync_slice_deployments.py
index 7cce152..9e79164 100644 (file)
@@ -7,8 +7,9 @@ from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.site import Deployment, SiteDeployments
 from core.models.slice import Slice, SliceDeployments
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.site import Deployment, SiteDeployments
 from core.models.slice import Slice, SliceDeployments
-from core.models.userdeployments import UserDeployments
+from core.models.userdeployments import UserDeployment
 from util.logger import Logger, logging
 from util.logger import Logger, logging
+from observer.ansible import *
 
 logger = Logger(level=logging.INFO)
 
 
 logger = Logger(level=logging.INFO)
 
@@ -16,32 +17,11 @@ class SyncSliceDeployments(OpenStackSyncStep):
     provides=[SliceDeployments]
     requested_interval=0
 
     provides=[SliceDeployments]
     requested_interval=0
 
-    def fetch_pending(self):
-        # slice deployments are not visible to users. We must ensure
-        # slices are deployed at all deploymets available to their site.
-        site_deployments = SiteDeployments.objects.all()
-        site_deploy_lookup = defaultdict(list)
-        for site_deployment in site_deployments:
-            site_deploy_lookup[site_deployment.site].append(site_deployment.deployment)
-        
-        slice_deployments = SliceDeployments.objects.all()
-        slice_deploy_lookup = defaultdict(list)
-        for slice_deployment in slice_deployments:
-            slice_deploy_lookup[slice_deployment.slice].append(slice_deployment.deployment)
-        
-        all_deployments = Deployment.objects.all() 
-        for slice in Slice.objects.all():
-            # slices are added to all deployments for now
-            expected_deployments = all_deployments
-            #expected_deployments = site_deploy_lookup[slice.site]
-            for expected_deployment in expected_deployments:
-                if slice not in slice_deploy_lookup or \
-                   expected_deployment not in slice_deploy_lookup[slice]:
-                    sd = SliceDeployments(slice=slice, deployment=expected_deployment)
-                    sd.save()
-
-        # now we can return all slice deployments that need to be enacted   
-        return SliceDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+    def fetch_pending(self, deleted):
+        if (deleted):
+            return SliceDeployments.deleted_objects.all()
+        else:
+            return SliceDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
     def get_next_subnet(self, deployment=None):
         # limit ourself to 10.0.x.x for now
 
     def get_next_subnet(self, deployment=None):
         # limit ourself to 10.0.x.x for now
@@ -63,43 +43,63 @@ class SyncSliceDeployments(OpenStackSyncStep):
 
     def sync_record(self, slice_deployment):
         logger.info("sync'ing slice deployment %s" % slice_deployment)
 
     def sync_record(self, slice_deployment):
         logger.info("sync'ing slice deployment %s" % slice_deployment)
-        if not slice_deployment.tenant_id:
-            nova_fields = {'tenant_name': slice_deployment.slice.name,
-                   'description': slice_deployment.slice.description,
-                   'enabled': slice_deployment.slice.enabled}
-            driver = self.driver.admin_driver(deployment=slice_deployment.deployment.name)
-            tenant = driver.create_tenant(**nova_fields)
-            slice_deployment.tenant_id = tenant.id
 
 
-            # XXX give caller an admin role at the tenant they've created
-            deployment_users = UserDeployments.objects.filter(user=slice_deployment.slice.creator,
+        if not slice_deployment.deployment.admin_user:
+            logger.info("deployment %r has no admin_user, skipping" % slice_deployment.deployment)
+            return
+
+       deployment_users = UserDeployment.objects.filter(user=slice_deployment.slice.creator,
                                                              deployment=slice_deployment.deployment)            
                                                              deployment=slice_deployment.deployment)            
-            if not deployment_users:
-                logger.info("slice createor %s has not accout at deployment %s" % (slice_deployment.slice.creator, slice_deployment.deployment.name))
-            else:
-                deployment_user = deployment_users[0]
-                # lookup user id at this deployment
-                kuser= driver.shell.keystone.users.find(email=slice_deployment.slice.creator.email)
+       if not deployment_users:
+           logger.info("slice createor %s has not accout at deployment %s" % (slice_deployment.slice.creator, slice_deployment.deployment.name))
+           roles = []
+       else:
+           deployment_user = deployment_users[0]
+           roles = ['admin']
+           
+       max_instances=int(slice_deployment.slice.max_slivers)
+       tenant_fields = {'endpoint':slice_deployment.deployment.auth_url,
+                        'admin_user': slice_deployment.deployment.admin_user,
+                        'admin_password': slice_deployment.deployment.admin_password,
+                        'admin_tenant': 'admin',
+                        'tenant': slice_deployment.slice.name,
+                        'tenant_description': slice_deployment.slice.description,
+                        'roles':roles,
+                        'name':deployment_user.email,
+                        'max_instances':max_instances}
 
 
-                # add required roles at the slice's tenant 
-                driver.add_user_role(kuser.id, tenant.id, 'admin')
-                    
-                # refresh credentials using this tenant
-                client_driver = self.driver.client_driver(caller=deployment_user.user,
-                                                          tenant=tenant.name, 
-                                                          deployment=slice_deployment.deployment.name)
+       res = run_template('sync_slice_deployments.yaml', tenant_fields)
+       expected_num = len(roles)+1
+       if (len(res)!=expected_num):
+           raise Exception('Could not sync tenants for slice %s'%slice_deployment.slice.name)
+       else:
+           tenant_id = res[0]['id']
+           if (not slice_deployment.tenant_id):
+               handle = os.popen('nova quota-update --instances %d %s'%(max_instances,tenant_id))
+               output = handle.read()
+               result = handle.close()
+               if (result):
+                   logging.info('Could not update quota for %s'%slice_deployment.slice.name)
+               slice_deployment.tenant_id = tenant_id
+               slice_deployment.save()
+                       
 
 
 
 
-        if slice_deployment.id and slice_deployment.tenant_id:
-            # update existing tenant
-            driver = self.driver.admin_driver(deployment=slice_deployment.deployment.name)
-            driver.update_tenant(slice_deployment.tenant_id,
-                                 description=slice_deployment.slice.description,
-                                 enabled=slice_deployment.slice.enabled)  
+    def delete_record(self, slice_deployment):
+        user = User.objects.get(id=slice_deployment.slice.creator.id)
+        driver = OpenStackDriver().admin_driver(deployment=slice_deployment.deployment.name)
+        client_driver = driver.client_driver(caller=user,
+                                             tenant=slice_deployment.slice.name,
+                                             deployment=slice_deployment.deployment.name)
 
 
+        if slice_deployment.router_id and slice_deployment.subnet_id:
+            client_driver.delete_router_interface(slice_deployment.router_id, slice_deployment.subnet_id)
+        if slice_deployment.subnet_id:
+            client_driver.delete_subnet(slice_deployment.subnet_id)
+        if slice_deployment.router_id:    
+            client_driver.delete_router(slice_deployment.router_id)
+        if slice_deployment.network_id:
+            client_driver.delete_network(slice_deployment.network_id)
         if slice_deployment.tenant_id:
         if slice_deployment.tenant_id:
-            # update slice/tenant quota
-            driver = self.driver.client_driver(deployment=slice_deployment.deployment.name, tenant=slice_deployment.slice.name)
-            driver.shell.nova.quotas.update(tenant_id=slice_deployment.tenant_id, instances=int(slice_deployment.slice.max_slivers)) 
-
-        slice_deployment.save()
+            driver.delete_tenant(slice_deployment.tenant_id)
+