3 from datetime import datetime
4 from planetstack.config import Config
5 from util.logger import Logger, logging
7 logger = Logger(level=logging.INFO)
9 class FailedDependency(Exception):
13 """ A PlanetStack Sync step.
16 psmodel Model name the step synchronizes
17 dependencies list of names of models that must be synchronized first if the current model depends on them
22 sync_config_dir = Config().sync_config_dir
24 sync_config_dir = '/etc/planetstack/sync'
25 prop_config_path = '/'.join(sync_config_dir,self.name,prop)
26 return open(prop_config_path).read().rstrip()
28 def __init__(self, **args):
29 """Initialize a sync step
31 name -- Name of the step
32 provides -- PlanetStack models sync'd by this step
35 self.driver = args.get('driver')
37 self.soft_deadline = int(self.get_prop('soft_deadline_seconds'))
39 self.soft_deadline = 5 # 5 seconds
43 def fetch_pending(self):
45 #return Sliver.objects.filter(ip=None)
47 def check_dependencies(self, obj, failed):
48 for dep in self.dependencies:
49 peer_object = getattr(obj, dep.lower())
50 if (peer_object.pk==failed.pk):
51 raise FailedDependency
53 def call(self, failed=[]):
54 pending = self.fetch_pending()
58 self.check_dependencies(o,f) # Raises exception if failed
60 o.enacted = datetime.now() # Is this the same timezone? XXX
61 o.save(update_fields=['enacted'])
63 logger.log_exc("sync step failed!")
68 def __call__(self, **args):
69 return self.call(**args)