eonpatapon / contrail-api-cli

Simple CLI program to browse Contrail API server

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Fix RecursionError with Python3.6

Lygoria opened this issue · comments

Hi,
With Python3.6, I got this error (contrail-api-cli 0.3.0):

File "/usr/lib/python3.6/ssl.py", line 465, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
    [Previous line repeated 308 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

After gevent update, I found this warning:
MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. It may also silently lead to incorrect behaviour on Python 3.7. Ple ase monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016. Modules that had direct imports (NOT patched): ['urllib3.util (/home/vagrant/env/lib/python3.6/site-packages/urllib3/util/__init__.py)', 'urllib3.util.ssl_ (/home/vagrant/env/lib/python3.6/site-p ackages/urllib3/util/ssl_.py)'].

Once those lines removed https://github.com/eonpatapon/contrail-api-cli/blob/master/contrail_api_cli/utils.py#L25-L26, my error was gone.

Could you integrate this fix ?

What is your gevent version ?

It was gevent 1.2 initially (as requested by setup.py) then I tried with 1.3 (and maybe 1.4)

Can you try with this patch ?

Same error:

Traceback (most recent call last):
  File "contrail_cleaner.py", line 161, in <module>
    cleaner = ContrailCleaner(**args)
  File "contrail_cleaner.py", line 74, in __init__
    Context().schema = DummySchema()
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/schema.py", line 214, in __init__
    DummyResourceSchema()
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/utils.py", line 117, in __call__
    cls.instance = super(Singleton, cls).__call__(*args, **kw)
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/schema.py", line 238, in __init__
    [c.type for c in RootCollection(fetch=True)]
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/resource.py", line 403, in __init__
    return super(RootCollection, self).__init__('', **kwargs)
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/resource.py", line 264, in __init__
    self.fetch(recursive=recursive)
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/resource.py", line 47, in wrapper
    return f(self, *args, **kwargs)
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/resource.py", line 374, in fetch
    data = self.session.get_json(self.href, **params)
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/client.py", line 22, in wrapper
    return f(*args, **kwargs)
  File "/home/vagrant/shared/tmp/contrail-api-cli/contrail_api_cli/client.py", line 130, in get_json
    return self.get(url, params=kwargs).json()
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/session.py", line 1123, in get
    return self.request(url, 'GET', **kwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/session.py", line 772, in request
    auth_headers = self.get_auth_headers(auth)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/session.py", line 1183, in get_auth_headers
    return auth.get_headers(self, **kwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/plugin.py", line 95, in get_headers
    token = self.get_token(session)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/identity/base.py", line 88, in get_token
    return self.get_access(session).auth_token
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/identity/base.py", line 134, in get_access
    self.auth_ref = self.get_auth_ref(session)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/identity/v3/base.py", line 184, in get_auth_ref
    authenticated=False, log=False, **rkwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/session.py", line 1131, in post
    return self.request(url, 'POST', **kwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/session.py", line 913, in request
    resp = send(**kwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/keystoneauth1/session.py", line 1004, in _send_request
    resp = self.session.request(method, url, **kwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/requests/sessions.py", line 530, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/requests/sessions.py", line 643, in send
    r = adapter.send(request, **kwargs)
  File "/home/vagrant/env/lib/python3.6/site-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/home/vagrant/env/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopen
    chunked=chunked,
  File "/home/vagrant/env/lib/python3.6/site-packages/urllib3/connectionpool.py", line 376, in _make_request
    self._validate_conn(conn)
  File "/home/vagrant/env/lib/python3.6/site-packages/urllib3/connectionpool.py", line 994, in _validate_conn
    conn.connect()
  File "/home/vagrant/env/lib/python3.6/site-packages/urllib3/connection.py", line 336, in connect
    cert_reqs=resolve_cert_reqs(self.cert_reqs),
  File "/home/vagrant/env/lib/python3.6/site-packages/urllib3/util/ssl_.py", line 273, in create_urllib3_context
    context.options |= options
  File "/usr/lib/python3.6/ssl.py", line 465, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/lib/python3.6/ssl.py", line 465, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/lib/python3.6/ssl.py", line 465, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 308 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object
from contrail_api_cli.client import SessionLoader
from contrail_api_cli.context import Context
from contrail_api_cli.resource import Collection
from contrail_api_cli.schema import DummySchema


class ContrailCleaner(object):

    def __init__(self, [...]):

        Context.session = SessionLoader().make([...])
        Context().schema = DummySchema()

Following https://github.com/eonpatapon/contrail-api-cli/blob/master/doc/usage.rst#basic-auth-on-localhost8095

Oh, you're right, urllib3 is imported so we can disable warnings about InsecureRequests:

import urllib3

from contrail_api_cli.client import SessionLoader
from contrail_api_cli.context import Context
from contrail_api_cli.resource import Collection
from contrail_api_cli.schema import DummySchema
from contrail_api_cli.exceptions import ChildrenExists, BackRefsExists, ResourceNotFound
from keystoneauth1.exceptions.http import Conflict

urllib3.disable_warnings()


class ContrailCleaner(object):

When removing

import urllib3
urllib3.disable_warnings()

it works (with a lot of warnings tho)

It works fine with your fix 3b4ceec and import urllib3 after contrail_api_cli imports

Thanks !