dont print the exceptions
[plcapi.git] / PLC / SFA.py
1 import traceback
2 from types import StringTypes
3 from PLC.Sites import Sites
4 try:
5     from sfa.plc.sfaImport import sfaImport, cleanup_string
6     from sfa.util.debug import log
7     packages_imported = True
8 except:
9     packages_imported = False
10     
11
12 def wrap_exception(method):
13     def wrap(*args, **kwds):
14         try:
15             return method(*args, **kwds)
16         except:
17             pass
18             #traceback.print_exc()
19     return wrap
20
21 def required_packages_imported(method):
22     def wrap(*args, **kwds):
23         if packages_imported:
24             return method(*args, **kwds)
25         else:
26             return
27     return wrap         
28
29 class SFA:
30     
31     @wrap_exception
32     @required_packages_imported
33     def __init__(self, api):
34         
35         self.api = api
36         self.sfa = sfaImport()
37
38         if self.sfa.level1_auth:
39             self.authority = self.sfa.level1_auth
40         else:
41             self.authority = self.sfa.root_auth
42
43
44     def get_login_base(self, site_id):
45         sites = Sites(self.api, [site_id], ['login_base'])
46         login_base = sites[0]['login_base']
47         return login_base
48         
49
50     def get_login_bases(self, object):
51         login_bases = []
52         site_ids = []
53         
54         # get the site_ids
55         if object.has_key('site_id') and object['site_id']:
56             site_ids.append(object['site_id'])
57         elif object.has_key('site_ids') and object['site_ids']:
58             site_ids.extend(object['site_ids'])
59         else:
60             raise Exception
61
62         # get the login bases
63         for site_id in site_ids:
64             login_bases.append(self.get_login_base(site_id))
65
66         return login_bases
67
68     @wrap_exception
69     @required_packages_imported
70     def update_record(self, object, type, login_bases = None):
71         try:
72             # determine this objects site and login_base
73             if not login_bases:
74                 login_bases = self.get_login_bases(object)
75
76             if isinstance(login_bases, StringTypes):
77                 login_bases = [login_bases]
78
79             for login_base in login_bases:
80                 login_base = cleanup_string(login_base)
81                 parent_hrn = self.authority + "." + login_base
82                 if type in ['person']:
83                     self.sfa.import_person(parent_hrn, object)
84                 elif type in ['slice']:
85                     self.sfa.import_slice(parent_hrn, object)
86                 elif type in ['node']:
87                     self.sfa.import_node(parent_hrn, object)
88                 elif type in ['site']:
89                     self.sfa.import_site(self.authority, object)
90         except Exception, e:
91             id = None
92             keys = ['name', 'hostname', 'email', 'login_base']
93             for key in keys:
94                 if object.has_key(key):
95                     id = object[key]
96             traceback.print_exc(file = log)
97             print >> log, "Error importing %s record for %s into geni db: %s" % \
98                   (type, id, e.message)
99
100     @wrap_exception
101     @required_packages_imported
102     def delete_record(self, object, type, login_base = None):
103
104         if not login_base:
105             login_bases = self.get_login_bases(object)
106         else:
107             login_bases = [login_base]
108
109         for login_base in login_bases:
110             login_base = cleanup_string(login_base)
111             parent_hrn = self.authority + "." + login_base
112             self.sfa.delete_record(parent_hrn, object, type)
113
114     def update_site(self, site, login_base = None):
115         self.update_record(site, 'site', login_base)
116
117     def update_node(self, node, login_base = None):
118         self.update_record(node, 'node', login_base)
119
120     def update_slice(self, slice, login_base = None):
121         self.update_record(slice, 'slice', login_base)
122
123     def update_person(self, person, login_base = None):
124         self.update_record(person, 'person', login_base)
125
126     def delete_site(self, site, login_base = None):
127         site_name = site['login_base']
128         hrn = parent_hrn + site_name
129         self.delete_record(site, 'site', login_base)
130
131     def delete_node(self, node, login_base = None):
132         self.delete_record(node, 'node', login_base)
133
134     def delete_slice(self, slice, login_base = None):
135         self.delete_record(slice, 'slice', login_base)
136
137     def delete_person(self, person, login_base = None):
138         self.delete_record(person, 'person', login_base)