Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
authorScott Baker <smbaker@gmail.com>
Mon, 22 Dec 2014 16:32:02 +0000 (08:32 -0800)
committerScott Baker <smbaker@gmail.com>
Mon, 22 Dec 2014 16:32:02 +0000 (08:32 -0800)
16 files changed:
planetstack/core/admin.py
planetstack/dependency_walker.py
planetstack/model-deps
planetstack/model_policies/model_policy_Slice.py
planetstack/model_policy.py
planetstack/openstack/client.py
planetstack/openstack_observer/ansible.py
planetstack/openstack_observer/steps/sync_controller_images.py
planetstack/openstack_observer/steps/sync_controller_images.yaml
planetstack/openstack_observer/steps/sync_controller_networks.py
planetstack/openstack_observer/steps/sync_controller_networks.yaml
planetstack/openstack_observer/steps/sync_controller_site_deployments.py
planetstack/openstack_observer/steps/sync_controller_slices.py
planetstack/openstack_observer/steps/sync_controller_users.py
planetstack/openstack_observer/steps/sync_nodes.py
planetstack/openstack_observer/steps/sync_roles.py

index f2679ff..0469005 100644 (file)
@@ -944,7 +944,7 @@ class SliceAdmin(PlanetStackBaseAdmin):
     def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
         deployment_nodes = []
         for node in Node.objects.all():
-            deployment_nodes.append( (node.deployment.id, node.id, node.name) )
+            deployment_nodes.append( (node.site_deployment.id, node.id, node.name) )
 
         deployment_flavors = []
         for flavor in Flavor.objects.all():
index 93e1847..bc75b0c 100755 (executable)
@@ -55,7 +55,6 @@ def walk_inv_deps(fn, object):
 
 def __walk_deps(fn, object, deps):
        model = object.__class__.__name__
-
        for dep in deps:
                #print "Checking dep %s"%dep
                peer=None
@@ -74,8 +73,10 @@ def __walk_deps(fn, object, deps):
                if (peer):
                        try:
                                peer_objects = peer.all()
-                       except:
+                       except AttributeError:
                                peer_objects = [peer]
+                       except:
+                               peer_objects = []
 
                        for o in peer_objects:
                                fn(o, object)
index d5d0e4c..33cb695 100644 (file)
@@ -96,7 +96,8 @@
     ], 
     "ControllerSlices": [
         "Controller", 
-        "Slice"
+        "Slice",
+        "ControllerUsers"
     ], 
     "SiteDeployments": [
         "Site", 
index 46ca9b8..659c139 100644 (file)
@@ -1,5 +1,7 @@
 
 def handle(slice):
+        import pdb
+        pdb.set_trace()
        from core.models import Controller, ControllerSiteDeployments, ControllerSlices,Controller,Network,NetworkSlice,NetworkTemplate
        from collections import defaultdict
        ctrl_site_deployments = ControllerSiteDeployments.objects.all()
@@ -14,7 +16,7 @@ def handle(slice):
        
        #expected_controllers = site_deploy_lookup[slice.site]
         all_controllers = Controller.objects.all() 
-       for expected_controller in controllers:
+       for expected_controller in all_controllers:
                if slice not in slice_deploy_lookup or \
                   expected_controller not in slice_deploy_lookup[slice]:
                        sd = ControllerSlices(slice=slice, controller=expected_controller)
index 38cc4df..de6f73d 100644 (file)
@@ -12,8 +12,12 @@ def EnableModelPolicy(x):
     modelPolicyEnabled = x
 
 def update_dep(d, o):
-       if (d.updated < o.updated):
-               d.save(update_fields=['updated'])
+       try:
+               if (d.updated < o.updated):
+                       d.save(update_fields=['updated'])
+       except AttributeError,e:
+               pdb.set_trace()
+               raise e
        
 def delete_if_inactive(d, o):
        #print "Deleting %s (%s)"%(d,d.__class__.__name__)
index 6974dad..d776ec9 100644 (file)
@@ -38,8 +38,10 @@ def parse_novarc(filename):
     return opts
 
 class Client:
-    def __init__(self, username=None, password=None, tenant=None, url=None, token=None, endpoint=None, deployment=None, admin=True, *args, **kwds):
+    def __init__(self, username=None, password=None, tenant=None, url=None, token=None, endpoint=None, controller=None, admin=True, *args, **kwds):
        
+        deployment = controller
+
         self.has_openstack = has_openstack
         self.url = deployment.auth_url
         if admin:
index 8570c17..5761327 100755 (executable)
@@ -46,7 +46,6 @@ def run_template(name, opts,path=''):
     template = os_template_env.get_template(name)
     buffer = template.render(opts)
 
-    import pdb
 
     #f = open('/tmp/obsans','w')
     try:
@@ -61,7 +60,6 @@ def run_template(name, opts,path=''):
     f.write(buffer)
     f.flush()
 
-    #os.system('cp %s %s-backup'%(fqp,fqp))
     run = os.popen('/opt/planetstack/observer/run_ansible '+fqp)
     msg = run.read()
     status = run.close()
@@ -69,8 +67,17 @@ def run_template(name, opts,path=''):
     try:
         ok_results = parse_output(msg)
     except ValueError,e:
-        print str(e)
-        raise e
+        all_fatal = re.findall(r'^msg: (.*)',msg,re.MULTILINE)
+        all_fatal2 = re.findall(r'^ERROR: (.*)',msg,re.MULTILINE)
+       
+       
+       all_fatal.extend(all_fatal2)
+        try:
+            error = ' // '.join(all_fatal)
+        except:
+            pass
+        raise Exception(error)
+
     return ok_results
 
 def main():
index 4446d9a..0a0910e 100644 (file)
@@ -7,6 +7,7 @@ from observer.openstacksyncstep import OpenStackSyncStep
 from core.models import Controller
 from core.models import Image, ControllerImages
 from util.logger import Logger, logging
+from observer.ansible import *
 \r
 logger = Logger(level=logging.INFO)
 
@@ -23,15 +24,18 @@ class SyncControllerImages(OpenStackSyncStep):
 
     def sync_record(self, controller_image):
         logger.info("Working on image %s on controller %s" % (controller_image.image.name, controller_image.controller))
+        import pdb
+        pdb.set_trace()
 
        image_fields = {'endpoint':controller_image.controller.auth_url,
                        'admin_user':controller_image.controller.admin_user,
                        'admin_password':controller_image.controller.admin_password,
                        'name':controller_image.image.name,
-                       'filepath':controller_image.image.path
+                       'filepath':controller_image.image.path,
+                       'ansible_tag': '%s@%s'%(controller_image.image.name,controller_image.controller.name), # name of ansible playbook
                        }
 
-       res = run_template('sync_controller_images.yaml', image_fields)
+       res = run_template('sync_controller_images.yaml', image_fields, path='controller_images')
 
        if (len(res)!=1):
            raise Exception('Could not sync image %s'%controller_image.image.name)
index 55ad36a..aca7171 100644 (file)
@@ -2,12 +2,12 @@
 - hosts: 127.0.0.1
   connection: local 
   tasks:
-  - glance:
+  - glance_image:
         auth_url: {{ endpoint }} 
-       username: {{ admin_user }}
-       tenant_name: 'admin'
-       password: {{ admin_password }}
-       name: {{ name }}
+        login_username: {{ admin_user }}
+        login_tenant_name: 'admin'
+        login_password: {{ admin_password }}
+        name: {{ name }}
         file: {{ filepath }}
-        format: 'raw'
+        disk_format: 'raw'
         is_public: true
index 43769a7..3cff7c2 100644 (file)
@@ -9,6 +9,7 @@ from core.models.network import *
 from core.models.slice import *
 from core.models.sliver import Sliver
 from util.logger import Logger, logging
+from observer.ansible import *
 
 logger = Logger(level=logging.INFO)
 
@@ -37,16 +38,19 @@ class SyncControllerNetworks(OpenStackSyncStep):
             network_name = controller_network.network.name
             subnet_name = '%s-%d'%(network_name,controller_network.pk)
            cidr = self.alloc_subnet(controller_network.pk)
+           slice = controller_network.network.slices.all()[0] # XXX: FIXME!!
+
            network_fields = {'endpoint':controller_network.controller.auth_url,
-                       'admin_user':controller_network.network.slice.creator.email,
-                       'tenant_name':controller_network.network.slice.slicename,
+                       'admin_user':slice.creator.email, # XXX: FIXME
+                       'tenant_name':slice.slicename, # XXX: FIXME
                        'admin_password':controller_network.controller.admin_password,
                        'name':network_name,
                        'subnet_name':subnet_name,
+                       'ansible_tag':'%s-%s@%s'%(network_name,slice.slicename,controller_network.controller.name),
                        'cidr':cidr
                        }
 
-           res = run_template('sync_controller_networks.yaml', network_fields)
+           res = run_template('sync_controller_networks.yaml', network_fields, path = 'controller_networks')
 
            if (len(res)!=2):
                raise Exception('Could not sync network %s'%controller_network.network.name)
@@ -68,7 +72,6 @@ class SyncControllerNetworks(OpenStackSyncStep):
             logger.info("controller %r has no admin_user, skipping" % controller_network.controller)
             return
 
-        self.driver = self.driver.admin_driver(controller=controller_network.controller,tenant='admin')
         if controller_network.network.owner and controller_network.network.owner.creator:
             try:
                 # update manager context
index 4f2daf4..c85ec55 100644 (file)
@@ -3,28 +3,27 @@
   connection: local 
   tasks:
   - quantum_network:
-       auth_url: {{ endpoint }} 
-       username: {{ admin_user }}
-       tenant_name: {{ tenant_name }}
-       password: {{ admin_password }}
-       name: {{ name }}
-       {% if delete %}
-       state: absent
-       {% else %}
-       state: present
-       {% endif %}
-        
+        auth_url={{ endpoint }} 
+        login_username={{ admin_user }}
+        tenant_name={{ tenant_name }}
+        login_password={{ admin_password }}
+        name={{ name }}
+        {% if delete %}
+        state=absent
+        {% else %}
+        state=present
+        {% endif %}
         shared: true
   - quantum_subnet:
-       auth_url: {{ endpoint }} 
-       username: {{ admin_user }}
-       tenant_name: {{ tenant_name }}
-       password: {{ admin_password }}
-       name={{ subnet_name }} 
+        auth_url={{ endpoint }} 
+        login_username={{ admin_user }}
+        tenant_name={{ tenant_name }}
+        login_password={{ admin_password }}
+        name={{ subnet_name }} 
         network_name={{ name }} 
-       {% if delete %}
-       state: absent
-       {% else %}
-       state=present 
-       cidr = {{ cidr }}
-       {% endif %}
+        {% if delete %}
+        state=absent
+        {% else %}
+        state=present 
+        cidr = {{ cidr }}
+        {% endif %}
index 32ca19b..fb257f1 100644 (file)
@@ -17,11 +17,12 @@ class SyncControllerSiteDeployments(OpenStackSyncStep):
                         'admin_user': controller_site_deployment.controller.admin_user,
                         'admin_password': controller_site_deployment.controller.admin_password,
                         'admin_tenant': 'admin',
+                        'ansible_tag': '%s@%s'%(controller_site_deployment.site_deployment.site.login_base,controller_site_deployment.site_deployment.deployment.name), # name of ansible playbook
                         'tenant': controller_site_deployment.site_deployment.site.login_base,
                         'tenant_description': controller_site_deployment.site_deployment.site.name}
 
        rendered = template.render(tenant_fields)
-       res = run_template('sync_controller_site_deployments.yaml', tenant_fields)
+       res = run_template('sync_controller_site_deployments.yaml', tenant_fields, path='site_deployments')
 
        if (len(res)==1):
                controller_site_deployment.tenant_id = res[0]['id']
@@ -32,6 +33,27 @@ class SyncControllerSiteDeployments(OpenStackSyncStep):
                raise Exception('Could not create or update user %s'%tenant_fields['tenant'])
             
     def delete_record(self, controller_site_deployment):
-        if controller_site_deployment.tenant_id:
+       if controller_site_deployment.tenant_id:
             driver = self.driver.admin_driver(controller=controller_site_deployment.controller)
             driver.delete_tenant(controller_site_deployment.tenant_id)
+
+       """
+        Ansible does not support tenant deletion yet
+
+       import pdb
+       pdb.set_trace()
+        template = os_template_env.get_template('delete_controller_site_deployments.yaml')
+       tenant_fields = {'endpoint':controller_site_deployment.controller.auth_url,
+                        'admin_user': controller_site_deployment.controller.admin_user,
+                        'admin_password': controller_site_deployment.controller.admin_password,
+                        'admin_tenant': 'admin',
+                        'ansible_tag': 'site_deployments/%s@%s'%(controller_site_deployment.site_deployment.site.login_base,controller_site_deployment.site_deployment.deployment.name), # name of ansible playbook
+                        'tenant': controller_site_deployment.site_deployment.site.login_base,
+                        'delete': True}
+
+       rendered = template.render(tenant_fields)
+       res = run_template('sync_controller_site_deployments.yaml', tenant_fields)
+
+       if (len(res)!=1):
+               raise Exception('Could not assign roles for user %s'%tenant_fields['tenant'])
+       """
index 636d007..c6021ba 100644 (file)
@@ -9,6 +9,7 @@ from core.models.slice import Slice, ControllerSlices
 from core.models.controllerusers import ControllerUsers
 from util.logger import Logger, logging
 from observer.ansible import *
+import pdb
 
 logger = Logger(level=logging.INFO)
 
@@ -29,41 +30,46 @@ class SyncControllerSlices(OpenStackSyncStep):
             logger.info("controller %r has no admin_user, skipping" % controller_slice.controller)
             return
 
-       controller_users = ControllerUsers.objects.filter(user=controller_slice.slice.creator,
-                                                             controller=controller_slice.controller)            
-       if not controller_users:
-           logger.info("slice createor %s has not accout at controller %s" % (controller_slice.slice.creator, controller_slice.controller.name))
-           roles = []
-       else:
-           controller_user = controller_users[0]
-           roles = ['admin']
-           
-       max_instances=int(controller_slice.slice.max_slivers)
-       tenant_fields = {'endpoint':controller_slice.controller.auth_url,
-                        'admin_user': controller_slice.controller.admin_user,
-                        'admin_password': controller_slice.controller.admin_password,
-                        'admin_tenant': 'admin',
-                        'tenant': controller_slice.slice.name,
-                        'tenant_description': controller_slice.slice.description,
-                        'roles':roles,
-                        'name':controller_user.user.email,
-                        'max_instances':max_instances}
+        controller_users = ControllerUsers.objects.filter(user=controller_slice.slice.creator,
+                                                             controller=controller_slice.controller)
+        if not controller_users:
+            raise Exception("slice createor %s has not accout at controller %s" % (controller_slice.slice.creator, controller_slice.controller.name))
+        else:
+            controller_user = controller_users[0]
+            roles = ['admin']
+
+        pdb.set_trace()
+        max_instances=int(controller_slice.slice.max_slivers)
+        tenant_fields = {'endpoint':controller_slice.controller.auth_url,
+                         'admin_user': controller_slice.controller.admin_user,
+                         'admin_password': controller_slice.controller.admin_password,
+                         'admin_tenant': 'admin',
+                         'tenant': controller_slice.slice.name,
+                         'tenant_description': controller_slice.slice.description,
+                         'roles':roles,
+                         'name':controller_user.user.email,
+                         'ansible_tag':'%s@%s'%(controller_slice.slice.name,controller_slice.controller.name),
+                         'max_instances':max_instances}
+
+        res = run_template('sync_controller_slices.yaml', tenant_fields, path='controller_slices')
+        expected_num = len(roles)+1
+        if (len(res)!=expected_num):
+            raise Exception('Could not sync tenants for slice %s'%controller_slice.slice.name)
+        else:
+            tenant_id = res[0]['id']
+            if (not controller_slice.tenant_id):
+                try:
+                        driver = OpenStackDriver().client_driver(caller=controller_slice.controller.admin_user,
+                                                         tenant=controller_slice.controller.admin_tenant,
+                                                         controller=controller_network.controller)
+                        driver.shell.nova.quotas.update(tenant_id=controller_slice.slice.name, instances=int(controller_slice.slice.max_slivers))
+                except:
+                        logging.info('Could not update quota for %s'%controller_slice.slice.name)
+                        raise Exception('Could not update quota for %s'%controller_slice.slice.name)
+
+                controller_slice.tenant_id = tenant_id
+                controller_slice.save()
 
-       res = run_template('sync_controller_slices.yaml', tenant_fields)
-       expected_num = len(roles)+1
-       if (len(res)!=expected_num):
-           raise Exception('Could not sync tenants for slice %s'%controller_slice.slice.name)
-       else:
-           tenant_id = res[0]['id']
-           if (not controller_slice.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'%controller_slice.slice.name)
-               controller_slice.tenant_id = tenant_id
-               controller_slice.save()
-                       
 
 
     def delete_record(self, controller_slice):
@@ -77,10 +83,9 @@ class SyncControllerSlices(OpenStackSyncStep):
             client_driver.delete_router_interface(controller_slice.router_id, controller_slice.subnet_id)
         if controller_slice.subnet_id:
             client_driver.delete_subnet(controller_slice.subnet_id)
-        if controller_slice.router_id:    
+        if controller_slice.router_id:
             client_driver.delete_router(controller_slice.router_id)
         if controller_slice.network_id:
             client_driver.delete_network(controller_slice.network_id)
         if controller_slice.tenant_id:
             driver.delete_tenant(controller_slice.tenant_id)
-        
index b9e7b03..8f7e508 100644 (file)
@@ -5,7 +5,7 @@ from collections import defaultdict
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.site import Controller, SiteDeployments
+from core.models.site import Controller, SiteDeployments, ControllerSiteDeployments
 from core.models.user import User
 from core.models.controllerusers import ControllerUsers
 from util.logger import Logger, logging
@@ -36,6 +36,8 @@ class SyncControllerUsers(OpenStackSyncStep):
        
         name = controller_user.user.email[:controller_user.user.email.find('@')]
 
+        import pdb
+        pdb.set_trace()
        roles = ['user']
         if controller_user.user.is_admin:
             roles.append('admin')
@@ -54,7 +56,7 @@ class SyncControllerUsers(OpenStackSyncStep):
             if ctrl_site_deployments:
                 # need the correct tenant id for site at the controller
                 tenant_id = ctrl_site_deployments[0].tenant_id  
-               tenant_name = ctrl_site_deployment[0].site_deployment.site.login_base
+               tenant_name = ctrl_site_deployments[0].site_deployment.site.login_base
 
                 user_fields = {'endpoint':controller_user.controller.auth_url,
                       'name': controller_user.user.email,
@@ -62,12 +64,13 @@ class SyncControllerUsers(OpenStackSyncStep):
                        'password': hashlib.md5(controller_user.user.password).hexdigest()[:6],
                        'admin_user': controller_user.controller.admin_user,
                       'admin_password': controller_user.controller.admin_password,
+                      'ansible_tag':'%s@%s'%(controller_user.user.email.replace('@','-at-'),controller_user.controller.name),
                       'admin_tenant': 'admin',
                       'roles':roles,
                       'tenant':tenant_name}    
        
                rendered = template.render(user_fields)
-               res = run_template('sync_controller_users.yaml', user_fields)
+               res = run_template('sync_controller_users.yaml', user_fields,path='controller_users')
 
                # results is an array in which each element corresponds to an 
                # "ok" string received per operation. If we get as many oks as
index d5edb02..8702a21 100644 (file)
@@ -6,7 +6,7 @@ from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.node import Node
-from core.models.site import SiteDeployments, Controller
+from core.models.site import SiteDeployments, Controller, ControllerSiteDeployments
 from util.logger import Logger, logging
 
 logger = Logger(level=logging.INFO)
@@ -22,16 +22,24 @@ class SyncNodes(OpenStackSyncStep):
             return []
 
         # collect local nodes
-        site_deployments = SiteDeployments.objects.all()
+        controllers = Controller.objects.all()
         nodes = Node.objects.all()
         node_hostnames = [node.name for node in nodes]
 
         # fetch all nodes from each controller
-        controllers = Controller.objects.all()
         new_nodes = []
         for controller in controllers:
             try:
-                driver = self.driver.admin_driver(controller=controller)
+               controller_site_deployments = ControllerSiteDeployments.objects.filter(controller=controller)[0]
+           except IndexError:
+                raise Exception("Controller %s not bound to any site deployments"%controller.name)
+
+            site_deployment = controller_site_deployments.site_deployment
+            if (not site_deployment):
+                raise Exception('Controller without Site Deployment: %s'%controller.name)
+
+            try:
+                driver = self.driver.admin_driver(controller=controller,tenant='admin')
                 compute_nodes = driver.shell.nova.hypervisors.list()
             except:
                 logger.log_exc("Failed to get nodes from controller %s" % str(controller))
@@ -40,10 +48,9 @@ class SyncNodes(OpenStackSyncStep):
             for compute_node in compute_nodes:
                 if compute_node.hypervisor_hostname not in node_hostnames:
                     # XX TODO:figure out how to correctly identify a node's site.
-                    # XX pick a random site to add the node to for now
-                    site_index = random.randint(0, len(site_deployments))
+                    # XX pick the first one
                     node = Node(name=compute_node.hypervisor_hostname,
-                                site_deployment=site_deployments[site_index])
+                                site_deployment=site_deployment)
                     new_nodes.append(node)
 
         return new_nodes    
index 91c0abb..f08a693 100644 (file)
@@ -35,7 +35,7 @@ class SyncRoles(OpenStackSyncStep):
         if not role.enacted:
             controllers = Controller.objects.all()
                    for controller in controllers:
-                driver = self.driver.admin_driver(controller=controller.name)
+                driver = self.driver.admin_driver(controller=controller)
                 driver.create_role(role.role)
             role.save()