Bug fixes to sync_slivers step
authorSapan Bhatia <sapanb@cs.princeton.edu>
Wed, 22 Oct 2014 03:55:54 +0000 (23:55 -0400)
committerSapan Bhatia <sapanb@cs.princeton.edu>
Wed, 22 Oct 2014 03:55:54 +0000 (23:55 -0400)
planetstack/openstack_observer/steps/sync_slivers.py

index dcc3b1e..7c572d1 100644 (file)
@@ -11,6 +11,10 @@ from observer.ansible import *
 
 logger = Logger(level=logging.INFO)
 
+def escape(s):
+    s = s.replace('\n',r'\n').replace('"',r'\"')
+    return s
+    
 class SyncSlivers(OpenStackSyncStep):
     provides=[Sliver]
     requested_interval=0
@@ -21,8 +25,10 @@ class SyncSlivers(OpenStackSyncStep):
 
     def sync_record(self, sliver):
         logger.info("sync'ing sliver:%s deployment:%s " % (sliver, sliver.node.deployment))
+
         metadata_update = {}
-        metadata_update["cpu_cores"] = str(sliver.numberCores)
+       if (sliver.numberCores):
+            metadata_update["cpu_cores"] = str(sliver.numberCores)
 
         for tag in sliver.slice.tags.all():
             if tag.name.startswith("sysctl-"):
@@ -30,12 +36,12 @@ class SyncSlivers(OpenStackSyncStep):
 
         # public keys
         slice_memberships = SlicePrivilege.objects.filter(slice=sliver.slice)
-        pubkeys = [sm.user.public_key for sm in slice_memberships if sm.user.public_key]
+        pubkeys = set([sm.user.public_key for sm in slice_memberships if sm.user.public_key])
        if sliver.creator.public_key:
-           pubkeys.append(sliver.creator.public_key)
+           pubkeys.add(sliver.creator.public_key)
 
         if sliver.slice.creator.public_key:
-            pubkeys.append(sliver.slice.creator.public_key) 
+            pubkeys.add(sliver.slice.creator.public_key) 
 
        nics = []
        networks = [ns.network for ns in NetworkSlice.objects.filter(slice=sliver.slice)]   
@@ -44,25 +50,32 @@ class SyncSlivers(OpenStackSyncStep):
 
        for network_deployment in network_deployments:
            if network_deployment.network.template.visibility == 'private' and \
-              network_deployment.network.template.translation == 'none': 
+              network_deployment.network.template.translation == 'none' and network_deployment.net_id
                nics.append({'net-id': network_deployment.net_id})
 
        # now include network template
        network_templates = [network.template.sharedNetworkName for network in networks \
                             if network.template.sharedNetworkName]
 
-        driver = self.driver.client_driver(caller=sliver.creator, tenant=sliver.slice.name, deployment=sliver.deploymentNetwork.name)
-       for net in driver.shell.quantum.list_networks()['networks']:
+        #driver = self.driver.client_driver(caller=sliver.creator, tenant=sliver.slice.name, deployment=sliver.deploymentNetwork)
+        driver = self.driver.admin_driver(tenant='admin', deployment=sliver.deploymentNetwork)
+       nets = driver.shell.quantum.list_networks()['networks']
+       for net in nets:
            if net['name'] in network_templates: 
                nics.append({'net-id': net['id']}) 
 
+       if (not nics):
+           for net in nets:
+               if net['name']=='public':
+                   nics.append(net['id'])
+
        # look up image id
        deployment_driver = self.driver.admin_driver(deployment=sliver.deploymentNetwork.name)
        image_id = None
-       images = deployment_driver.shell.glance.get_images()
+       images = deployment_driver.shell.glanceclient.images.list()
        for image in images:
-           if image['name'] == sliver.image.name:
-               image_id = image['id']
+           if image.name == sliver.image.name or not image_id:
+               image_id = image.id
                
        # look up key name at the deployment
        # create/fetch keypair
@@ -77,31 +90,30 @@ class SyncSlivers(OpenStackSyncStep):
        if sliver.userData:
            userData = sliver.userData
            
-       tenant_fields = {'endpoint':slice_deployment.deployment.auth_url,
-                    'admin_user': slice_deployment.deployment.admin_user,
-                    'admin_password': slice_deployment.deployment.admin_password,
+       sliver_name = '@'.join([sliver.slice.name,sliver.node.name])
+       tenant_fields = {'endpoint':sliver.node.deployment.auth_url,
+                    'admin_user': sliver.node.deployment.admin_user,
+                    'admin_password': sliver.node.deployment.admin_password,
                     'admin_tenant': 'admin',
-                    'tenant': slice_deployment.slice.name,
-                    'tenant_description': slice_deployment.slice.description,
-                    'roles':roles,
-                    'max_instances':max_instances,
-                    'name':sliver.name,
+                    'tenant': sliver.slice.name,
+                    'tenant_description': sliver.slice.description,
+                    'name':sliver_name,
                     'image_id':image_id,
                     'key_name':keyname,
-                    'flavor_id':sliver.flavor.flavor,
+                    'flavor_id':1,
                     'nics':nics,
                     'meta':metadata_update,
                     'key':key_fields,
-                    'user_data':userData}
+                    'user_data':r'%s'%escape(userData)}
 
        res = run_template('sync_slivers.yaml', tenant_fields)
        if (len(res)!=2):
-           raise Exception('Could not sync tenants for slice %s'%slice_deployment.slice.name)
+           raise Exception('Could not sync sliver %s'%sliver.slice.name)
        else:
            sliver_id = res[1]['id'] # 0 is for the key
 
-            sliver.instance_id = instance.id
-            sliver.instance_name = getattr(instance, 'OS-EXT-SRV-ATTR:instance_name')
+            sliver.instance_id = sliver_id
+            sliver.instance_name = sliver_name
             sliver.save()    
 
     def delete_record(self, sliver):