def test_simple(): exit_res = [] def exit_cb(process, return_code, term_signal): exit_res.append(process) loop = pyuv.Loop.default_loop() testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd, on_exit_cb=exit_cb) assert p.pid == "someid" assert p.name == "dummy" assert p.cmd == cmd assert p.args == args assert cwd == cwd p.spawn() assert p.active == True time.sleep(0.2) p.stop() loop.run() assert p.active == False with open(testfile, 'r') as f: res = f.read() assert res == 'STARTQUITSTOP' assert len(exit_res) == 1 assert exit_res[0].name == "dummy" assert exit_res[0].active == False
def test_pids(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) s.load(config) time.sleep(0.2) job = s.get_job("dummy") assert isinstance(job, Job) == True pid = s.get_process(1) assert isinstance(pid, Process) == True assert pid.pid == 1 assert pid.info.get('name') == "default.dummy" assert pid.name == "default.dummy" assert pid.os_pid == pid.info.get('os_pid') assert job.pids == [1] pid.stop() assert 1 not in m.running time.sleep(0.2) assert job.pids == [2] m.stop() m.run()
def test_pids(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() p = s.add_process("dummy", cmd, args=args, cwd=wdir) time.sleep(0.2) p = s.get_process("dummy") assert isinstance(p, Process) == True pid = s.get_process(1) assert isinstance(pid, ProcessId) == True assert pid.pid == 1 assert pid.process.get('name') == "dummy" assert p.pids == [1] pid.stop() assert 1 not in m.running time.sleep(0.2) assert p.pids == [2] 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_stat_events(): loop = pyuv.Loop.default_loop() monitored = [] def cb(evtype, info): monitored.append((evtype, info)) testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd) p.spawn() time.sleep(0.2) pid = p.pid p.monitor(cb) def stop(handle): p.unmonitor(cb) assert p._process_watcher.active == False p.stop() t = pyuv.Timer(loop) t.start(stop, 0.3, 0.0) loop.run() assert len(monitored) >= 1 res = monitored[0] assert res[0] == "stat" assert "cpu" in res[1] assert res[1]["pid"] == pid
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_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_stat_events_refcount(): loop = pyuv.Loop.default_loop() monitored = [] def cb(evtype, info): monitored.append((evtype, info)) def cb2(evtype, info): monitored.append((evtype, info)) testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd) p.spawn() time.sleep(0.2) os_pid = p.os_pid p.monitor(cb) p.monitor(cb2) def stop(handle): p.unmonitor(cb) assert p._process_watcher.active == True assert p._process_watcher._refcount == 1 p.unmonitor(cb2) assert p._process_watcher.active == False p.stop() t = pyuv.Timer(loop) t.start(stop, 0.3, 0.0) loop.run() assert len(monitored) >= 2 res = monitored[0] assert res[0] == "stat" assert "cpu" in res[1]
def test_simple(): def exit_cb(process, return_code, term_signal): assert process.name == "dummy" assert process.active == False loop = pyuv.Loop.default_loop() testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd, on_exit_cb=exit_cb) assert p.id == "someid" assert p.name == "dummy" assert p.cmd == cmd assert p.args == args assert cwd == cwd p.spawn() assert p.active == True time.sleep(0.2) p.stop() loop.run() assert p.active == False with open(testfile, 'r') as f: res = f.read() assert res == 'STARTQUITSTOP'
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_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_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_remove_job(): m, s, socket = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) results = [] def cb(event, cmd): jobs = m.jobs() results.append((cmd, jobs)) socket.bind("command_success", cb) socket.send_command("load", config.to_dict(), start=False) socket.send_command("unload", "dummy") def stop(h): h.close() socket.close() m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.4, 0.0) m.run() assert len(results) == 2 cmd0, jobs0 = results[0] cmd1, jobs1 = results[1] assert cmd0.result()["ok"] == True assert cmd1.result()["ok"] == True assert len(jobs0) == 1 assert jobs0[0] == "default.dummy" assert len(jobs1) == 0
def test_simple_job(): m, s, socket = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) # send a command cmd0 = socket.send_command("load", config.to_dict(), start=False) cmd1 = socket.send_command("jobs") results = [] def do_events(h): results.append((len(m.jobs()), len(s.jobs()), s.jobs()[0])) def stop(h): h.close() socket.close() m.stop() t = pyuv.Timer(m.loop) t.start(do_events, 0.4, 0.0) t1 = pyuv.Timer(m.loop) t1.start(stop, 0.8, 0.0) m.run() assert cmd0.error() == None assert cmd1.error() == None assert results[0] == (1, 1, "default.dummy") assert cmd0.result() == {"ok": True} assert cmd1.result()["jobs"][0] == "default.dummy"
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_sessions(): m, s = init() started = [] stopped = [] def cb(evtype, info): if evtype == "start": started.append(info['name']) elif evtype == "stop": stopped.append(info['name']) m.events.subscribe('start', cb) m.events.subscribe('stop', cb) testfile, cmd, args, wdir = dummy_cmd() a = ProcessConfig("a", cmd, args=args, cwd=wdir) b = ProcessConfig("b", cmd, args=args, cwd=wdir) # load process config in different sessions m.load(a, sessionid="ga", start=False) m.load(b, sessionid="ga", start=False) m.load(a, sessionid="gb", start=False) sessions = s.sessions() ga1 = s.jobs('ga') gb1 = s.jobs('gb') start_app = lambda mgr, job: job.start() stop_app = lambda mgr, job: job.stop() s.jobs_walk(start_app, "ga") s.jobs_walk(start_app, "gb") ga2 = [] def rem_cb(h): s.unload("a", sessionid="ga") [ga2.append(name) for name in s.jobs('ga')] t0 = pyuv.Timer(m.loop) t0.start(rem_cb, 0.2, 0.0) s.jobs_walk(stop_app, "gb") def stop(handle): m.events.unsubscribe("start", cb) m.events.unsubscribe("stop", cb) m.stop() t = pyuv.Timer(m.loop) t.start(stop, 0.6, 0.0) m.run() assert len(sessions) == 2 assert sessions == ['ga', 'gb'] assert ga1 == ['ga.a', 'ga.b'] assert gb1 == ['gb.a'] assert started == ['ga.a', 'ga.b', 'gb.a'] assert stopped == ['gb.a', 'ga.a'] assert ga2 == ['ga.b']
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)
def test_remove_job(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) s.load(config, start=False) assert s.jobs()[0] == "default.dummy" s.unload("dummy") assert len(s.jobs()) == 0 assert len(m.jobs()) == 0 assert len(m.sessions) == 0 m.stop() m.run()
def test_stats(): loop = pyuv.Loop.default_loop() testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd) p.spawn() time.sleep(0.2) stats = p.stats os_pid = p.os_pid p.stop() loop.run() assert "cpu" in stats assert "mem_info1" in stats
def test_signal(): loop = pyuv.Loop.default_loop() testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd) p.spawn() time.sleep(0.2) p.kill(signal.SIGHUP) time.sleep(0.2) p.stop() loop.run() with open(testfile, 'r') as f: res = f.read() assert res == 'STARTHUPQUITSTOP'
def test_info(): loop = pyuv.Loop.default_loop() testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd) p.spawn() time.sleep(0.2) info = p.info pid = p.pid p.stop() loop.run() assert "cpu" in info assert info['pid'] == pid
def test_info(): loop = pyuv.Loop.default_loop() testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd) p.spawn() time.sleep(0.2) info = p.info os_pid = p.os_pid p.stop() loop.run() assert info['os_pid'] == os_pid assert info['name'] == "dummy" assert info['pid'] == "someid"
def test_processes(): m, s = init() assert s.processes() == [] testfile, cmd, args, wdir = dummy_cmd() m.add_process("dummy", cmd, args=args, cwd=wdir, start=False) time.sleep(0.2) assert len(m.processes) == 1 assert len(s.processes()) == 1 assert s.processes()[0] == "dummy" m.stop() m.run()
def test_redirect_output(): loop = pyuv.Loop.default_loop() monitored1 = [] monitored2 = [] def cb(evtype, info): monitored1.append((evtype, info)) def cb2(evtype, info): monitored2.append((evtype, info)) testfile, cmd, args, cwd = dummy_cmd() p = Process(loop, "someid", "dummy", cmd, args=args, cwd=cwd, redirect_output=["stdout", "stderr"]) p.spawn() time.sleep(0.2) pid = p.pid p.monitor_io("stdout", cb) p.monitor_io("stderr", cb2) p.stop() loop.run() assert len(monitored1) == 1 assert len(monitored2) == 1 ev1 = monitored1[0] ev2 = monitored2[0] assert ev1[0] == 'stdout' assert ev1[1] == { 'data': b'hello out', 'pid': "someid", 'name': 'dummy', 'event': 'stdout' } assert ev2[0] == 'stderr' assert ev2[1] == { 'data': b'hello err', 'pid': "someid", 'name': 'dummy', 'event': 'stderr' }
def test_process_remove(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() s.add_process("dummy", cmd, args=args, cwd=wdir, start=False) assert s.processes()[0] == "dummy" s.remove_process("dummy") assert len(s.processes()) == 0 assert len(m.processes) == 0 m.stop() m.run()
def test_running(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() p = s.add_process("dummy", cmd, args=args, cwd=wdir) time.sleep(0.2) assert len(m.running) == 1 assert len(s.running()) == 1 assert 1 in m.running assert s.running()[0] == 1 m.stop() m.run()
def test_running(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() s.add_process("dummy", cmd, args=args, cwd=wdir) time.sleep(0.2) assert len(m.running) == 1 assert len(s.running()) == 1 assert 1 in m.running assert s.running()[0] == 1 m.stop() m.run()
def test_simple_job(): m, s = init() assert s.jobs() == [] testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) m.load(config, start=False) time.sleep(0.2) assert len(m.jobs()) == 1 assert len(s.jobs()) == 1 assert s.jobs()[0] == "default.dummy" m.stop() m.run()
def test_running(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) job = s.load(config) time.sleep(0.2) assert len(m.running) == 1 assert len(s.running()) == 1 assert 1 in m.running assert s.running()[0] == 1 m.stop() m.run()
def test_stats(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir) s.load(config) time.sleep(0.2) pid = s.get_process(1) assert isinstance(pid, Process) == True assert pid.pid == 1 stats = pid.stats assert isinstance(stats, dict) == True assert "cpu" in stats assert "mem_info1" in stats pid.stop() m.stop() m.run()
def test_groups(): m, s = init() started = [] stopped = [] def cb(evtype, info): if evtype == "start": started.append(info['name']) elif evtype == "stop": stopped.append(info['name']) 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(s.groups()) ga1 = s.get_group('ga') gb1 = s.get_group('gb') s.start_group("ga") s.stop_group("ga") time.sleep(0.2) m.remove_process("ga:a") time.sleep(0.2) ga2 = s.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.4, 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 test_commit(): m, s, socket = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=0) # send a command cmd0 = socket.send_command("load", config.to_dict(), start=False) cmd1 = socket.send_command("commit", "dummy") def stop(c): socket.close() m.stop() cmd1.add_done_callback(stop) m.run() assert cmd0.error() == None assert cmd1.error() == None assert cmd0.result() == {"ok": True} assert cmd1.result()["pid"] == 1
def test_process_create(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() s.add_process("dummy", cmd, args=args, cwd=wdir, start=False) time.sleep(0.2) assert len(m.processes) == 1 assert len(s.processes()) == 1 assert s.processes()[0] == "dummy" assert "dummy" in m.processes assert len(m.running) == 0 with pytest.raises(GafferConflict): s.add_process("dummy", cmd, args=args, cwd=wdir, start=False) p = s.get_process("dummy") assert isinstance(p, Process) m.stop() m.run()
def test_job_commit(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=0) job = s.load(config, start=False) time.sleep(0.2) assert isinstance(job, Job) assert job.active == False assert job.numprocesses == 0 assert job.running == 0 assert job.running_out == 0 pid = job.commit() assert pid == 1 assert s.pids() == [1] assert job.active == True assert job.numprocesses == 0 assert job.running == 1 assert job.running_out == 1 state = m._get_locked_state("dummy") assert len(state.running) == 0 assert state.numprocesses == 0 assert len(state.running_out) == 1 assert m.pids() == [1] job.scale(1) assert s.pids() == [1, 2] assert job.active == True assert job.numprocesses == 1 assert job.running == 2 assert job.running_out == 1 m.stop() m.run()
def test_basic_socket(): m = start_manager() s = get_server(m.loop) t = pyuv.Timer(m.loop) # get a gaffer socket socket = s.socket() socket.start() messages = [] def cb(event, data): print("got %s" % event) messages.append(event) # bind to all events socket.subscribe('EVENTS') socket['EVENTS'].bind_all(cb) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=1) def stop_all(handle): m.stop() socket.close() def load_process(ev, msg): m.load(config) m.scale("dummy", 1) m.unload("dummy") t.start(stop_all, 0.6, 0.0) socket.bind("subscription_success", load_process) m.run() assert 'load' in messages assert 'start' in messages assert 'update' in messages assert 'stop' in messages assert 'unload' in messages
def test_basic_socket(): m = start_manager() s = get_server(m.loop) t = pyuv.Timer(m.loop) # get a gaffer socket socket = s.socket() socket.start() messages =[] def cb(event, data): print("got %s" % event) messages.append(event) # bind to all events socket.subscribe('EVENTS') socket['EVENTS'].bind_all(cb) testfile, cmd, args, wdir = dummy_cmd() config = ProcessConfig("dummy", cmd, args=args, cwd=wdir, numprocesses=1) def stop_all(handle): m.stop() socket.close() def load_process(ev, msg): m.load(config) m.scale("dummy", 1) m.unload("dummy") t.start(stop_all, 0.6, 0.0) socket.bind("subscription_success", load_process) m.run() assert 'load' in messages assert 'start' in messages assert 'update' in messages assert 'stop' in messages assert 'unload' in messages
def test_process_add_sub(): m, s = init() testfile, cmd, args, wdir = dummy_cmd() p = s.add_process("dummy", cmd, args=args, cwd=wdir) time.sleep(0.2) assert isinstance(p, Process) assert p.active == True assert p.numprocesses == 1 p.add(3) time.sleep(0.2) assert p.numprocesses == 4 assert p.running == 4 p.sub(3) time.sleep(0.2) assert p.numprocesses == 1 assert p.running == 1 m.stop() m.run()