예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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),
    )
예제 #5
0
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()
예제 #6
0
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()]
예제 #7
0
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())
예제 #8
0
 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')
예제 #9
0
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'
예제 #10
0
def test_get_procs_len():
    server = FakeRPC()
    host = Host('somewhere', server)
    procs = host.get_procs()
    assert len(procs) == 2
예제 #11
0
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)
예제 #12
0
def test_host_init_port():
    host = Host('somewhere', 9001)
    assert str(host.rpc) == '<ServerProxy for somewhere:9001/RPC2>'
예제 #13
0
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
예제 #14
0
def test_host_init_rpc():
    server = FakeRPC()
    host = Host('somewhere', server)
    assert host.supervisor is server.supervisor