import functools
import os

from keystone.common import config
from keystone.common import logging

CONF = config.CONF
LOG = logging.getLogger(__name__)


__all__ = ['Server', 'httplib', 'subprocess']

_configured = False

Server = None
httplib = None
subprocess = None


def configure_once(name):
    """Ensure that environment configuration is only run once.

    If environment is reconfigured in the same way then it is ignored.
    It is an error to attempt to reconfigure environment in a different way.
    """
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            global _configured
            if _configured:
                if _configured == name:
                    return
                else:
                    raise SystemError("Environment has already been "
                                      "configured as %s" % _configured)

            LOG.info(_("Environment configured as: %s"), name)
            _configured = name
            return func(*args, **kwargs)

        return wrapper
    return decorator


@configure_once('eventlet')
def use_eventlet(monkeypatch_thread=None):
    global httplib, subprocess, Server

    # This must be set before the initial import of eventlet because if
    # dnspython is present in your environment then eventlet monkeypatches
    # socket.getaddrinfo() with an implementation which doesn't work for IPv6.
    os.environ['EVENTLET_NO_GREENDNS'] = 'yes'

    import eventlet
    from eventlet.green import httplib as _httplib
    from eventlet.green import subprocess as _subprocess
    from keystone.common.environment import eventlet_server

    if monkeypatch_thread is None:
        monkeypatch_thread = not os.getenv('STANDARD_THREADS')

    eventlet.patcher.monkey_patch(all=False, socket=True, time=True,
                                  thread=monkeypatch_thread)

    Server = eventlet_server.Server
    httplib = _httplib
    subprocess = _subprocess


@configure_once('stdlib')
def use_stdlib():
    global httplib, subprocess

    import httplib as _httplib
    import subprocess as _subprocess

    httplib = _httplib
    subprocess = _subprocess

import functools
import os

from keystone.common import config
from keystone.common import logging

CONF = config.CONF
LOG = logging.getLogger(__name__)


__all__ = ['Server', 'httplib', 'subprocess']

_configured = False

Server = None
httplib = None
subprocess = None


def configure_once(name):
    """Ensure that environment configuration is only run once.

    If environment is reconfigured in the same way then it is ignored.
    It is an error to attempt to reconfigure environment in a different way.
    """
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            global _configured
            if _configured:
                if _configured == name:
                    return
                else:
                    raise SystemError("Environment has already been "
                                      "configured as %s" % _configured)

            LOG.info(_("Environment configured as: %s"), name)
            _configured = name
            return func(*args, **kwargs)

        return wrapper
    return decorator


@configure_once('eventlet')
def use_eventlet(monkeypatch_thread=None):
    global httplib, subprocess, Server

    # This must be set before the initial import of eventlet because if
    # dnspython is present in your environment then eventlet monkeypatches
    # socket.getaddrinfo() with an implementation which doesn't work for IPv6.
    os.environ['EVENTLET_NO_GREENDNS'] = 'yes'

    import eventlet
    from eventlet.green import httplib as _httplib
    from eventlet.green import subprocess as _subprocess
    from keystone.common.environment import eventlet_server

    if monkeypatch_thread is None:
        monkeypatch_thread = not os.getenv('STANDARD_THREADS')

    # Raise the default from 8192 to accommodate large tokens
    eventlet.wsgi.MAX_HEADER_LINE = 16384

    eventlet.patcher.monkey_patch(all=False, socket=True, time=True,
                                  thread=monkeypatch_thread)

    Server = eventlet_server.Server
    httplib = _httplib
    subprocess = _subprocess


@configure_once('stdlib')
def use_stdlib():
    global httplib, subprocess

    import httplib as _httplib
    import subprocess as _subprocess

    httplib = _httplib
    subprocess = _subprocess

Raise max header size to accommodate large tokens.