[208797c] | 1 | #!/usr/local/bin/python |
---|
| 2 | |
---|
| 3 | import os,sys |
---|
| 4 | import logging |
---|
| 5 | |
---|
| 6 | from service_error import service_error |
---|
| 7 | from remote_service import xmlrpc_handler, soap_handler, service_caller |
---|
| 8 | |
---|
| 9 | from proxy_segment import proxy_segment |
---|
| 10 | |
---|
| 11 | |
---|
| 12 | class protogeni_proxy(proxy_segment): |
---|
| 13 | class ProtoGENIError(Exception): |
---|
| 14 | def __init__(self, op, code, output): |
---|
| 15 | Exception.__init__(self, output) |
---|
| 16 | self.op = op |
---|
| 17 | self.code = code |
---|
| 18 | self.output = output |
---|
| 19 | |
---|
| 20 | def __init__(self, log=None, keyfile=None, debug=False, |
---|
| 21 | ch_url=None, sa_url=None, cm_url=None): |
---|
| 22 | proxy_segment.__init__(self, log=log, keyfile=keyfile, debug=debug) |
---|
| 23 | |
---|
| 24 | self.ProtoGENIError = protogeni_proxy.ProtoGENIError |
---|
| 25 | self.ch_url = ch_url |
---|
| 26 | self.sa_url = sa_url |
---|
| 27 | self.cm_url = cm_url |
---|
| 28 | |
---|
| 29 | self.call_SetValue = service_caller('SetValue') |
---|
| 30 | |
---|
| 31 | self.debug_fail = ['Resolve'] |
---|
| 32 | self.debug_response = { |
---|
| 33 | 'RedeemTicket': ("XML blob1", "XML blob2"), |
---|
| 34 | 'SliceStatus': { 'status': 'ready' }, |
---|
| 35 | } |
---|
| 36 | |
---|
| 37 | |
---|
| 38 | def pg_call(self, url, method, params, context): |
---|
| 39 | max_retries = 5 |
---|
| 40 | retries = 0 |
---|
| 41 | |
---|
| 42 | s = service_caller(method, request_body_name="", strict=False) |
---|
| 43 | if self.log: |
---|
| 44 | self.log.debug("Calling %s %s" % (url, method)) |
---|
| 45 | if not self.debug: |
---|
| 46 | while retries < max_retries: |
---|
| 47 | r = s.call_xmlrpc_service(url, params, context=context) |
---|
| 48 | code = r.get('code', -1) |
---|
| 49 | if code == 0: |
---|
| 50 | # Success leaves the loop here |
---|
| 51 | return r.get('value', None) |
---|
| 52 | elif code == 14 and retries +1 < max_retries: |
---|
| 53 | # Busy resource |
---|
| 54 | retries+= 1 |
---|
| 55 | self.log.info("Resource busy, retrying in 30 secs") |
---|
| 56 | time.sleep(30) |
---|
| 57 | else: |
---|
| 58 | # NB: out of retries falls through to here |
---|
| 59 | raise self.ProtoGENIError(op=method, |
---|
| 60 | code=r.get('code', 'unknown'), |
---|
| 61 | output=r.get('output', 'No output')) |
---|
| 62 | else: |
---|
| 63 | if method in self.debug_fail: |
---|
| 64 | raise self.ProtoGENIError(op=method, code='unknown', |
---|
| 65 | output='No output') |
---|
| 66 | elif self.debug_response.has_key(method): |
---|
| 67 | return self.debug_response[method] |
---|
| 68 | else: |
---|
| 69 | return "%s XML blob" % method |
---|
| 70 | |
---|
| 71 | def clearinghouse_call(self, method, params, context): |
---|
| 72 | return self.pg_call(self.ch_url, method, params, context) |
---|
| 73 | |
---|
| 74 | def slice_authority_call(self, method, params, context): |
---|
| 75 | return self.pg_call(self.sa_url, method, params, context) |
---|
| 76 | |
---|
| 77 | def component_manager_call(self, method, params, context): |
---|
| 78 | return self.pg_call(self.cm_url, method, params, context) |
---|
| 79 | |
---|