def test_procstate_events_published(): server = FakeRPC() host = Host('somewhere', server) host.redis = mock.Mock() host.redis.pipeline.return_value = MockContextManager() host.redis.hkeys.return_value = [] epayload = ( 'processname:dummyproc groupname:dummyproc from_state:STOPPED tries:0' ) eheaders = { 'ver': '3.0', 'server': 'supervisor', 'serial': '21', 'pool': 'listener', 'poolserial': '10', 'eventname': 'PROCESS_STATE_RUNNING', 'len': str(len(epayload)), } ev = publisher.Event(eheaders, epayload, host.name) publisher.handle_event(ev, host, 'fake_channel') _, args, kwargs = host.redis.publish.mock_calls[0] assert args[0] == 'fake_channel' expected_data = Proc( host, dict(host.supervisor.process_info['dummyproc']) ).as_dict() expected_data['event'] = 'PROCESS_STATE_RUNNING' published_data = json.loads(args[1]) assert expected_data == published_data
def test_removals_include_parsed_procname(): server = FakeRPC() host = Host('somewhere', server) host.redis = mock.Mock() host.redis.pipeline.return_value = MockContextManager() host.redis.hkeys.return_value = [] epayload = 'groupname:node_example-v2-local-f96054b7-web-5003' eheaders = { 'ver': '3.0', 'server': 'supervisor', 'serial': '21', 'pool': 'listener', 'poolserial': '10', 'eventname': 'PROCESS_GROUP_REMOVED', 'len': str(len(epayload)), } ev = publisher.Event(eheaders, epayload, host.name) publisher.handle_event(ev, host, 'fake_channel') _, args, kwargs = host.redis.publish.mock_calls[0] parsed = json.loads(args[1]) assert parsed['app_name'] == 'node_example' assert parsed['hash'] == 'f96054b7' assert parsed['proc_name'] == 'web' assert parsed['config_name'] == 'local' assert parsed['version'] == 'v2' assert parsed['port'] == 5003
def test_removal_events_published(): server = FakeRPC() host = Host('somewhere', server) host.redis = mock.Mock() host.redis.pipeline.return_value = MockContextManager() host.redis.hkeys.return_value = [] epayload = 'groupname:dummyproc' eheaders = { 'ver': '3.0', 'server': 'supervisor', 'serial': '21', 'pool': 'listener', 'poolserial': '10', 'eventname': 'PROCESS_GROUP_REMOVED', 'len': str(len(epayload)), } ev = publisher.Event(eheaders, epayload, host.name) publisher.handle_event(ev, host, 'fake_channel') _, args, kwargs = host.redis.publish.mock_calls[0] assert args[0] == 'fake_channel' parsed = json.loads(args[1]) assert parsed['name'] == 'dummyproc' assert parsed['event'] == 'PROCESS_GROUP_REMOVED' assert 'time' in parsed
def redis_bundle(skip_if_redis_missing, redisdb, request): server = FakeRPC() vars(request.instance).update( redis=redisdb, server=server, supervisor=server.supervisor, host=Host('somewhere', server, redis_or_url=redisdb), )
def test_events_cache_all_procs(): server = FakeRPC() host = Host('somewhere', server) host.redis = mock.Mock() host.redis.pipeline.return_value = pipe = MockContextManager() host.redis.hkeys.return_value = [] tick = get_tick() publisher.handle_event(tick, host, 'fake_channel') calls = pipe.mock.mock_calls assert calls[0][0] == 'delete' cache_key, hashdict = calls[1][1] assert cache_key == 'host_procs:somewhere' for k in hashdict: assert k in ('dummyproc', 'node_example-v2-local-f96054b7-web-5003') # Make sure the saved values are json dicts procdata = json.loads(hashdict[k]) assert isinstance(procdata, dict) assert calls[2] == mock.call.expire('host_procs:somewhere', 600) assert calls[3] == mock.call.execute()
def test_ticks_get_fresh_data(): server = mock.Mock() host = Host('somewhere', server) tick = get_tick() try: publisher.handle_event(tick, host, 'fake_channel') except TypeError: # TypeError: 'Mock' object is not iterable # This happens after the bit we're testing, so ignore it. pass assert server.supervisor.mock_calls == [mock.call.getAllProcessInfo()]
def main(): if 'SUPERVISOR_SERVER_URL' not in os.environ: raise SystemExit('supervisor_events_publisher must be run as a ' 'supervisor event listener') # Use Supervisor's own RPC interface to get full proc data on each process # state change, since the emitted events don't have everything we want. rpc = supervisor_utils.getRPCInterface(os.environ) rcon = redis.StrictRedis.from_url(os.environ['REDIS_URL']) hostname = os.getenv('HOSTNAME', socket.getfqdn()) log('proc_publisher starting with hostname %s' % hostname) log('connecting to Redis') host = Host( hostname, rpc_or_port=rpc, redis_or_url=rcon, ) for e in EventStream(hostname): handle_event(e, host, 'proc_events') log(e.emit())
def setUp(self): self.server = FakeRPC() self.host = Host('somewhere', self.server) self.dummyproc = self.host.get_proc('dummyproc') self.nodeproc = self.host.get_proc( 'node_example-v2-local-f96054b7-web-5003')
class FakeProcCase(unittest.TestCase): def setUp(self): self.server = FakeRPC() self.host = Host('somewhere', self.server) self.dummyproc = self.host.get_proc('dummyproc') self.nodeproc = self.host.get_proc( 'node_example-v2-local-f96054b7-web-5003') def test_hostname(self): assert self.dummyproc.host.name == 'somewhere' def test_name(self): assert self.dummyproc.name == 'dummyproc' def test_start(self): ts = utc.datetime(2012, 12, 19, 6, 19, 46) assert self.dummyproc.start_time == ts def test_stop(self): ts = utc.datetime(2012, 12, 19, 6, 19, 46) assert self.dummyproc.stop_time == ts def test_now(self): ts = utc.datetime(2012, 12, 19, 6, 19, 46) assert self.dummyproc.now == ts def test_description(self): assert self.dummyproc.description == 'pid 5556, uptime 16:05:53' def test_group(self): assert self.dummyproc.group == 'dummyproc' def test_logfile(self): assert self.dummyproc.logfile == ( '/var/log/supervisor/dummyproc-stdout---supervisor-cYv5Q2.log') def test_pid(self): assert self.dummyproc.pid == 5556 def test_spawnerr(self): assert self.dummyproc.spawnerr == '' def test_statename(self): assert self.dummyproc.statename == 'RUNNING' def test_stderr_logfile(self): assert self.dummyproc.stderr_logfile == '/tmp/pub.log' def test_stdout_logfile(self): assert self.dummyproc.stdout_logfile == ( '/var/log/supervisor/dummyproc-stdout---supervisor-cYv5Q2.log') def test_as_dict(self): assert self.dummyproc.as_dict() == { 'app_name': 'dummyproc', 'description': 'pid 5556, uptime 16:05:53', 'exitstatus': 0, 'group': 'dummyproc', 'hash': 'UNKNOWN', 'host': 'somewhere', 'id': 'somewhere-dummyproc', 'jsname': 'dummyproc', 'logfile': ('/var/log/supervisor/dummyproc-stdout---supervisor-cYv5Q2.log'), 'name': 'dummyproc', 'now': '2012-12-19T06:19:46+00:00', 'pid': 5556, 'port': 0, 'proc_name': 'dummyproc', 'config_name': 'UNKNOWN', 'spawnerr': '', 'start_time': '2012-12-19T06:19:46+00:00', 'state': 20, 'statename': 'RUNNING', 'stderr_logfile': '/tmp/pub.log', 'stdout_logfile': ('/var/log/supervisor/dummyproc-stdout---supervisor-cYv5Q2.log'), 'stop_time': '2012-12-19T06:19:46+00:00', 'version': 'UNKNOWN', } def test_app_name(self): assert self.nodeproc.app_name == 'node_example' def test_version(self): assert self.nodeproc.version == 'v2' def test_config_name(self): assert self.nodeproc.config_name == 'local' def test_hash(self): assert self.nodeproc.hash == 'f96054b7' def test_proc_name(self): assert self.nodeproc.proc_name == 'web' def test_port(self): assert self.nodeproc.port == 5003 def test_as_node(self): assert self.nodeproc.as_node() == 'somewhere:5003' def test_shortname(self): assert self.nodeproc.shortname() == 'node_example-v2-web'
def test_get_procs_len(): server = FakeRPC() host = Host('somewhere', server) procs = host.get_procs() assert len(procs) == 2
def test_host_init_redis_url(): server = FakeRPC() host = Host('somewhere', server, redis_or_url='redis://localhost:6379/0') assert isinstance(host.redis, redis.StrictRedis)
def test_host_init_port(): host = Host('somewhere', 9001) assert str(host.rpc) == '<ServerProxy for somewhere:9001/RPC2>'
def test_datetime_none(): server = FakeRPC() server.supervisor.process_info['dummyproc']['now'] = 0 host = Host('somewhere', server) proc = host.get_proc('dummyproc') assert proc.now is None
def test_host_init_rpc(): server = FakeRPC() host = Host('somewhere', server) assert host.supervisor is server.supervisor