Bladeren bron

Merge pull request #311 from gmjosack/master

Add argument support to update
Mike Naberezny 11 jaren geleden
bovenliggende
commit
50bfb97223
2 gewijzigde bestanden met toevoegingen van 60 en 1 verwijderingen
  1. 28 1
      supervisor/supervisorctl.py
  2. 32 0
      supervisor/tests/test_supervisorctl.py

+ 28 - 1
supervisor/supervisorctl.py

@@ -950,8 +950,29 @@ class DefaultControllerPlugin(ControllerPluginBase):
                 raise e
 
         added, changed, removed = result[0]
+        valid_gnames = set(arg.strip().split())
+
+        # If all is specified treat it as if nothing was specified.
+        if "all" in valid_gnames:
+            valid_gnames = set()
+
+        # If any gnames are specified we need to verify that they are
+        # valid in order to print a useful error message.
+        if valid_gnames:
+            groups = set()
+            for info in supervisor.getAllProcessInfo():
+                groups.add(info['group'])
+            # New gnames would not currently exist in this set so
+            # add those as well.
+            groups.update(added)
+
+            for gname in valid_gnames:
+                if gname not in groups:
+                    self.ctl.output('ERROR: no such group: %s' % gname)
 
         for gname in removed:
+            if valid_gnames and gname not in valid_gnames:
+                continue
             results = supervisor.stopProcessGroup(gname)
             log(gname, "stopped")
 
@@ -964,6 +985,8 @@ class DefaultControllerPlugin(ControllerPluginBase):
             log(gname, "removed process group")
 
         for gname in changed:
+            if valid_gnames and gname not in valid_gnames:
+                continue
             results = supervisor.stopProcessGroup(gname)
             log(gname, "stopped")
 
@@ -972,11 +995,15 @@ class DefaultControllerPlugin(ControllerPluginBase):
             log(gname, "updated process group")
 
         for gname in added:
+            if valid_gnames and gname not in valid_gnames:
+                continue
             supervisor.addProcessGroup(gname)
             log(gname, "added process group")
 
     def help_update(self):
-        self.ctl.output("update\t\tReload config and add/remove as necessary")
+        self.ctl.output("update\t\t\tReload config and add/remove as necessary")
+        self.ctl.output("update all\t\tReload config and add/remove as necessary")
+        self.ctl.output("update <gname> [...]\tUpdate specific groups")
 
     def _clearresult(self, result):
         name = result['name']

+ 32 - 0
supervisor/tests/test_supervisorctl.py

@@ -757,6 +757,38 @@ class TestDefaultControllerPlugin(unittest.TestCase):
         plugin.do_update('')
         self.assertEqual(supervisor.processes, ['new_proc'])
 
+    def test_update_with_gname(self):
+        plugin = self._makeOne()
+        supervisor = plugin.ctl.options._server.supervisor
+
+        def reloadConfig():
+            return [[['added1', 'added2'], ['changed'], ['removed']]]
+        supervisor.reloadConfig = reloadConfig
+        supervisor.processes = ['changed', 'removed']
+
+        plugin.do_update('changed')
+        self.assertEqual(sorted(supervisor.processes),
+                         sorted(['changed', 'removed']))
+
+        plugin.do_update('added1 added2')
+        self.assertEqual(sorted(supervisor.processes),
+                         sorted(['changed', 'removed', 'added1', 'added2']))
+
+        plugin.do_update('removed')
+        self.assertEqual(sorted(supervisor.processes),
+                         sorted(['changed', 'added1', 'added2']))
+
+        supervisor.processes = ['changed', 'removed']
+        plugin.do_update('removed added1')
+        self.assertEqual(sorted(supervisor.processes),
+                         sorted(['changed', 'added1']))
+
+        supervisor.processes = ['changed', 'removed']
+        plugin.do_update('all')
+        self.assertEqual(sorted(supervisor.processes),
+                         sorted(['changed', 'added1', 'added2']))
+
+
     def test_update_changed_procs(self):
         from supervisor import xmlrpc