From 4efd27f70df3bf107bf7ad9b80e407f98da6f862 Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Tue, 7 Feb 2023 15:14:46 +0000 Subject: Give deploy status feedback into scallywag Also: isolate each individual deploy, by putting them in a subdirectory of stagingdir named after the job id. --- calm/calm.py | 12 ++++++++++- calm/scallywag_db.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 calm/scallywag_db.py diff --git a/calm/calm.py b/calm/calm.py index 03dae45..7ea4739 100755 --- a/calm/calm.py +++ b/calm/calm.py @@ -72,6 +72,7 @@ from . import package from . import pkg2html from . import repology from . import reports +from . import scallywag_db from . import setup_exe from . import uploads from . import utils @@ -161,7 +162,14 @@ def process_uploads(args, state): with logfilters.AttrFilter(maint=m.name): process_maintainer_uploads(args, state, all_packages, m, args.homedir, 'upload') - process_maintainer_uploads(args, state, all_packages, m, args.stagingdir, 'staging', scrub=True) + + # for each deploy job + def deploy_upload(r): + m = mlist[r.user] + with logfilters.AttrFilter(maint=m.name): + return process_maintainer_uploads(args, state, all_packages, m, os.path.join(args.stagingdir, str(r.id)), 'staging', scrub=True) + + scallywag_db.do_deploys(deploy_upload) # record updated reminder times for maintainers maintainers.update_reminder_times(mlist) @@ -199,6 +207,8 @@ def process_maintainer_uploads(args, state, all_packages, m, basedir, desc, scru if not args.dryrun: utils.rmemptysubdirs(os.path.join(basedir, m.name)) + return success + def _process_maintainer_uploads(scan_result, args, state, all_packages, m, basedir, desc): name = m.name diff --git a/calm/scallywag_db.py b/calm/scallywag_db.py new file mode 100644 index 0000000..a310c55 --- /dev/null +++ b/calm/scallywag_db.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2023 Jon Turney +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +import contextlib +import os +import sqlite3 +from collections import namedtuple + +basedir = os.path.dirname(os.path.realpath(__file__)) +dbfile = os.path.join(basedir, '..', '..', 'scallywag', 'carpetbag.db') + + +def namedtuple_factory(cursor, row): + fields = [column[0] for column in cursor.description] + row_cls = namedtuple("row_cls", fields) + return row_cls(*row) + + +def do_deploys(cb): + if not os.path.exists(dbfile): + return + + with contextlib.closing(sqlite3.connect(dbfile)) as conn: + conn.row_factory = namedtuple_factory + + cur = conn.execute("SELECT * FROM jobs WHERE status = 'deploying'") + rows = cur.fetchall() + + for r in rows: + status = 'deploy succeeded' + if not cb(r): + status = 'deploy failed' + + conn.execute("UPDATE jobs SET status = ? WHERE id = ?", (status, r.id)) + + conn.commit() -- cgit v1.2.3