Beispiel #1
0
    def start_server(self, config=None, name='default'):
        '''Run the Bottle server as a thread'''
        from ambry.client.siesta import API
        import ambry.server.main
        from threading import Thread
        import time
        from functools import partial
        from ambry.client.rest import RemoteLibrary

        if not config:
            config = self.server_library_config(name)

        self.server_url = "http://{}".format(config['host'])

        global_logger.info("Checking server at: {}".format(self.server_url))

        a = RemoteLibrary(self.server_url)

        #
        # Test to see of the server is already running.
        #

        try:
            # An echo request to see if the server is running.
            r = a.get_is_debug()

            if r.object:
                global_logger.info('Already running a debug server')
            else:
                global_logger.info('Already running a non-debug server')

            # We already have a server, so carry on
            return config
        except:
            # We'll get an exception refused eception if there is not server
            global_logger.info('No server, starting a local debug server')

        server = Thread(target=partial(ambry.server.main.test_run, config))
        server.setDaemon(True)
        server.start()

        #ambry.server.bottle.debug()

        # Wait for the server to start
        for i in range(1, 10):  #@UnusedVariable
            try:
                # An echo request to see if the server is running.
                r = a.get_test_echo('start_server')
                break
            except:
                global_logger.info('Server not started yet, waiting')
                time.sleep(1)

        r = a.get_test_echo('start_server')

        return config
Beispiel #2
0
    def stop_server(self):
        '''Shutdown the server process by calling the close() API, then waiting for it
        to stop serving requests '''

        import socket
        import time
        import ambry.client.exceptions as exc
        from requests.exceptions import ConnectionError
        from ambry.client.rest import RemoteLibrary

        if not self.server_url:
            return

        a = RemoteLibrary(self.server_url)

        try:
            is_debug = a.get_is_debug()
        except ConnectionError:
            # Already closed:
            return

        if not is_debug:
            global_logger.info("Server is not debug, won't stop")
            return
        else:
            global_logger.info("Server at {} is debug, stopping".format(
                self.server_url))

        # Wait for the server to shutdown

        for i in range(1, 10):  #@UnusedVariable
            try:
                a.post_close()
                global_logger.info('Teardown: server still running, waiting')
                time.sleep(1)
            except socket.error:
                pass  # Just means that the socket is already closed
            except IOError:
                pass  # Probably just means that the socket is already closed
            except ConnectionError:
                pass  # Another way the socket can be closed. Thrown by requests library.
            except Exception as e:
                global_logger.error(
                    "Got an exception while stopping: {} {}".format(
                        type(e), e))
                break

        time.sleep(2)  # Let the socket clear