Source code for swh.scheduler.cli
# Copyright (C) 2016-2023 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
# WARNING: do not import unnecessary things here to keep cli startup time under
# control
import logging
import click
from swh.core.cli import CONTEXT_SETTINGS, AliasedGroup
from swh.core.cli import swh as swh_cli_group
# If you're looking for subcommand imports, they are further down this file to
# avoid a circular import!
@swh_cli_group.group(
name="scheduler", context_settings=CONTEXT_SETTINGS, cls=AliasedGroup
)
@click.option(
"--config-file",
"-C",
default=None,
type=click.Path(
exists=True,
dir_okay=False,
),
help=(
"Configuration file. This has a higher priority than SWH_CONFIG_FILENAME "
"environment variable if set. "
),
)
@click.option(
"--database",
"-d",
default=None,
help="Scheduling database DSN (imply cls is 'postgresql')",
)
@click.option(
"--url", "-u", default=None, help="Scheduler's url access (imply cls is 'remote')"
)
@click.option(
"--no-stdout", is_flag=True, default=False, help="Do NOT output logs on the console"
)
@click.pass_context
def cli(ctx, config_file, database, url, no_stdout):
"""Software Heritage Scheduler tools.
Use a local scheduler instance by default (plugged to the
main scheduler db).
Expected configuration:
* :ref:`cli-config-scheduler`
"""
try:
from psycopg2 import OperationalError
except ImportError:
class OperationalError(Exception):
pass
from swh.scheduler import get_scheduler
from swh.scheduler.cli.config import read_config
ctx.ensure_object(dict)
logger = logging.getLogger(__name__)
scheduler = None
# Read configuration out of config_file or SWH_CONFIG_FILENAME environment variable
conf = read_config(config_file)
if "scheduler" not in conf:
ctx.fail("missing 'scheduler' configuration")
if database:
conf["scheduler"]["cls"] = "postgresql"
conf["scheduler"]["db"] = database
elif url:
conf["scheduler"]["cls"] = "remote"
conf["scheduler"]["url"] = url
sched_conf = conf["scheduler"]
try:
logger.debug("Instantiating scheduler with %s", sched_conf)
scheduler = get_scheduler(**sched_conf)
except (ValueError, OperationalError) as e:
# Propagate scheduler instantiation exception context to subcommands, and let
# them report properly the issue
ctx.obj["scheduler_exc"] = e
ctx.obj["scheduler"] = scheduler
ctx.obj["config"] = conf
from . import ( # noqa
add_forge_now,
admin,
celery_monitor,
journal,
origin,
simulator,
task,
task_type,
)
[docs]
def main():
import click.core
click.core.DEPRECATED_HELP_NOTICE = """
DEPRECATED! Please use the command 'swh scheduler'."""
cli.deprecated = True
return cli(auto_envvar_prefix="SWH_SCHEDULER")
if __name__ == "__main__":
main()