5 # implements the client-side of the GENI API.
7 # TODO: Investigate ways to combine this with existing PLC API?
12 from credential import *
14 from geniticket import *
16 # ServerException, ExceptionUnmarshaller
18 # Used to convert server exception strings back to an exception.
19 # from usenet, Raghuram Devarakonda
21 class ServerException(Exception):
24 class ExceptionUnmarshaller(xmlrpclib.Unmarshaller):
27 return xmlrpclib.Unmarshaller.close(self)
\r
28 except xmlrpclib.Fault, e:
\r
29 raise ServerException(e.faultString)
33 # A transport for XMLRPC that works on top of HTTPS
35 class GeniTransport(xmlrpclib.Transport):
38 def make_connection(self, host):
\r
39 # create a HTTPS connection object from a host descriptor
\r
40 # host may be a string, or a (host, x509-dict) tuple
\r
42 host, extra_headers, x509 = self.get_host_info(host)
\r
44 HTTPS = httplib.HTTPS()
\r
45 except AttributeError:
\r
46 raise NotImplementedError(
\r
47 "your version of httplib doesn't support HTTPS"
\r
50 return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {}))
\r
52 def getparser(self):
\r
53 unmarshaller = ExceptionUnmarshaller()
\r
54 parser = xmlrpclib.ExpatParser(unmarshaller)
\r
55 return parser, unmarshaller
\r
59 # Class for performing GeniClient operations.
\r
63 # key_file = private key file of client
64 # cert_file = x.509 cert of client
65 def __init__(self, url, key_file, cert_file):
67 self.key_file = key_file
68 self.cert_file = cert_file
69 self.transport = GeniTransport()
70 self.transport.key_file = self.key_file
71 self.transport.cert_file = self.cert_file
72 self.server = xmlrpclib.ServerProxy(self.url, self.transport, allow_none=True)
74 # -------------------------------------------------------------------------
76 # -------------------------------------------------------------------------
78 def create_gid(self, cred, name, uuid, pkey_string):
79 gid_str = self.server.create_gid(cred.save_to_string(save_parents=True), name, uuid, pkey_string)
80 return GID(string=gid_str)
82 def get_gid(self, name):
83 gid_str_list = self.server.get_gid(name)
85 for str in gid_str_list:
86 gid_list.append(GID(string=str))
91 # a degenerate version of get_credential used by a client to get his
92 # initial credential when he doesn't have one. The same as calling
93 # get_credential(..., cred=None,...)
95 def get_self_credential(self, type, name):
96 cred_str = self.server.get_self_credential(type, name)
97 return Credential(string = cred_str)
99 def get_credential(self, cred, type, name):
101 return self.get_self_credential(type, name)
102 cred_str = self.server.get_credential(cred.save_to_string(save_parents=True), type, name)
103 return Credential(string = cred_str)
105 def list(self, cred):
106 result_dict_list = self.server.list(cred.save_to_string(save_parents=True))
108 for dict in result_dict_list:
109 result_rec_list.append(GeniRecord(dict=dict))
110 return result_rec_list
112 def register(self, cred, record):
113 gid_str = self.server.register(cred.save_to_string(save_parents=True), record.as_dict())
114 return GID(string = gid_str)
116 def remove(self, cred, record):
117 result = self.server.remove(cred.save_to_string(save_parents=True), record.as_dict())
120 def resolve(self, cred, name):
121 result_dict_list = self.server.resolve(cred.save_to_string(save_parents=True), name)
123 for dict in result_dict_list:
124 result_rec_list.append(GeniRecord(dict=dict))
125 return result_rec_list
127 def update(self, cred, record):
128 result = self.server.update(cred.save_to_string(save_parents=True), record.as_dict())
131 # ------------------------------------------------------------------------
133 # ------------------------------------------------------------------------
135 def start_slice(self, cred):
136 result = self.server.start_slice(cred.save_to_string(save_parents=True))
139 def stop_slice(self, cred):
140 result = self.server.stop_slice(cred.save_to_string(save_parents=True))
143 def reset_slice(self, cred):
144 result = self.server.reset_slice(cred.save_to_string(save_parents=True))
147 def delete_slice(self, cred):
148 result = self.server.delete_slice(cred.save_to_string(save_parents=True))
151 def list_slices(self, cred):
152 result = self.server.list_slices(cred.save_to_string(save_parents=True))
155 def get_ticket(self, cred, name, rspec):
156 ticket_str = self.server.get_ticket(cred.save_to_string(save_parents=True), name, rspec)
157 ticket = Ticket(string=ticket_str)
160 def redeem_ticket(self, ticket):
161 result = self.server.redeem_ticket(ticket.save_to_string(save_parents=True))