~loggerhead-team/loggerhead/trunk-rich

423.2.1 by John Arbash Meinel
Start working on some code to do load testing of loggerhead.
1
# Copyright 2009, 2010, 2011 Canonical Ltd
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
262.2.1 by Martin Pool
Stub code to allow loggerhead to load as a plugin
17
18
# This file allows loggerhead to be treated as a plugin for bzr.
19
#
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
20
# XXX: Because loggerhead already contains a loggerhead directory, much of the
21
# code is going to appear loaded at bzrlib.plugins.loggerhead.loggerhead.
22
# This seems like the easiest thing, because bzrlib wants the top-level plugin
23
# directory to be the module, but when it's used as a library people expect
24
# the source directory to contain a directory called loggerhead.  -- mbp
25
# 20090123
26
27
"""Loggerhead web viewer for Bazaar branches.
28
329.2.1 by Matt Nordhoff
Strip trailing whitespace
29
This provides a new option "--http" to the "bzr serve" command, that
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
30
starts a web server to browse the contents of a branch.
31
"""
262.2.1 by Martin Pool
Stub code to allow loggerhead to load as a plugin
32
437 by John Arbash Meinel
Import sys at the start of loggerhead/__init__.py we use it as part of startup.
33
import sys
34
420 by Max Kanat-Alexander
Merge info file, mark as compatible with bzr 2.3.
35
from info import (
36
    bzr_plugin_version as version_info,
37
    bzr_compatible_versions,
38
    )
262.2.2 by Martin Pool
Merge in 'serve --http' based on code from mwh
39
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
40
if __name__ == 'bzrlib.plugins.loggerhead':
41
    import bzrlib
262.2.5 by Martin Pool
This loggerhead will work with bzr 1.13
42
    from bzrlib.api import require_any_api
423.2.1 by John Arbash Meinel
Start working on some code to do load testing of loggerhead.
43
    from bzrlib import commands
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
44
420 by Max Kanat-Alexander
Merge info file, mark as compatible with bzr 2.3.
45
    require_any_api(bzrlib, bzr_compatible_versions)
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
46
423.1.1 by Jelmer Vernooij
remove support for pre-1.16 bzr.
47
    from bzrlib.transport import transport_server_registry
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
48
49
    DEFAULT_HOST = '0.0.0.0'
262.2.4 by Martin Pool
Act as a plugin only when loaded by bzr; update docs
50
    DEFAULT_PORT = 8080
360 by Martin Albisetti
Avoid diluting sys.path if loggerhead is installed systemwide, install loggerhead as a plugin (Jelmer Vernooij)
51
    HELP = ('Loggerhead, a web-based code viewer and server. (default port: %d)' %
352.4.3 by Matt Nordhoff
Better line-wrapping
52
            (DEFAULT_PORT,))
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
53
418.1.1 by John Arbash Meinel
Allow running the loggerhead test suite using 'bzr selftest'
54
    def _ensure_loggerhead_path():
55
        """Ensure that you can 'import loggerhead' and get the root."""
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
56
        # loggerhead internal code will try to 'import loggerhead', so
359.1.2 by Jelmer Vernooij
Avoid diluting sys.path if loggerhead is installed systemwide.
57
        # let's put it on the path if we can't find it in the existing path
58
        try:
405.1.3 by John Arbash Meinel
Change the import check so it actually works.
59
            import loggerhead.apps.transport
359.1.2 by Jelmer Vernooij
Avoid diluting sys.path if loggerhead is installed systemwide.
60
        except ImportError:
61
            import os.path, sys
62
            sys.path.append(os.path.dirname(__file__))
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
63
418.1.1 by John Arbash Meinel
Allow running the loggerhead test suite using 'bzr selftest'
64
    def serve_http(transport, host=None, port=None, inet=None):
422.3.2 by John Arbash Meinel
Fix bug #716201 by suppressing body content when getting a HEAD request.
65
        # TODO: if we supported inet to pass requests in and respond to them,
66
        #       then it would be easier to test the full stack, but it probably
67
        #       means routing around paste.httpserver.serve which probably
68
        #       isn't testing the full stack
418.1.1 by John Arbash Meinel
Allow running the loggerhead test suite using 'bzr selftest'
69
        from paste.httpexceptions import HTTPExceptionHandler
70
        from paste.httpserver import serve
71
72
        _ensure_loggerhead_path()
73
422.3.2 by John Arbash Meinel
Fix bug #716201 by suppressing body content when getting a HEAD request.
74
        from loggerhead.apps.http_head import HeadMiddleware
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
75
        from loggerhead.apps.transport import BranchesFromTransportRoot
76
        from loggerhead.config import LoggerheadConfig
411.2.7 by John Arbash Meinel
Remove duplicated effort in setup_logging.
77
        from loggerhead.main import setup_logging
389.2.1 by Matt Nordhoff
Some random PEP 8 and otehr stylistic changes.
78
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
79
        if host is None:
80
            host = DEFAULT_HOST
81
        if port is None:
82
            port = DEFAULT_PORT
359.2.2 by Matt Nordhoff
Fix a stupid mistake constructing argv
83
        argv = ['--host', host, '--port', str(port), '--', transport.base]
84
        if not transport.is_readonly():
85
            argv.insert(0, '--allow-writes')
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
86
        config = LoggerheadConfig(argv)
411.2.7 by John Arbash Meinel
Remove duplicated effort in setup_logging.
87
        setup_logging(config, init_logging=False, log_file=sys.stderr)
388 by Matt Nordhoff
serve_http was passing a transport to BranchesFromTransportRoot, not an URL.
88
        app = BranchesFromTransportRoot(transport.base, config)
445.1.1 by John Arbash Meinel
Quick-fix for bug #758618.
89
        # Bug #758618, HeadMiddleware seems to break HTTPExceptionHandler from
90
        # actually sending appropriate return codes to the client. Since nobody
91
        # desperately needs HeadMiddleware right now, just ignoring it.
92
        # app = HeadMiddleware(app)
352.4.1 by Matt Nordhoff
Use the "bzr serve" protocol registry if it's available.
93
        app = HTTPExceptionHandler(app)
94
        serve(app, host=host, port=port)
95
423.1.1 by Jelmer Vernooij
remove support for pre-1.16 bzr.
96
    transport_server_registry.register('http', serve_http, help=HELP)
423.2.1 by John Arbash Meinel
Start working on some code to do load testing of loggerhead.
97
98
    class cmd_load_test_loggerhead(commands.Command):
99
        """Run a load test against a live loggerhead instance.
423.2.4 by John Arbash Meinel
Add a <noop> command to the RequestWorker.
100
101
        Pass in the name of a script file to run. See loggerhead/load_test.py
102
        for a description of the file format.
423.2.1 by John Arbash Meinel
Start working on some code to do load testing of loggerhead.
103
        """
104
423.2.4 by John Arbash Meinel
Add a <noop> command to the RequestWorker.
105
        takes_args = ["filename"]
106
107
        def run(self, filename):
423.2.1 by John Arbash Meinel
Start working on some code to do load testing of loggerhead.
108
            from bzrlib.plugins.loggerhead.loggerhead import load_test
423.2.4 by John Arbash Meinel
Add a <noop> command to the RequestWorker.
109
            script = load_test.run_script(filename)
423.2.6 by John Arbash Meinel
Avoid getting a lazy object error by instantiating an
110
            for thread_id in sorted(script._threads):
111
                worker = script._threads[thread_id][0]
423.2.4 by John Arbash Meinel
Add a <noop> command to the RequestWorker.
112
                for url, success, time in worker.stats:
423.2.5 by John Arbash Meinel
Allow comment strings in the scripts.
113
                    self.outf.write(' %5.3fs %s %s\n'
114
                                    % (time, str(success)[0], url))
423.2.4 by John Arbash Meinel
Add a <noop> command to the RequestWorker.
115
116
    commands.register_command(cmd_load_test_loggerhead)
418.1.1 by John Arbash Meinel
Allow running the loggerhead test suite using 'bzr selftest'
117
118
    def load_tests(standard_tests, module, loader):
119
        _ensure_loggerhead_path()
120
        standard_tests.addTests(loader.loadTestsFromModuleNames(
121
            ['bzrlib.plugins.loggerhead.loggerhead.tests']))
122
        return standard_tests