浏览代码

Implement 'open' command.

Chris McDonough 19 年之前
父节点
当前提交
dab9998404
共有 3 个文件被更改,包括 35 次插入2 次删除
  1. 0 2
      TODO.txt
  2. 14 0
      src/supervisor/supervisorctl.py
  3. 21 0
      src/supervisor/tests.py

+ 0 - 2
TODO.txt

@@ -20,8 +20,6 @@
 
 - Figure out how to test the actual supervisord class.
 
-- "open" command.
-
 - Test log rotation.
 
 - Command-line arg tests.

+ 14 - 0
src/supervisor/supervisorctl.py

@@ -49,6 +49,7 @@ import asyncore
 import errno
 import time
 import datetime
+import urlparse
 
 class Controller(cmd.Cmd):
 
@@ -538,6 +539,19 @@ class Controller(cmd.Cmd):
                      "process log files")
         self._output("clear all\t\t\t\tClear all process log files")
 
+    def do_open(self, arg):
+        url = arg.strip()
+        parts = urlparse.urlparse(url)
+        if parts[0] not in ('unix', 'http'):
+            self._output('ERROR: url must be http:// or unix://')
+            return
+        self.options.serverurl = url
+        self.do_status('')
+
+    def help_open(self):
+        self._output("open <url>\t\t\tConnect to a remote supervisord process.")
+        self._output("\t\t\t(for UNIX domain socket, use unix:///socket/path)")
+
 def main(args=None, options=None):
     if options is None:
         options = ClientOptions()

+ 21 - 0
src/supervisor/tests.py

@@ -1579,6 +1579,27 @@ baz            STOPPED    Jun 26 11:42 PM (OK)
         self.assertEqual(controller.stdout.getvalue(),
          'foo: cleared\nfoo2: cleared\nfailed: ERROR (failed)\n')
 
+    def test_open_fail(self):
+        options = DummyClientOptions()
+        controller = self._makeOne(options)
+        controller.stdout = StringIO()
+        result = controller.do_open('badname')
+        self.assertEqual(result, None)
+        self.assertEqual(controller.stdout.getvalue(),
+                         'ERROR: url must be http:// or unix://\n')
+
+    def test_open_succeed(self):
+        options = DummyClientOptions()
+        controller = self._makeOne(options)
+        controller.stdout = StringIO()
+        result = controller.do_open('http://localhost:9002')
+        self.assertEqual(result, None)
+        self.assertEqual(controller.stdout.getvalue(), """\
+foo            RUNNING    pid 11, uptime 0:01:40
+bar            ERROR      screwed
+baz            STOPPED    Jun 26 11:42 PM (OK)
+""")
+        
 class TailFProducerTests(unittest.TestCase):
     def _getTargetClass(self):
         from http import tail_f_producer