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