Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
authorScott Baker <smbaker@gmail.com>
Fri, 18 Apr 2014 17:49:54 +0000 (10:49 -0700)
committerScott Baker <smbaker@gmail.com>
Fri, 18 Apr 2014 17:49:54 +0000 (10:49 -0700)
planetstack/observer/steps/sync_network_deployments.py
planetstack/observer/steps/sync_slice_deployments.py
planetstack/observer/steps/sync_slivers.py
planetstack/observer/steps/sync_user_deployments.py
planetstack/observer/steps/sync_users.py
planetstack/openstack/driver.py
planetstack/planetstack-backend.py
planetstack/plstackapi_config

index a8d6262..d27430d 100644 (file)
@@ -29,6 +29,10 @@ class SyncNetworkDeployments(OpenStackSyncStep):
             network_deploy_lookup[network_deployment.network].append(network_deployment.deployment)
 
         for network in Network.objects.filter():
+            # ignore networks that have
+            # template.visibility = private and template.translation = none
+            if network.template.visibility == 'private' and not network.template.translation == 'none':
+                continue
             expected_deployments = slice_deploy_lookup[network.owner]
             for expected_deployment in expected_deployments:
                 if network not in network_deploy_lookup or \
index 01a10dd..c7b20ce 100644 (file)
@@ -89,41 +89,6 @@ class SyncSliceDeployments(OpenStackSyncStep):
                                                           tenant=tenant.name, 
                                                           deployment=slice_deployment.deployment.name)
 
-                # create a public key for the slice creator
-                if deployment_user.user.public_key:
-                    keyname = deployment_user.user.email.lower().replace('@', 'AT').replace('.', '') +\
-                              slice_deployment.slice.name
-                    slice_deployment.keyname = keyname 
-                    key_fields =  {'name': keyname,
-                                   'public_key': deployment_user.user.public_key} 
-                    client_driver.create_keypair(**key_fields)
-
-                # create network
-                #network = client_driver.create_network(slice_deployment.slice.name)
-                #slice_deployment.network_id = network['id']
-
-                # create router
-                #router = client_driver.create_router(slice_deployment.slice.name)
-                #slice_deployment.router_id = router['id']
-
-                # create subnet for slice's private network
-                #next_subnet = self.get_next_subnet(deployment=slice_deployment.deployment.name)
-                #cidr = str(next_subnet.cidr)
-                #ip_version = next_subnet.version
-                #start = str(next_subnet[2])
-                #end = str(next_subnet[-2]) 
-                #subnet = client_driver.create_subnet(name=slice_deployment.slice.name,
-                #                                   network_id = network['id'],
-                #                                   cidr_ip = cidr,
-                #                                   ip_version = ip_version,
-                #                                   start = start,
-                #                                   end = end)
-                #slice_deployment.subnet_id = subnet['id']
-                # add subnet as interface to slice's router
-                #client_driver.add_router_interface(router['id'], subnet['id'])
-                # add external route
-                #client_driver.add_external_route(subnet)
-
 
         if slice_deployment.id and slice_deployment.tenant_id:
             driver = self.driver.admin_driver(deployment=slice_deployment.deployment.name)
index 3759747..473b3ac 100644 (file)
@@ -67,7 +67,15 @@ class SyncSlivers(OpenStackSyncStep):
                     image_id = image['id']
                     
             # look up key name at the deployment
+            # create/fetch keypair
             keyname = None
+            if sliver.creator.public_key:
+                keyname = sliver.creator.email.lower().replace('@', 'AT').replace('.', '') +\
+                          sliver.slice.name
+                key_fields =  {'name': keyname,
+                               'public_key': sliver.creator.public_key}
+                driver.create_keypair(**key_fields)       
             slice_deployments = SliceDeployments.objects.filter(slice = sliver.slice, 
                                                                deployment = sliver.deploymentNetwork)
             for slice_deployment in slice_deployments:
index cbbcb17..39943f7 100644 (file)
@@ -29,7 +29,6 @@ class SyncUserDeployments(OpenStackSyncStep):
         for user_deployment in UserDeployments.objects.all():
             user_deploy_lookup[user_deployment.user].append(user_deployment.deployment)
        
-        user_deployments = []
         all_deployments = Deployment.objects.filter() 
         for user in User.objects.all():
             if user.is_admin:
@@ -45,13 +44,14 @@ class SyncUserDeployments(OpenStackSyncStep):
                   expected_deployment not in user_deploy_lookup[user]: 
                     # add new record
                     ud = UserDeployments(user=user, deployment=expected_deployment)
-                    user_deployments.append(ud)
+                    ud.save()
+                    #user_deployments.append(ud)
                 #else:
                 #    # update existing record
                 #    ud = UserDeployments.objects.get(user=user, deployment=expected_deployment)
                 #    user_deployments.append(ud)
 
-        return user_deployments
+        return UserDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) 
 
     def sync_record(self, user_deployment):
         logger.info("sync'ing user %s at deployment %s" % (user_deployment.user, user_deployment.deployment.name))
@@ -96,5 +96,3 @@ class SyncUserDeployments(OpenStackSyncStep):
         #    user_driver.create_keypair(**key_fields)
 
         user_deployment.save()
-        user = User.objects.get(id=user_deployment.user.id)
-        user.save()
index 2550104..71f9c0f 100644 (file)
@@ -4,7 +4,7 @@ import hashlib
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.user import User
+from core.models.user import User, UserDeployments
 
 class SyncUsers(OpenStackSyncStep):
     provides=[User]
@@ -14,5 +14,7 @@ class SyncUsers(OpenStackSyncStep):
         return User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
     def sync_record(self, user):
-        #user.save()
-        pass 
+        for user_deployment in UserDeployments.objects.filter(user=user):
+            # bump the 'updated' field so user account are updated across 
+            # deployments.
+            user_deployment.save()
index b8faf25..f5abb02 100644 (file)
@@ -417,12 +417,9 @@ class OpenStackDriver:
         if not security_group:
             security_group = self.config.nova_default_security_group
 
-        personality = []
-        if pubkeys:
-            personality.append({
-                'path': '/root/.ssh/authorized_keys',
-                'contents':"\n".join(pubkeys),
-        })       
+        files = {}
+        #if pubkeys:
+        #    files["/root/.ssh/authorized_keys"] = "\n".join(pubkeys).encode('base64')
         hints = {}
         availability_zone = None
         if hostname:
@@ -433,7 +430,7 @@ class OpenStackDriver:
                                             flavor=flavor.id,
                                             image=image_id,
                                             security_group = security_group,
-                                            personality = personality,
+                                            #files = files,
                                             scheduler_hints=hints,
                                             availability_zone=availability_zone,
                                             nics=nics,
index 7d94b67..8a2eff2 100755 (executable)
@@ -1,10 +1,41 @@
 #!/usr/bin/env python
 import os
+import argparse
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
-from observer.backend import Backend 
+from observer.backend import Backend
+from planetstack.config import Config 
 
-if __name__ == '__main__':
+config = Config()
+
+# after http://www.erlenstar.demon.co.uk/unix/faq_2.html
+def daemon():
+    """Daemonize the current process."""
+    if os.fork() != 0: os._exit(0)
+    os.setsid()
+    if os.fork() != 0: os._exit(0)
+    os.umask(0)
+    devnull = os.open(os.devnull, os.O_RDWR)
+    os.dup2(devnull, 0)
+    # xxx fixme - this is just to make sure that nothing gets stupidly lost - should use devnull
+    logdir=os.path.dirname(config.observer_logfile)
+    # when installed in standalone we might not have httpd installed
+    if not os.path.isdir(logdir): os.mkdir(logdir)
+    crashlog = os.open('%s'%config.observer_logfile, os.O_RDWR | os.O_APPEND | os.O_CREAT, 0644)
+    os.dup2(crashlog, 1)
+    os.dup2(crashlog, 2)
+
+def main():
+    # Generate command line parser
+    parser = argparse.ArgumentParser(usage='%(prog)s [options]')
+    parser.add_argument('-d', '--daemon', dest='daemon', action='store_true', default=False, 
+                        help='Run as daemon.')
+    args = parser.parse_args()
+       
+    if args.daemon: daemon()
 
     backend = Backend()
-    backend.run()
+    backend.run()    
+
+if __name__ == '__main__':
+    
+    main() 
index 6abdaaf..5d95231 100644 (file)
@@ -19,6 +19,7 @@ ratelimit_enabled=0
 omf_enabled=0
 mail_support_address=support@localhost
 nova_enabled=True
+logfile=/var/log/planetstack.log
 
 [nova]
 admin_user=admin@domain.com
@@ -31,3 +32,4 @@ default_security_group=default
 
 [observer]
 dependency_graph=/opt/planetstack/model-deps
+logfile=/var/log/planetstack_backend.log