2 from types import StringTypes
3 from PLC.Sites import Sites
5 from sfa.plc.api import GeniAPI
6 from sfa.plc.sfaImport import cleanup_string
7 from sfa.server.registry import Registries
8 from sfa.util.record import *
9 from sfa.trust.hierarchy import *
10 from sfa.util.misc import *
11 packages_imported = True
13 packages_imported = False
15 def wrap_exception(method):
16 def wrap(*args, **kwds):
18 return method(*args, **kwds)
23 def required_packages_imported(method):
24 def wrap(*args, **kwds):
26 return method(*args, **kwds)
34 @required_packages_imported
35 def __init__(self, api):
39 # Get the path to the sfa server key/cert files from
40 # the sfa hierarchy object
41 sfa_hierarchy = Hierarchy()
42 sfa_key_path = sfa_hierarchy.basedir
43 key_file = os.path.join(sfa_key_path, "server.key")
44 cert_file = os.path.join(sfa_key_path, "server.cert")
46 # get a connection to our local sfa registry
47 # and a valid credential
48 self.sfa_api = GeniAPI(key_file = key_file, cert_file = cert_file)
49 self.sfa_api.interface = "other"
50 registries = Registries(self.sfa_api)
51 self.registry = registries[self.sfa_api.hrn]
52 self.credential = self.sfa_api.getCredential()
53 self.authority = self.sfa_api.hrn
56 def get_login_base(self, site_id):
57 sites = Sites(self.api, [site_id], ['login_base'])
58 login_base = sites[0]['login_base']
62 def get_login_bases(self, object):
67 if object.has_key('site_id') and object['site_id']:
68 site_ids.append(object['site_id'])
69 elif object.has_key('site_ids') and object['site_ids']:
70 site_ids.extend(object['site_ids'])
75 for site_id in site_ids:
76 login_bases.append(self.get_login_base(site_id))
80 def get_object_hrn(self, type, object, authority, login_base):
81 parent_hrn = authority + "." + login_base
82 if type in ['person', 'user']:
83 name_parts = object['email'].split("@")
84 hrn = parent_hrn + "." + name_parts[:1]
86 elif type in ['slice']:
87 name_parts = object['name'].split("_")
88 hrn = parent_hrn + "." + name_parts[-1:]
90 elif type in ['node']:
91 hrn = hostname_to_hrn(self.authority, login_base, object['hostname'])
93 elif type in ['site', 'authority']:
97 raise Exception, "Invalid record type %(type)s" % locals()
102 @required_packages_imported
103 def update_record(self, object, type, login_bases = None):
104 # determine this objects site and login_base
106 login_bases = self.get_login_bases(object)
108 if isinstance(login_bases, StringTypes):
109 login_bases = [login_bases]
111 for login_base in login_bases:
112 login_base = cleanup_string(login_base)
113 parent_hrn = self.authority + "." + login_base
115 # set the object hrn, tpye and create the sfa record
117 object['hrn'] = self.get_object_hrn(type, object, self.authority, login_base)
118 if type in ['person', 'user']:
119 object['type'] = 'user'
120 record = UserRecord(dict=object)
122 elif type in ['slice']:
123 object['type'] = 'slice'
124 record = SliceRecord(dict=object)
126 elif type in ['node']:
127 object['type'] = 'node'
128 record = NodeRecord(dict=object)
130 elif type in ['site']:
131 object['type'] = 'authority'
132 record = AuthorityRecord(dict=object)
135 raise Exception, "Invalid record type %(type)s" % locals()
137 # add the record to sfa
138 self.registry.register(self.credential, record)
141 @required_packages_imported
142 def delete_record(self, object, type, login_base = None):
143 if type in ['person']:
145 elif type in ['site']:
148 if type not in ['user', 'slice', 'node', 'authority']:
149 raise Exception, "Invalid type %(type)s" % locals()
152 login_bases = self.get_login_bases(object)
154 login_bases = [login_base]
156 for login_base in login_bases:
157 login_base = cleanup_string(login_base)
158 hrn = self.get_object_hrn(type, object, self.authority, login_base)
159 self.registry.remove(self.credential, type, hrn)