4116d6564d4ee91ff85cd24ade61d631638a82de
[plstackapi.git] / planetstack / observer / syncstep.py
1 import os
2 import base64
3 from datetime import datetime
4 from planetstack.config import Config
5
6 class FailedDependency(Exception):
7     pass
8
9 class SyncStep:
10     """ A PlanetStack Sync step. 
11
12     Attributes:
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
15     """ 
16     slow=False
17     def get_prop(prop):
18         try:
19             sync_config_dir = Config().sync_config_dir
20         except:
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()
24
25     def __init__(self, **args):
26         """Initialize a sync step
27            Keyword arguments:
28                    name -- Name of the step
29                 provides -- PlanetStack models sync'd by this step
30         """
31         dependencies = []
32         self.driver = args.get('driver')
33         try:
34             self.soft_deadline = int(self.get_prop('soft_deadline_seconds'))
35         except:
36             self.soft_deadline = 5 # 5 seconds
37
38         return
39
40     def fetch_pending(self):
41         return []
42         #return Sliver.objects.filter(ip=None)
43     
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
49
50     def call(self, failed=[]):
51         pending = self.fetch_pending()
52         for o in pending:
53             try:
54                 for f in failed:
55                     self.check_dependencies(o,f) # Raises exception if failed                    
56                 self.sync_record(o)
57                 o.enacted = datetime.now() # Is this the same timezone? XXX
58                 o.save(update_fields=['enacted'])
59             except:
60                 failed.append(o)
61
62         return failed
63
64     def __call__(self, **args):
65         return self.call(**args)