3 from datetime import datetime
4 from planetstack.config import Config
6 class FailedDependency(Exception):
10 """ A PlanetStack Sync step.
13 psmodel Model name the step synchronizes
14 dependencies list of names of models that must be synchronized first if the current model depends on them
19 sync_config_dir = Config().sync_config_dir
21 sync_config_dir = '/etc/planetstack/sync'
22 prop_config_path = '/'.join(sync_config_dir,self.name,prop)
23 return open(prop_config_path).read().rstrip()
25 def __init__(self, **args):
26 """Initialize a sync step
28 name -- Name of the step
29 provides -- PlanetStack models sync'd by this step
32 self.driver = args.get('driver')
34 self.soft_deadline = int(self.get_prop('soft_deadline_seconds'))
36 self.soft_deadline = 5 # 5 seconds
40 def fetch_pending(self):
42 #return Sliver.objects.filter(ip=None)
44 def check_dependencies(self, obj, failed):
45 for dep in self.dependencies:
46 peer_object = getattr(obj, dep.lower())
47 if (peer_object.pk==failed.pk):
48 raise DependencyFailed
50 def call(self, failed=[]):
51 pending = self.fetch_pending()
55 self.check_dependencies(o,f) # Raises exception if failed
57 o.enacted = datetime.now() # Is this the same timezone? XXX
58 o.save(update_fields=['enacted'])
64 def __call__(self, **args):
65 return self.call(**args)