blob: 02b0b9cc4a5ceac011cf6a8b691fb727cedd7753 [file] [log] [blame]
Tony Mackc59fcaf2013-06-10 11:14:04 -04001import time
Tony Mack0553f282013-06-10 22:54:50 -04002import traceback
Tony Mackc59fcaf2013-06-10 11:14:04 -04003from datetime import datetime
4from core.models import *
5from django.db.models import F, Q
6from openstack.manager import OpenStackManager
7
8
9class OpenStackObserver:
10
11 def __init__(self):
Tony Mack0553f282013-06-10 22:54:50 -040012 self.manager = OpenStackManager()
13
14 def run(self):
15 if not self.manager.enabled or not self.manager.has_openstack:
16 return
17 while True:
18 try:
19 #self.sync_roles()
20 self.sync_tenants()
21 self.sync_users()
22 #self.sync_user_tenant_roles()
23 #self.sync_slivers()
24 time.sleep(7)
25 except:
26 traceback.print_exc()
Tony Mackc59fcaf2013-06-10 11:14:04 -040027
Tony Mackdb9be932013-06-10 13:42:42 -040028 def sync_tenants(self):
Tony Mackc59fcaf2013-06-10 11:14:04 -040029 """
Tony Mackdb9be932013-06-10 13:42:42 -040030 Save all sites and sliceswhere enacted < updated or enacted == None.
31 Remove sites and slices that no don't exist in openstack db if they
32 have an enacted time (enacted != None).
Tony Mackc59fcaf2013-06-10 11:14:04 -040033 """
34 # get all sites that need to be synced (enacted < updated or enacted is None)
35 pending_sites = Site.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
36 for site in pending_sites:
37 self.manager.save_site(site)
38 site.enacted = datetime.now()
39 site.save()
40
Tony Mackc59fcaf2013-06-10 11:14:04 -040041 # get all slices that need to be synced (enacted < updated or enacted is None)
42 pending_slices = Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
43 for slice in pending_slices:
44 self.manager.save_slice(slice)
45 slice.enacted = datetime.now()
46 slice.save()
47
Tony Mackdb9be932013-06-10 13:42:42 -040048 # get all sites that where enacted != null. We can assume these sites
49 # have previously been synced and need to be checed for deletion.
50 sites = Site.objects.filter(enacted__isnull=False)
51 site_dict = {}
52 for site in sites:
53 site_dict[site.login_base] = site
54
Tony Mackc59fcaf2013-06-10 11:14:04 -040055 # get all slices that where enacted != null. We can assume these slices
56 # have previously been synced and need to be checed for deletion.
57 slices = Slice.objects.filter(enacted__isnull=False)
58 slice_dict = {}
59 for slice in slices:
60 slice_dict[slice.name] = slice
61
62 # delete keystone tenants that don't have a site record
63 tenants = self.manager.driver.shell.keystone.tenants.findall()
64 for tenant in tenants:
Tony Mackdb9be932013-06-10 13:42:42 -040065 if tenant.name == 'admin':
66 continue
67 if tenant.name not in site_dict and tenant.name not in slice_dict:
Tony Mack0553f282013-06-10 22:54:50 -040068 #print "delete " + tenant.name
69 pass
Tony Mackdb9be932013-06-10 13:42:42 -040070 #self.manager.driver.delete_tenant(tenant.id)
71
Tony Mackc59fcaf2013-06-10 11:14:04 -040072
73 def sync_users(self):
74 """
75 save all users where enacted < updated or enacted == None. Remove users that
76 no don't exist in openstack db if they have an enacted time (enacted != None).
77 """
78 # get all users that need to be synced (enacted < updated or enacted is None)
79 pending_users = User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
80 for user in pending_users:
81 self.manager.save_user(user)
82 user.enacted = datetime.now()
83 user.save()
84
85 # get all users that where enacted != null. We can assume these users
86 # have previously been synced and need to be checed for deletion.
87 users = User.objects.filter(enacted__isnull=False)
88 user_dict = {}
89 for user in users:
90 user_dict[user.kuser_id] = user
91
92 # delete keystone users that don't have a user record
Tony Mack0553f282013-06-10 22:54:50 -040093 users = self.manager.driver.shell.keystone.users.findall()
Tony Mackc59fcaf2013-06-10 11:14:04 -040094 for user in users:
Tony Mackdb9be932013-06-10 13:42:42 -040095 if user.name == 'admin':
96 continue
Tony Mackc59fcaf2013-06-10 11:14:04 -040097 if user.id not in user_dict:
Tony Mackdb9be932013-06-10 13:42:42 -040098 pass
99 #self.manager.driver.delete_user(user.id)
Tony Mackc59fcaf2013-06-10 11:14:04 -0400100
Tony Mackc59fcaf2013-06-10 11:14:04 -0400101
102 def sync_slivers(self):
103 """
104 save all slivers where enacted < updated or enacted == None. Remove slivers that
105 no don't exist in openstack db if they have an enacted time (enacted != None).
106 """
107 # get all users that need to be synced (enacted < updated or enacted is None)
108 pending_slivers = Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
109 for sliver in pending_slivers:
110 if sliver.creator:
111 # update manager context
112 self.manager.init_caller(sliver.creator)
113 self.manager.save_sliver(sliver)
114 sliver.enacted = datetime.now()
115 sliver.save()
116
117 # get all slivers that where enacted != null. We can assume these users
118 # have previously been synced and need to be checed for deletion.
119 slivers = Sliver.objects.filter(enacted__isnull=False)
120 sliver_dict = {}
121 for sliver in slivers:
122 sliver_dict[sliver.instance_id] = sliver
123
124 # delete sliver that don't have a sliver record
125 ctx = self.manager.driver.shell.nova_db.ctx
126 instances = self.manager.driver.shell.nova_db.instance_get_all(ctx)
127 for instance in instances:
128 if instance.id not in sliver_dict:
129 # lookup tenant and update context
130 tenant = self.manager.driver.shell.keystone.tenants.findall(id=instance.tenant_id)
131 self.manager.init_admin(tenant=tenant.name)
132 self.manager.driver.destroy_instance(instance.id)