aboutsummaryrefslogtreecommitdiffstats
path: root/test_lifecycle.py
blob: 1e040d32e9f49d4d186e358d961520da466dddea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
from MassPnfSim import MassPnfSim
from glob import glob
from os import popen, stat
from yaml import load, SafeLoader
from ipaddress import ip_address
from test_settings import *
import pytest
from time import sleep

# These test routines perform functional testing in current file tree context
# thus they require that no simulator instances are bootstrapped and running
# prior to running tests

@pytest.mark.parametrize("action", ['start', 'stop', 'trigger', 'status', 'stop_simulator'])
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_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_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_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()

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_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_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_trigger_status(args_status, capfd, caplog):
    MassPnfSim().status(args_status)
    msg = capfd.readouterr()
    for _ in range(SIM_INSTANCES):
        assert '"simulatorStatus":"RUNNING"' in caplog.text
        assert '"simulatorStatus":"NOT RUNNING"' not in caplog.text
        assert 'Up' in msg.out
        assert 'Exit' not in msg.out
    caplog.clear()

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_stop_simulator(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 "Simulator successfully stopped" in caplog.text
        assert "not running" not in caplog.text
    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_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_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(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_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()

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_clean(args_clean):
    m = MassPnfSim()
    m.clean(args_clean)
    assert not glob(f"{m.sim_dirname_pattern}*")