New steps, ansible playbooks
authorroot <root@ip-172-31-38-128.ec2.internal>
Fri, 17 Oct 2014 14:43:29 +0000 (10:43 -0400)
committerroot <root@ip-172-31-38-128.ec2.internal>
Fri, 17 Oct 2014 14:43:29 +0000 (10:43 -0400)
planetstack/openstack_observer/steps/sliver.yaml [new file with mode: 0644]
planetstack/openstack_observer/steps/sync_site_deployments.py
planetstack/openstack_observer/steps/sync_site_deployments.yaml [new file with mode: 0644]
planetstack/openstack_observer/steps/sync_slice_deployments.py
planetstack/openstack_observer/steps/sync_slice_deployments.yaml [new file with mode: 0644]
planetstack/openstack_observer/steps/sync_slivers.yaml [new file with mode: 0644]

diff --git a/planetstack/openstack_observer/steps/sliver.yaml b/planetstack/openstack_observer/steps/sliver.yaml
new file mode 100644 (file)
index 0000000..e630415
--- /dev/null
@@ -0,0 +1,17 @@
+---
+- hosts: 127.0.0.1
+  connection: local
+  tasks:
+  - nova_compute:
+       state: present
+       auth_url: http://172.31.38.128:5000/v2.0/
+       login_username: admin
+       login_password: 6a789bf69dd647e2
+       login_tenant_name: admin
+       name: gloopy
+       image_id: 3ee851df-b35a-41c5-8551-f681e7209095
+       key_name: boo
+       wait_for: 200
+       flavor_id: 3
+       nics:
+         - net-id: d1de537b-80dc-4c1b-aa5f-4a197b33b5f6
index a8a00f6..1d51e4e 100644 (file)
@@ -4,24 +4,32 @@ from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.site import *
+from observer.ansible import *
 
 class SyncSiteDeployments(OpenStackSyncStep):
     requested_interval=0
     provides=[SiteDeployments, Site]
 
     def sync_record(self, site_deployment):
-        if not site_deployment.tenant_id:
-            driver = self.driver.admin_driver(deployment=site_deployment.deployment.name)
-            tenant = driver.create_tenant(tenant_name=site_deployment.site.login_base,
-                                               description=site_deployment.site.name,
-                                               enabled=site_deployment.site.enabled)
-            site_deployment.tenant_id = tenant.id
-            site_deployment.save()
-        elif site_deployment.site.id and site_deployment.tenant_id:
-            driver = self.driver.admin_driver(deployment=site_deployment.deployment.name)
-            driver.update_tenant(site_deployment.tenant_id,
-                                 description=site_deployment.site.name,
-                                 enabled=site_deployment.site.enabled)
+
+       template = os_template_env.get_template('sync_site_deployments.yaml')
+       tenant_fields = {'endpoint':site_deployment.deployment.auth_url,
+                        'admin_user': site_deployment.deployment.admin_user,
+                        'admin_password': site_deployment.deployment.admin_password,
+                        'admin_tenant': 'admin',
+                        'tenant': site_deployment.site.login_base,
+                        'tenant_description': site_deployment.site.name}
+
+       rendered = template.render(tenant_fields)
+       res = run_template('sync_site_deployments.yaml', tenant_fields)
+
+       if (len(res)==1):
+               site_deployment.tenant_id = res[0]['id']
+               site_deployment.save()
+       elif (len(res)):
+               raise Exception('Could not assign roles for user %s'%tenant_fields['name'])
+       else:
+               raise Exception('Could not create or update user %s'%tenant_fields['name'])
             
     def delete_record(self, site_deployment):
         if site_deployment.tenant_id:
diff --git a/planetstack/openstack_observer/steps/sync_site_deployments.yaml b/planetstack/openstack_observer/steps/sync_site_deployments.yaml
new file mode 100644 (file)
index 0000000..4129802
--- /dev/null
@@ -0,0 +1,5 @@
+---
+- hosts: 127.0.0.1
+  connection: local
+  tasks:
+  - keystone_user: endpoint={{ endpoint }} login_user={{ admin_user }} login_password={{ admin_password }} login_tenant_name={{ admin_tenant }} tenant={{ tenant }} tenant_description="{{ tenant_description }}"
index 03ea2ca..da900ef 100644 (file)
@@ -9,6 +9,7 @@ from core.models.site import Deployment, SiteDeployments
 from core.models.slice import Slice, SliceDeployments
 from core.models.userdeployments import UserDeployments
 from util.logger import Logger, logging
+from observer.ansible import *
 
 logger = Logger(level=logging.INFO)
 
@@ -47,46 +48,40 @@ class SyncSliceDeployments(OpenStackSyncStep):
             logger.info("deployment %r has no admin_user, skipping" % slice_deployment.deployment)
             return
 
-        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,
+       deployment_users = UserDeployments.objects.filter(user=slice_deployment.slice.creator,
                                                              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)
-
-                # 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)
-
-
-        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)  
-
-        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()
+       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,
+                        'max_instances':max_instances}
+
+       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()
+                       
 
 
     def delete_record(self, slice_deployment):
@@ -106,11 +101,4 @@ class SyncSliceDeployments(OpenStackSyncStep):
             client_driver.delete_network(slice_deployment.network_id)
         if slice_deployment.tenant_id:
             driver.delete_tenant(slice_deployment.tenant_id)
-        # delete external route
-        #subnet = None
-        #subnets = client_driver.shell.quantum.list_subnets()['subnets']
-        #for snet in subnets:
-        #    if snet['id'] == slice_deployment.subnet_id:
-        #        subnet = snet
-        #if subnet:
-        #    driver.delete_external_route(subnet)
+        
diff --git a/planetstack/openstack_observer/steps/sync_slice_deployments.yaml b/planetstack/openstack_observer/steps/sync_slice_deployments.yaml
new file mode 100644 (file)
index 0000000..12fd59e
--- /dev/null
@@ -0,0 +1,13 @@
+---
+- hosts: 127.0.0.1
+  connection: local
+  tasks:
+  - keystone_user: endpoint={{ endpoint }} login_user={{ admin_user }} login_password={{ admin_password }} login_tenant_name={{ admin_tenant }} tenant={{ tenant }} tenant_description="{{ tenant_description }}"
+---
+- hosts: 127.0.0.1
+  connection: local
+  tasks:
+  - keystone_user: endpoint={{ endpoint }} user="{{ name }}" email={{ email }} password={{ password }} login_user={{ admin_user }} login_password={{ admin_password }} login_tenant_name={{ admin_tenant }} tenant={{ tenant }}
+  {% for role in roles %}
+  - keystone_user: endpoint={{ endpoint}} login_user={{ admin_user }} login_password={{ admin_password }} login_tenant_name={{ admin_tenant }} user="{{ name }}" role={{ role }} tenant={{ tenant }}
+  {% endfor %}
diff --git a/planetstack/openstack_observer/steps/sync_slivers.yaml b/planetstack/openstack_observer/steps/sync_slivers.yaml
new file mode 100644 (file)
index 0000000..8aa54a3
--- /dev/null
@@ -0,0 +1,24 @@
+---
+- hosts: 127.0.0.1
+  connection: local
+  tasks:
+  - nova_compute:
+       state: present
+       auth_url: {{ endpoint }}
+       login_username: {{ admin_user }}
+       login_password: {{ admin_password }}
+       login_tenant_name: {{ admin_tenant }}
+       name: {{ name }}
+       image_id: {{ image_id }}
+       key_name: ansible_key
+       wait_for: 200
+       flavor_id: {{ flavor_id }}
+       nics:
+         - net-id: {{ net_id }}
+       meta:
+         hostname: test1
+         group: uge_master
+  - keystone_user: endpoint={{ endpoint }} user="{{ name }}" email={{ email }} password={{ password }} login_user={{ admin_user }} login_password={{ admin_password }} login_tenant_name={{ admin_tenant }} tenant={{ tenant }}
+  {% for role in roles %}
+  - keystone_user: endpoint={{ endpoint}} login_user={{ admin_user }} login_password={{ admin_password }} login_tenant_name={{ admin_tenant }} user="{{ name }}" role={{ role }} tenant={{ tenant }}
+  {% endfor %}