blob: 75f575c0f25a116c1d931e8004d62043bd893539 [file] [log] [blame]
Sapan Bhatia24836f12013-08-27 10:16:05 -04001import os
2import base64
3from planetstack.config import Config
4
Sapan Bhatia13c7f112013-09-02 14:19:35 -04005class FailedDependency(Exception):
Tony Mackce79de02013-09-24 10:12:33 -04006 pass
Sapan Bhatia13c7f112013-09-02 14:19:35 -04007
Sapan Bhatia24836f12013-08-27 10:16:05 -04008class SyncStep:
Tony Mackce79de02013-09-24 10:12:33 -04009 """ A PlanetStack Sync step.
Sapan Bhatia24836f12013-08-27 10:16:05 -040010
Tony Mackce79de02013-09-24 10:12:33 -040011 Attributes:
12 psmodel Model name the step synchronizes
13 dependencies list of names of models that must be synchronized first if the current model depends on them
14 """
15 slow=False
16 def get_prop(prop):
17 try:
18 sync_config_dir = Config().sync_config_dir
19 except:
20 sync_config_dir = '/etc/planetstack/sync'
21 prop_config_path = '/'.join(sync_config_dir,self.name,prop)
22 return open(prop_config_path).read().rstrip()
Sapan Bhatia24836f12013-08-27 10:16:05 -040023
Tony Mackce79de02013-09-24 10:12:33 -040024 def __init__(self, **args):
25 """Initialize a sync step
26 Keyword arguments:
27 name -- Name of the step
28 provides -- PlanetStack models sync'd by this step
29 """
30 dependencies = []
Tony Mack387a73f2013-09-18 07:59:14 -040031 self.driver = args.get('driver')
Tony Mackce79de02013-09-24 10:12:33 -040032 try:
33 self.soft_deadline = int(self.get_prop('soft_deadline_seconds'))
34 except:
35 self.soft_deadline = 5 # 5 seconds
Sapan Bhatia24836f12013-08-27 10:16:05 -040036
Tony Mackce79de02013-09-24 10:12:33 -040037 return
Sapan Bhatia24836f12013-08-27 10:16:05 -040038
Tony Mackce79de02013-09-24 10:12:33 -040039 def fetch_pending(self):
Tony Mack66646d52013-09-24 21:47:12 -040040 #return Sliver.objects.filter(ip=None)
41 return []
Tony Mackce79de02013-09-24 10:12:33 -040042
43 def check_dependencies(self, obj):
44 for dep in self.dependencies:
45 peer_object = getattr(obj, dep.name.lowercase())
46 if (peer_object.pk==dep.pk):
47 raise DependencyFailed
Sapan Bhatia24836f12013-08-27 10:16:05 -040048
Tony Mackce79de02013-09-24 10:12:33 -040049 def call(self, failed=[]):
50 pending = self.fetch_pending()
51 for o in pending:
52 if (not self.depends_on(o, failed)):
53 try:
54 check_dependencies(o) # Raises exception if failed
55 self.sync_record(o)
56 o.enacted = datetime.now() # Is this the same timezone? XXX
57 o.save(update_fields=['enacted'])
58 except:
59 failed.append(o)
60 return failed
Sapan Bhatia24836f12013-08-27 10:16:05 -040061
Tony Mack16f04742013-09-25 08:53:28 -040062 def __call__(self, **args):
63 return self.call(**args)