[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[GIT BRANCH] dominate: Add --days option to domainate



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


Reply to: