Browse Source

Expose groupname from within supervisorctl and ensure that this version of supervisorctl is talking to a 3.0 server.

Chris McDonough 18 years ago
parent
commit
19185801fc

+ 20 - 8
src/supervisor/supervisorctl.py

@@ -113,7 +113,14 @@ class Controller(cmd.Cmd):
     def _upcheck(self):
         try:
             supervisor = self._get_supervisor()
-            supervisor.getSupervisorVersion()
+            api = supervisor.getAPIVersion()
+            from supervisor import rpcinterface
+            if api != rpcinterface.API_VERSION:
+                self._output(
+                    'Sorry, this version of supervisorctl expects to '
+                    'talk to a server with API version %s, but the '
+                    'remote version is %s.' % (rpcinterface.API_VERSION, api))
+                return False
         except socket.error, why:
             if why[0] == errno.ECONNREFUSED:
                 self._output('%s refused connection' % self.options.serverurl)
@@ -281,12 +288,21 @@ class Controller(cmd.Cmd):
     def help_exit(self):
         self._output("exit\tExit the supervisor shell.")
 
+    def _procrepr(self, info):
+        template = '%(name)-32s %(state)-10s %(desc)s'
+        if info['name'] == info['group']:
+            name = info['name']
+        else:
+            name = '%s:%s' % (info['group'], info['name'])
+                    
+        return template % {'name':name, 'state':info['statename'],
+                           'desc':info['description']}
+
     def do_status(self, arg):
         if not self._upcheck():
             return
         
         supervisor = self._get_supervisor()
-        template = '%(name)-14s %(state)-10s %(desc)s'
 
         processnames = arg.strip().split()
 
@@ -300,14 +316,10 @@ class Controller(cmd.Cmd):
                     else:
                         raise
                     continue
-                newinfo = {'name':info['name'], 'state':info['statename'],
-                           'desc':info['description']}
-                self._output(template % newinfo)
+                self._output(self._procrepr(info))
         else:
             for info in supervisor.getAllProcessInfo():
-                newinfo = {'name':info['name'], 'state':info['statename'],
-                           'desc':info['description']}
-                self._output(template % newinfo)
+                self._output(self._procrepr(info))
 
     def help_status(self):
         self._output("status\t\t\tGet all process status info.")

+ 29 - 11
src/supervisor/tests/base.py

@@ -518,7 +518,7 @@ class DummySupervisorRPCNamespace:
     _shutdown = False
 
     def getAPIVersion(self):
-        return '1.0'
+        return '3.0'
 
     def readProcessLog(self, name, offset, length):
         from supervisor import xmlrpc
@@ -537,6 +537,7 @@ class DummySupervisorRPCNamespace:
         return [
             {
             'name':'foo',
+            'group':'foo',
             'pid':11,
             'state':ProcessStates.RUNNING,
             'statename':'RUNNING',
@@ -548,6 +549,7 @@ class DummySupervisorRPCNamespace:
              },
             {
             'name':'bar',
+            'group':'bar',
             'pid':12,
             'state':ProcessStates.FATAL,
             'statename':'FATAL',
@@ -558,7 +560,8 @@ class DummySupervisorRPCNamespace:
             'description':'bar description',
              },
             {
-            'name':'baz',
+            'name':'baz_01',
+            'group':'baz',
             'pid':12,
             'state':ProcessStates.STOPPED,
             'statename':'STOPPED',
@@ -575,6 +578,7 @@ class DummySupervisorRPCNamespace:
         from supervisor.process import ProcessStates
         return {
             'name':'foo',
+            'group':'foo',
             'pid':11,
             'state':ProcessStates.RUNNING,
             'statename':'RUNNING',
@@ -599,9 +603,14 @@ class DummySupervisorRPCNamespace:
     def startAllProcesses(self):
         from supervisor import xmlrpc
         return [
-            {'name':'foo', 'status': xmlrpc.Faults.SUCCESS,'description': 'OK'},
-            {'name':'foo2', 'status':xmlrpc.Faults.SUCCESS,'description': 'OK'},
-            {'name':'failed', 'status':xmlrpc.Faults.SPAWN_ERROR,
+            {'name':'foo', 'group':'foo',
+             'status': xmlrpc.Faults.SUCCESS,
+             'description': 'OK'},
+            {'name':'foo2', 'group':'foo2',
+             'status':xmlrpc.Faults.SUCCESS,
+             'description': 'OK'},
+            {'name':'failed', 'group':'failed_group',
+             'status':xmlrpc.Faults.SPAWN_ERROR,
              'description':'SPAWN_ERROR'}
             ]
 
@@ -620,9 +629,13 @@ class DummySupervisorRPCNamespace:
     def stopAllProcesses(self):
         from supervisor import xmlrpc
         return [
-            {'name':'foo','status': xmlrpc.Faults.SUCCESS,'description': 'OK'},
-            {'name':'foo2', 'status':xmlrpc.Faults.SUCCESS,'description': 'OK'},
-            {'name':'failed', 'status':xmlrpc.Faults.BAD_NAME,
+            {'name':'foo','group':'foo',
+             'status': xmlrpc.Faults.SUCCESS,
+             'description': 'OK'},
+            {'name':'foo2', 'group':'foo2',
+             'status':xmlrpc.Faults.SUCCESS,'description': 'OK'},
+            {'name':'failed', 'group':'failed_group',
+             'status':xmlrpc.Faults.BAD_NAME,
              'description':'FAILED'}
             ]
 
@@ -652,9 +665,14 @@ class DummySupervisorRPCNamespace:
     def clearAllProcessLogs(self):
         from supervisor import xmlrpc
         return [
-            {'name':'foo', 'status':xmlrpc.Faults.SUCCESS,'description': 'OK'},
-            {'name':'foo2', 'status':xmlrpc.Faults.SUCCESS,'description': 'OK'},
-            {'name':'failed','status':xmlrpc.Faults.FAILED,
+            {'name':'foo', 'group':'foo',
+             'status':xmlrpc.Faults.SUCCESS,
+             'description': 'OK'},
+            {'name':'foo2', 'group':'foo2',
+             'status':xmlrpc.Faults.SUCCESS,
+             'description': 'OK'},
+            {'name':'failed', 'group':'failed_group',
+             'status':xmlrpc.Faults.FAILED,
              'description':'FAILED'}
             ]
 

+ 31 - 13
src/supervisor/tests/test_supervisorctl.py

@@ -23,6 +23,18 @@ class ControllerTests(unittest.TestCase):
         result = controller._upcheck()
         self.assertEqual(result, True)
 
+    def test__upcheck_wrong_server_version(self):
+        options = DummyClientOptions()
+        options._server.supervisor.getAPIVersion = lambda *x: '1.0'
+        controller = self._makeOne(options)
+        controller.stdout = StringIO()
+        result = controller._upcheck()
+        self.assertEqual(result, False)
+        value = controller.stdout.getvalue()
+        self.assertEqual(value, 'Sorry, this version of supervisorctl expects '
+        'to talk to a server with API version 3.0, but the remote version is '
+        '1.0.\n')
+
     def test_onecmd(self):
         options = DummyClientOptions()
         controller = self._makeOne(options)
@@ -104,8 +116,10 @@ class ControllerTests(unittest.TestCase):
         controller.stdout = StringIO()
         result = controller.do_status('foo')
         self.assertEqual(result, None)
-        expected = "foo            RUNNING    foo description\n"
-        self.assertEqual(controller.stdout.getvalue(), expected)
+        value = controller.stdout.getvalue().strip()
+        self.assertEqual(value.split(None, 2),
+                         ['foo', 'RUNNING', 'foo description'])
+                         
 
     def test_status_allprocesses(self):
         options = DummyClientOptions()
@@ -113,12 +127,13 @@ class ControllerTests(unittest.TestCase):
         controller.stdout = StringIO()
         result = controller.do_status('')
         self.assertEqual(result, None)
-        expected = """\
-foo            RUNNING    foo description
-bar            FATAL      bar description
-baz            STOPPED    baz description
-"""
-        self.assertEqual(controller.stdout.getvalue(), expected)
+        value = controller.stdout.getvalue().split('\n')
+        self.assertEqual(value[0].split(None, 2),
+                         ['foo', 'RUNNING', 'foo description'])
+        self.assertEqual(value[1].split(None, 2),
+                         ['bar', 'FATAL', 'bar description'])
+        self.assertEqual(value[2].split(None, 2),
+                         ['baz:baz_01', 'STOPPED', 'baz description'])
 
     def test_start_fail(self):
         options = DummyClientOptions()
@@ -381,11 +396,14 @@ baz            STOPPED    baz description
         controller.stdout = StringIO()
         result = controller.do_open('http://localhost:9002')
         self.assertEqual(result, None)
-        self.assertEqual(controller.stdout.getvalue(), """\
-foo            RUNNING    foo description
-bar            FATAL      bar description
-baz            STOPPED    baz description
-""")
+        value = controller.stdout.getvalue().split('\n')
+        self.assertEqual(value[0].split(None, 2),
+                         ['foo', 'RUNNING', 'foo description'])
+        self.assertEqual(value[1].split(None, 2),
+                         ['bar', 'FATAL', 'bar description'])
+        self.assertEqual(value[2].split(None, 2),
+                         ['baz:baz_01', 'STOPPED', 'baz description'])
+#""")
 
     def test_version(self):
         options = DummyClientOptions()

+ 1 - 1
src/supervisor/tests/test_xmlrpc.py

@@ -68,7 +68,7 @@ class XMLRPCHandlerTests(unittest.TestCase):
         self.assertEqual(len(request.producers), 1)
         xml_response = request.producers[0]
         response = xmlrpclib.loads(xml_response)
-        self.assertEqual(response[0][0], '1.0')
+        self.assertEqual(response[0][0], '3.0')
         self.assertEqual(request._done, True)
         self.assertEqual(request.headers['Content-Type'], 'text/xml')
         self.assertEqual(request.headers['Content-Length'], len(xml_response))