X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fopenstack%2Fobserver.py;h=c0291ab08550ed42b778577757edbd19863cece9;hb=45d57b2f8b9bed5edbd78ca0c60138a786c81e5a;hp=ac2d58a983717df0736e7f0b52cf9e7fed032b34;hpb=c59fcaf0847bcc583591ae79cfc06e63960f59d8;p=plstackapi.git diff --git a/planetstack/openstack/observer.py b/planetstack/openstack/observer.py index ac2d58a..c0291ab 100644 --- a/planetstack/openstack/observer.py +++ b/planetstack/openstack/observer.py @@ -1,4 +1,5 @@ import time +import traceback from datetime import datetime from core.models import * from django.db.models import F, Q @@ -8,19 +9,64 @@ from openstack.manager import OpenStackManager class OpenStackObserver: def __init__(self): - self.manager = OpenStackManager() + self.manager = OpenStackManager() - def sync_sites(self): + def run(self): + if not self.manager.enabled or not self.manager.has_openstack: + return + while True: + try: + #self.sync_roles() + self.sync_tenants() + self.sync_users() + #self.sync_user_tenant_roles() + #self.sync_slivers() + time.sleep(7) + except: + traceback.print_exc() + + def sync_roles(self): """ - save all sites where enacted < updated or enacted == None. Remove sites that - no don't exist in openstack db if they have an enacted time (enacted != None). + save all role that don't already exist in keystone. Remove keystone roles that + don't exist in planetstack + """ + # sync all roles that don't already in keystone + keystone_roles = self.manager.driver.shell.keystone.roles.findall() + keystone_role_names = [kr.name for kr in keystone_roles] + pending_roles = Role.objects.all() + pending_role_names = [r.role_type for r in pending_roles] + for role in pending_roles: + if role.role_type not in keystone_role_names: + self.manager.save_role(role) + + + # delete keystone roles that don't exist in planetstack + for keystone_role in keystone_roles: + if keystone_role.name == 'admin': + continue + if keystone_role.name not in pending_role_names: + pass + #self.manager.driver.delete_role({id: keystone_role.id}) + + def sync_tenants(self): + """ + Save all sites and sliceswhere enacted < updated or enacted == None. + Remove sites and slices that no don't exist in openstack db if they + have an enacted time (enacted != None). """ # get all sites that need to be synced (enacted < updated or enacted is None) pending_sites = Site.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) for site in pending_sites: self.manager.save_site(site) site.enacted = datetime.now() - site.save() + site.save(update_fields=['enacted']) + + # get all slices that need to be synced (enacted < updated or enacted is None) + pending_slices = Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) + for slice in pending_slices: + self.manager.save_slice(slice) + slice.enacted = datetime.now() + slice.save(update_fields=['enacted']) # get all sites that where enacted != null. We can assume these sites # have previously been synced and need to be checed for deletion. @@ -29,24 +75,6 @@ class OpenStackObserver: for site in sites: site_dict[site.login_base] = site - # delete keystone tenants that don't have a site record - tenants = self.manager.driver.shell.keystone.tenants.findall() - for tenant in tenants: - if tenant.name not in site_dict: - self.manager.driver.delete_tenant(tenant.id) - - def sync_slices(self): - """ - save all slices where enacted < updated or enacted == None. Remove slices that - no don't exist in openstack db if they have an enacted time (enacted != None). - """ - # get all slices that need to be synced (enacted < updated or enacted is None) - pending_slices = Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) - for slice in pending_slices: - self.manager.save_slice(slice) - slice.enacted = datetime.now() - slice.save() - # get all slices that where enacted != null. We can assume these slices # have previously been synced and need to be checed for deletion. slices = Slice.objects.filter(enacted__isnull=False) @@ -57,8 +85,13 @@ class OpenStackObserver: # delete keystone tenants that don't have a site record tenants = self.manager.driver.shell.keystone.tenants.findall() for tenant in tenants: - if tenant.name not in slice_dict: - self.manager.driver.delete_tenant(tenant.id) + if tenant.name == 'admin': + continue + if tenant.name not in site_dict and tenant.name not in slice_dict: + #print "delete " + tenant.name + pass + #self.manager.driver.delete_tenant(tenant.id) + def sync_users(self): """ @@ -70,7 +103,7 @@ class OpenStackObserver: for user in pending_users: self.manager.save_user(user) user.enacted = datetime.now() - user.save() + user.save(update_fields=['enacted']) # get all users that where enacted != null. We can assume these users # have previously been synced and need to be checed for deletion. @@ -80,12 +113,14 @@ class OpenStackObserver: user_dict[user.kuser_id] = user # delete keystone users that don't have a user record - user = self.manager.driver.shell.keystone.users.findall() + users = self.manager.driver.shell.keystone.users.findall() for user in users: + if user.name == 'admin': + continue if user.id not in user_dict: - self.manager.driver.delete_user(user.id) + pass + #self.manager.driver.delete_user(user.id) - def sync_slivers(self): """ @@ -100,7 +135,7 @@ class OpenStackObserver: self.manager.init_caller(sliver.creator) self.manager.save_sliver(sliver) sliver.enacted = datetime.now() - sliver.save() + sliver.save(update_fields=['enacted']) # get all slivers that where enacted != null. We can assume these users # have previously been synced and need to be checed for deletion. @@ -115,6 +150,7 @@ class OpenStackObserver: for instance in instances: if instance.id not in sliver_dict: # lookup tenant and update context - tenant = self.manager.driver.shell.keystone.tenants.findall(id=instance.tenant_id) - self.manager.init_admin(tenant=tenant.name) - self.manager.driver.destroy_instance(instance.id) + #tenant = self.manager.driver.shell.keystone.tenants.findall(id=instance.tenant_id) + #self.manager.init_admin(tenant=tenant.name) + #self.manager.driver.destroy_instance(instance.id) + pass