示例#1
0
def rest_request(host,
                 port,
                 user,
                 pswd,
                 ssl,
                 path,
                 method='GET',
                 body='',
                 reason='',
                 headers=None):
    if reason:
        reason = "; reason: %s" % (reason)
    logging.debug("rest_request: %s@%s:%s%s%s" %
                  (tag_user_data(user), host, port, path, reason))
    if ssl:
        if port not in [
                couchbaseConstants.SSL_REST_PORT,
                couchbaseConstants.SSL_QUERY_PORT
        ]:
            return ("error: invalid port %s used when ssl option is specified"
                    ) % port, None, None
        conn = httplib.HTTPSConnection(host, port)
    else:
        conn = httplib.HTTPConnection(host, port)
    try:
        header = rest_headers(user, pswd, headers)
        conn.request(method, path, body, header)
        resp = conn.getresponse()
    except Exception, e:
        return ("error: could not access REST API: %s:%s%s" +
                "; please check source URL, server status, username (-u) and password (-p)" +
                "; exception: %s%s") % \
                (host, port, path, e, reason), None, None
示例#2
0
def rest_request(host,
                 port,
                 user,
                 pswd,
                 use_ssl,
                 path,
                 method='GET',
                 body='',
                 reason='',
                 headers=None,
                 verify=True,
                 ca_cert=None):
    if reason:
        reason = "; reason: %s" % (reason)
    logging.debug("rest_request: %s@%s:%s%s%s" %
                  (tag_user_data(user), host, port, path, reason))
    if use_ssl:
        if port not in [
                couchbaseConstants.SSL_REST_PORT,
                couchbaseConstants.SSL_QUERY_PORT
        ]:
            return ("error: invalid port %s used when ssl option is specified"
                    ) % port, None, None
        ctx = ssl.create_default_context(cafile=ca_cert)
        if not verify:
            ctx.check_hostname = False
            ctx.verify_mode = ssl.CERT_NONE

        conn = http.client.HTTPSConnection(host, port, context=ctx)

    else:
        conn = http.client.HTTPConnection(host, port)
    try:
        header = rest_headers(user, pswd, headers)
        conn.request(method, path, body, header)
        resp = conn.getresponse()
    except Exception as e:
        return ("error: could not access REST API: %s:%s%s" +
                "; please check source URL, server status, username (-u) and password (-p)" +
                "; exception: %s%s") % \
                (host, port, path, e, reason), None, None

    if resp.status in [200, 201, 202, 204, 302]:
        return None, conn, resp.read()

    conn.close()
    if resp.status == 401:
        return ("error: unable to access REST API: %s:%s%s" +
                "; please check source URL, server status, username (-u) and password (-p)%s") % \
                (host, port, path, reason), None, None

    return ("error: unable to access REST API: %s:%s%s" +
            "; please check source URL, server status, username (-u) and password (-p)" +
            "; response: %s%s") % \
            (host, port, path, resp.status, reason), None, None
示例#3
0
    def skip(self, key, vbucket_id):
        if (self.only_key_re and not re.search(self.only_key_re, key)):
            logging.warn("skipping msg with key: " + tag_user_data(key))
            return True

        if (self.only_vbucket_id is not None and
            self.only_vbucket_id != vbucket_id):
            logging.warn("skipping msg of vbucket_id: " + str(vbucket_id))
            return True

        return False
示例#4
0
    def skip(self, key, vbucket_id):
        if (self.only_key_re and not re.search(self.only_key_re, key)):
            logging.warn("skipping msg with key: " + tag_user_data(key))
            return True

        if (self.only_vbucket_id is not None and
            self.only_vbucket_id != vbucket_id):
            logging.warn("skipping msg of vbucket_id: " + str(vbucket_id))
            return True

        return False
示例#5
0
def rest_request(host, port, user, pswd, ssl, path, method='GET', body='', reason='', headers=None):
    if reason:
        reason = "; reason: %s" % (reason)
    logging.debug("rest_request: %s@%s:%s%s%s" % (tag_user_data(user), host, port, path, reason))
    if ssl:
        if port not in [couchbaseConstants.SSL_REST_PORT, couchbaseConstants.SSL_QUERY_PORT]:
            return ("error: invalid port %s used when ssl option is specified") % port, None, None
        conn = httplib.HTTPSConnection(host, port)
    else:
        conn = httplib.HTTPConnection(host, port)
    try:
        header = rest_headers(user, pswd, headers)
        conn.request(method, path, body, header)
        resp = conn.getresponse()
    except Exception, e:
        return ("error: could not access REST API: %s:%s%s" +
                "; please check source URL, server status, username (-u) and password (-p)" +
                "; exception: %s%s") % \
                (host, port, path, e, reason), None, None
示例#6
0
    def recv_msgs(self, conn, msgs, vbucket_id=None, verify_opaque=True):
        refresh = False
        retry = False

        for i, msg in enumerate(msgs):
            cmd, vbucket_id_msg, key, flg, exp, cas, meta, val = msg[:8]
            if vbucket_id is not None:
                vbucket_id_msg = vbucket_id

            if self.skip(key, vbucket_id_msg):
                continue

            try:
                r_cmd, r_status, r_ext, r_key, r_val, r_cas, r_opaque = \
                    self.read_conn(conn)
                if verify_opaque and i != r_opaque:
                    return "error: opaque mismatch: %s %s" % (i, r_opaque), None, None

                if r_status == couchbaseConstants.ERR_SUCCESS:
                    continue
                elif r_status == couchbaseConstants.ERR_KEY_EEXISTS:
                    #logging.warn("item exists: %s, key: %s" %
                    #             (self.spec, tag_user_data(key)))
                    continue
                elif r_status == couchbaseConstants.ERR_KEY_ENOENT:
                    if (cmd != couchbaseConstants.CMD_TAP_DELETE and
                        cmd != couchbaseConstants.CMD_GET):
                        logging.warn("item not found: %s, key: %s" %
                                     (self.spec, tag_user_data(key)))
                    continue
                elif (r_status == couchbaseConstants.ERR_ETMPFAIL or
                      r_status == couchbaseConstants.ERR_EBUSY or
                      r_status == couchbaseConstants.ERR_ENOMEM):
                    retry = True # Retry the whole batch again next time.
                    continue     # But, finish recv'ing current batch.
                elif r_status == couchbaseConstants.ERR_NOT_MY_VBUCKET:
                    msg = ("received NOT_MY_VBUCKET;"
                           " perhaps the cluster is/was rebalancing;"
                           " vbucket_id: %s, key: %s, spec: %s, host:port: %s:%s"
                           % (vbucket_id_msg, tag_user_data(key), self.spec,
                              conn.host, conn.port))
                    if self.opts.extra.get("nmv_retry", 1):
                        logging.warn("warning: " + msg)
                        refresh = True
                        retry = True
                        self.cur["tot_sink_not_my_vbucket"] = \
                            self.cur.get("tot_sink_not_my_vbucket", 0) + 1
                    else:
                        return "error: " + msg, None, None
                elif r_status == couchbaseConstants.ERR_UNKNOWN_COMMAND:
                    if self.op_map == OP_MAP:
                        if not retry:
                            return "error: unknown command: %s" % (r_cmd), None, None
                    else:
                        if not retry:
                            logging.warn("destination does not take XXX-WITH-META"
                                         " commands; will use META-less commands")
                        self.op_map = OP_MAP
                        retry = True
                elif r_status == couchbaseConstants.ERR_ACCESS:
                    return json.loads(r_val)["error"]["context"], None, None
                else:
                    return "error: MCSink MC error: " + str(r_status), None, None

            except Exception, e:
                logging.error("MCSink exception: %s", e)
                return "error: MCSink exception: " + str(e), None, None