Exemple #1
0
    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 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")
Exemple #5
0
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)
Exemple #6
0
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
Exemple #14
0
    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
Exemple #15
0
    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