5 # implements the client-side of the GENI API.
7 # TODO: Investigate ways to combine this with existing PLC API?
12 from credential import *
17 # A transport for XMLRPC that works on top of HTTPS
19 class GeniTransport(xmlrpclib.Transport):
22 def make_connection(self, host):
\r
23 # create a HTTPS connection object from a host descriptor
\r
24 # host may be a string, or a (host, x509-dict) tuple
\r
26 host, extra_headers, x509 = self.get_host_info(host)
\r
28 HTTPS = httplib.HTTPS()
\r
29 except AttributeError:
\r
30 raise NotImplementedError(
\r
31 "your version of httplib doesn't support HTTPS"
\r
34 return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {}))
\r
38 # Class for performing GeniClient operations.
\r
42 # key_file = private key file of client
43 # cert_file = x.509 cert of client
44 def __init__(self, url, key_file, cert_file):
46 self.key_file = key_file
47 self.cert_file = cert_file
48 self.transport = GeniTransport()
49 self.transport.key_file = self.key_file
50 self.transport.cert_file = self.cert_file
51 self.server = xmlrpclib.ServerProxy(self.url, self.transport)
53 def get_gid(self, name):
54 gid_str_list = self.server.get_gid(name)
56 for str in gid_str_list:
57 gid_list.append(GID(string=str))
62 # a degenerate version of get_credential used by a client to get his
63 # initial credential when he doesn't have one. The same as calling
64 # get_credential(..., cred=None,...)
66 def get_self_credential(self, type, name):
67 cred_str = self.server.get_self_credential(type, name)
68 return Credential(string = cred_str)
70 def get_credential(self, cred, type, name):
71 cred_str = self.server.get_credential(cred.save_to_string(), type, name)
72 return Credential(string = cred_str)
74 def resolve(self, cred, name):
75 result_dict_list = self.server.resolve(cred.save_to_string(), name)
77 for dict in result_dict_list:
78 result_rec_list.append(GeniRecord(dict=dict))
79 return result_rec_list