added redeemticket
[sfa.git] / util / geniclient.py
1 # geniclient.py
2 #
3 # geni client
4 #
5 # implements the client-side of the GENI API.
6 #
7 # TODO: Investigate ways to combine this with existing PLC API?
8
9 import xmlrpclib
10
11 from gid import *
12 from credential import *
13 from record import *
14
15 # GeniTransport
16 #
17 # A transport for XMLRPC that works on top of HTTPS
18
19 class GeniTransport(xmlrpclib.Transport):
20     key_file = None
21     cert_file = None
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
25         import httplib\r
26         host, extra_headers, x509 = self.get_host_info(host)\r
27         try:\r
28             HTTPS = httplib.HTTPS()\r
29         except AttributeError:\r
30             raise NotImplementedError(\r
31                 "your version of httplib doesn't support HTTPS"\r
32                 )\r
33         else:\r
34             return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {}))\r
35 \r
36 # GeniClient:\r
37 #\r
38 # Class for performing GeniClient operations.\r
39 \r
40 class GeniClient():
41     # url = url of server
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):
45        self.url = url
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)
52
53     def get_gid(self, name):
54        gid_str_list = self.server.get_gid(name)
55        gid_list = []
56        for str in gid_str_list:
57            gid_list.append(GID(string=str))
58        return gid_list
59
60     # get_self_credential
61     #
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,...)
65
66     def get_self_credential(self, type, name):
67        cred_str = self.server.get_self_credential(type, name)
68        return Credential(string = cred_str)
69
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)
73
74     def resolve(self, cred, name):
75        result_dict_list = self.server.resolve(cred.save_to_string(), name)
76        result_rec_list = []
77        for dict in result_dict_list:
78             result_rec_list.append(GeniRecord(dict=dict))
79        return result_rec_list
80