Hi, The git branch at mhy/dominate-expire allows users to prevent dominate cleaning anything which is less than a certain age. As the commit notes explain, this is useful in a CI environment. Thanks, Mark -- Mark Hymers <mhy at debian dot org> "The first thing we do, let's kill all the Lawyers" Henry VI Part II, Shakespeare
From 5dacc4ac80eaf513c133fa10beaae821d0e98d92 Mon Sep 17 00:00:00 2001 From: Mark Hymers <mhy@debian.org> Date: Fri, 22 Jul 2016 10:52:59 +0100 Subject: [PATCH] Add --days option to dominate Allows users to prevent the dominate script removing items which are under a certain number of days old. This is useful in, for example, continuous integration environments where packages are required for a certain amount of time, but must eventually be dominated out. Signed-off-by: Mark Hymers <mhy@debian.org> --- dak/dominate.py | 63 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/dak/dominate.py b/dak/dominate.py index 52f1b17..01e9018 100755 --- a/dak/dominate.py +++ b/dak/dominate.py @@ -22,6 +22,8 @@ Remove obsolete source and binary associations from suites. # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +from datetime import datetime, timedelta + from daklib.dbconn import * from daklib.config import Config from daklib import daklog, utils @@ -43,45 +45,53 @@ def fetch(reason, query, args, session): idList.append(id) return idList -def obsoleteAnyByAllAssociations(suite, session): +def obsoleteAnyByAllAssociations(suite, expire, session): query = """ - SELECT obsolete.id, package, obsolete.version, suite_name, arch_string + SELECT obsolete.id, obsolete.package, obsolete.version, suite_name, arch_string FROM obsolete_any_by_all_associations AS obsolete JOIN architecture ON obsolete.architecture = architecture.id JOIN suite ON obsolete.suite = suite.id - WHERE suite = :suite + JOIN binaries ON obsolete.id = binaries.id + WHERE suite = :suite AND binaries.install_date < :expire """ - return fetch('newer_all', query, { 'suite': suite }, session) + return fetch('newer_all', query, { 'suite': suite, + 'expire': expire }, session) -def obsoleteAnyAssociations(suite, session): +def obsoleteAnyAssociations(suite, expire, session): query = """ - SELECT obsolete.id, package, obsolete.version, suite_name, arch_string + SELECT obsolete.id, obsolete.package, obsolete.version, suite_name, arch_string FROM obsolete_any_associations AS obsolete JOIN architecture ON obsolete.architecture = architecture.id JOIN suite ON obsolete.suite = suite.id - WHERE suite = :suite + JOIN binaries ON obsolete.id = binaries.id + WHERE suite = :suite AND binaries.install_date < :expire """ - return fetch('newer_any', query, { 'suite': suite }, session) + return fetch('newer_any', query, { 'suite': suite, + 'expire': expire }, session) -def obsoleteSrcAssociations(suite, session): +def obsoleteSrcAssociations(suite, expire, session): query = """ - SELECT obsolete.id, source, obsolete.version, suite_name, + SELECT obsolete.id, obsolete.source, obsolete.version, suite_name, 'source' AS arch_string FROM obsolete_src_associations AS obsolete JOIN suite ON obsolete.suite = suite.id - WHERE suite = :suite + JOIN source ON obsolete.id = source.id + WHERE suite = :suite AND source.install_date < :expire """ - return fetch('old_and_unreferenced', query, { 'suite': suite }, session) + return fetch('old_and_unreferenced', query, { 'suite': suite, + 'expire': expire }, session) -def obsoleteAllAssociations(suite, session): +def obsoleteAllAssociations(suite, expire, session): query = """ - SELECT obsolete.id, package, obsolete.version, suite_name, + SELECT obsolete.id, obsolete.package, obsolete.version, suite_name, 'all' AS arch_string FROM obsolete_all_associations AS obsolete JOIN suite ON obsolete.suite = suite.id - WHERE suite = :suite + JOIN binaries ON obsolete.id = binaries.id + WHERE suite = :suite AND binaries.install_date < :expire """ - return fetch('old_and_unreferenced', query, { 'suite': suite }, session) + return fetch('old_and_unreferenced', query, { 'suite': suite, + 'expire': expire }, session) def deleteAssociations(table, idList, session): global Options @@ -95,18 +105,18 @@ def deleteAssociations(table, idList, session): params = {'idList': tuple(idList)} session.execute(query, params) -def doDaDoDa(suite, session): +def doDaDoDa(suite, expire, session): # keep this part disabled because it is too dangerous - #idList = obsoleteAnyByAllAssociations(suite, session) + #idList = obsoleteAnyByAllAssociations(suite, expire, session) #deleteAssociations('bin_associations', idList, session) - idList = obsoleteAnyAssociations(suite, session) + idList = obsoleteAnyAssociations(suite, expire, session) deleteAssociations('bin_associations', idList, session) - idList = obsoleteSrcAssociations(suite, session) + idList = obsoleteSrcAssociations(suite, expire, session) deleteAssociations('src_associations', idList, session) - idList = obsoleteAllAssociations(suite, session) + idList = obsoleteAllAssociations(suite, expire, session) deleteAssociations('bin_associations', idList, session) def usage(): @@ -117,6 +127,7 @@ Remove obsolete source and binary associations from suites. -h, --help show this help and exit -n, --no-action don't commit changes -f, --force also clean up untouchable suites + -d, --days=DAYS only clean items which are at least DAYS past install date SUITE can be comma (or space) separated list, e.g. --suite=testing,unstable""" @@ -128,7 +139,8 @@ def main(): Arguments = [('h', "help", "Obsolete::Options::Help"), ('s', "suite", "Obsolete::Options::Suite", "HasArg"), ('n', "no-action", "Obsolete::Options::No-Action"), - ('f', "force", "Obsolete::Options::Force")] + ('f', "force", "Obsolete::Options::Force"), + ('d', "days", "Obsolete::Options::Days", "HasArg")] cnf['Obsolete::Options::Help'] = '' cnf['Obsolete::Options::No-Action'] = '' cnf['Obsolete::Options::Force'] = '' @@ -141,6 +153,11 @@ def main(): suites = [suite.suite_name for suite in query_suites] cnf['Obsolete::Options::Suite'] = str(','.join(suites)) + if 'Days' in Options: + expire = datetime.now() - timedelta(days=int(cnf['Obsolete::Options::Days'])) + else: + expire = datetime.now() + if not Options['No-Action']: Logger = daklog.Logger("dominate") session = DBConn().session() @@ -153,7 +170,7 @@ def main(): continue if not suite.untouchable or Options['Force']: - doDaDoDa(suite.suite_id, session) + doDaDoDa(suite.suite_id, expire, session) if Options['No-Action']: session.rollback() else: -- 2.1.4
Attachment:
signature.asc
Description: Digital signature