Introduce config defaults, valid for all toddlers

This introduces a default section which can be overridden for any
toddler individually. The dictionaries will be merged at depth, i.e.
sub-dictionaries don't have to be copied wholesale just to override a
single value.

Additionally, it consolidates the configuration keys for
Pagure-as-dist-git to `dist_git_*`, this was inconsistent between
different toddlers. The old `pagure_*` keys will be used as a fallback
for the time being, if `dist_git_*` keys are missing, to support
deployed configuration.

Signed-off-by: Nils Philippsen <nils@redhat.com>
This commit is contained in:
Nils Philippsen 2020-07-08 16:24:23 +02:00
parent c753e54947
commit 92b3805fe1
6 changed files with 91 additions and 63 deletions

View file

@ -105,9 +105,9 @@ class TestFlagCIPRToddler:
"run": {"url": "https://example.com/testing"},
}
config = {
"pagure_token_seed": "example_seed",
"pagure_url": "https://pagure.io",
"pagure_token": "ahah",
"dist_git_token_seed": "example_seed",
"dist_git_url": "https://pagure.io",
"dist_git_token": "ahah",
}
assert toddler.process(config=config, message=msg) == 1
@ -135,9 +135,9 @@ class TestFlagCIPRToddler:
"run": {"url": "https://example.com/testing"},
}
config = {
"pagure_token_seed": "example_seed",
"pagure_url": "https://pagure.io",
"pagure_token": "ahah",
"dist_git_token_seed": "example_seed",
"dist_git_url": "https://pagure.io",
"dist_git_token": "ahah",
}
assert toddler.process(config=config, message=msg) is None

View file

@ -149,8 +149,8 @@ class TestFlagCommitBuildToddler:
}
config = {
"koji_url": "https://koji.fedoraproject.org",
"pagure_url": "https://src.fedoraproject.org",
"pagure_token": "ahah",
"dist_git_url": "https://src.fedoraproject.org",
"dist_git_token": "ahah",
}
assert toddler.process(config=config, message=msg) is None
assert (
@ -193,8 +193,8 @@ class TestFlagCommitBuildToddler:
}
config = {
"koji_url": "https://koji.fedoraproject.org",
"pagure_url": "https://src.fedoraproject.org",
"pagure_token": "ahah",
"dist_git_url": "https://src.fedoraproject.org",
"dist_git_token": "ahah",
}
assert toddler.process(config=config, message=msg) is None
assert (
@ -239,8 +239,8 @@ class TestFlagCommitBuildToddler:
}
config = {
"koji_url": "https://koji.fedoraproject.org",
"pagure_url": "https://src.fedoraproject.org",
"pagure_token": "ahah",
"dist_git_url": "https://src.fedoraproject.org",
"dist_git_token": "ahah",
}
assert toddler.process(config=config, message=msg) is None
assert (
@ -282,8 +282,8 @@ class TestFlagCommitBuildToddler:
}
config = {
"koji_url": "https://koji.fedoraproject.org",
"pagure_url": "https://src.fedoraproject.org",
"pagure_token": "ahah",
"dist_git_url": "https://src.fedoraproject.org",
"dist_git_token": "ahah",
}
assert toddler.process(config=config, message=msg) is None
assert (

View file

@ -45,32 +45,25 @@ routing_keys = ["#"] # This is dynamically generated in the code
# more of them.
blocked_toddlers = ["debug"]
[consumer_config.flag_ci_pr]
# flag_ci_pr
pagure_token_seed = "private random string to change"
pagure_token = "private random string to change"
pagure_url = "https://src.fedoraproject.org"
[consumer_config.flag_commit_build]
# flag_commit_build
pagure_token = "private random string to change"
pagure_url = "https://src.fedoraproject.org"
koji_url = "https://koji.fedoraproject.org"
[consumer_config.packager_bugzilla_sync]
# Configuration file storing all the email overrides in the form of:
# "foo@bar.com" = "bar@foo.org"
# This is the same format as used by the distgit_bugzilla_sync cron/app
email_overrides_file = "/path/to/email_overrides.toml"
# Base url of dist-git
dist_git_url = "https://src.fedoraproject.org"
# List of accounts we do not want to report about
ignorable_accounts = ["packagerbot", "zuul"]
[consumer_config.default]
# Configuration common to all toddlers.
#
# You can override any of these in the section of a particular toddler, e.g.:
#
# [consumer_config.default]
# somekey = "somevalue"
#
# [consumer_config.default.subsection]
# key1 = "value1"
# key2 = "value2"
#
# ...
#
# [consumer_config.sometoddler]
# somekey = "someothervalue"
#
# [consumer_config.sometoddler.subsection]
# key2 = "othervalue2"
# Configuration used when sending notifications:
mail_server = "bastion.fedoraproject.org"
@ -87,10 +80,18 @@ bugzilla_username = "Bugzilla username (ie: email)"
bugzilla_password = "Bugzilla password for that account"
bugzilla_group = "fedora_contrib"
# Base URL for the Koji build system
koji_url = "https://koji.fedoraproject.org"
[consumer_config.pdc_retired_packages]
file_check_url = "https://src.fedoraproject.org/%(namespace)s/%(repo)s/blob/%(branch)s/f/%(file)s"
# Account to use to connect to Pagure-as-dist-git
dist_git_url = "https://src.fedoraproject.org"
dist_git_token_seed = "private random string to change"
dist_git_token = "private random string to change"
[consumer_config.default.pdc_config]
# Configuration to talk to PDC, as understood by pdc-client.
server = "https://pdc.fedoraproject.org/rest_api/v1/"
ssl_verify = false # Enable if using a self-signed cert
# XXX - getting the token is a bit of a pain, but here's a walk through
# 1) go to https://pdc.fedoraproject.org/ in your browser and login.
# 2) go to https://pdc.fedoraproject.org/rest_api/v1/auth/token/obtain/
@ -100,13 +101,24 @@ file_check_url = "https://src.fedoraproject.org/%(namespace)s/%(repo)s/blob/%(br
# 6) before hitting enter, edit the command to add the following option
# -H 'Accept: application/json' # to tell the API you want data
# 7) the command should print out your token.
# Credentials to talk to PDC
[consumer_config.pdc_retired_packages.pdc_config]
server = "https://pdc.fedoraproject.org/rest_api/v1/"
ssl_verify = false # Enable if using a self-signed cert
token = "PUT_HERE_THE_TOKEN_OBTAINED_MANUALLY"
[consumer_config.flag_ci_pr]
[consumer_config.flag_commit_build]
[consumer_config.packager_bugzilla_sync]
# Configuration file storing all the email overrides in the form of:
# "foo@bar.com" = "bar@foo.org"
# This is the same format as used by the distgit_bugzilla_sync cron/app
email_overrides_file = "/path/to/email_overrides.toml"
# List of accounts we do not want to report about
ignorable_accounts = ["packagerbot", "zuul"]
[consumer_config.pdc_retired_packages]
file_check_url = "https://src.fedoraproject.org/%(namespace)s/%(repo)s/blob/%(branch)s/f/%(file)s"
[qos]
prefetch_size = 0
prefetch_count = 25

View file

@ -106,7 +106,7 @@ class FlagCIPR(ToddlerBase):
pr_id = str(msg["artifact"]["id"])
commit_hash_text = " for %s" % msg["artifact"]["commit_hash"][:8]
seed = config.get("pagure_token_seed") or ""
seed = config.get("dist_git_token_seed", config.get("pagure_token_seed")) or ""
data = {
"username": "Fedora CI",
@ -116,7 +116,7 @@ class FlagCIPR(ToddlerBase):
"uid": hashlib.md5((pr_id + seed).encode("utf-8")).hexdigest(),
}
pagure_url = config["pagure_url"]
dist_git_url = config.get("dist_git_url") or config["pagure_url"]
namespace = msg["artifact"]["repository"].split("/")[-2]
repo = msg["artifact"]["repository"].split("/")[-1]
@ -124,11 +124,12 @@ class FlagCIPR(ToddlerBase):
target_url = "/".join(
["api", "0", namespace, repo, "pull-request", pr_id, "flag"]
)
flag_url = pagure_url + "/" + target_url
flag_url = dist_git_url + "/" + target_url
_log.info("Flagging commit at: %s" % flag_url)
headers = {
"Authorization": "token " + config["pagure_token"],
"Authorization": "token " + config.get("dist_git_token")
or config["pagure_token"],
"User-Agent": "loopabull@fedora-infra",
}
@ -137,7 +138,7 @@ class FlagCIPR(ToddlerBase):
req = requests_session.request(
method="POST", url=flag_url, headers=headers, data=data,
)
_log.info("Request to %s returned: %s" % (pagure_url, req.status_code))
_log.info("Request to %s returned: %s" % (dist_git_url, req.status_code))
if not req.ok:
_log.debug(req.text)
return 1

View file

@ -127,14 +127,15 @@ class FlagCommitBuild(ToddlerBase):
"url": _koji_link(config, msg),
}
pagure_url = config["pagure_url"]
dist_git_url = config.get("dist_git_url") or config["pagure_url"]
target_url = "/".join(["api", "0", "rpms", msg["name"], "c", commit, "flag"])
flag_url = pagure_url + "/" + target_url
flag_url = dist_git_url + "/" + target_url
_log.info("Flagging commit at: %s" % flag_url)
headers = {
"Authorization": "token " + config["pagure_token"],
"Authorization": "token " + config.get("dist_git_token")
or config["pagure_token"],
"User-Agent": "toddlers@fedora-infra",
}
@ -143,7 +144,7 @@ class FlagCommitBuild(ToddlerBase):
req = requests_session.request(
method="POST", url=flag_url, headers=headers, data=data,
)
_log.info("Request to %s returned: %s" % (pagure_url, req.status_code))
_log.info("Request to %s returned: %s" % (dist_git_url, req.status_code))
if not req.ok:
_log.debug(" -- FAILED -- ")
_log.debug(req.text)
@ -151,7 +152,7 @@ class FlagCommitBuild(ToddlerBase):
else:
_log.info("All clear")
_log.info(
"User-URL: %s" % pagure_url
"User-URL: %s" % dist_git_url
+ "/"
+ "/".join(["rpms", msg["name"], "c", commit])
)

View file

@ -5,6 +5,7 @@ import fedora_messaging.exceptions
from . import plugins # noqa: F401
from .base import ToddlerBase
from .utils.misc import merge_dicts
_log = logging.getLogger(__name__)
@ -39,6 +40,15 @@ class RunningToddler(object):
"No toddlers found to run :("
)
self.toddler_config = {}
for toddler in self.toddlers:
name = toddler.name
# Bail out if two toddlers have the same name.
if name in self.toddler_config:
raise ValueError(f"Toddler named {name} already exists.")
self.toddler_config[name] = self._get_toddler_config(name)
topics = set()
for toddler in self.toddlers:
_log.debug(
@ -57,6 +67,15 @@ class RunningToddler(object):
)
binding["routing_keys"] = topics
def _get_toddler_config(self, toddler_name: str) -> dict:
"""Merge default and private configuration for a toddler."""
base_config = fedora_messaging.config.conf["consumer_config"]
default_config = base_config.get("default", {})
private_config = base_config.get(toddler_name, {})
return merge_dicts(default_config, private_config)
def __call__(self, message):
"""
Invoked when a message is received by the consumer.
@ -74,12 +93,7 @@ class RunningToddler(object):
toddler.name,
message.id,
)
toddler.process(
fedora_messaging.config.conf["consumer_config"].get(
toddler.name
),
message,
)
toddler.process(self.toddler_config[toddler.name], message)
except Exception:
_log.exception(
"Toddler '%s' failed to process message id: %s -- putting it back in the queue",