mirror of
https://pagure.io/fm-orchestrator.git
synced 2026-04-05 11:48:33 +08:00
Merge #550 improve mbs-build
This commit is contained in:
@@ -30,15 +30,43 @@ BUILD_STATES = {
|
||||
|
||||
INVERSE_BUILD_STATES = {v: k for k, v in BUILD_STATES.items()}
|
||||
|
||||
|
||||
def fetch_module_info(server, build_id):
|
||||
if not server:
|
||||
server = DEFAULT_MBS_SERVER
|
||||
idx = int(build_id)
|
||||
|
||||
response = requests.get(server + '/module-build-service/1/module-builds/%i?verbose=true' % idx)
|
||||
return response.json()
|
||||
|
||||
|
||||
def show_module_info(server, build_id):
|
||||
state_names = dict([(v, k) for k, v in koji.BUILD_STATES.items()])
|
||||
state_names[None] = "undefined"
|
||||
|
||||
data = fetch_module_info(server, build_id)
|
||||
table = []
|
||||
for package_name, task_data in data["tasks"]["rpms"].items():
|
||||
try:
|
||||
koji_task_url = "https://koji.fedoraproject.org/koji/taskinfo?taskID=%s" % task_data['task_id']
|
||||
except KeyError:
|
||||
koji_task_url = ""
|
||||
table += [[
|
||||
task_data.get("nvr", "null"),
|
||||
state_names[task_data.get("state", None)],
|
||||
koji_task_url
|
||||
]]
|
||||
headers = ["NVR", "State", "Koji Task"]
|
||||
|
||||
print(tabulate(table, headers=headers))
|
||||
|
||||
|
||||
def watch_build(server, build_id):
|
||||
"""
|
||||
Watches the MBS build in a loop, updates every 30 seconds.
|
||||
Returns when build state is 'failed' or 'done' or 'ready' or when
|
||||
user hits ctrl+c.
|
||||
"""
|
||||
if not server:
|
||||
server = DEFAULT_MBS_SERVER
|
||||
|
||||
done = False
|
||||
while not done:
|
||||
# Clear the screen
|
||||
@@ -47,10 +75,7 @@ def watch_build(server, build_id):
|
||||
state_names = dict([(v, k) for k, v in koji.BUILD_STATES.items()])
|
||||
state_names[None] = "undefined"
|
||||
|
||||
idx = int(build_id)
|
||||
|
||||
response = requests.get(server + '/module-build-service/1/module-builds/%i?verbose=true' % idx)
|
||||
data = response.json()
|
||||
data = fetch_module_info(server, build_id)
|
||||
|
||||
tasks = data['tasks']['rpms']
|
||||
states = list(set([task['state'] for task in tasks.values()]))
|
||||
@@ -258,7 +283,7 @@ def cancel_module_build(server, id_provider, build_id):
|
||||
{'state': 'failed'})
|
||||
logging.info(resp.text)
|
||||
|
||||
def show_overview(server):
|
||||
def show_overview(server, finished, limit=30):
|
||||
if not server:
|
||||
server = DEFAULT_MBS_SERVER
|
||||
|
||||
@@ -295,9 +320,14 @@ def show_overview(server):
|
||||
"%s-%s-%s" % (module["name"], module["stream"], module["version"])]
|
||||
return row
|
||||
|
||||
# We are interested only in init, wait and build states.
|
||||
states = [BUILD_STATES["init"], BUILD_STATES["wait"],
|
||||
BUILD_STATES["build"]]
|
||||
if finished:
|
||||
# these are the states when the module build is finished
|
||||
states = [BUILD_STATES["done"], BUILD_STATES["ready"],
|
||||
BUILD_STATES["failed"]]
|
||||
else:
|
||||
# this is when the build is in progress
|
||||
states = [BUILD_STATES["init"], BUILD_STATES["wait"],
|
||||
BUILD_STATES["build"]]
|
||||
|
||||
# Get all modules in the states we are interested in using 3 threads.
|
||||
pool = ThreadPool(3)
|
||||
@@ -308,7 +338,8 @@ def show_overview(server):
|
||||
|
||||
# Get the table rows with information about each module using 20 threads.
|
||||
pool = ThreadPool(20)
|
||||
table = pool.map(get_module_info, module_builds)
|
||||
# get most recent builds
|
||||
table = pool.map(get_module_info, module_builds[-limit:])
|
||||
|
||||
# Sort it according to 'id' (first element in list).
|
||||
table = list(reversed(sorted(
|
||||
@@ -352,6 +383,11 @@ def main():
|
||||
"the 'submit' subcommand.")
|
||||
parser_watch.add_argument("build_id")
|
||||
|
||||
parser_info = subparsers.add_parser(
|
||||
'info', help="display detailed information about selected module build",
|
||||
description="Display detailed information about selected module build.")
|
||||
parser_info.add_argument("build_id")
|
||||
|
||||
parser_cancel = subparsers.add_parser(
|
||||
'cancel', help="cancel module build",
|
||||
description="Cancels the build submitted by 'submit' subcommand.")
|
||||
@@ -369,6 +405,12 @@ def main():
|
||||
parser_overview = subparsers.add_parser(
|
||||
'overview', help="show overview of module builds",
|
||||
description="Shows overview of module builds.")
|
||||
parser_overview.add_argument(
|
||||
'--finished', dest='finished', action='store_true', default=False,
|
||||
help="show only finished module builds")
|
||||
parser_overview.add_argument(
|
||||
'--limit', dest='limit', action='store', type=int, default=30,
|
||||
help="the number of recent builds to show")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
@@ -404,7 +446,9 @@ def main():
|
||||
# Cancel the module build
|
||||
cancel_module_build(args.server, args.idprovider, args.build_id)
|
||||
elif args.cmd_name == "overview":
|
||||
show_overview(args.server)
|
||||
show_overview(args.server, finished=args.finished, limit=args.limit)
|
||||
elif args.cmd_name == "info":
|
||||
show_module_info(args.server, args.build_id)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user