Ver código fonte

Better supervisorctl reporting on stop requests that have a FAILED status.

Chris McDonough 18 anos atrás
pai
commit
6becd804b6

+ 8 - 4
src/supervisor/supervisorctl.py

@@ -388,7 +388,7 @@ class Controller(cmd.Cmd):
                      "in")
         self._output("  priority order (see config file)")
 
-    def _stopresult(self, code, processname, default=None):
+    def _stopresult(self, code, processname, fault_string=None):
         template = '%s: ERROR (%s)'
         if code == xmlrpc.Faults.BAD_NAME:
             return template % (processname, 'no such process')
@@ -396,7 +396,9 @@ class Controller(cmd.Cmd):
             return template % (processname, 'not running')
         elif code == xmlrpc.Faults.SUCCESS:
             return '%s: stopped' % processname
-        return default
+        elif code == xmlrpc.Faults.FAILED:
+            return fault_string
+        return None
 
     def do_stop(self, arg):
         if not self._upcheck():
@@ -415,7 +417,8 @@ class Controller(cmd.Cmd):
             for result in results:
                 name = result['name']
                 code = result['status']
-                result = self._stopresult(code, name)
+                fault_string = result['description']
+                result = self._stopresult(code, name, fault_string)
                 if result is None:
                     # assertion
                     raise ValueError('Unknown result code %s for %s' %
@@ -429,7 +432,8 @@ class Controller(cmd.Cmd):
                 try:
                     result = supervisor.stopProcess(processname)
                 except xmlrpclib.Fault, e:
-                    error = self._stopresult(e.faultCode, processname)
+                    error = self._stopresult(e.faultCode, processname,
+                                             e.faultString)
                     if error is not None:
                         self._output(error)
                     else:

+ 11 - 0
src/supervisor/tests.py

@@ -2337,6 +2337,14 @@ baz            STOPPED    baz description
         self.assertEqual(controller.stdout.getvalue(),
                          'NOT_RUNNING: ERROR (not running)\n')
 
+    def test_stop_failed(self):
+        options = DummyClientOptions()
+        controller = self._makeOne(options)
+        controller.stdout = StringIO()
+        result = controller.do_stop('FAILED')
+        self.assertEqual(result, None)
+        self.assertEqual(controller.stdout.getvalue(), 'FAILED\n')
+
     def test_stop_one_success(self):
         options = DummyClientOptions()
         controller = self._makeOne(options)
@@ -2959,6 +2967,9 @@ class DummySupervisorRPCNamespace:
             raise Fault(xmlrpc.Faults.BAD_NAME, 'BAD_NAME')
         if name == 'NOT_RUNNING':
             raise Fault(xmlrpc.Faults.NOT_RUNNING, 'NOT_RUNNING')
+        if name == 'FAILED':
+            raise Fault(xmlrpc.Faults.FAILED, 'FAILED')
+        
         return True
     
     def stopAllProcesses(self):

+ 1 - 1
src/supervisor/xmlrpc.py

@@ -437,7 +437,7 @@ class SupervisorNamespaceRPCInterface:
             if not stopped:
                 msg = process.stop()
                 if msg is not None:
-                    raise RPCError(Faults.FAILED, name)
+                    raise RPCError(Faults.FAILED, msg)
                 stopped.append(1)
                 return NOT_DONE_YET