7 from datetime import datetime
8 from collections import defaultdict
9 from core.models import *
10 from django.db.models import F, Q
11 from openstack.manager import OpenStackManager
12 from util.logger import Logger, logging, logger
13 #from timeout import timeout
16 logger = Logger(logfile='observer.log', level=logging.INFO)
18 def toposort(g, steps):
30 if not reverse.has_key(k):
34 for k,v in reverse.iteritems():
54 class PlanetStackObserver:
55 sync_steps = ['SyncNetworks','SyncNetworkSlivers','SyncSites','SyncSitePrivileges','SyncSlices','SyncSliceMemberships','SyncSlivers','SyncSliverIps']
58 self.manager = OpenStackManager()
59 # The Condition object that gets signalled by Feefie events
60 self.load_sync_steps()
61 self.event_cond = threading.Condition()
64 def wait_for_event(self, timeout):
65 self.event_cond.acquire()
66 self.event_cond.wait(timeout)
67 self.event_cond.release()
70 logger.info('Wake up routine called. Event cond %r'%self.event_cond)
71 self.event_cond.acquire()
72 self.event_cond.notify()
73 self.event_cond.release()
75 def load_sync_steps(self):
76 dep_path = Config().pl_dependency_path
78 # This contains dependencies between records, not sync steps
79 self.model_dependency_graph = json.loads(open(dep_path).read())
83 backend_path = Config().backend_dependency_path
85 # This contains dependencies between backend records
86 self.backend_dependency_graph = json.loads(open(backend_path).read())
93 provides_dict[m]=s.__name__
96 for k,v in model_dependency_graph.iteritems():
98 source = provides_dict[k]
101 dest = provides_dict[m]
104 step_graph[source]=dest
108 # no dependencies, pass
110 if (backend_dependency_graph):
114 backend_dict[m]=s.__name__
116 for k,v in backend_dependency_graph.iteritems():
118 source = backend_dict[k]
121 dest = backend_dict[m]
124 step_graph[source]=dest
128 # no dependencies, pass
130 dependency_graph = step_graph
132 self.ordered_steps = toposort(dependency_graph, steps)
136 if not self.manager.enabled or not self.manager.has_openstack:
142 start_time=time.time()
144 logger.info('Waiting for event')
145 tBeforeWait = time.time()
146 self.wait_for_event(timeout=300)
148 for S in self.ordered_steps:
152 # Enforce 5 minutes between wakeups
153 tSleep = 300 - (time.time() - tBeforeWait)
155 logger.info('Sleeping for %d seconds' % tSleep)
158 logger.info('Observer woke up')
160 logger.log_exc("Exception in observer run loop")
161 traceback.print_exc()