Ejemplo n.º 1
0
 def __init__(self, host, secretId, secretKey,
              version="SDK_Python_1.3", logger=None):
     self.host, self.is_https = self.process_host(host)
     self.secretId = secretId
     self.secretKey = secretKey
     self.version = version
     self.logger = CMQLogger.get_logger() if logger is None else logger
     self.http = CMQHttp(self.host, logger=logger, is_https=self.is_https)
     self.sign_method = 'sha1'
     if self.logger:
         self.logger.debug(
             "InitClient Host:%s Version:%s" % (host, version))
     self.method = 'POST'
Ejemplo n.º 2
0
class CMQClient:
    def __init__(self, host, secretId, secretKey,
                 version="SDK_Python_1.3", logger=None):
        self.host, self.is_https = self.process_host(host)
        self.secretId = secretId
        self.secretKey = secretKey
        self.version = version
        self.logger = CMQLogger.get_logger() if logger is None else logger
        self.http = CMQHttp(self.host, logger=logger, is_https=self.is_https)
        self.sign_method = 'sha1'
        if self.logger:
            self.logger.debug(
                "InitClient Host:%s Version:%s" % (host, version))
        self.method = 'POST'

    def set_method(self, method='POST'):
        """
        method: POST OR GET
        """
        self.method = method.upper()

    def set_sign_method(self, sign_method='sha1'):
        '''
        @function : set sign method ,
            and current support sha1 and sha256 method
        @sign_method :  sign method support sha1 and sha256
        @return none or exception for sign method
        '''
        if sign_method == 'sha1' or sign_method == 'sha256':
            self.sign_method = sign_method
        else:
            raise CMQClientParameterException(
                'Only support sha1 or sha256. invalid method:%s' % sign_method)

    def set_log_level(self, log_level):
        if self.logger:
            CMQLogger.validate_loglevel(log_level)
            self.logger.setLevel(log_level)
            self.http.set_log_level(log_level)

    def close_log(self):
        self.logger = None
        self.http.close_log()

    def set_connection_timeout(self, connection_timeout):
        self.http.set_connection_timeout(connection_timeout)

    def set_keep_alive(self, keep_alive):
        self.http.set_keep_alive(keep_alive)

    def close_connection(self):
        self.http.conn.close()

    def process_host(self, host):
        if host.startswith("http://"):
            if host.endswith("/"):
                host = host[:-1]
            host = host[len("http://"):]
            return host, False
        elif host.startswith("https://"):
            if host.endswith("/"):
                host = host[:-1]
            host = host[len("https://"):]
            return host, True
        else:
            raise CMQClientParameterException(
                "Only support http(s) prototol. Invalid host:%s" % host)

    def build_req_inter(self, action, params, req_inter):
        _params = copy.deepcopy(params)
        _params['Action'] = action[0].upper() + action[1:]
        _params['RequestClient'] = self.version

        if 'SecretId' not in _params:
            _params['SecretId'] = self.secretId

        if 'Nonce' not in _params:
            _params['Nonce'] = random.randint(1, sys.maxsize)

        if 'Timestamp' not in _params:
            _params['Timestamp'] = int(time.time())

        if 'SignatureMethod' not in _params:
            if self.sign_method == 'sha256':
                _params['SignatureMethod'] = 'HmacSHA256'
            else:
                _params['SignatureMethod'] = 'HmacSHA1'

        sign = Sign(self.secretId, self.secretKey)
        _params['Signature'] = sign.make(
            self.host, req_inter.uri, _params,
            req_inter.method, self.sign_method)

        req_inter.data = urlencode(_params)

        self.build_header(req_inter)

    def build_header(self, req_inter):
        if self.http.is_keep_alive():
            req_inter.header["Connection"] = "Keep-Alive"

    def check_status(self, resp_inter):
        if resp_inter.status != 200:
            raise CMQServerNetworkException(
                resp_inter.status, resp_inter.header, resp_inter.data)

        resp = json.loads(resp_inter.data)
        code, message, requestId = \
            resp['code'], resp['message'], resp.get('requestId', '')

        if code != 0:
            raise CMQServerException(
                message=message, request_id=requestId, code=code, data=resp)

    def request(self, action, params):
        # make request internal
        UserTimeout = '0'
        req_inter = RequestInternal(self.method, URISEC)
        self.build_req_inter(action, params, req_inter)

        # send request
        if params.get('UserpollingWaitSeconds') is not None:
            UserTimeout = params.get('UserpollingWaitSeconds')
        resp_inter = self.http.send_request(req_inter, UserTimeout)

        # handle result, make response
        # self.check_status(resp_inter)

        return resp_inter

# ==========================queue operation===========================

    def create_queue(self, params):
        resp_inter = self.request('CreateQueue', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "CreateQueue RequestId:%s QueueName:%s QueueId:%s" %
                (ret['requestId'], params['queueName'], ret['queueId']))

    def delete_queue(self, params):
        resp_inter = self.request('DeleteQueue', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug("DeleteQueue RequestId:%s QueueName:%s" %
                              (ret['requestId'], params['queueName']))

    def list_queue(self, params):
        resp_inter = self.request('ListQueue', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug("ListQueue RequestId:%s QueueTotalCount:%d" %
                              (ret['requestId'], ret['totalCount']))
        return ret

    def rewindQueue(self, params):
        resp_inter = self.request('RewindQueue', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug("RewindQueue RequestId:%s QueueName:%s" %
                              (ret['requestId'], params['queueName']))

    def set_queue_attributes(self, params):
        resp_inter = self.request('SetQueueAttributes', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug("SetQueueAttributes RequestId:%s QueueName:%s" %
                              (ret['requestId'], params['queueName']))

    def get_queue_attributes(self, params):
        resp_inter = self.request('GetQueueAttributes', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug("GetQueueAttributes RequestId:%s QueueName:%s" %
                              (ret['requestId'], params['queueName']))
        return ret

    def send_message(self, params):
        resp_inter = self.request('SendMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "SendMessage RequestId:%s QueueName:%s MsgId:%s" %
                (ret['requestId'], params['queueName'], ret['msgId']))
        return ret['msgId']

    def batch_send_message(self, params):
        resp_inter = self.request('BatchSendMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "BatchSendMessage RequestId:%s QueueName:%s MessageCount:%s \
                MessageInfo\n%s" % (
                    ret['requestId'],
                    params['queueName'],
                    len(ret['msgList']),
                    "\n".join(
                        ["MessageId:%s" % (msg['msgId'])
                         for msg in ret['msgList']]
                    )
                )
            )
        return ret['msgList']

    def receive_message(self, params):
        resp_inter = self.request('ReceiveMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug("ReceiveMessage RequestId:%s QueueName:%s \
                PollingWaitSeconds:%s MsgId:%s ReceiptHandle:%s \
                EnqueueTime:%s NextVisibleTime:%s \
                FirstDequeueTime:%s DequeueCount:%s" % (
                    ret['requestId'], params['queueName'],
                    params.get('pollingWaitSeconds', ''),
                    ret['msgId'], ret['receiptHandle'],
                    ret['enqueueTime'], ret['nextVisibleTime'],
                    ret['firstDequeueTime'], ret['dequeueCount']))
        return ret

    def batch_receive_message(self, params):
        resp_inter = self.request('BatchReceiveMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug("BatchReceiveMessage RequestId:%s \
                QueueName:%s PollingWaitSeconds:%s BatchSize:%s \
                MessageCount:%s MessageInfo\n%s" % (
                 ret['requestId'], params['queueName'],
                 params.get('pollingWaitSeconds', ''),
                 params['numOfMsg'],
                 len(ret['msgInfoList']),
                 "\n".join([
                    "MessageId:%s ReceiptHandle:%s \
                    EnqueueTime:%s NextVisibleTime:%s \
                    FirstDequeueTime:%s DequeueCount:%s" % (
                        msg['msgId'], msg['receiptHandle'],
                        msg['enqueueTime'], msg['nextVisibleTime'],
                        msg['firstDequeueTime'], msg['dequeueCount'])
                    for msg in ret['msgInfoList']])
                 ))
        return ret['msgInfoList']

    def delete_message(self, params):
        resp_inter = self.request('DeleteMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "DeleteMessage RequestId:%s QueueName:%s ReceiptHandle:%s" % (
                    ret['requestId'],
                    params['queueName'],
                    params['receiptHandle']
                )
            )

    def batch_delete_message(self, params):
        resp_inter = self.request('BatchDeleteMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "BatchDeleteMessage RequestId:%s QueueName:%s \
                ReceiptHandles\n%s" % (
                    ret['requestId'],
                    params['queueName'],
                    "\n".join([
                        str(params[key])
                        for key in params.keys()
                        if 'receiptHandle.' in key
                    ])
                )
            )

# ===================================topic operation=========================

    def create_topic(self, params):
        resp_inter = self.request('CreateTopic', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "CreateTopic RequestId:%s TopicName:%s TopicId:%s" %
                (ret['requestId'], params['topicName'], ret['topicId']))

    def delete_topic(self, params):
        resp_inter = self.request('DeleteTopic', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "DeleteTopic RequestId:%s TopicName:%s" %
                (ret['requestId'], params['topicName']))

    def list_topic(self, params):
        resp_inter = self.request('ListTopic', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "ListTopic RequestId:%s TopicTotalCount:%d" %
                (ret['requestId'], ret['totalCount']))
        return ret

    def set_topic_attributes(self, params):
        resp_inter = self.request('SetTopicAttributes', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "SetTopicAttributes RequestId:%s TopicName:%s" %
                (ret['requestId'], params['topicName']))

    def get_topic_attributes(self, params):
        resp_inter = self.request('GetTopicAttributes', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "GetTopicAttributes RequestId:%s TopicName:%s" %
                (ret['requestId'], params['topicName']))
        return ret

    def publish_message(self, params):
        resp_inter = self.request('PublishMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "PublishMessage RequestId:%s TopicName:%s MsgId:%s" %
                (ret['requestId'], params['topicName'], ret['msgId']))
        return ret['msgId']

    def batch_publish_message(self, params):
        resp_inter = self.request('BatchPublishMessage', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "BatchPublishMessage RequestId:%s \
                TopicName:%s \
                MessageCount:%s \
                MessageInfo\n%s" % (
                    ret['requestId'],
                    params['topicName'],
                    len(ret['msgList']),
                    "\n".join([
                       "MessageId:%s" % (msg['msgId'])
                       for msg in ret['msgList']
                    ])
                ))
        return ret['msgList']
# ==========================Subscription operation========================

    def create_subscription(self, params):
        resp_inter = self.request('Subscribe', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "Create subscription RequestId:%s \
                subscription Name:%s subscripton Id:%s" % (
                    ret['requestId'],
                    params['subscriptionName'],
                    ret['subscriptionId']))

    def delete_subscription(self, params):
        resp_inter = self.request('Unsubscribe', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "DeleteTopic RequestId:%s TopicName:%s" %
                (ret['requestId'], params['topicName']))

    def clear_filterTags(self, params):
        resp_inter = self.request('ClearSubscriptionFilterTags', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "ClearSubscriptionFilterTags RequestId:%s TopicName:%s" %
                (ret['requestId'], params['topicName']))

    def list_subscription(self, params):
        resp_inter = self.request('ListSubscriptionByTopic', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "ListTopic RequestId:%s TopicTotalCount:%d" % (
                    ret['requestId'], ret['totalCount']))
        return ret

    def set_subscription_attributes(self, params):
        resp_inter = self.request('SetSubscriptionAttributes', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "Set subscription Attributes RequestId:%s TopicName:%s" %
                (ret['requestId'], params['topicName']))

    def get_subscription_attributes(self, params):
        resp_inter = self.request('GetSubscriptionAttributes', params)
        self.check_status(resp_inter)

        ret = json.loads(resp_inter.data)
        if self.logger:
            self.logger.debug(
                "GetTopicAttributes RequestId:%s TopicName:%s" %
                (ret['requestId'], params['topicName']))
        return ret