added tickets
[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 from geniticket import *
15
16 # ServerException, ExceptionUnmarshaller
17 #
18 # Used to convert server exception strings back to an exception.
19 #    from usenet, Raghuram Devarakonda
20
21 class ServerException(Exception):
22     pass
23
24 class ExceptionUnmarshaller(xmlrpclib.Unmarshaller):
25     def close(self):\r
26         try:\r
27             return xmlrpclib.Unmarshaller.close(self)\r
28         except xmlrpclib.Fault, e:\r
29             raise ServerException(e.faultString)
30
31 # GeniTransport
32 #
33 # A transport for XMLRPC that works on top of HTTPS
34
35 class GeniTransport(xmlrpclib.Transport):
36     key_file = None
37     cert_file = None
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
41         import httplib\r
42         host, extra_headers, x509 = self.get_host_info(host)\r
43         try:\r
44             HTTPS = httplib.HTTPS()\r
45         except AttributeError:\r
46             raise NotImplementedError(\r
47                 "your version of httplib doesn't support HTTPS"\r
48                 )\r
49         else:\r
50             return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {}))\r
51 \r
52     def getparser(self): \r
53         unmarshaller = ExceptionUnmarshaller() \r
54         parser = xmlrpclib.ExpatParser(unmarshaller) \r
55         return parser, unmarshaller\r
56 \r
57 # GeniClient:\r
58 #\r
59 # Class for performing GeniClient operations.\r
60 \r
61 class GeniClient():
62     # url = url of server
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):
66        self.url = url
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)
73
74     # -------------------------------------------------------------------------
75     # Registry Interface
76     # -------------------------------------------------------------------------
77
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)
81
82     def get_gid(self, name):
83        gid_str_list = self.server.get_gid(name)
84        gid_list = []
85        for str in gid_str_list:
86            gid_list.append(GID(string=str))
87        return gid_list
88
89     # get_self_credential
90     #
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,...)
94
95     def get_self_credential(self, type, name):
96         cred_str = self.server.get_self_credential(type, name)
97         return Credential(string = cred_str)
98
99     def get_credential(self, cred, type, name):
100         if cred == None:
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)
104
105     def list(self, cred):
106         result_dict_list = self.server.list(cred.save_to_string(save_parents=True))
107         result_rec_list = []
108         for dict in result_dict_list:
109              result_rec_list.append(GeniRecord(dict=dict))
110         return result_rec_list
111
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)
115
116     def remove(self, cred, record):
117         result = self.server.remove(cred.save_to_string(save_parents=True), record.as_dict())
118         return result
119
120     def resolve(self, cred, name):
121         result_dict_list = self.server.resolve(cred.save_to_string(save_parents=True), name)
122         result_rec_list = []
123         for dict in result_dict_list:
124              result_rec_list.append(GeniRecord(dict=dict))
125         return result_rec_list
126
127     def update(self, cred, record):
128         result = self.server.update(cred.save_to_string(save_parents=True), record.as_dict())
129         return result
130
131     # ------------------------------------------------------------------------
132     # Slice Interface
133     # ------------------------------------------------------------------------
134
135     def start_slice(self, cred):
136         result = self.server.start_slice(cred.save_to_string(save_parents=True))
137         return result
138
139     def stop_slice(self, cred):
140         result = self.server.stop_slice(cred.save_to_string(save_parents=True))
141         return result
142
143     def reset_slice(self, cred):
144         result = self.server.reset_slice(cred.save_to_string(save_parents=True))
145         return result
146
147     def delete_slice(self, cred):
148         result = self.server.delete_slice(cred.save_to_string(save_parents=True))
149         return result
150
151     def list_slices(self, cred):
152         result = self.server.list_slices(cred.save_to_string(save_parents=True))
153         return result
154
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)
158         return ticket
159
160     def redeem_ticket(self, ticket):
161         result = self.server.redeem_ticket(ticket.save_to_string(save_parents=True))
162         return result
163
164