mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
adding retry logic, error handling, and urllib2 used for managing connections
This commit is contained in:
parent
1316fb7714
commit
01fa6e3322
@ -1,4 +1,4 @@
|
|||||||
import httplib
|
import urllib2
|
||||||
import urllib
|
import urllib
|
||||||
import base64
|
import base64
|
||||||
import hmac
|
import hmac
|
||||||
@ -17,7 +17,6 @@ class cloudConnection(object):
|
|||||||
self.apiKey = apiKey
|
self.apiKey = apiKey
|
||||||
self.securityKey = securityKey
|
self.securityKey = securityKey
|
||||||
self.mgtSvr = mgtSvr
|
self.mgtSvr = mgtSvr
|
||||||
self.connection = httplib.HTTPConnection("%s:%d"%(mgtSvr,port), timeout=180)
|
|
||||||
self.port = port
|
self.port = port
|
||||||
self.logging = logging
|
self.logging = logging
|
||||||
if port == 8096:
|
if port == 8096:
|
||||||
@ -25,6 +24,7 @@ class cloudConnection(object):
|
|||||||
else:
|
else:
|
||||||
self.auth = True
|
self.auth = True
|
||||||
|
|
||||||
|
self.retries = 5
|
||||||
self.asyncTimeout = asyncTimeout
|
self.asyncTimeout = asyncTimeout
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
@ -40,27 +40,47 @@ class cloudConnection(object):
|
|||||||
requests["command"] = command
|
requests["command"] = command
|
||||||
requests["apiKey"] = self.apiKey
|
requests["apiKey"] = self.apiKey
|
||||||
requests["response"] = "json"
|
requests["response"] = "json"
|
||||||
requests = zip(requests.keys(), requests.values())
|
request = zip(requests.keys(), requests.values())
|
||||||
requests.sort(key=lambda x: str.lower(x[0]))
|
request.sort(key=lambda x: str.lower(x[0]))
|
||||||
|
|
||||||
requestUrl = "&".join(["=".join([request[0], urllib.quote_plus(str(request[1]))]) for request in requests])
|
requestUrl = "&".join(["=".join([r[0], urllib.quote_plus(str(r[1]))]) for r in request])
|
||||||
hashStr = "&".join(["=".join([str.lower(request[0]), str.lower(urllib.quote_plus(str(request[1]))).replace("+", "%20")]) for request in requests])
|
hashStr = "&".join(["=".join([str.lower(r[0]), str.lower(urllib.quote_plus(str(r[1]))).replace("+", "%20")]) for r in request])
|
||||||
|
|
||||||
sig = urllib.quote_plus(base64.encodestring(hmac.new(self.securityKey, hashStr, hashlib.sha1).digest()).strip())
|
sig = urllib.quote_plus(base64.encodestring(hmac.new(self.securityKey, hashStr, hashlib.sha1).digest()).strip())
|
||||||
|
|
||||||
requestUrl += "&signature=%s"%sig
|
requestUrl += "&signature=%s"%sig
|
||||||
|
|
||||||
self.connection.request("GET", "/client/api?%s"%requestUrl)
|
try:
|
||||||
|
self.connection = urllib2.urlopen("http://%s:%d/client/api?%s"%(self.mgtSvr, self.port, requestUrl))
|
||||||
return self.connection.getresponse().read()
|
self.logging.debug("sending request: %s"%requestUrl)
|
||||||
|
response = self.connection.read()
|
||||||
|
self.logging.debug("got response: %s"%response)
|
||||||
|
except IOError, e:
|
||||||
|
if hasattr(e, 'reason'):
|
||||||
|
self.logging.debug("failed to reach %s because of %s"%(self.mgtSvr, e.reason))
|
||||||
|
elif hasattr(e, 'code'):
|
||||||
|
self.logging.debug("server returned %d error code"%e.code)
|
||||||
|
except HTTPException, h:
|
||||||
|
self.logging.debug("encountered http Exception %s"%h.args)
|
||||||
|
if self.retries > 0:
|
||||||
|
self.retries = self.retries - 1
|
||||||
|
self.make_request_with_auth(command, requests)
|
||||||
|
else:
|
||||||
|
self.retries = 5
|
||||||
|
raise h
|
||||||
|
else:
|
||||||
|
return response
|
||||||
|
|
||||||
def make_request_without_auth(self, command, requests={}):
|
def make_request_without_auth(self, command, requests={}):
|
||||||
requests["command"] = command
|
requests["command"] = command
|
||||||
requests["response"] = "json"
|
requests["response"] = "json"
|
||||||
requests = zip(requests.keys(), requests.values())
|
requests = zip(requests.keys(), requests.values())
|
||||||
requestUrl = "&".join(["=".join([request[0], urllib.quote_plus(str(request[1]))]) for request in requests])
|
requestUrl = "&".join(["=".join([request[0], urllib.quote_plus(str(request[1]))]) for request in requests])
|
||||||
self.connection.request("GET", "/&%s"%requestUrl)
|
|
||||||
return self.connection.getresponse().read()
|
self.connection = urllib2.urlopen("http://%s:%d/client/api?%s"%(self.mgtSvr, self.port, requestUrl))
|
||||||
|
self.logging.debug("sending request without auth: %s"%requestUrl)
|
||||||
|
response = self.connection.read()
|
||||||
|
self.logging.debug("got response: %s"%response)
|
||||||
|
return response
|
||||||
|
|
||||||
def pollAsyncJob(self, jobId, response):
|
def pollAsyncJob(self, jobId, response):
|
||||||
cmd = queryAsyncJobResult.queryAsyncJobResultCmd()
|
cmd = queryAsyncJobResult.queryAsyncJobResultCmd()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user