def test_monitor(): m = Manager() monitored = [] def cb(evtype, info): monitored.append((evtype, info)) m.start() testfile, cmd, args, wdir = dummy_cmd() configa = ProcessConfig("a", cmd, args=args, cwd=wdir) m.load(configa) time.sleep(0.2) os_pid = m.running[1].os_pid m.monitor(cb, "a") def stop(handle): m.unmonitor(cb, "a") m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.3, 0.0) m.run() assert len(monitored) >= 1 res = monitored[0] assert res[0] == "stat" assert "cpu" in res[1] assert res[1]["os_pid"] == os_pid
def start_manager(): http_endpoint = HttpEndpoint(uri="%s:%s" % (TEST_HOST, TEST_PORT)) http_handler = HttpHandler(endpoints=[http_endpoint]) m = Manager() m.start(apps=[http_handler]) time.sleep(0.2) return m
def init1(): m = Manager() m.start() ctl = Controller(m) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) return m, ctl, testfile, config
def test_monitor(): m = Manager() monitored = [] def cb(evtype, info): monitored.append((evtype, info)) m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("a", cmd, args=args, cwd=wdir) time.sleep(0.2) pid = m.running[1].pid m.monitor("a", cb) def stop(handle): m.unmonitor("a", cb) m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.3, 0.0) m.run() assert len(monitored) >= 1 res = monitored[0] assert res[0] == "stat" assert "cpu" in res[1] assert res[1]["pid"] == pid
def test_start_multiple(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=2) m.load(config) state = m._get_locked_state("dummy") assert len(state.running) == 2 m.stop() m.run()
def test_stats(): m = Manager() monitored = [] def cb(info): monitored.append(info) m.start() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("a", cmd, args=args, cwd=wdir) m.load(config) os_pid = m.running[1].os_pid chan = m.subscribe("STATS:default.a") chan.bind(cb) def stop(handle): chan.unbind(cb) m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.3, 0.0) m.run() assert len(monitored) >= 1 res = monitored[0] assert "cpu" in res assert res["os_pid"] == os_pid
def test_flapping(): m = Manager() m.start() states = [] cmd, args, wdir = crash_cmd() # create flapping info object flapping = FlappingInfo(attempts=1., window=1, retry_in=0.1, max_retry=1) # load conf conf1 = ProcessConfig("crashing", cmd, args=args, cwd=wdir, flapping=flapping) conf2 = ProcessConfig("crashing2", cmd, args=args, cwd=wdir) m.load(conf1) m.load(conf2) time.sleep(0.2) def cb(handle): state = m._get_locked_state("crashing") states.append(state.stopped) state2 = m._get_locked_state("crashing2") states.append(state2.stopped) m.stop() t = pyuv.Timer(m.loop) t.start(cb, 0.8, 0.0) m.run() assert states == [True, False]
def test_simple(): m = Manager() m.start() assert m.started == True def on_stop(manager): assert manager.started == False m.stop(on_stop) m.run()
def test_lookup_client_events(): # intiallize the lookupd server loop = pyuv.Loop.default_loop() r = Registry(loop) sock = bind_sockets(LOOKUPD_ADDR) io_loop = IOLoop(_loop=loop) server = http_server(io_loop, sock, registration_db=r) server.start() lookup_address = "http://%s" % LOOKUPD_ADDR client = LookupServer(lookup_address, loop) channel = client.lookup() emitted = [] def cb(event, msg): emitted.append((event, msg)) channel.bind_all(cb) channel.start() http_handler = HttpHandler( MockConfig(bind=GAFFERD_ADDR, lookupd_addresses=[lookup_address])) m = Manager(loop=loop) t = pyuv.Timer(loop) t0 = pyuv.Timer(loop) def do_stop(h): channel.close() server.stop() io_loop.close(True) def stop_server(m): t.start(do_stop, 0.4, 0.0) def wait(h): m.stop(stop_server) def on_manager(h): # start the manager with the HTTP API m.start(apps=[http_handler]) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) m.load(config) m.stop_process(1) m.unload("dummy") h.start(wait, 0.3, 0.0) t0.start(on_manager, 0.3, 0.0) loop.run() actions = [line[0] for line in emitted] assert len(emitted) == 7 assert list(actions) == [ 'add_node', 'identify', 'add_job', 'add_process', 'remove_process', 'remove_job', 'remove_node' ]
def test_restart_manager(): results = [] m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=4) m.load(config) results.append(m.pids("dummy")) def cb(manager): results.append(m.pids("dummy")) m.stop() m.restart() t = pyuv.Timer(m.loop) t.start(cb, 0.4, 0.0) m.run() assert results[0] != results[1]
def test_flapping(): m = Manager() m.start() states = [] cmd, args, wdir = crash_cmd() flapping = FlappingInfo(attempts=1, window=1., retry_in=0.1, max_retry=1) m.add_process("crashing", cmd, args=args, cwd=wdir, flapping=flapping) m.add_process("crashing2", cmd, args=args, cwd=wdir) time.sleep(0.2) def cb(handle): state = m.get_process("crashing") states.append(state.stopped) state2 = m.get_process("crashing2") states.append(state2.stopped) m.stop() t = pyuv.Timer(m.loop) t.start(cb, 0.8, 0.0) m.run() assert states == [True, False]
def test_multiple_handers(): http_endpoint = HttpEndpoint(uri="%s:%s" % (TEST_HOST, TEST_PORT)) http_endpoint2 = HttpEndpoint(uri="%s:%s" % (TEST_HOST, TEST_PORT2)) http_handler = HttpHandler(endpoints=[http_endpoint, http_endpoint2]) m = Manager() m.start(apps=[http_handler]) time.sleep(0.2) s = Server("http://%s:%s" % (TEST_HOST, TEST_PORT), loop=m.loop) s2 = Server("http://%s:%s" % (TEST_HOST, TEST_PORT2), loop=m.loop) assert TEST_PORT != TEST_PORT2 assert s.version == __version__ assert s2.version == __version__ m.stop() m.run()
def test_send_signal(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir) time.sleep(0.2) state = m.get_process_state("dummy") processes = state.list_processes() m.send_signal("dummy", signal.SIGHUP) time.sleep(0.2) m.send_signal(processes[0].id, signal.SIGHUP) m.stop_process("dummy") def stop(handle): handle.stop() m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.8, 0.0) m.run() with open(testfile, 'r') as f: res = f.read() assert res == 'STARTHUPHUPQUITSTOP'
def test_restart_manager(): results = [] m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, numprocesses=4) state = m.get_process_state("dummy") results.append(state.pids) def cb(manager): state = m.get_process_state("dummy") results.append(state.pids) m.stop() m.restart() t = pyuv.Timer(m.loop) t.start(cb, 0.4, 0.0) m.run() assert results[0] != results[1]
def test_process_id(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, numprocesses=4) state = m.get_process_state("dummy") processes = state.list_processes() assert isinstance(processes, list) p = processes[0] assert isinstance(p, Process) assert p.id == 1 p = processes[2] assert p.id == 3 m.stop() m.run()
def test_manager_hooks(): hooks = create_hooks(['load', 'unload', 'start', 'update', 'stop', 'job.default.dummy.start', 'job.default.dummy.spawn', 'job.default.dummy.stop', 'job.default.dummy.exit']) emitted = [] loop = pyuv.Loop.default_loop() s = get_server(loop, emitted) s.start() m = Manager(loop=loop) m.start(apps=[WebHooks(hooks)]) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=1) m.load(config) m.manage("dummy") m.scale("dummy", 1) m.unload("dummy") t = pyuv.Timer(loop) def on_stop(manager): t.start(lambda h: s.stop(), 0.4, 0.0) m.stop(on_stop) m.run() assert ('load', 'default.dummy') in emitted assert ('start', 'default.dummy') in emitted assert ('update', 'default.dummy') in emitted assert ('stop', 'default.dummy') in emitted assert ('unload', 'default.dummy') in emitted assert ('job.default.dummy.start', 'default.dummy') in emitted assert ('job.default.dummy.spawn', 'default.dummy') in emitted assert ('job.default.dummy.stop', 'default.dummy') in emitted assert ('job.default.dummy.exit', 'default.dummy') in emitted
def test_processes_stats(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() testfile1, cmd1, args1, wdir1 = dummy_cmd() m.add_process("a", cmd, args=args, cwd=wdir) time.sleep(0.2) infos = list(m.processes_stats()) m.add_process("b", cmd, args=args, cwd=wdir) infos2 = list(m.processes_stats()) m.stop() m.run() assert len(infos) == 1 assert len(infos2) == 2 assert infos[0]['name'] == "a" assert infos2[0]['name'] == "a" assert infos2[1]['name'] == "b"
def test_process_exit_event(): emitted = [] m = Manager() m.start() def cb(ev, msg): emitted.append(msg) # subscribe to all events m.on('proc.dummy.exit', cb) testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir) m.stop_process("dummy") time.sleep(0.2) m.stop() m.run() assert len(emitted) == 1 assert len(emitted[0]) == 6 msg = emitted[0] assert "exit_status" in msg
def test_process_events(): emitted = [] m = Manager() m.start() def cb(ev, *args): emitted.append(ev) # subscribe to all events chan = m.subscribe("JOB:default.dummy") chan.bind_all(cb) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) m.load(config) m.unload(config) time.sleep(0.2) m.stop() m.run() assert 'start' in emitted assert 'spawn' in emitted assert 'stop' in emitted assert 'exit' in emitted
def test_start_stop_process(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir) state = m.get_process_state("dummy") assert len(state.running) == 1 m.stop_process("dummy") assert len(state.running) == 0 m.stop() m.run()
def test_priority(): m = Manager() started = [] def cb(evtype, info): started.append(info['name']) m.start() m.subscribe('start', cb) testfile, cmd, args, wdir = dummy_cmd() m.add_process("a", cmd, args=args, cwd=wdir, start=False) m.add_process("d", cmd, args=args, cwd=wdir, start=False) m.add_process("b", cmd, args=args, cwd=wdir, start=False) m.start_processes() def stop(handle): m.unsubscribe("start", cb) m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.4, 0.0) m.run() assert started == ["a", "d", "b"]
def test_simple_job(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) m.load(config, start=False) state = m._get_locked_state("dummy") assert state.numprocesses == 1 assert state.name == "default.dummy" assert state.cmd == cmd assert state.config['args'] == args assert state.config['cwd'] == wdir m.unload("dummy") with pytest.raises(ProcessError): m._get_locked_state("dummy") m.stop() m.run()
def test_process_commit(): emitted = [] m = Manager() m.start() def cb(ev, msg): emitted.append(msg) # subscribe to all events m.events.subscribe('job.default.dummy.exit', cb) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=0) m.load(config) pids0 = m.pids() pid = m.commit("dummy", env={"BLAH": "test"}) process = m.get_process(pid) pids1 = m.pids() state = m._get_locked_state("dummy") assert len(state.running) == 0 assert state.numprocesses == 0 assert len(state.running_out) == 1 m.unload("dummy") time.sleep(0.2) m.stop() m.run() assert pids0 == [] assert pid == 1 assert process.name == "default.dummy" assert process.pid == 1 assert "BLAH" in process.env assert pids1 == [1] assert len(emitted) == 1 assert len(emitted[0]) == 7 msg = emitted[0] assert "exit_status" in msg assert msg['once'] == True
def test_events(): emitted = [] m = Manager() m.start() def cb(ev, msg): emitted.append((ev, msg['name'])) # subscribe to all events m.on('.', cb) testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, numprocesses=4) m.ttin("dummy", 1) m.remove_process("dummy") time.sleep(0.2) m.stop() m.run() assert ('create', 'dummy') in emitted assert ('start', 'dummy') in emitted assert ('update', 'dummy') in emitted assert ('stop', 'dummy') in emitted assert ('delete', 'dummy') in emitted
def test_process_events(): emitted = [] m = Manager() m.start() def cb(ev, *args): emitted.append(ev) # subscribe to all events m.on('proc.dummy', cb) testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir) m.stop_process("dummy") time.sleep(0.2) m.stop() m.run() assert 'proc.dummy.start' in emitted assert 'proc.dummy.spawn' in emitted assert 'proc.dummy.stop' in emitted assert 'proc.dummy.exit' in emitted
def test_ttou(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, numprocesses=4) state = m.get_process_state("dummy") assert len(state.running) == 4 ret = m.ttou("dummy", 1) assert ret == 3 time.sleep(0.2) assert len(state.running) == 3 ret = m.ttou("dummy", 2) assert ret == 1 time.sleep(0.2) assert len(state.running) == 1 m.stop() m.run()
def test_process_stats(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir) time.sleep(0.2) info = m.get_process_stats("dummy") info_by_id = m.get_process_stats(1) pid = m.running[1].pid m.stop() m.run() assert isinstance(info, dict) assert isinstance(info_by_id, dict) assert "pid" in info_by_id assert info_by_id["pid"] == pid assert info['name'] == "dummy" assert len(info['stats']) == 1 assert info['stats'][0]['pid'] == info_by_id['pid']
def test_numprocesses(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, numprocesses=4) state = m.get_process_state("dummy") assert len(state.running) == 4 state.numprocesses = 0 assert state.numprocesses == 0 m.manage_process("dummy") time.sleep(0.2) assert len(state.running) == 0 m.stop() m.run()
def test_start_stop_job(): res = [] m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) m.load(config) state = m._get_locked_state("dummy") res.append(len(state.running)) m.stop_job("dummy") res.append(len(state.running)) m.stop() m.run() assert res == [1, 0]
def test_manager_hooks(): hooks = create_hooks(['create', 'start', 'update', 'stop', 'delete', 'proc.dummy.start', 'proc.dummy.spawn', 'proc.dummy.stop', 'proc.dummy.exit']) emitted = [] loop = pyuv.Loop.default_loop() s = get_server(loop, emitted) s.start() m = Manager(loop=loop) m.start(apps=[WebHooks(hooks)]) testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, numprocesses=4) m.ttin("dummy", 1) m.remove_process("dummy") time.sleep(0.2) def on_stop(manager): s.stop() m.stop(on_stop) m.run() assert ('create', 'dummy') in emitted assert ('start', 'dummy') in emitted assert ('update', 'dummy') in emitted assert ('stop', 'dummy') in emitted assert ('delete', 'dummy') in emitted assert ('proc.dummy.start', 'dummy') in emitted assert ('proc.dummy.spawn', 'dummy') in emitted assert ('proc.dummy.stop', 'dummy') in emitted assert ('proc.dummy.exit', 'dummy') in emitted
def test_group(): m = Manager() started = [] stopped = [] def cb(evtype, info): if evtype == "start": started.append(info['name']) elif evtype == "stop": stopped.append(info['name']) m.start() m.subscribe('start', cb) m.subscribe('stop', cb) testfile, cmd, args, wdir = dummy_cmd() m.add_process("ga:a", cmd, args=args, cwd=wdir, start=False) m.add_process("ga:b", cmd, args=args, cwd=wdir, start=False) m.add_process("gb:a", cmd, args=args, cwd=wdir, start=False) groups = sorted(m.get_groups()) ga1 = m.get_group('ga') gb1 = m.get_group('gb') m.start_group("ga") m.stop_group("ga") time.sleep(0.2) m.remove_process("ga:a") ga2 = m.get_group('ga') m.stop_group("gb") def stop(handle): m.unsubscribe("start", cb) m.unsubscribe("stop", cb) m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.6, 0.0) m.run() assert groups == ['ga', 'gb'] assert ga1 == ['ga:a', 'ga:b'] assert gb1 == ['gb:a'] assert started == ['ga:a', 'ga:b'] assert stopped == ['ga:a', 'ga:b', 'gb:a'] assert ga2 == ['ga:b']
def start_manager(): http_handler = HttpHandler(MockConfig(bind=TEST_URI)) m = Manager() m.start(apps=[http_handler]) time.sleep(0.2) return m
def test_simple_process(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, start=False) state = m.get_process_state("dummy") assert state.numprocesses == 1 assert state.name == "dummy" assert state.cmd == cmd assert state.settings['args'] == args assert state.settings['cwd'] == wdir m.remove_process("dummy") assert m.get_process_state("dummy") == None m.stop() m.run()
def test_basic(): emitted = [] m = Manager() m.start() def cb(ev, msg): emitted.append((ev, msg['name'])) # subscribe to all events chan = m.subscribe("EVENTS") chan.bind('.', cb) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=4) m.load(config) m.scale("dummy", 1) m.unload("dummy") time.sleep(0.2) m.stop() m.run() assert ('load', 'default.dummy') in emitted assert ('start', 'default.dummy') in emitted assert ('update', 'default.dummy') in emitted assert ('stop', 'default.dummy') in emitted assert ('unload', 'default.dummy') in emitted
def test_start_multiple(): m = Manager() m.start() testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, numprocesses=2) state = m.get_process_state("dummy") assert len(state.running) == 2 m.stop() m.run()