blob: ac2d58a983717df0736e7f0b52cf9e7fed032b34 [file] [log] [blame]
Tony Mackc59fcaf2013-06-10 11:14:04 -04001import time
2from datetime import datetime
3from core.models import *
4from django.db.models import F, Q
5from openstack.manager import OpenStackManager
6
7
8class OpenStackObserver:
9
10 def __init__(self):
11 self.manager = OpenStackManager()
12
13 def sync_sites(self):
14 """
15 save all sites where enacted < updated or enacted == None. Remove sites that
16 no don't exist in openstack db if they have an enacted time (enacted != None).
17 """
18 # get all sites that need to be synced (enacted < updated or enacted is None)
19 pending_sites = Site.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
20 for site in pending_sites:
21 self.manager.save_site(site)
22 site.enacted = datetime.now()
23 site.save()
24
25 # get all sites that where enacted != null. We can assume these sites
26 # have previously been synced and need to be checed for deletion.
27 sites = Site.objects.filter(enacted__isnull=False)
28 site_dict = {}
29 for site in sites:
30 site_dict[site.login_base] = site
31
32 # delete keystone tenants that don't have a site record
33 tenants = self.manager.driver.shell.keystone.tenants.findall()
34 for tenant in tenants:
35 if tenant.name not in site_dict:
36 self.manager.driver.delete_tenant(tenant.id)
37
38 def sync_slices(self):
39 """
40 save all slices where enacted < updated or enacted == None. Remove slices that
41 no don't exist in openstack db if they have an enacted time (enacted != None).
42 """
43 # get all slices that need to be synced (enacted < updated or enacted is None)
44 pending_slices = Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
45 for slice in pending_slices:
46 self.manager.save_slice(slice)
47 slice.enacted = datetime.now()
48 slice.save()
49
50 # get all slices that where enacted != null. We can assume these slices
51 # have previously been synced and need to be checed for deletion.
52 slices = Slice.objects.filter(enacted__isnull=False)
53 slice_dict = {}
54 for slice in slices:
55 slice_dict[slice.name] = slice
56
57 # delete keystone tenants that don't have a site record
58 tenants = self.manager.driver.shell.keystone.tenants.findall()
59 for tenant in tenants:
60 if tenant.name not in slice_dict:
61 self.manager.driver.delete_tenant(tenant.id)
62
63 def sync_users(self):
64 """
65 save all users where enacted < updated or enacted == None. Remove users that
66 no don't exist in openstack db if they have an enacted time (enacted != None).
67 """
68 # get all users that need to be synced (enacted < updated or enacted is None)
69 pending_users = User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
70 for user in pending_users:
71 self.manager.save_user(user)
72 user.enacted = datetime.now()
73 user.save()
74
75 # get all users that where enacted != null. We can assume these users
76 # have previously been synced and need to be checed for deletion.
77 users = User.objects.filter(enacted__isnull=False)
78 user_dict = {}
79 for user in users:
80 user_dict[user.kuser_id] = user
81
82 # delete keystone users that don't have a user record
83 user = self.manager.driver.shell.keystone.users.findall()
84 for user in users:
85 if user.id not in user_dict:
86 self.manager.driver.delete_user(user.id)
87
88
89
90 def sync_slivers(self):
91 """
92 save all slivers where enacted < updated or enacted == None. Remove slivers that
93 no don't exist in openstack db if they have an enacted time (enacted != None).
94 """
95 # get all users that need to be synced (enacted < updated or enacted is None)
96 pending_slivers = Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
97 for sliver in pending_slivers:
98 if sliver.creator:
99 # update manager context
100 self.manager.init_caller(sliver.creator)
101 self.manager.save_sliver(sliver)
102 sliver.enacted = datetime.now()
103 sliver.save()
104
105 # get all slivers that where enacted != null. We can assume these users
106 # have previously been synced and need to be checed for deletion.
107 slivers = Sliver.objects.filter(enacted__isnull=False)
108 sliver_dict = {}
109 for sliver in slivers:
110 sliver_dict[sliver.instance_id] = sliver
111
112 # delete sliver that don't have a sliver record
113 ctx = self.manager.driver.shell.nova_db.ctx
114 instances = self.manager.driver.shell.nova_db.instance_get_all(ctx)
115 for instance in instances:
116 if instance.id not in sliver_dict:
117 # lookup tenant and update context
118 tenant = self.manager.driver.shell.keystone.tenants.findall(id=instance.tenant_id)
119 self.manager.init_admin(tenant=tenant.name)
120 self.manager.driver.destroy_instance(instance.id)