8e8d4fce4c74a63cf769244a2c77d283e75c7c0f
[plstackapi.git] / planetstack / observer / syncstep.py
1 import os
2 import base64
3 from planetstack.config import Config
4
5 class FailedDependency(Exception):
6     pass
7
8 class SyncStep:
9     """ A PlanetStack Sync step. 
10
11     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()
23
24     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 = []
31         self.driver = args.get('driver')
32         try:
33             self.soft_deadline = int(self.get_prop('soft_deadline_seconds'))
34         except:
35             self.soft_deadline = 5 # 5 seconds
36
37         return
38
39     def fetch_pending(self):
40         #return Sliver.objects.filter(ip=None)
41         return []
42     
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
48
49     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
61
62     def __call__(self):
63         return self.call()