def test_start_idempotence(args_start, caplog):
    '''Verify start idempotence'''
    MassPnfSim().start(args_start)
    assert 'containers are already up' in caplog.text
    assert 'Starting simulator containers' not in caplog.text
    assert f"is already running" in caplog.text
    caplog.clear()
def test_start_status(args_status, docker_containers, caplog):
    sleep(5)  # Wait for the simulator to settle
    MassPnfSim().status(args_status)
    for instance in range(SIM_INSTANCES):
        assert '"simulatorStatus":"NOT RUNNING"' in caplog.text
        assert '"simulatorStatus":"RUNNING"' not in caplog.text
        assert f"{PNF_SIM_CONTAINER_NAME}{instance}" in docker_containers
    caplog.clear()
def test_stop_simulator_status(args_status, capfd, caplog):
    MassPnfSim().status(args_status)
    msg = capfd.readouterr()
    for _ in range(SIM_INSTANCES):
        assert '"simulatorStatus":"RUNNING"' not in caplog.text
        assert '"simulatorStatus":"NOT RUNNING"' in caplog.text
        assert 'Up' in msg.out
        assert 'Exit' not in msg.out
    caplog.clear()
def test_not_bootstrapped(action, caplog, args_start, args_stop, args_trigger,
                          args_status, args_stop_simulator):  # pylint: disable=W0613
    try:
        m = getattr(MassPnfSim(), action)
        m(eval(f'args_{action}'))
    except SystemExit as e:
        assert e.code == 1
    assert 'No bootstrapped instance found' in caplog.text
    caplog.clear()
def test_stop_idempotence(args_stop, caplog, docker_containers):
    MassPnfSim().stop(args_stop)
    for instance in range(SIM_INSTANCES):
        assert f'Stopping pnf-sim-lw-{instance} instance:' in caplog.text
        assert f'ROP_file_creator.sh {instance} already not running' in caplog.text
        assert 'Simulator containers are already down' in caplog.text
        assert f"ROP_file_creator.sh {instance}" not in popen('ps afx').read()
        assert f"{PNF_SIM_CONTAINER_NAME}{instance}" not in docker_containers
    caplog.clear()
def test_trigger(args_trigger, caplog):
    MassPnfSim().trigger(args_trigger)
    for instance in range(SIM_INSTANCES):
        instance_ip_offset = instance * 16
        ip_offset = 2
        assert f'Triggering pnf-sim-lw-{instance} instance:' in caplog.text
        assert f'PNF-Sim IP: {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in caplog.text
        assert 'Simulator started' in caplog.text
    caplog.clear()
def test_stop(args_stop, caplog):
    MassPnfSim().stop(args_stop)
    for instance in range(SIM_INSTANCES):
        instance_ip_offset = instance * 16
        ip_offset = 2
        assert f'Stopping pnf-sim-lw-{instance} instance:' in caplog.text
        assert f'PNF-Sim IP: {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in caplog.text
        assert f'ROP_file_creator.sh {instance} successfully killed' in caplog.text
        assert f"ROP_file_creator.sh {instance}" not in popen('ps afx').read()
    caplog.clear()
def test_trigger_custom(args_trigger_custom, caplog):
    MassPnfSim().trigger_custom(args_trigger_custom)
    for instance in range(SIM_INSTANCES):
        instance_ip_offset = instance * 16
        ip_offset = 2
        assert f'Triggering pnf-sim-lw-{instance} instance:' in caplog.text
        assert f'PNF-Sim IP: {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in caplog.text
        assert 'Simulator started' in caplog.text
        assert "Cannot start simulator since it's already running" not in caplog.text
    caplog.clear()
def test_stop_simulator_idempotence(args_stop_simulator, caplog):
    MassPnfSim().stop_simulator(args_stop_simulator)
    for instance in range(SIM_INSTANCES):
        instance_ip_offset = instance * 16
        ip_offset = 2
        assert f'Stopping pnf-sim-lw-{instance} instance:' in caplog.text
        assert f'PNF-Sim IP: {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in caplog.text
        assert "Cannot stop simulator, because it's not running" in caplog.text
        assert "Simulator successfully stopped" not in caplog.text
    caplog.clear()
def test_validate_trigger_custom(parser, caplog):
    args = parser.parse_args([
        'trigger_custom', '--triggerstart', '0', '--triggerend',
        str(SIM_INSTANCES)
    ])
    try:
        MassPnfSim().trigger_custom(args)
    except SystemExit as e:
        assert e.code == 1
    assert "--triggerend value greater than existing instance count" in caplog.text
    caplog.clear()
def test_bootstrap(args_bootstrap, caplog):
    # Initial bootstrap
    MassPnfSim().bootstrap(args_bootstrap)
    for instance in range(SIM_INSTANCES):
        assert f'Creating pnf-sim-lw-{instance}' in caplog.text
        assert f'Done setting up instance #{instance}' in caplog.text
    caplog.clear()

    # Verify bootstrap idempotence
    try:
        MassPnfSim().bootstrap(args_bootstrap)
    except SystemExit as e:
        assert e.code == 1
    assert 'Bootstrapped instances detected, not overwiriting, clean first' in caplog.text
    caplog.clear()

    # Verify simulator dirs created
    sim_dirname_pattern = MassPnfSim().sim_dirname_pattern
    assert len(glob(f"{sim_dirname_pattern}*")) == SIM_INSTANCES

    # Verify simulators configs content is valid
    start_port = 2000
    for instance in range(SIM_INSTANCES):
        instance_ip_offset = instance * 16
        ip_offset = 2
        with open(f"{sim_dirname_pattern}{instance}/{INSTANCE_CONFIG}") as f:
            yml = load(f, Loader=SafeLoader)
        assert URLVES == yml['urlves']
        assert TYPEFILESERVER == yml['typefileserver']
        assert f'sftp://{USER}:{PASSWORD}@{IPFILESERVER}:{start_port + 1}' in yml[
            'urlsftp']
        assert f'ftps://{USER}:{PASSWORD}@{IPFILESERVER}:{start_port + 2}' in yml[
            'urlftps']
        assert str(ip_address(IPSTART) + ip_offset +
                   instance_ip_offset) == yml['ippnfsim']
        start_port += 2
        print(yml['ippnfsim'])

    # Verify vsftpd config file has proper permissions
    for cfg in glob(f'{sim_dirname_pattern}*/config/vsftpd_ssl.conf'):
        assert stat(cfg).st_uid == 0
def test_count_option_bad_value(parser, caplog, subcommand):
    '''Test case where invalid value passed to '--count' opt'''
    try:
        args = parser.parse_args(
            [subcommand, '--count',
             str(SIM_INSTANCES + 1)])
        m = getattr(MassPnfSim(), subcommand)
        m(args)
    except SystemExit:
        pass
    assert '--count value greater that existing instance count' in caplog.text
    caplog.clear()
def test_start(args_start, caplog):
    MassPnfSim().start(args_start)
    for instance in range(SIM_INSTANCES):
        instance_ip_offset = instance * 16
        ip_offset = 2
        assert f'Starting pnf-sim-lw-{instance} instance:' in caplog.text
        assert f'PNF-Sim IP: {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in caplog.text
        assert 'Starting simulator containers' in caplog.text
        assert f"ROP_file_creator.sh {instance} successfully started" in caplog.text
        assert f"3GPP measurements file generator for instance {instance} is already running" not in caplog.text
        # Verify ROP_file_creator.sh running
        assert f"ROP_file_creator.sh {instance}" in popen('ps afx').read()
    caplog.clear()
#!/usr/bin/env python3
import sys
import logging
from MassPnfSim import MassPnfSim, get_parser

if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    log_lvl = getattr(logging, args.verbose.upper())

    if sys.stdout.isatty():
        logging.basicConfig(
            level=logging.INFO,
            format='\033[92m[%(levelname)s]\033[0m %(message)s')
    else:
        logging.basicConfig(level=logging.INFO,
                            format='[%(levelname)s] %(message)s')

    logger = logging.getLogger(__name__)
    logger.setLevel(log_lvl)
    MassPnfSim.log_lvl = log_lvl

    if args.subcommand is not None:
        sim_routine = getattr(MassPnfSim(), args.subcommand)
        sim_routine(args)
    else:
        parser.print_usage()
def test_trigger_idempotence(args_trigger, caplog):
    MassPnfSim().trigger(args_trigger)
    assert "Cannot start simulator since it's already running" in caplog.text
    assert 'Simulator started' not in caplog.text
    caplog.clear()
def test_bootstrap_status(args_status, caplog):
    MassPnfSim().status(args_status)
    for _ in range(SIM_INSTANCES):
        assert 'Simulator containers are down' in caplog.text
        assert 'Simulator response' not in caplog.text
    caplog.clear()
def test_clean(args_clean):
    m = MassPnfSim()
    m.clean(args_clean)
    assert not glob(f"{m.sim_dirname_pattern}*")
def test_stop_status(args_status, docker_containers, caplog):
    MassPnfSim().status(args_status)
    for instance in range(SIM_INSTANCES):
        assert f"{PNF_SIM_CONTAINER_NAME}{instance}" not in docker_containers
        assert 'Simulator containers are down' in caplog.text
    caplog.clear()