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 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):
 
 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:
             
     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 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)
 
 
 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
 
             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)            
                                                              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):
 
 
     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)
             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 %}