Exemple #1
0
def test_fatal_if_no_storage_and_no_sqlite_file(tmpdir, use_option):
    from devpi_server.init import init
    from devpi_server.main import _main, get_pluginmanager

    class Plugin:
        @hookimpl
        def devpiserver_cmdline_run(self, xom):
            return 1

    pm = get_pluginmanager()
    pm.register(Plugin())
    if use_option:
        _main(argv=["devpi-server", "--init", "--serverdir",
                    str(tmpdir)],
              pluginmanager=pm)
    else:
        init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm)
    _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm)
    tmpdir.join('.sqlite').remove()
    with pytest.raises(Fatal) as excinfo:
        _main(argv=["devpi-server", "--serverdir",
                    str(tmpdir)],
              pluginmanager=pm)
    assert "you first need to run devpi-init or devpi-import" in str(
        excinfo.value)
Exemple #2
0
 def new_import(self, options=(), plugin=None):
     if request.param:
         mapp2 = makemapp(
             options=("--import", str(self.exportdir)) + options)
         if plugin is not None:
             mapp2.xom.config.pluginmanager.register(plugin)
         mapp2.xom.config.init_nodeinfo()
         assert mapp2.xom.main() == 0
     else:
         from devpi_server.config import get_pluginmanager
         from devpi_server.importexport import import_
         serverdir = gentmp()
         argv = [
             "devpi-import", "--no-events", "--serverdir", serverdir
         ]
         argv.extend(options)
         argv.extend(["--storage", storage_info["name"]])
         argv.append(self.exportdir)
         pm = get_pluginmanager()
         pm.register(plugin)
         assert import_(pluginmanager=pm, argv=argv) == 0
         mapp2 = makemapp(options=["--serverdir", serverdir])
         if plugin is not None:
             mapp2.xom.config.pluginmanager.register(plugin)
     return mapp2
Exemple #3
0
def test_run_commands_called(tmpdir, use_option):
    from devpi_server.init import init
    from devpi_server.main import _main, get_pluginmanager
    l = []

    class Plugin:
        @hookimpl
        def devpiserver_cmdline_run(self, xom):
            l.append(xom)
            return 1

    pm = get_pluginmanager()
    pm.register(Plugin())
    if use_option:
        result = _main(
            argv=["devpi-server", "--init", "--serverdir",
                  str(tmpdir)],
            pluginmanager=pm)
    else:
        result = init(argv=["devpi-init", "--serverdir",
                            str(tmpdir)],
                      pluginmanager=pm)
    result = _main(argv=["devpi-server", "--serverdir",
                         str(tmpdir)],
                   pluginmanager=pm)
    assert result == 1
    assert len(l) == 1
    assert isinstance(l[0], XOM)
Exemple #4
0
 def makexom(opts=(), httpget=httpget, proxy=None, mocking=True, plugins=()):
     from devpi_server import auth_basic
     from devpi_server import auth_devpi
     plugins = list(plugins) + [(auth_basic, None), (auth_devpi, None)]
     pm = get_pluginmanager()
     for plugin in plugins:
         pm.register(plugin)
     serverdir = gentmp()
     fullopts = ["devpi-server", "--serverdir", serverdir] + list(opts)
     fullopts = [str(x) for x in fullopts]
     config = parseoptions(pm, fullopts)
     config.init_nodeinfo()
     if mocking:
         if proxy is None:
             proxy = mock.create_autospec(XMLProxy)
             proxy.list_packages_with_serial.return_value = {}
         xom = XOM(config, proxy=proxy, httpget=httpget)
         add_pypistage_mocks(monkeypatch, httpget)
     else:
         xom = XOM(config)
     # initialize default indexes
     from devpi_server.main import set_default_indexes
     if not xom.config.args.master_url:
         with xom.keyfs.transaction(write=True):
             set_default_indexes(xom.model)
     if mocking:
         xom.pypimirror.init_pypi_mirror(proxy)
     if request.node.get_marker("start_threads"):
         xom.thread_pool.start()
     elif request.node.get_marker("with_notifier"):
         xom.thread_pool.start_one(xom.keyfs.notifier)
     request.addfinalizer(xom.thread_pool.shutdown)
     return xom
Exemple #5
0
def clear_index(argv=None):
    if argv is None:
        argv = sys.argv
    else:
        # for tests
        argv = [str(x) for x in argv]
    pluginmanager = get_pluginmanager()
    try:
        parser = MyArgumentParser(description="Clear project search index.",
                                  add_help=False)
        add_help_option(parser, pluginmanager)
        add_configfile_option(parser, pluginmanager)
        add_storage_options(parser, pluginmanager)
        add_indexer_backend_option(parser, pluginmanager)
        config = parseoptions(pluginmanager, argv, parser=parser)
        configure_cli_logging(config.args)
        xom = xom_from_config(config)
        log = xom.log
        log.warn("You should stop devpi-server before running this command.")
        ix = get_indexer(xom)
        ix.delete_index()
        log.info(
            "Index deleted, start devpi-server again to let the index rebuild automatically."
        )
    except Fatal as e:
        tw = py.io.TerminalWriter(sys.stderr)
        tw.line("fatal: %s" % e.args[0], red=True)
        return 1
Exemple #6
0
def genconfig(config=None, argv=None):
    pluginmanager = get_pluginmanager()

    if argv is None:
        argv = sys.argv
        argv = [str(x) for x in argv]

    if config is None:
        parser = get_parser(pluginmanager)
        parser.description = (
            "Write configuration files for various process managers and "
            "webservers. Takes same arguments as devpi-server.")
        config = parseoptions(pluginmanager, argv, parser=parser)

    tw = py.io.TerminalWriter()
    tw.cwd = py.path.local()

    if not config.args.configfile:
        tw.line(
            "It is highly recommended to use a configuration file for "
            "devpi-server, see --configfile option.",
            red=True)

    destdir = tw.cwd.ensure("gen-config", dir=1)

    new_argv = []
    argv_iter = iter(argv[1:])
    for arg in argv_iter:
        if arg == "--gen-config":
            continue
        if arg.startswith("--serverdir"):
            if '=' not in arg:
                next(argv_iter)  # remove path
            # replace with absolute path
            new_argv.extend(["--serverdir", config.serverdir.strpath])
            continue
        if arg == "-c" or arg.startswith(("--configfile", "-c=")):
            if '=' not in arg:
                next(argv_iter)  # remove path
            # replace with absolute path
            new_argv.extend([
                "--configfile",
                py.path.local(config.args.configfile).strpath
            ])
            continue
        new_argv.append(arg)
    new_args = parseoptions(pluginmanager, ["devpi-server"] + new_argv)
    cfg_types = [
        "cron", "launchd", "nginx", "supervisor", "systemd", "windows_service"
    ]
    for cfg_type in cfg_types:

        def writer(basename, content):
            p = destdir.join(basename)
            p.write(content)
            tw.line("wrote %s" % p.relto(tw.cwd), bold=True)

        name = "gen_" + cfg_type
        globals()[name](tw, new_args, new_argv, writer)
Exemple #7
0
def test_indexer_relative_path():
    from devpi_server.config import parseoptions, get_pluginmanager
    from devpi_server.main import Fatal
    from devpi_web.main import get_indexer_from_config
    options = ("--indexer-backend", "whoosh:path=ham")
    config = parseoptions(get_pluginmanager(), ("devpi-server", ) + options)
    with pytest.raises(Fatal, match="must be absolute"):
        get_indexer_from_config(config)
Exemple #8
0
 def makexom(opts=(), httpget=httpget, plugins=()):
     from devpi_server import auth_basic
     from devpi_server import auth_devpi
     plugins = [
         plugin[0] if isinstance(plugin, tuple) else plugin
         for plugin in plugins
     ]
     for plugin in [auth_basic, auth_devpi, storage_info["_test_plugin"]]:
         if plugin not in plugins:
             plugins.append(plugin)
     pm = get_pluginmanager(load_entrypoints=False)
     for plugin in plugins:
         pm.register(plugin)
     serverdir = gentmp()
     fullopts = ["devpi-server", "--serverdir", serverdir] + list(opts)
     if request.node.get_marker("with_replica_thread"):
         fullopts.append("--master=http://localhost")
     if not request.node.get_marker("no_storage_option"):
         if storage_info["name"] != "sqlite":
             fullopts.append("--storage=%s" % storage_info["name"])
     fullopts = [str(x) for x in fullopts]
     config = parseoptions(pm, fullopts)
     config.init_nodeinfo()
     for marker in ("storage_with_filesystem", ):
         if request.node.get_marker(marker):
             info = config._storage_info()
             markers = info.get("_test_markers", [])
             if marker not in markers:
                 pytest.skip("The storage doesn't have marker '%s'." %
                             marker)
     if not request.node.get_marker("no_storage_option"):
         assert storage_info["storage"] is config.storage
     if request.node.get_marker("nomocking"):
         xom = XOM(config)
     else:
         xom = XOM(config, httpget=httpget)
         if not request.node.get_marker("nomockprojectsremote"):
             monkeypatch.setattr(extpypi.PyPIStage, "_get_remote_projects",
                                 lambda self: set())
         add_pypistage_mocks(monkeypatch, httpget)
     # initialize default indexes
     from devpi_server.main import set_default_indexes
     if not xom.config.args.master_url:
         with xom.keyfs.transaction(write=True):
             set_default_indexes(xom.model)
     if request.node.get_marker("with_replica_thread"):
         from devpi_server.replica import ReplicaThread
         rt = ReplicaThread(xom)
         xom.replica_thread = rt
         xom.thread_pool.register(rt)
         xom.thread_pool.start_one(rt)
     if request.node.get_marker("start_threads"):
         xom.thread_pool.start()
     elif request.node.get_marker("with_notifier"):
         xom.thread_pool.start_one(xom.keyfs.notifier)
     request.addfinalizer(xom.thread_pool.shutdown)
     return xom
 def test_add_parser_options_called(self):
     l = []
     class Plugin:
         def devpiserver_add_parser_options(self, parser):
             l.append(parser)
     pm = get_pluginmanager()
     pm.register(Plugin())
     parseoptions(pm, ["devpi-server"])
     assert len(l) == 1
     assert isinstance(l[0], MyArgumentParser)
Exemple #10
0
def genconfig(config, argv):
    tw = py.io.TerminalWriter()
    tw.cwd = py.path.local()

    destdir = tw.cwd.ensure("gen-config", dir=1)

    new_argv = [x for x in argv if x != "--gen-config"]
    new_args = parseoptions(get_pluginmanager(), ["devpi-server"] + new_argv)
    for cfg_type in ["supervisor", "nginx", "cron", "launchd", "systemd"]:

        def writer(basename, content):
            p = destdir.join(basename)
            p.write(content)
            tw.line("wrote %s" % p.relto(tw.cwd), bold=True)

        name = "gen_" + cfg_type
        globals()[name](tw, new_args, new_argv, writer)
Exemple #11
0
def test_main_starts_server_if_run_commands_returns_none(tmpdir):
    from devpi_server.init import init
    from devpi_server.main import _main, get_pluginmanager
    l = []

    class Plugin:
        @hookimpl
        def devpiserver_cmdline_run(self, xom):
            l.append(xom)

    pm = get_pluginmanager()
    pm.register(Plugin())
    init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm)
    with pytest.raises(ZeroDivisionError):
        _main(argv=["devpi-server", "--serverdir",
                    str(tmpdir)],
              pluginmanager=pm)
    assert len(l) == 1
    assert isinstance(l[0], XOM)
Exemple #12
0
def make_config(args):
    return parseoptions(get_pluginmanager(), args)
Exemple #13
0
def config(gentmp):
    serverdir = gentmp()
    pluginmanager = get_pluginmanager()
    return parseoptions(pluginmanager,
                        ["devpi-server", "--serverdir", serverdir.strpath])
Exemple #14
0
def make_config(args):
    from devpi_server.config import parseoptions, get_pluginmanager
    return parseoptions(get_pluginmanager(), args)
Exemple #15
0
def reparse_without_genconfig(config):
    new_args = [x for x in config.args._raw if x != "--gen-config"]
    return parseoptions(get_pluginmanager(), ["devpi-server"] + new_args)
def reparse_without_genconfig(config):
    new_args = [x for x in config.args._raw if x != "--gen-config"]
    return parseoptions(get_pluginmanager(), ["devpi-server"] + new_args)