def poll(self, jobid, response): """ polls the completion of a given jobid @param jobid: @param response: @return: """ cmd = queryAsyncJobResult.queryAsyncJobResultCmd() cmd.jobid = jobid timeout = self.asyncTimeout while timeout > 0: asyncResonse = self.marvin_request(cmd, response_type=response) if asyncResonse.jobstatus == 2: raise cloudstackException.cloudstackAPIException( "asyncquery", asyncResonse.jobresult) elif asyncResonse.jobstatus == 1: return asyncResonse time.sleep(5) if self.logging is not None: self.logging.debug("job: %s still processing," " will timeout in %ds" % (jobid, timeout)) timeout = timeout - 5 raise cloudstackException.cloudstackAPIException( "asyncquery", "Async job timeout %s" % jobid)
def pollAsyncJob(self, cmd, response, jobId): commandName = cmd.__class__.__name__.replace("Cmd", "") cmd = queryAsyncJobResult.queryAsyncJobResultCmd() cmd.jobid = jobId while self.asyncTimeout > 0: asyncResponse = queryAsyncJobResult.queryAsyncJobResultResponse() responseName = asyncResponse.__class__.__name__.lower() asyncResponseXml = self.make_request(cmd, asyncResponse, True) dom = xml.dom.minidom.parseString(asyncResponseXml) elements = dom.getElementsByTagName(responseName) if len(elements) == 0: raise cloudstackException.cloudstackAPIException("can't find %s"%responseName) self.hasErrorCode(elements, responseName) jobstatus = self.getText(elements[0].getElementsByTagName("jobstatus")) if jobstatus == "2": jobResult = self.getText(elements[0].getElementsByTagName("jobresult")) raise cloudstackException.cloudstackAPIException(commandName, jobResult) elif jobstatus == "1": jobResultEle = elements[0].getElementsByTagName("jobresult") return self.paraseResultFromElement(jobResultEle, response) time.sleep(5) raise cloudstackException.cloudstackAPIException(commandName, "Async job timeout")
def pollAsyncJob(self, jobId, response): cmd = queryAsyncJobResult.queryAsyncJobResultCmd() cmd.jobid = jobId while self.asyncTimeout > 0: asyncResonse = self.make_request(cmd, response, True) if asyncResonse.jobstatus == 2: raise cloudstackException.cloudstackAPIException("asyncquery", asyncResonse.jobresult) elif asyncResonse.jobstatus == 1: return asyncResonse time.sleep(5) self.asyncTimeout = self.asyncTimeout - 5 raise cloudstackException.cloudstackAPIException("asyncquery", "Async job timeout")
def getResultObj(returnObj, responsecls=None): if len(returnObj) == 0: return None responseName = filter(lambda a: a != u'cloudstack-version', returnObj.keys())[0] response = returnObj[responseName] if len(response) == 0: return None result = jsonLoader(response) if result.errorcode is not None: errMsg = "errorCode: %s, errorText:%s" % (result.errorcode, result.errortext) raise cloudstackException.cloudstackAPIException( responseName.replace("response", ""), errMsg) if result.count is not None: for key in result.__dict__.iterkeys(): if key == "count": continue else: return getattr(result, key) else: return finalizeResultObj(result, responseName, responsecls)
def getResultObj(returnObj, responsecls=None): if len(returnObj) == 0: return None responseName = filter(lambda a: a != u'cloudstack-version', returnObj.keys())[0] response = returnObj[responseName] if len(response) == 0: return None result = jsonLoader(response) if result.errorcode is not None: errMsg = "errorCode: %s, errorText:%s" % (result.errorcode, result.errortext) respname = responseName.replace("response", "") raise cloudstackException.cloudstackAPIException(respname, errMsg) if result.count is not None: for key in result.__dict__.iterkeys(): if key == "count": continue else: return getattr(result, key) else: return finalizeResultObj(result, responseName, responsecls)
def getAsyncJobId(self, response, resultXml): responseName = response.__class__.__name__.lower() dom = xml.dom.minidom.parseString(resultXml) elements = dom.getElementsByTagName(responseName) if len(elements) == 0: raise cloudstackException.cloudstackAPIException("can't find %s"%responseName) self.hasErrorCode(elements, responseName) jobIdEle = elements[0].getElementsByTagName("jobid") if len(jobIdEle) == 0: errMsg = 'can not find jobId in the result:%s'%resultXml raise cloudstackException.cloudstackAPIException(errMsg) jobId = self.getText(jobIdEle) return jobId
def hasErrorCode(self, elements, responseName): errorCode = elements[0].getElementsByTagName("errorcode") if len(errorCode) > 0: erroCodeText = self.getText(errorCode) errorText = elements[0].getElementsByTagName("errortext") if len(errorText) > 0: errorText = self.getText(errorText) errMsg = "errorCode: %s, errorText:%s"%(erroCodeText, errorText) raise cloudstackException.cloudstackAPIException(responseName, errMsg)
def pollAsyncJob(self, jobId, response): cmd = queryAsyncJobResult.queryAsyncJobResultCmd() cmd.jobid = jobId timeout = self.asyncTimeout while timeout > 0: asyncResonse = self.make_request(cmd, response, True) if asyncResonse.jobstatus == 2: raise cloudstackException.cloudstackAPIException("asyncquery", asyncResonse.jobresult) elif asyncResonse.jobstatus == 1: return asyncResonse time.sleep(5) self.logging.debug("job: %s still processing, will timeout in %ds"%(jobId, timeout)) timeout = timeout - 5 raise cloudstackException.cloudstackAPIException("asyncquery", "Async job timeout %s"%jobId)
def make_request(self, cmd, response = None, raw=False): commandName = cmd.__class__.__name__.replace("Cmd", "") isAsync = "false" requests = {} required = [] for attribute in dir(cmd): if attribute != "__doc__" and attribute != "__init__" and attribute != "__module__": if attribute == "isAsync": isAsync = getattr(cmd, attribute) elif attribute == "required": required = getattr(cmd, attribute) else: requests[attribute] = getattr(cmd, attribute) for requiredPara in required: if requests[requiredPara] is None: raise cloudstackException.cloudstackAPIException(commandName, "%s is required"%requiredPara) '''remove none value''' for param, value in requests.items(): if value is None: requests.pop(param) elif isinstance(value, list): if len(value) == 0: requests.pop(param) else: if not isinstance(value[0], dict): requests[param] = ",".join(value) else: requests.pop(param) i = 0 for v in value: for key, val in v.iteritems(): requests["%s[%d].%s"%(param,i,key)] = val i = i + 1 if self.logging is not None: self.logging.debug("sending command: %s %s"%(commandName, str(requests))) result = None if self.auth: result = self.make_request_with_auth(commandName, requests) else: result = self.make_request_without_auth(commandName, requests) if self.logging is not None: self.logging.debug("got result: " + result) if result is None: return None result = jsonHelper.getResultObj(result, response) if raw or isAsync == "false": return result else: asynJobId = result.jobid result = self.pollAsyncJob(asynJobId, response) return result.jobresult
def make_request(self, cmd, response=None, raw=False): commandName = cmd.__class__.__name__.replace("Cmd", "") isAsync = "false" requests = {} required = [] for attribute in dir(cmd): if attribute != "__doc__" and attribute != "__init__" and attribute != "__module__": if attribute == "isAsync": isAsync = getattr(cmd, attribute) elif attribute == "required": required = getattr(cmd, attribute) else: requests[attribute] = getattr(cmd, attribute) for requiredPara in required: if requests[requiredPara] is None: raise cloudstackException.cloudstackAPIException( commandName, "%s is required" % requiredPara) '''remove none value''' for param, value in requests.items(): if value is None: requests.pop(param) elif isinstance(value, list): if len(value) == 0: requests.pop(param) else: if not isinstance(value[0], dict): requests[param] = ",".join(value) else: requests.pop(param) i = 0 for v in value: for key, val in v.iteritems(): requests["%s[%d].%s" % (param, i, key)] = val i = i + 1 if self.logging is not None: self.logging.info("sending command: %s %s" % (commandName, str(requests))) result = None if self.auth: result = self.make_request_with_auth(commandName, requests) else: result = self.make_request_without_auth(commandName, requests) if result is None: return None result = jsonHelper.getResultObj(result, response) if raw or isAsync == "false": return result else: asynJobId = result.jobid result = self.pollAsyncJob(asynJobId, response) return result.jobresult
def pollAsyncJob(self, jobId, response): cmd = queryAsyncJobResult.queryAsyncJobResultCmd() cmd.jobid = jobId timeout = self.asyncTimeout while timeout > 0: asyncResonse = self.make_request(cmd, response, True) if asyncResonse.jobstatus == 2: raise cloudstackException.cloudstackAPIException( "asyncquery", asyncResonse.jobresult) elif asyncResonse.jobstatus == 1: return asyncResonse time.sleep(5) self.logging.debug( "job: %s still processing, will timeout in %ds" % (jobId, timeout)) timeout = timeout - 5 raise cloudstackException.cloudstackAPIException( "asyncquery", "Async job timeout %s" % jobId)
def make_request(self, cmd, response, raw=False): commandName = cmd.__class__.__name__.replace("Cmd", "") isAsync = "false" requests = {} required = [] for attribute in dir(cmd): if attribute != "__doc__" and attribute != "__init__" and attribute != "__module__": if attribute == "isAsync": isAsync = getattr(cmd, attribute) elif attribute == "required": required = getattr(cmd, attribute) else: requests[attribute] = getattr(cmd, attribute) for requiredPara in required: if requests[requiredPara] is None: raise cloudstackException.cloudstackAPIException(commandName, "%s is required"%requiredPara) '''remove none value''' for param, value in requests.items(): if value is None: requests.pop(param) if self.logging is not None: self.logging.debug("sending command: " + str(requests)) result = None if self.auth: result = self.make_request_with_auth(commandName, requests) else: result = self.make_request_without_auth(commandName, requests) if self.logging is not None: self.logging.debug("got result: " + result) if result is None: return None if raw: return result if isAsync == "false": result,num = self.paraseReturnXML(result, response) else: jobId = self.getAsyncJobId(response, result) result,num = self.pollAsyncJob(cmd, response, jobId) if num: return result else: if len(result) != 0: return result[0] return None
def sanitize_command(self, cmd): """ Removes None values, Validates all required params are present @param cmd: Cmd object eg: createPhysicalNetwork @return: """ requests = {} required = [] for attribute in dir(cmd): if attribute != "__doc__" and attribute != "__init__" and\ attribute != "__module__": if attribute == "isAsync": isAsync = getattr(cmd, attribute) elif attribute == "required": required = getattr(cmd, attribute) else: requests[attribute] = getattr(cmd, attribute) cmdname = cmd.__class__.__name__.replace("Cmd", "") for requiredPara in required: if requests[requiredPara] is None: raise cloudstackException.cloudstackAPIException( cmdname, "%s is required" % requiredPara) for param, value in requests.items(): if value is None: requests.pop(param) elif isinstance(value, list): if len(value) == 0: requests.pop(param) else: if not isinstance(value[0], dict): requests[param] = ",".join(value) else: requests.pop(param) i = 0 for val in value: for k, v in val.iteritems(): requests["%s[%d].%s" % (param, i, k)] = v i = i + 1 return cmdname, isAsync, requests