<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <br>
    <br>
    <div class="moz-cite-prefix">On 21.04.2016 18:46, Oğuz Yarımtepe
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAKtWOTR8faENCVoPta0c1o0FhFdowC3MctCH=tZF0UrWTeRyWw@mail.gmail.com"
      type="cite">
      <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
          moz-do-not-send="true"
          href="http://paste.ubuntu.com/15966308/"><a class="moz-txt-link-freetext" href="http://paste.ubuntu.com/15966308/">http://paste.ubuntu.com/15966308/</a></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 moz-do-not-send="true"
          href="http://paste.ubuntu.com/15966347/">http://paste.ubuntu.com/15966347/</a><br>
        <br>
        ipa: INFO: Forwarding 'user_find' to json server '<a
          moz-do-not-send="true" href="https://ipa.foo.com/ipa/json"><a class="moz-txt-link-freetext" href="https://ipa.foo.com/ipa/json">https://ipa.foo.com/ipa/json</a></a>'<br>
        ipa: INFO: Forwarding 'netgroup_find' to json server '<a
          moz-do-not-send="true" href="https://ipa.foo.com/ipa/json"><a class="moz-txt-link-freetext" href="https://ipa.foo.com/ipa/json">https://ipa.foo.com/ipa/json</a></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
          moz-do-not-send="true" 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
          moz-do-not-send="true" href="https://ipa.foo.com/ipa/json"><a class="moz-txt-link-freetext" href="https://ipa.foo.com/ipa/json">https://ipa.foo.com/ipa/json</a></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 moz-do-not-send="true"
          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 moz-do-not-send="true"
          href="http://api.foo.com:8888/v1/users">http://api.foo.com:8888/v1/users</a>',
        '<a moz-do-not-send="true"
          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 moz-do-not-send="true" href="http://about.me/oguzy">http://about.me/oguzy</a><br>
        <br>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
    </blockquote>
    <br>
    Hello, could you check /var/logs/httpd/error_log if there is any
    info about Internal server error?<br>
    <br>
    It looks like there is no session cookie set (but not sure). IMO
    because the parallel processing you may need to use local instances
    of API instead the global one for each thread/process.<br>
    <br>
    From top of my head:<br>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <pre style="background-color:#ffffff;color:#000000;font-family:'DejaVu Sans Mono';font-size:9.0pt;"><span style="color:#94558d;"></span>api = create_api(<span style="color:#660099;">mode</span>=<span style="color:#000080;">None</span>)
api.bootstrap(<span style="color:#660099;"><optionshere></span><span style="color:#000080;"></span><span style="color:#660099;"></span><span style="color:#008000;font-weight:bold;"></span>)
api.finalize()</pre>
    <br>
    But I'm not sure what is the exact problem, you need try :)<br>
    <br>
    Martin<br>
    <br>
    <br>
  </body>
</html>