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