import repository from arizona
[raven.git] / apps / geni / geniclientbase.py
1 ##
2 # This module implements the client-side of the Geni API. Stubs are provided
3 # that convert the supplied parameters to the necessary format and send them
4 # via XMLRPC to a Geni Server.
5 #
6 # TODO: Investigate ways to combine this with existing PLC API?
7 ##
8
9 import xmlrpclib
10
11 ##
12 # ServerException, ExceptionUnmarshaller
13 #
14 # Used to convert server exception strings back to an exception.
15 #    from usenet, Raghuram Devarakonda
16
17 class ServerException(Exception):
18     pass
19
20 class ExceptionUnmarshaller(xmlrpclib.Unmarshaller):
21     def close(self):\r
22         try:\r
23             return xmlrpclib.Unmarshaller.close(self)\r
24         except xmlrpclib.Fault, e:\r
25             raise ServerException(e.faultString)
26
27 ##
28 # GeniTransport
29 #
30 # A transport for XMLRPC that works on top of HTTPS
31
32 class GeniTransport(xmlrpclib.Transport):
33     key_file = None
34     cert_file = None
35     def make_connection(self, host):\r
36         # create a HTTPS connection object from a host descriptor\r
37         # host may be a string, or a (host, x509-dict) tuple\r
38         import httplib\r
39         host, extra_headers, x509 = self.get_host_info(host)\r
40         try:\r
41             HTTPS = httplib.HTTPS()\r
42         except AttributeError:\r
43             raise NotImplementedError(\r
44                 "your version of httplib doesn't support HTTPS"\r
45                 )\r
46         else:\r
47             return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {}))\r
48 \r
49     def getparser(self):\r
50         unmarshaller = ExceptionUnmarshaller()\r
51         parser = xmlrpclib.ExpatParser(unmarshaller)\r
52         return parser, unmarshaller\r
53 \r
54 ##\r
55 # The GeniClient class provides stubs for executing Geni operations. A given\r
56 # client object connects to one server. To connect to multiple servers, create\r
57 # multiple GeniClient objects.\r
58 #\r
59 # The Geni protocol uses an HTTPS connection, and the client's side of the\r
60 # connection uses his private key. Generally, this private key must match the\r
61 # public key that is containing in the GID that the client is providing for\r
62 # those functions that take a GID.\r
63 \r
64 class GeniClientBase():
65     ##
66     # Create a new GeniClient object.
67     #
68     # @param url is the url of the server
69     # @param key_file = private key file of client
70     # @param cert_file = x.509 cert containing the client's public key. This
71     #      could be a GID certificate, or any x.509 cert.
72
73     def __init__(self, url, key_file, cert_file):
74        self.url = url
75        self.key_file = key_file
76        self.cert_file = cert_file
77        self.transport = GeniTransport()
78        self.transport.key_file = self.key_file
79        self.transport.cert_file = self.cert_file
80        self.server = xmlrpclib.ServerProxy(self.url, self.transport, allow_none=True)
81
82
83