ArielGlenn has submitted this change and it was merged.

Change subject: git deploy cleanup <minion> to toss minion from redis
......................................................................


git deploy cleanup <minion> to toss minion from redis

Bug: T74319
Change-Id: Ieee79ae8932a905d43f33f0b3f0dd09eed8bd4df
---
M trigger/config.py
M trigger/drivers/__init__.py
M trigger/drivers/trebuchet/local.py
M trigger/shell.py
4 files changed, 60 insertions(+), 0 deletions(-)

Approvals:
  ArielGlenn: Verified; Looks good to me, approved



diff --git a/trigger/config.py b/trigger/config.py
index 561a02b..f1d4a8c 100644
--- a/trigger/config.py
+++ b/trigger/config.py
@@ -107,6 +107,10 @@
                 'required': True,
                 'default': 'trebuchet.local.ReportDriver'
             },
+            'deploy.cleanup-driver': {
+                'required': True,
+                'default': 'trebuchet.local.CleanupDriver'
+            },
         }
         self._register_config(driver_config)
         for driver in driver_config:
diff --git a/trigger/drivers/__init__.py b/trigger/drivers/__init__.py
index d7848da..90a2874 100644
--- a/trigger/drivers/__init__.py
+++ b/trigger/drivers/__init__.py
@@ -93,3 +93,18 @@
 
     def report(self, args):
         raise NotImplementedError
+
+
+class CleanupDriverError(Exception):
+    def __init__(self, message, errorno):
+        Exception.__init__(self, message)
+        self.errorno = errorno
+
+    def __str__(self):
+        return self.message
+
+
+class CleanupDriver(Driver):
+
+    def cleanup(self, args):
+        raise NotImplementedError
diff --git a/trigger/drivers/trebuchet/local.py 
b/trigger/drivers/trebuchet/local.py
index 53ef5d2..413c823 100644
--- a/trigger/drivers/trebuchet/local.py
+++ b/trigger/drivers/trebuchet/local.py
@@ -26,6 +26,7 @@
 from trigger.drivers import LockDriverError
 from trigger.drivers import ServiceDriverError
 from trigger.drivers import ReportDriverError
+from trigger.drivers import CleanupDriverError
 
 LOG = config.LOG
 
@@ -383,3 +384,25 @@
             else:
                 ret['pending'][minion] = data
         return ret
+
+
+class CleanupDriver(drivers.CleanupDriver):
+
+    def __init__(self, conf):
+        self.conf = conf
+        self._report_driver = self.conf.drivers['report-driver']
+
+    def cleanup(self, minion):
+        repo_name = self.conf.config['deploy.repo-name']
+        serv = self._report_driver._get_redis_serv()
+        minions = serv.smembers('deploy:{0}:minions'.format(repo_name))
+        if minion not in minions:
+            raise CleanupDriverError("No such minion {0} known in redis for 
repo".format(
+                minion), 1)
+        else:
+            # remove minion hash, then remove minion from the set
+            minion_key = 'deploy:{0}:minions:{1}'.format(repo_name, minion)
+            serv.delete(minion_key)
+            serv.srem('deploy:{0}:minions'.format(repo_name), minion)
+            LOG.info("removed minion {0} from redis targets for {1}".format(
+                minion, repo_name))
diff --git a/trigger/shell.py b/trigger/shell.py
index 111f64c..fa0aa8c 100755
--- a/trigger/shell.py
+++ b/trigger/shell.py
@@ -29,6 +29,7 @@
 from trigger.drivers import SyncDriverError
 from trigger.drivers import ServiceDriverError
 from trigger.drivers import ReportDriverError
+from trigger.drivers import CleanupDriverError
 from trigger.config import ConfigurationError
 from datetime import datetime
 from git import GitCommandError
@@ -54,6 +55,7 @@
         self._sync_driver = self.conf.drivers['sync-driver']
         self._service_driver = self.conf.drivers['service-driver']
         self._report_driver = self.conf.drivers['report-driver']
+        self._cleanup_driver = self.conf.drivers['cleanup-driver']
 
     def do_start(self, args):
         """
@@ -270,6 +272,22 @@
         else:
             self.parser.print_help()
 
+    @utils.arg('minion',
+               metavar='<minion>',
+               help='Minion to remove from redis known minions for this repo')
+    def do_cleanup(self, args):
+        """
+        Clean up dead minions for this repository
+        """
+        if not args.minion:
+            msg = "minion name must be specified as argument"
+            raise TriggerError(msg, 1)
+        else:
+            try:
+                self._cleanup_driver.cleanup(args.minion)
+            except CleanupDriverError as e:
+                LOG.error(e.message)
+
     def _discover_extensions(self):
         extensions = []
         for name, module in self._discover_via_extension_path():

-- 
To view, visit https://gerrit.wikimedia.org/r/219852
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ieee79ae8932a905d43f33f0b3f0dd09eed8bd4df
Gerrit-PatchSet: 5
Gerrit-Project: operations/software/deployment/trebuchet-trigger
Gerrit-Branch: master
Gerrit-Owner: ArielGlenn <ar...@wikimedia.org>
Gerrit-Reviewer: Aklapper <aklap...@wikimedia.org>
Gerrit-Reviewer: ArielGlenn <ar...@wikimedia.org>
Gerrit-Reviewer: BryanDavis <bda...@wikimedia.org>
Gerrit-Reviewer: Cscott <canan...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to