Esempio n. 1
0
 def __init__(self, threads=1000, workers=0):
     os.umask(0o27)  # ensure files are created with the correct privileges
     self._logger = logging.getLogger("eventlet.wsgi.server")
     self._wsgi_logger = loggers.WritableLogger(self._logger)
     self.threads = threads
     self.children = set()
     self.stale_children = set()
     self.running = True
     self.pgid = os.getpid()
     self.workers = workers
     try:
         # NOTE(flaper87): Make sure this process
         # runs in its own process group.
         os.setpgid(self.pgid, self.pgid)
     except OSError:
         # NOTE(flaper87): When running searchlight-control,
         # (searchlight's functional tests, for example)
         # setpgid fails with EPERM as searchlight-control
         # creates a fresh session, of which the newly
         # launched service becomes the leader (session
         # leaders may not change process groups)
         #
         # Running searchlight-api is safe and
         # shouldn't raise any error here.
         self.pgid = 0
Esempio n. 2
0
 def _run(self, application, socket):
     """Start a WSGI server in a new green thread."""
     eventlet.wsgi.server(socket, application,
                          max_size=self.num_threads,
                          log=loggers.WritableLogger(LOG),
                          keepalive=CONF.wsgi_keep_alive,
                          socket_timeout=self.client_socket_timeout)
Esempio n. 3
0
 def _run(self, application, socket):
     """Start a WSGI server in a new green thread."""
     logger = logging.getLogger('eventlet.wsgi')
     eventlet.wsgi.server(socket,
                          application,
                          custom_pool=self.tg.pool,
                          log=loggers.WritableLogger(logger))
Esempio n. 4
0
 def run(self, ip_address, port=RUG_META_PORT):
     app = MetadataProxyHandler()
     for i in xrange(5):
         LOG.info(_LI('Starting the metadata proxy on %s/%s'), ip_address,
                  port)
         try:
             sock = eventlet.listen((ip_address, port),
                                    family=socket.AF_INET6,
                                    backlog=128)
         except socket.error as err:
             if err.errno != 99:
                 raise
             LOG.warning(_LW('Could not create metadata proxy socket: %s'),
                         err)
             LOG.warning(_LW('Sleeping %s before trying again'), i + 1)
             eventlet.sleep(i + 1)
         else:
             break
     else:
         raise RuntimeError(
             _('Could not establish metadata proxy socket on %s/%s') %
             (ip_address, port))
     eventlet.wsgi.server(sock,
                          app,
                          custom_pool=self.pool,
                          log=loggers.WritableLogger(LOG))
Esempio n. 5
0
def start_server(app):
    sock = eventlet.listen((cfg.CONF.host, cfg.CONF.port), backlog=500)
    if sslutils.is_enabled():
        LOG.info(_LI("Using HTTPS for port %s"), cfg.CONF.port)
        sock = sslutils.wrap(sock)

    wsgi.server(sock, app, log=loggers.WritableLogger(LOG), debug=False)
Esempio n. 6
0
 def run(self, ip_address, port=cfg.CONF.rug_api_port):
     app = RugAPI()
     for i in xrange(5):
         LOG.info(
             _LI('Starting the rug-api on %s/%s'),
             ip_address,
             port,
         )
         try:
             sock = eventlet.listen((ip_address, port),
                                    family=socket.AF_INET6,
                                    backlog=128)
         except socket.error as err:
             if err.errno != 99:  # EADDRNOTAVAIL
                 raise
             LOG.warning(_LW('Could not create rug-api socket: %s'), err)
             LOG.warning(_LW('Sleeping %s before trying again'), i + 1)
             eventlet.sleep(i + 1)
         else:
             break
     else:
         raise RuntimeError(
             _('Could not establish rug-api socket on %s/%s') %
             (ip_address, port))
     eventlet.wsgi.server(sock,
                          app,
                          custom_pool=self.pool,
                          log=loggers.WritableLogger(LOG))
Esempio n. 7
0
 def __init__(self, threads=1000, initialize_glance_store=False):
     os.umask(0o27)  # ensure files are created with the correct privileges
     self._logger = logging.getLogger("eventlet.wsgi.server")
     self._wsgi_logger = loggers.WritableLogger(self._logger)
     self.threads = threads
     self.children = set()
     self.stale_children = set()
     self.running = True
     # NOTE(abhishek): Allows us to only re-initialize glance_store when
     # the API's configuration reloads.
     self.initialize_glance_store = initialize_glance_store
     self.pgid = os.getpid()
     try:
         # NOTE(flaper87): Make sure this process
         # runs in its own process group.
         os.setpgid(self.pgid, self.pgid)
     except OSError:
         # NOTE(flaper87): When running glance-control,
         # (glance's functional tests, for example)
         # setpgid fails with EPERM as glance-control
         # creates a fresh session, of which the newly
         # launched service becomes the leader (session
         # leaders may not change process groups)
         #
         # Running glance-(api|registry) is safe and
         # shouldn't raise any error here.
         self.pgid = 0
Esempio n. 8
0
 def run_server(self):
     self.pool = self.get_pool()
     eventlet.wsgi.server(self.sock,
                          self.app,
                          log=loggers.WritableLogger(LOG),
                          custom_pool=self.pool,
                          debug=False)
     self.pool.waitall()
Esempio n. 9
0
 def _run(self, application, socket):
     """Start a WSGI service in a new green thread."""
     logger = logging.getLogger('eventlet.wsgi.server')
     eventlet.wsgi.server(socket,
                          application,
                          max_size=self.num_threads,
                          protocol=UnixDomainHttpProtocol,
                          log=loggers.WritableLogger(logger))
Esempio n. 10
0
 def _single_run(self, application, sock):
     """Start a WSGI server in a new green thread."""
     LOG.info(_LI("Starting single process server"))
     eventlet.wsgi.server(sock,
                          application,
                          custom_pool=self.pool,
                          log=loggers.WritableLogger(LOG),
                          debug=False)
Esempio n. 11
0
    def __init__(self, name, app, host='0.0.0.0', port=0, pool_size=None,
                       protocol=eventlet.wsgi.HttpProtocol, backlog=128,
                       use_ssl=False, max_url_len=None):
        """Initialize, but do not start, a WSGI server.

        :param name: Pretty name for logging.
        :param app: The WSGI application to serve.
        :param host: IP address to serve the application.
        :param port: Port number to server the application.
        :param pool_size: Maximum number of eventlets to spawn concurrently.
        :param backlog: Maximum number of queued connections.
        :param max_url_len: Maximum length of permitted URLs.
        :returns: None
        :raises: nova.exception.InvalidInput
        """
        # Allow operators to customize http requests max header line size.
        eventlet.wsgi.MAX_HEADER_LINE = CONF.max_header_line
        self.name = name
        self.app = app
        self._server = None
        self._protocol = protocol
        self.pool_size = pool_size or self.default_pool_size
        self._pool = eventlet.GreenPool(self.pool_size)
        self._logger = logging.getLogger("alarm.%s.wsgi.server" % self.name)
        self._wsgi_logger = loggers.WritableLogger(self._logger)
        self._use_ssl = use_ssl
        self._max_url_len = max_url_len
        self.client_socket_timeout = CONF.client_socket_timeout or None

        if backlog < 1:
            raise exception.InvalidInput(
                    reason='The backlog must be more than 1')

        bind_addr = (host, port)
        # TODO(dims): eventlet's green dns/socket module does not actually
        # support IPv6 in getaddrinfo(). We need to get around this in the
        # future or monitor upstream for a fix
        try:
            info = socket.getaddrinfo(bind_addr[0],
                                      bind_addr[1],
                                      socket.AF_UNSPEC,
                                      socket.SOCK_STREAM)[0]
            family = info[0]
            bind_addr = info[-1]
        except Exception:
            family = socket.AF_INET

        try:
            self._socket = eventlet.listen(bind_addr, family, backlog=backlog)
        except EnvironmentError:
            LOG.error(_LE("Could not bind to %(host)s:%(port)s"),
                      {'host': host, 'port': port})
            raise

        (self.host, self.port) = self._socket.getsockname()[0:2]
        LOG.info(_LI("%(name)s listening on %(host)s:%(port)s"),
                 {'name': self.name, 'host': self.host, 'port': self.port})
Esempio n. 12
0
 def run_server(self):
     """Run a WSGI server."""
     self.pool = eventlet.GreenPool(size=self.threads)
     wsgi.server(self.sock,
                 self.application,
                 custom_pool=self.pool,
                 log=loggers.WritableLogger(LOG),
                 debug=False)
     self.pool.waitall()
Esempio n. 13
0
    def _wsgi_handle(self, application, socket):
        logger = logging.getLogger('eventlet.wsgi')
        # Adjust wsgi MAX_HEADER_LINE to accept large tokens.
        eventlet.wsgi.MAX_HEADER_LINE = self._service_config.max_header_line

        eventlet.wsgi.server(socket,
                             application,
                             custom_pool=self.tg.pool,
                             log=loggers.WritableLogger(logger))
Esempio n. 14
0
 def __init__(self, threads=1000):
     os.umask(0o27)  # ensure files are created with the correct privileges
     self._logger = logging.getLogger("eventlet.wsgi.server")
     self._wsgi_logger = loggers.WritableLogger(self._logger)
     self.threads = threads
     self.children = set()
     self.timers = []
     self.stale_children = set()
     self.running = True
     self.pgid = os.getpid()
     try:
         # NOTE(flaper87): Make sure this process
         # runs in its own process group.
         os.setpgid(self.pgid, self.pgid)
     except OSError:
         self.pgid = 0
Esempio n. 15
0
    def start(self, application, conf, default_port):
        """
        Run a WSGI server with the given application.

        :param application: The application to run in the WSGI server
        :param conf: a cfg.ConfigOpts object
        :param default_port: Port to bind to if none is specified in conf
        """
        def kill_children(*args):
            """Kills the entire process group."""
            LOG.error(_LE('SIGTERM received'))
            signal.signal(signal.SIGTERM, signal.SIG_IGN)
            self.running = False
            os.killpg(0, signal.SIGTERM)

        def hup(*args):
            """
            Shuts down the server(s), but allows running requests to complete
            """
            LOG.error(_LE('SIGHUP received'))
            signal.signal(signal.SIGHUP, signal.SIG_IGN)
            os.killpg(0, signal.SIGHUP)
            signal.signal(signal.SIGHUP, hup)

        eventlet.wsgi.MAX_HEADER_LINE = conf.max_header_line
        self.application = application
        self.sock = get_socket(conf, default_port)

        os.umask(0o27)  # ensure files are created with the correct privileges
        self._logger = logging.getLogger("eventlet.wsgi.server")
        self._wsgi_logger = loggers.WritableLogger(self._logger)

        if conf.workers == 0:
            # Useful for profiling, test, debug etc.
            self.pool = eventlet.GreenPool(size=self.threads)
            self.pool.spawn_n(self._single_run, application, self.sock)
            return

        LOG.info(_LI("Starting %d workers") % conf.workers)
        signal.signal(signal.SIGTERM, kill_children)
        signal.signal(signal.SIGHUP, hup)
        while len(self.children) < conf.workers:
            self.run_child()
Esempio n. 16
0
def setup_app(config):
    """App factory."""
    # By default we expect path to oslo config file in environment variable
    # REFSTACK_OSLO_CONFIG (option for testing and development)
    # If it is empty we look up those config files
    # in the following directories:
    #   ~/.${project}/
    #   ~/
    #   /etc/${project}/
    #   /etc/

    default_config_files = ((os.getenv('REFSTACK_OSLO_CONFIG'), )
                            if os.getenv('REFSTACK_OSLO_CONFIG') else
                            cfg.find_config_files('refstack'))
    CONF('', project='refstack', default_config_files=default_config_files)

    log.setup(CONF, 'refstack')
    CONF.log_opt_values(LOG, logging.DEBUG)

    template_path = CONF.api.template_path % {'project_root': PROJECT_ROOT}
    static_root = CONF.api.static_root % {'project_root': PROJECT_ROOT}

    app_conf = dict(config.app)
    app = pecan.make_app(
        app_conf.pop('root'),
        debug=CONF.api.app_dev_mode,
        static_root=static_root,
        template_path=template_path,
        hooks=[
            JSONErrorHook(),
            CORSHook(),
            pecan.hooks.RequestViewerHook(
                {'items': ['status', 'method', 'controller', 'path', 'body']},
                headers=False,
                writer=loggers.WritableLogger(LOG, logging.DEBUG))
        ])

    return app
Esempio n. 17
0
    def __init__(self, name, app, host=None, port=None, pool_size=None,
                 protocol=eventlet.wsgi.HttpProtocol):
        """Initialize, but do not start, a WSGI server.

        :param name: Pretty name for logging.
        :param app: The WSGI application to serve.
        :param host: IP address to serve the application.
        :param port: Port number to server the application.
        :param pool_size: Maximum number of eventlets to spawn concurrently.
        :returns: None

        """
        eventlet.wsgi.MAX_HEADER_LINE = CONF.max_header_line
        self.name = name
        self.app = app
        self._host = host or "0.0.0.0"
        self._port = port or 0
        self._server = None
        self._socket = None
        self._protocol = protocol
        self._pool = eventlet.GreenPool(pool_size or self.default_pool_size)
        self._logger = log.getLogger("eventlet.wsgi.server")
        self._wsgi_logger = loggers.WritableLogger(self._logger)
Esempio n. 18
0
 def _wsgi_handle(self, application, socket):
     logger = logging.getLogger('eventlet.wsgi')
     eventlet.wsgi.server(socket,
                          application,
                          custom_pool=self.tg.pool,
                          log=loggers.WritableLogger(logger))