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