def test_start_stop_stateboard_from_conf(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' write_conf(project.get_cli_cfg_path(), { 'stateboard': True, }) cli.start(project, [INSTANCE1], daemonized=True) check_instances_running(cli, project, [INSTANCE1], daemonized=True) cli.stop(project, [INSTANCE1], stateboard=True) check_instances_stopped(cli, project, [INSTANCE1], stateboard=True) write_conf(project.get_cli_cfg_path(), { 'stateboard': False, }) cli.start(project, [INSTANCE1, INSTANCE2], daemonized=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True) cli.stop(project, [INSTANCE1, INSTANCE2]) check_instances_stopped(cli, project, [INSTANCE1, INSTANCE2])
def test_start_stop_from_conf_with_stateboard(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' write_conf( project.get_cfg_path(), { project.get_instance_id(INSTANCE1): {}, project.get_instance_id(INSTANCE2): {}, }) # start instances cli.start(project, daemonized=True, stateboard=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True) # stop instances cli.stop(project, stateboard=True) check_instances_stopped(cli, project, [INSTANCE1, INSTANCE2], stateboard=True)
def test_start_stop_status_cfg(cartridge_cmd, project_with_patched_init): project = project_with_patched_init cli = Cli(cartridge_cmd) ID1 = get_instance_id(project.name, 'instance-1') ID2 = get_instance_id(project.name, 'instance-2') CFG = 'my-conf.yml' write_conf(os.path.join(project.path, CFG), { ID1: {}, ID2: {}, }) status = cli.get_status(project, cfg=CFG) assert status.get(ID1) == STATUS_NOT_STARTED assert status.get(ID2) == STATUS_NOT_STARTED cli.start(project, stateboard=True, daemonized=True, cfg=CFG) check_instances_running( cli, project, [ID1, ID2], stateboard=True, cfg=CFG, daemonized=True, ) status = cli.get_status(project, cfg=CFG) assert status.get(ID1) == STATUS_RUNNING assert status.get(ID2) == STATUS_RUNNING cli.stop(project, stateboard=True, cfg=CFG) check_instances_stopped(cli, project, [ID1, ID2]) status = cli.get_status(project, cfg=CFG) assert status.get(ID1) == STATUS_STOPPED assert status.get(ID2) == STATUS_STOPPED
def test_for_running(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' ID1 = project.get_instance_id(INSTANCE1) ID2 = project.get_instance_id(INSTANCE2) # start two instances cli.start(project, [INSTANCE1, INSTANCE2], daemonized=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True) # stop one cli.stop(project, [INSTANCE1]) check_instances_stopped(cli, project, [INSTANCE1]) check_instances_running(cli, project, [INSTANCE2], daemonized=True) # instance-1 is stopped, instance-2 is running logs = cli.clean(project, [INSTANCE1, INSTANCE2], exp_rc=1) assert_files_cleaned(project, [INSTANCE1]) assert any([line.endswith('OK') and line.startswith(ID1) for line in logs]) assert any( [line.endswith('FAILED') and line.startswith(ID2) for line in logs]) assert any(["%s: Instance is running" % ID2 in line for line in logs])
def test_start_stop_status_run_dir(start_stop_cli, project_with_patched_init): project = project_with_patched_init cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' ID1 = get_instance_id(project.name, INSTANCE1) ID2 = get_instance_id(project.name, INSTANCE2) STATEBOARD_ID = get_stateboard_name(project.name) RUN_DIR = 'my-run' status = cli.get_status(project, [INSTANCE1, INSTANCE2], stateboard=True, run_dir=RUN_DIR) assert status.get(ID1) == STATUS_NOT_STARTED assert status.get(ID2) == STATUS_NOT_STARTED cli.start(project, [INSTANCE1], stateboard=True, daemonized=True, run_dir=RUN_DIR) check_instances_running(cli, project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR, daemonized=True) status = cli.get_status(project, [INSTANCE1, INSTANCE2], stateboard=True, run_dir=RUN_DIR) assert len(status) == 3 assert status.get(ID1) == STATUS_RUNNING assert status.get(ID2) == STATUS_NOT_STARTED assert status.get(STATEBOARD_ID) == STATUS_RUNNING cli.stop(project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR) check_instances_stopped(cli, project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR) status = cli.get_status(project, [INSTANCE1, INSTANCE2], stateboard=True, run_dir=RUN_DIR) assert len(status) == 3 assert status.get(ID1) == STATUS_STOPPED assert status.get(ID2) == STATUS_NOT_STARTED assert status.get(STATEBOARD_ID) == STATUS_STOPPED
def test_start_stop_status_run_dir(cartridge_cmd, project_with_patched_init): project = project_with_patched_init cli = Cli(cartridge_cmd) ID1 = get_instance_id(project.name, 'instance-1') # ID2 = get_instance_id(project.name, 'instance-2') RUN_DIR = 'my-run' status = cli.get_status(project, [ID1], run_dir=RUN_DIR) assert status.get(ID1) == STATUS_NOT_STARTED # assert status.get(ID2) == STATUS_NOT_STARTED cli.start(project, [ID1], stateboard=True, daemonized=True, run_dir=RUN_DIR) check_instances_running( cli, project, [ID1], stateboard=True, run_dir=RUN_DIR, daemonized=True ) status = cli.get_status(project, [ID1], run_dir=RUN_DIR) assert status.get(ID1) == STATUS_RUNNING # assert status.get(ID2) == STATUS_RUNNING cli.stop(project, [ID1], stateboard=True, run_dir=RUN_DIR) check_instances_stopped(cli, project, [ID1], run_dir=RUN_DIR) status = cli.get_status(project, [ID1], run_dir=RUN_DIR) assert status.get(ID1) == STATUS_STOPPED
def test_start_stop_stateboard_only(start_stop_cli, project_with_patched_init): project = project_with_patched_init cli = start_stop_cli # start with stateboard-only flag cli.start(project, daemonized=True, stateboard_only=True) check_instances_running(cli, project, daemonized=True, stateboard_only=True) # stop stateboard cli.stop(project, stateboard_only=True) check_instances_stopped(cli, project, stateboard_only=True)
def test_start_stop_custom_executable(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli INSTANCE1 = 'instance-1' RUN_DIR = 'my-run' # Below we are making a bash script named 'tarantool' that calls the real tarantool. # We also change $PATH variable so that the priority of calling our # fake tarantool script is always higher than the original tarantool. # As a result, our process is not called a 'tarantool'. real_tarantool_abs_path = shutil.which('tarantool') tarantool_substitution_script = f"#!/bin/bash\n{real_tarantool_abs_path} $1" with open('tarantool', 'w') as f: f.write(tarantool_substitution_script) os.chmod('tarantool', 0o755) modified_env = os.environ.copy() modified_env['PATH'] = os.getcwd() + ':' + modified_env['PATH'] try: logs = cli.start(project, [INSTANCE1], stateboard=True, daemonized=True, capture_output=True, run_dir=RUN_DIR, env=modified_env) finally: os.remove('tarantool') # On Linux process have name 'tarantool' anyway, but for Darwin it's 'sh', # so we can check that warning displayed. if system() != 'Linux': assert any( [line.endswith('does not seem to be tarantool') for line in logs]) check_instances_running(cli, project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR, daemonized=True) cli.stop(project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR) check_instances_stopped(cli, project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR)
def test_start_stop_stateboard_only(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli # start with stateboard-only flag cli.start(project, daemonized=True, stateboard_only=True) check_instances_running(cli, project, daemonized=True, stateboard_only=True) # stop stateboard cli.stop(project, stateboard_only=True) check_instances_stopped(cli, project, stateboard_only=True)
def test_start_stop_by_name_with_stateboard(start_stop_cli, project_with_patched_init): project = project_with_patched_init cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' # start instance-1, instance-2 and stateboard cli.start(project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True) # stop instance-1 and stateboard cli.stop(project, [INSTANCE1], stateboard=True) check_instances_running(cli, project, [INSTANCE2], daemonized=True) check_instances_stopped(cli, project, [INSTANCE1], stateboard=True)
def test_start_stop_by_name(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' # start instance-1 and instance-2 cli.start(project, [INSTANCE1, INSTANCE2], daemonized=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True) # stop instance-1 cli.stop(project, [INSTANCE1]) check_instances_running(cli, project, [INSTANCE2], daemonized=True) check_instances_stopped(cli, project, [INSTANCE1])
def test_start_stop_by_id_with_stateboard(cartridge_cmd, project_with_patched_init): project = project_with_patched_init cli = Cli(cartridge_cmd) ID1 = get_instance_id(project.name, 'instance-1') ID2 = get_instance_id(project.name, 'instance-2') # start instance-1 and stateboard cli.start(project, [ID1], daemonized=True, stateboard=True) # start instance-2 cli.start(project, [ID2], daemonized=True) check_instances_running(cli, project, [ID1, ID2], daemonized=True, stateboard=True) # stop instance-1 and stateboard cli.stop(project, [ID1], stateboard=True) check_instances_running(cli, project, [ID2], daemonized=True) check_instances_stopped(cli, project, [ID1], stateboard=True)
def test_start_stop_status_run_dir_from_conf(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' ID1 = project.get_instance_id(INSTANCE1) ID2 = project.get_instance_id(INSTANCE2) STATEBOARD_ID = project.get_stateboard_id() RUN_DIR = 'my-run' write_conf(project.get_cli_cfg_path(), { 'run-dir': RUN_DIR, }) status = cli.get_status(project, [INSTANCE1, INSTANCE2], stateboard=True) assert status.get(ID1) == STATUS_NOT_STARTED assert status.get(ID2) == STATUS_NOT_STARTED cli.start(project, [INSTANCE1], stateboard=True, daemonized=True) check_instances_running(cli, project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR, daemonized=True) status = cli.get_status(project, [INSTANCE1, INSTANCE2], stateboard=True) assert len(status) == 3 assert status.get(ID1) == STATUS_RUNNING assert status.get(ID2) == STATUS_NOT_STARTED assert status.get(STATEBOARD_ID) == STATUS_RUNNING cli.stop(project, [INSTANCE1], stateboard=True) check_instances_stopped(cli, project, [INSTANCE1], stateboard=True, run_dir=RUN_DIR) status = cli.get_status(project, [INSTANCE1, INSTANCE2], stateboard=True) assert len(status) == 3 assert status.get(ID1) == STATUS_STOPPED assert status.get(ID2) == STATUS_NOT_STARTED assert status.get(STATEBOARD_ID) == STATUS_STOPPED
def test_start_with_timeout(start_stop_cli, project_with_patched_init): project = project_with_patched_init cli = start_stop_cli TIMEOUT_SECONDS = 2 patch_init_to_send_ready_after_timeout(project, TIMEOUT_SECONDS) # patch_init_to_log_signals(project) INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' ID1 = get_instance_id(project.name, INSTANCE1) ID2 = get_instance_id(project.name, INSTANCE2) STATEBOARD_ID = get_stateboard_name(project.name) # start w/ timeout > TIMEOUT_SECONDS cli.terminate() cli.start( project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True, timeout="{}s".format(TIMEOUT_SECONDS+1) ) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True) # start w/ timeout < TIMEOUT_SECONDS cli.terminate() logs = cli.start( project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True, timeout="{}s".format(TIMEOUT_SECONDS-1), capture_output=True, exp_rc=1, ) check_instances_stopped(cli, project, [INSTANCE1, INSTANCE2], stateboard=True) for instance_id in [ID1, ID2, STATEBOARD_ID]: assert any([re.search(r"%s:.+Timeout was reached" % instance_id, msg) is not None for msg in logs]) # start w/ timeout 0s cli.terminate() logs = cli.start( project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True, timeout="{}s".format(0), capture_output=True, ) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True, stateboard=True) for instance_id in [ID1, ID2, STATEBOARD_ID]: assert all([re.search(r"%s:.+Timeout was reached" % instance_id, msg) is None for msg in logs])
def test_start_stop_from_conf_stateboard_only(start_stop_cli, project_with_patched_init): project = project_with_patched_init cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' write_conf(os.path.join(project.path, DEFAULT_CFG), { get_instance_id(project.name, INSTANCE1): {}, get_instance_id(project.name, INSTANCE2): {}, }) # start instances cli.start(project, daemonized=True, stateboard_only=True) check_instances_running(cli, project, daemonized=True, stateboard_only=True) # stop instances cli.stop(project, stateboard=True) check_instances_stopped(cli, project, stateboard_only=True)
def test_start_stop_from_conf_stateboard_only(cartridge_cmd, project_with_patched_init): project = project_with_patched_init cli = Cli(cartridge_cmd) ID1 = get_instance_id(project.name, 'instance-1') ID2 = get_instance_id(project.name, 'instance-2') write_conf(os.path.join(project.path, DEFAULT_CFG), { ID1: {}, ID2: {}, }) # start instances cli.start(project, daemonized=True, stateboard_only=True) check_instances_running(cli, project, daemonized=True, stateboard_only=True) # stop instances cli.stop(project, stateboard=True) check_instances_stopped(cli, project, stateboard_only=True)
def test_start_stop_status_cfg(start_stop_cli, project_without_dependencies): project = project_without_dependencies cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' ID1 = project.get_instance_id(INSTANCE1) ID2 = project.get_instance_id(INSTANCE2) CFG = 'my-conf.yml' write_conf(project.get_cfg_path(CFG), { ID1: {}, ID2: {}, }) status = cli.get_status(project, cfg=CFG) assert status.get(ID1) == STATUS_NOT_STARTED assert status.get(ID2) == STATUS_NOT_STARTED cli.start(project, stateboard=True, daemonized=True, cfg=CFG) check_instances_running( cli, project, [INSTANCE1, INSTANCE2], stateboard=True, cfg=CFG, daemonized=True, ) status = cli.get_status(project, cfg=CFG) assert status.get(ID1) == STATUS_RUNNING assert status.get(ID2) == STATUS_RUNNING cli.stop(project, stateboard=True, cfg=CFG) check_instances_stopped(cli, project, [INSTANCE1, INSTANCE2]) status = cli.get_status(project, cfg=CFG) assert status.get(ID1) == STATUS_STOPPED assert status.get(ID2) == STATUS_STOPPED
def test_stop_signals(start_stop_cli, project_ignore_sigterm): project = project_ignore_sigterm cli = start_stop_cli INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' # start instances cli.start(project, [INSTANCE1, INSTANCE2], stateboard=True, daemonized=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], stateboard=True, daemonized=True) # try to stop instaces using `cartridge stop` # since it sends SIGTERM and instances ignore this signal, # instances are still running cli.stop(project, [INSTANCE1, INSTANCE2], stateboard=True,) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], stateboard=True, daemonized=True) # now, use `cartridge stop -d` # it sends SIGKILL that can't be ignored, # so instances are stopped cli.stop(project, [INSTANCE1, INSTANCE2], stateboard=True, force=True) check_instances_stopped(cli, project, [INSTANCE1, INSTANCE2], stateboard=True)
def test_repair_reload_set_uri(cartridge_cmd, start_stop_cli, project_with_cartridge, tmpdir): project = project_with_cartridge cli = start_stop_cli cmd = [ cartridge_cmd, "build", project.path ] process = subprocess.run(cmd, cwd=tmpdir) assert process.returncode == 0, "Error during building the project" # patch cartridge.cfg to don't change process title patch_cartridge_proc_titile(project) # start instances INSTANCE1 = 'instance-1' INSTANCE2 = 'instance-2' ID1 = get_instance_id(project.name, INSTANCE1) ID2 = get_instance_id(project.name, INSTANCE2) ADMIN_HTTP_PORT = 8081 ADVERTISE_URI_TO_CHANGE = 'localhost:3302' NEW_ADVERTISE_URI = 'localhost:3322' INSTANCE_TO_SET_URI = INSTANCE2 cfg = { ID1: { 'advertise_uri': 'localhost:3301', 'http_port': ADMIN_HTTP_PORT, 'replication_connect_quorum': 0, 'custom_proc_title': '', }, ID2: { 'advertise_uri': ADVERTISE_URI_TO_CHANGE, 'http_port': 8082, 'replication_connect_quorum': 0, 'custom_proc_title': '', }, } write_conf(os.path.join(project.path, DEFAULT_CFG), cfg) # start instance-1 and instance-2 cli.start(project, daemonized=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True) advertise_uris = [cfg[id]['advertise_uri'] for id in cfg] admin_api_url = 'http://localhost:%s/admin/api' % ADMIN_HTTP_PORT # join instances to replicaset replicaset_uuid = create_replicaset(admin_api_url, advertise_uris, ['vshard-storage']) replicaset = get_replicaset(admin_api_url, replicaset_uuid) instance_to_set_uri_uuid = None for instance in replicaset['servers']: if instance['uri'] == ADVERTISE_URI_TO_CHANGE: instance_to_set_uri_uuid = instance['uuid'] break assert instance_to_set_uri_uuid is not None # first, change URI in config and restart instance INSTANCE_ID = get_instance_id(project.name, INSTANCE_TO_SET_URI) cfg[INSTANCE_ID]['advertise_uri'] = NEW_ADVERTISE_URI write_conf(os.path.join(project.path, DEFAULT_CFG), cfg) cli.stop(project, [INSTANCE_TO_SET_URI]) check_instances_stopped(cli, project, [INSTANCE_TO_SET_URI]) cli.start(project, [INSTANCE_TO_SET_URI], daemonized=True) check_instances_running(cli, project, [INSTANCE1, INSTANCE2], daemonized=True, skip_env_checks=True) # then, update cluster-wide configs data_dir = os.path.join(project.path, DEFAULT_DATA_DIR) run_dir = os.path.join(project.path, DEFAULT_RUN_DIR) cmd = [ cartridge_cmd, 'repair', 'set-advertise-uri', '--name', project.name, '--data-dir', data_dir, '--run-dir', run_dir, '--reload', '--verbose', instance_to_set_uri_uuid, NEW_ADVERTISE_URI, ] rc, output = run_command_and_get_output(cmd, cwd=tmpdir) assert rc == 0 wait_for_replicaset_is_healthy(admin_api_url, replicaset_uuid) new_replicaset = get_replicaset(admin_api_url, replicaset_uuid) new_replicaset_instance_advertise_uri = None for instance in new_replicaset['servers']: if instance['uuid'] == instance_to_set_uri_uuid: new_replicaset_instance_advertise_uri = instance['uri'] break assert new_replicaset_instance_advertise_uri == NEW_ADVERTISE_URI