3 from datetime import datetime
4 from core.models import *
5 from django.db.models import F, Q
6 from openstack.manager import OpenStackManager
9 class OpenStackObserver:
12 self.manager = OpenStackManager()
15 if not self.manager.enabled or not self.manager.has_openstack:
22 #self.sync_user_tenant_roles()
30 save all role that don't already exist in keystone. Remove keystone roles that
31 don't exist in planetstack
33 # sync all roles that don't already in keystone
34 keystone_roles = self.manager.driver.shell.keystone.roles.findall()
35 keystone_role_names = [kr.name for kr in keystone_roles]
36 pending_roles = Role.objects.all()
37 pending_role_names = [r.role_type for r in pending_roles]
38 for role in pending_roles:
39 if role.role_type not in keystone_role_names:
40 self.manager.save_role(role)
43 # delete keystone roles that don't exist in planetstack
44 for keystone_role in keystone_roles:
45 if keystone_role.name == 'admin':
47 if keystone_role.name not in pending_role_names:
49 #self.manager.driver.delete_role({id: keystone_role.id})
51 def sync_tenants(self):
53 Save all sites and sliceswhere enacted < updated or enacted == None.
54 Remove sites and slices that no don't exist in openstack db if they
55 have an enacted time (enacted != None).
57 # get all sites that need to be synced (enacted < updated or enacted is None)
58 pending_sites = Site.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
59 for site in pending_sites:
60 self.manager.save_site(site)
61 site.enacted = datetime.now()
62 site.save(update_fields=['enacted'])
64 # get all slices that need to be synced (enacted < updated or enacted is None)
65 pending_slices = Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
66 for slice in pending_slices:
67 self.manager.save_slice(slice)
68 slice.enacted = datetime.now()
69 slice.save(update_fields=['enacted'])
71 # get all sites that where enacted != null. We can assume these sites
72 # have previously been synced and need to be checed for deletion.
73 sites = Site.objects.filter(enacted__isnull=False)
76 site_dict[site.login_base] = site
78 # get all slices that where enacted != null. We can assume these slices
79 # have previously been synced and need to be checed for deletion.
80 slices = Slice.objects.filter(enacted__isnull=False)
83 slice_dict[slice.name] = slice
85 # delete keystone tenants that don't have a site record
86 tenants = self.manager.driver.shell.keystone.tenants.findall()
87 for tenant in tenants:
88 if tenant.name == 'admin':
90 if tenant.name not in site_dict and tenant.name not in slice_dict:
91 #print "delete " + tenant.name
93 #self.manager.driver.delete_tenant(tenant.id)
98 save all users where enacted < updated or enacted == None. Remove users that
99 no don't exist in openstack db if they have an enacted time (enacted != None).
101 # get all users that need to be synced (enacted < updated or enacted is None)
102 pending_users = User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
103 for user in pending_users:
104 self.manager.save_user(user)
105 user.enacted = datetime.now()
106 user.save(update_fields=['enacted'])
108 # get all users that where enacted != null. We can assume these users
109 # have previously been synced and need to be checed for deletion.
110 users = User.objects.filter(enacted__isnull=False)
113 user_dict[user.kuser_id] = user
115 # delete keystone users that don't have a user record
116 users = self.manager.driver.shell.keystone.users.findall()
118 if user.name == 'admin':
120 if user.id not in user_dict:
122 #self.manager.driver.delete_user(user.id)
125 def sync_slivers(self):
127 save all slivers where enacted < updated or enacted == None. Remove slivers that
128 no don't exist in openstack db if they have an enacted time (enacted != None).
130 # get all users that need to be synced (enacted < updated or enacted is None)
131 pending_slivers = Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
132 for sliver in pending_slivers:
134 # update manager context
135 self.manager.init_caller(sliver.creator)
136 self.manager.save_sliver(sliver)
137 sliver.enacted = datetime.now()
138 sliver.save(update_fields=['enacted'])
140 # get all slivers that where enacted != null. We can assume these users
141 # have previously been synced and need to be checed for deletion.
142 slivers = Sliver.objects.filter(enacted__isnull=False)
144 for sliver in slivers:
145 sliver_dict[sliver.instance_id] = sliver
147 # delete sliver that don't have a sliver record
148 ctx = self.manager.driver.shell.nova_db.ctx
149 instances = self.manager.driver.shell.nova_db.instance_get_all(ctx)
150 for instance in instances:
151 if instance.id not in sliver_dict:
152 # lookup tenant and update context
153 #tenant = self.manager.driver.shell.keystone.tenants.findall(id=instance.tenant_id)
154 #self.manager.init_admin(tenant=tenant.name)
155 #self.manager.driver.destroy_instance(instance.id)