Procházet zdrojové kódy

Hack in references to groups from within processes.

Chris McDonough před 18 roky
rodič
revize
15a32edbbf

+ 10 - 2
src/supervisor/events.py

@@ -54,8 +54,12 @@ class ProcessCommunicationEvent(Event):
         self.data = data
 
     def __str__(self):
-        return 'process_name: %s\nchannel: %s\n%s' % (
+        groupname = ''
+        if self.process.group is not None:
+            groupname = self.process.group.config.name
+        return 'process_name: %s\ngroup_name: %s\nchannel: %s\n%s' % (
             self.process.config.name,
+            groupname,
             self.channel,
             self.data)
 
@@ -73,7 +77,11 @@ class ProcessStateChangeEvent(Event):
         self.process = process
 
     def __str__(self):
-        return 'process_name: %s' % self.process.config.name
+        groupname = ''
+        if self.process.group is not None:
+            groupname = self.process.group.config.name
+        return 'process_name: %s\ngroup_name: %s' % (self.process.config.name,
+                                                     groupname)
 
 
 class StartingFromStoppedEvent(ProcessStateChangeEvent):

+ 4 - 2
src/supervisor/options.py

@@ -1488,9 +1488,11 @@ class ProcessConfig(Config):
         if self.stderr_capturefile is Automatic:
             self.stderr_capturefile = get_autoname(name, sid, 'stderr_capture')
             
-    def make_process(self):
+    def make_process(self, group=None):
         from supervisor.process import Subprocess
-        return Subprocess(self)
+        process = Subprocess(self)
+        process.group = group
+        return process
 
     def make_dispatchers(self, proc):
         use_stderr = not self.redirect_stderr

+ 2 - 1
src/supervisor/process.py

@@ -58,6 +58,7 @@ class Subprocess:
     pipes = None # map of channel name to file descriptor #
     exitstatus = None # status attached to dead process by finsh()
     spawnerr = None # error message attached by spawn() if any
+    group = None # ProcessGroup instance if process is in the group
     
     def __init__(self, config):
         """Constructor.
@@ -447,7 +448,7 @@ class ProcessGroupBase:
         self.config = config
         self.processes = {}
         for pconfig in self.config.process_configs:
-            self.processes[pconfig.name] = pconfig.make_process()
+            self.processes[pconfig.name] = pconfig.make_process(self)
         
 
     def __cmp__(self, other):

+ 5 - 2
src/supervisor/tests/base.py

@@ -291,6 +291,7 @@ class DummyProcess:
     stderr_buffer = '' # buffer of characters from child stderr output to log
     stdin_buffer = '' # buffer of characters to send to child process' stdin
     listener_state = None
+    group = None
 
     def __init__(self, config, state=None):
         self.config = config
@@ -431,8 +432,10 @@ class DummyPConfig:
     def create_autochildlogs(self):
         self.autochildlogs_created = True
 
-    def make_process(self):
-        return DummyProcess(self)
+    def make_process(self, group=None):
+        process = DummyProcess(self)
+        process.group = group
+        return process
 
     def make_dispatchers(self, proc):
         use_stderr = not self.redirect_stderr

+ 18 - 3
src/supervisor/tests/test_events.py

@@ -101,19 +101,27 @@ class TestSerializations(unittest.TestCase):
         pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1')
         process1 = DummyProcess(pconfig1)
         from supervisor.events import ProcessCommunicationStdoutEvent
+        class DummyGroup:
+            config = pconfig1
+        process1.group = DummyGroup
         event = ProcessCommunicationStdoutEvent(process1, 'yo')
         self.assertEqual(str(event),
-                         'process_name: process1\nchannel: stdout\nyo'
+                         'process_name: process1\ngroup_name: process1\n'
+                         'channel: stdout\nyo'
                          )
             
     def test_pcomm_stderr_event(self):
         options = DummyOptions()
         pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1')
         process1 = DummyProcess(pconfig1)
+        class DummyGroup:
+            config = pconfig1
+        process1.group = DummyGroup
         from supervisor.events import ProcessCommunicationStderrEvent
         event = ProcessCommunicationStderrEvent(process1, 'yo')
         self.assertEqual(str(event),
-                         'process_name: process1\nchannel: stderr\nyo'
+                         'process_name: process1\ngroup_name: process1\n'
+                         'channel: stderr\nyo'
                          )
 
     def test_overflow_event(self):
@@ -121,6 +129,9 @@ class TestSerializations(unittest.TestCase):
         options = DummyOptions()
         pconfig1 = DummyPConfig(options, 'foo', 'process1','/bin/process1')
         process1 = DummyProcess(pconfig1)
+        class DummyGroup:
+            config = pconfig1
+        process1.group = DummyGroup
         wrapped = events.ProcessCommunicationStderrEvent(process1, 'yo')
         event = events.EventBufferOverflowEvent(process1, wrapped)
         self.assertEqual(str(event), 'group_name: foo\nevent_type: None')
@@ -130,8 +141,12 @@ class TestSerializations(unittest.TestCase):
         options = DummyOptions()
         pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1')
         process1 = DummyProcess(pconfig1)
+        class DummyGroup:
+            config = pconfig1
+        process1.group = DummyGroup
         event = events.StartingFromStoppedEvent(process1)
-        self.assertEqual(str(event), 'process_name: process1')
+        self.assertEqual(str(event),
+                         'process_name: process1\ngroup_name: process1')
 
     def test_supervisor_sc_event(self):
         from supervisor import events

+ 9 - 0
src/supervisor/tests/test_options.py

@@ -710,6 +710,15 @@ class TestProcessConfig(unittest.TestCase):
         process = instance.make_process()
         from supervisor.process import Subprocess
         self.assertEqual(process.__class__, Subprocess)
+        self.assertEqual(process.group, None)
+
+    def test_make_process_with_group(self):
+        options = DummyOptions()
+        instance = self._makeOne(options)
+        process = instance.make_process('abc')
+        from supervisor.process import Subprocess
+        self.assertEqual(process.__class__, Subprocess)
+        self.assertEqual(process.group, 'abc')
 
     def test_make_dispatchers_stderr_not_redirected(self):
         options = DummyOptions()

+ 5 - 1
src/supervisor/tests/test_process.py

@@ -1129,13 +1129,17 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
         from supervisor.states import EventListenerStates
         event = StartingFromStoppedEvent(process1)
         process1.listener_state = EventListenerStates.READY
+        class DummyGroup:
+            config = gconfig
+        process1.group = DummyGroup
         pool.event_buffer = [event]
         pool.transition()
         self.assertEqual(process1.transitioned, True)
         self.assertEqual(pool.event_buffer, [])
         buf = process1.stdin_buffer
         self.assertTrue(buf.startswith('SUPERVISORD3.0 STARTING_FROM_STOPPED '))
-        self.assertTrue(buf.endswith('22\nprocess_name: process1'))
+        self.assertTrue(buf.endswith(
+            '43\nprocess_name: process1\ngroup_name: whatever'), buf)
         self.assertEqual(process1.listener_state, EventListenerStates.BUSY)
         self.assertEqual(process1.event, event)