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