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