<div dir="ltr">Hi,<br><br>I have a REST API that is using the ipalib and written with Falcon.<br>Below is the code or you can check it online here: <a href="http://paste.ubuntu.com/15966308/">http://paste.ubuntu.com/15966308/</a><br><br>from __future__ import print_function<br>from bson import json_util<br>import json<br>import falcon<br><br>from ipalib import api as ipaapi<br>from api.utils.utils import parse_json, check_connection<br>from api import settings<br><br>class Calls(object):<br><br>    #@falcon.before(check_connection)<br>    def on_post(self, req, resp):<br>            <br>        result_json = parse_json(req)<br>        command_name = result_json["command_name"]<br>        params = result_json["params"]<br><br>        if not hasattr(ipaapi.env, "conf"):<br>            #TODO: add kinit oguz for exceptional case<br>            ipaapi.bootstrap_with_global_options(context='satcloud_api')<br>            ipaapi.finalize()<br><br>            if ipaapi.env.in_server:<br>                ipaapi.Backend.ldap2.connect()<br>            else:<br>                ipaapi.Backend.rpcclient.connect()<br><br>        #import ipdb<br>        #ipdb.set_trace()<br><br>        command=ipaapi.Command<br>        command_result=getattr(command,command_name)<br>            <br>        #resp.set_cookie('api_status_cookie', 'True')<br>        if not params:<br>            resp.body = json.dumps(command_result())<br>            resp.status = falcon.HTTP_200<br>        else:<br>            if type(params) == dict:<br>                arguments = []<br>                kwargs = dict()<br>                for key, value in params.iteritems():<br>                    if "arg" in key:<br>                        arguments.append(value)<br>                    else:<br>                        kwargs[key]=value<br>                try:<br>                    #for datetime serialization problems better to use bson <br>                    dump = command_result(*arguments, **kwargs)<br>                    resp.body = json.dumps(dump, default=json_util.default)<br>                    #resp.body = json.dumps(command_result(*arguments, **kwargs))<br>                    resp.status = falcon.HTTP_200<br>                except UnicodeDecodeError:<br>                    resp.body = json.dumps(dump, default=json_util.default, encoding='latin1')<br>                    resp.status = falcon.HTTP_200<br>                except Exception as e:<br>                    resp.status = falcon.HTTP_BAD_REQUEST<br>                    resp.body = json.dumps({"description": e.message, "title": "Dublicate entry"})<br>                            #raise falcon.HTTPBadRequest(title="Dublicate entry",<br>                                        #            description=e,<br>                                        #            href=settings.__docs__)<br>            else:<br>                dump = command_result(params)<br>                resp.body = json.dumps(dump, default=json_util.default)<br>                #resp.body = json.dumps(command_result(params))<br>                resp.status = falcon.HTTP_200<br><br><br>Basically i am making concurrent calls to this rest api and i am getting <br><br>Network error: <a href="http://paste.ubuntu.com/15966347/">http://paste.ubuntu.com/15966347/</a><br><br>ipa: INFO: Forwarding 'user_find' to json server '<a href="https://ipa.foo.com/ipa/json">https://ipa.foo.com/ipa/json</a>'<br>ipa: INFO: Forwarding 'netgroup_find' to json server '<a href="https://ipa.foo.com/ipa/json">https://ipa.foo.com/ipa/json</a>'<br>[pid: 5450|app: 0|req: 9/14] 10.102.235.77 () {34 vars in 463 bytes} [Thu Apr 21 17:43:22 2016] POST /v1/ipa/calls => generated 2324 bytes in 227 msecs (HTTP/1.1 200) 8 headers in 459 bytes (1 switches on core 0)<br>Traceback (most recent call last):<br>  File "falcon/api.py", line 213, in falcon.api.API.__call__ (falcon/api.c:2521)<br>  File "falcon/api.py", line 182, in falcon.api.API.__call__ (falcon/api.c:2118)<br>  File "./api/resources/ipa/calls.py", line 38, in on_post<br>    resp.body = json.dumps(command_result())<br>  File "/usr/lib/python2.7/site-packages/ipalib/frontend.py", line 443, in __call__<br>    ret = self.run(*args, **options)<br>  File "/usr/lib/python2.7/site-packages/ipalib/frontend.py", line 761, in run<br>    return self.forward(*args, **options)<br>  File "/usr/lib/python2.7/site-packages/ipalib/frontend.py", line 782, in forward<br>    return self.Backend.rpcclient.forward(<a href="http://self.name">self.name</a>, *args, **kw)<br>  File "/usr/lib/python2.7/site-packages/ipalib/rpc.py", line 935, in forward<br>    raise NetworkError(uri=server, error=e.errmsg)<br>ipalib.errors.NetworkError: cannot connect to '<a href="https://ipa.foo.com/ipa/json">https://ipa.foo.com/ipa/json</a>': Internal Server Error<br>[pid: 5451|app: 0|req: 3/15] 10.102.235.77 () {34 vars in 463 bytes} [Thu Apr 21 17:43:22 2016] POST /v1/ipa/calls => generated 0 bytes in 1421 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)<br><br><br>This is how a concurrent request is being sent:<br>#!/usr/bin/env python<br><br>from multiprocessing import Process, Pool<br>import time<br>import urllib2<br><br>def millis():<br>  return int(round(time.time() * 1000))<br><br>def http_get(url):<br>  start_time = millis()<br>  request = urllib2.Request(url, headers={"Content-Type": "application/json", "Origin": "<a href="http://ipa.foo.com">http://ipa.foo.com</a>", "Authorization": "{'token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcnYiOiJpcGEuc2F0Y2xvdWQuY29tLnRyIiwic3ViIjoiMGU1ZGZkNDc3N2I2NmNhOTU3ZTc4ZmJhZjMxNjYxMmEifQ.cr8cNy7zgQkY-q7UUyTCNPCjGlmz-LCCzUYSUV9P694'}"})<br>  result = {"url": url, "data": urllib2.urlopen(request, timeout=10).read()[:100]}<br>  #result = {"url": url, "data": urllib2.urlopen(request, timeout=5).read()}<br>  print url + " took " + str(millis() - start_time) + " ms"<br>  return result<br>  <br><br>urls = ['<a href="http://api.foo.com:8888/v1/users">http://api.foo.com:8888/v1/users</a>', '<a href="http://api.foo.com:8888/v1/organizations">http://api.foo.com:8888/v1/organizations</a>']<br><br>pool = Pool(processes=2)<br><br>start_time = millis()<br>results = pool.map(http_get, urls)<br><br>print "\nTotal took " + str(millis() - start_time) + " ms\n"<br><br>for result in results:<br>  print result<br><br>I am confused about the reason of the error. Any idea?<br><br><br>-- <br>Oğuz Yarımtepe<br><a href="http://about.me/oguzy">http://about.me/oguzy</a><br><br></div>