Don't do expensive check of group membership on rescore, just handle exceptions

This could do with some further refactoring, but will probably postpone that
until a decision is made about dropping the non-batch mode
This commit is contained in:
Steve Langasek 2024-03-10 16:51:15 -07:00
parent d5faa9b133
commit 07d3158ade

View File

@ -54,10 +54,21 @@ def rescoreBuilds(pkg, archs, score):
for build in pkg.getBuilds(): for build in pkg.getBuilds():
arch = build.arch_tag arch = build.arch_tag
if arch in archs: if arch in archs:
if build.rescore(score): if not build.can_be_rescored:
continue
try:
build.rescore(score=score)
res.append(f" {arch}: done") res.append(f" {arch}: done")
else: except lazr.restfulclient.errors.Unauthorized:
Logger.error(
"You don't have the permissions to rescore builds. Ignoring your rescore request."
)
return None
except lazr.restfulclient.errors.BadRequest:
Logger.info("Cannot rescore build of %s on %s.",
build.source_package_name, arch)
res.append(f" {arch}: failed") res.append(f" {arch}: failed")
msg = "\n".join(res) msg = "\n".join(res)
return f"Rescoring builds of '{pkg.source_package_name}' to {score}:\n{msg}" return f"Rescoring builds of '{pkg.source_package_name}' to {score}:\n{msg}"
@ -150,9 +161,6 @@ def main():
version="devel") version="devel")
me = launchpad.me me = launchpad.me
is_buildd_admin = any(t.name == "launchpad-buildd-admins" \
for t in me.super_teams)
ubuntu = launchpad.distributions['ubuntu'] ubuntu = launchpad.distributions['ubuntu']
if args.batch: if args.batch:
@ -229,8 +237,6 @@ def main():
# Operations that are remaining may only be done by Ubuntu developers # Operations that are remaining may only be done by Ubuntu developers
# (retry) or buildd admins (rescore). Check if the proper permissions # (retry) or buildd admins (rescore). Check if the proper permissions
# are in place. # are in place.
if operation == "rescore":
necessary_privs = is_buildd_admin
if operation == "retry": if operation == "retry":
necessary_privs = archive.checkUpload( necessary_privs = archive.checkUpload(
component=sources.getComponent(), component=sources.getComponent(),
@ -240,7 +246,7 @@ def main():
sourcepackagename=sources.getPackageName(), sourcepackagename=sources.getPackageName(),
) )
if operation in ("rescore", "retry") and not necessary_privs: if operation == "retry" and not necessary_privs:
Logger.error( Logger.error(
"You cannot perform the %s operation on a %s package as you" "You cannot perform the %s operation on a %s package as you"
" do not have the permissions to do this action.", " do not have the permissions to do this action.",
@ -274,7 +280,13 @@ def main():
# FIXME: make priority an option # FIXME: make priority an option
priority = 5000 priority = 5000
Logger.info("Rescoring build %s to %d...", build.arch_tag, priority) Logger.info("Rescoring build %s to %d...", build.arch_tag, priority)
build.rescore(score=priority) try:
build.rescore(score=priority)
except lazr.restfulclient.errors.Unauthorized:
Logger.error(
"You don't have the permissions to rescore builds. Ignoring your rescore request."
)
break
else: else:
Logger.info("Cannot rescore build on %s.", build.arch_tag) Logger.info("Cannot rescore build on %s.", build.arch_tag)
if operation == "retry": if operation == "retry":
@ -303,15 +315,9 @@ def main():
# filter out duplicate and invalid architectures # filter out duplicate and invalid architectures
archs.intersection_update(valid_archs) archs.intersection_update(valid_archs)
# Check permisions (part 1): Rescoring can only be done by buildd admins
can_rescore = args.priority and is_buildd_admin
if args.priority and not can_rescore:
Logger.error(
"You don't have the permissions to rescore builds. Ignoring your rescore request."
)
if not args.packages: if not args.packages:
retry_count = 0 retry_count = 0
can_rescore = True
if not args.state: if not args.state:
if args.retry: if args.retry:
@ -372,9 +378,15 @@ def main():
if args.priority and can_rescore: if args.priority and can_rescore:
if build.can_be_rescored: if build.can_be_rescored:
build.rescore(score=args.priority) try:
else: build.rescore(score=args.priority)
Logger.info("Cannot rescore build of %s on %s.", except lazr.restfulclient.errors.Unauthorized:
Logger.error(
"You don't have the permissions to rescore builds. Ignoring your rescore request."
)
can_rescore = False
except lazr.restfulclient.errors.BadRequest:
Logger.info("Cannot rescore build of %s on %s.",
build.source_package_name, build.arch_tag) build.source_package_name, build.arch_tag)
Logger.info("") Logger.info("")
@ -422,7 +434,7 @@ def main():
Logger.info(getBuildStates(pkg, archs)) Logger.info(getBuildStates(pkg, archs))
if can_retry: if can_retry:
Logger.info(retryBuilds(pkg, archs)) Logger.info(retryBuilds(pkg, archs))
if args.priority and can_rescore: if args.priority:
Logger.info(rescoreBuilds(pkg, archs, args.priority)) Logger.info(rescoreBuilds(pkg, archs, args.priority))
Logger.info("") Logger.info("")