c61b72dd14020ffae8f5b0c554f20f828da457c5
[integration.git] / test / mocks / mass-pnf-sim / test_lifecycle.py
1 from MassPnfSim import MassPnfSim
2 from glob import glob
3 from os import popen
4 from yaml import load, SafeLoader
5 from ipaddress import ip_address
6 from test_settings import *
7 import pytest
8 from time import sleep
9
10 # These test routines perform functional testing in current file tree context
11 # thus they require that no simulator instances are bootstrapped and running
12 # prior to running tests
13
14 @pytest.mark.parametrize("action", ['start', 'stop', 'trigger', 'status'])
15 def test_not_bootstrapped(action, caplog, args_start, args_stop, args_trigger, args_status): # pylint: disable=W0613
16     try:
17         m = getattr(MassPnfSim(eval(f'args_{action}')), action)
18         m()
19     except SystemExit as e:
20         assert e.code == 1
21     assert 'No bootstrapped instance found' in caplog.text
22     caplog.clear()
23
24 def test_bootstrap(args_bootstrap, parser, caplog):
25     # Initial bootstrap
26     MassPnfSim(args_bootstrap).bootstrap()
27     for instance in range(SIM_INSTANCES):
28         assert f'Creating pnf-sim-lw-{instance}' in caplog.text
29         assert f'Done setting up instance #{instance}' in caplog.text
30     caplog.clear()
31
32     # Verify bootstrap idempotence
33     try:
34         MassPnfSim(args_bootstrap).bootstrap()
35     except SystemExit as e:
36         assert e.code == 1
37     assert 'Bootstrapped instances detected, not overwiriting, clean first' in caplog.text
38     caplog.clear()
39
40     # Verify simulator dirs created
41     sim_dirname_pattern = MassPnfSim(parser.parse_args([])).sim_dirname_pattern
42     assert len(glob(f"{sim_dirname_pattern}*")) == SIM_INSTANCES
43
44     # Verify ROP_file_creator.sh running
45     for instance in range(SIM_INSTANCES):
46         assert f"ROP_file_creator.sh {instance}" in popen('ps afx').read()
47
48     # Verify simulators configs content is valid
49     start_port = 2000
50     for instance in range(SIM_INSTANCES):
51         instance_ip_offset = instance * 16
52         ip_offset = 2
53         with open(f"{sim_dirname_pattern}{instance}/{INSTANCE_CONFIG}") as f:
54             yml = load(f, Loader=SafeLoader)
55         assert URLVES == yml['urlves']
56         assert TYPEFILESERVER == yml['typefileserver']
57         assert f'sftp://onap:pano@{IPFILESERVER}:{start_port + 1}' in yml['urlsftp']
58         assert f'ftps://onap:pano@{IPFILESERVER}:{start_port + 2}' in yml['urlftps']
59         assert str(ip_address(IPSTART) + ip_offset + instance_ip_offset) == yml['ippnfsim']
60         start_port += 2
61         print(yml['ippnfsim'])
62
63 def test_bootstrap_status(args_status, caplog):
64     MassPnfSim(args_status).status()
65     for _ in range(SIM_INSTANCES):
66         assert 'Simulator containers are down' in caplog.text
67         assert 'Simulator response' not in caplog.text
68     caplog.clear()
69
70 def test_start(args_start, caplog, capfd):
71     MassPnfSim(args_start).start()
72     msg = capfd.readouterr()
73     for instance in range(SIM_INSTANCES):
74         instance_ip_offset = instance * 16
75         ip_offset = 2
76         assert f'Starting pnf-sim-lw-{instance} instance:' in caplog.text
77         assert f'PNF-Sim IP:  {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in msg.out
78         assert 'Starting simulator containers' in msg.out
79     caplog.clear()
80
81 def test_start_status(args_status, docker_containers, caplog):
82     sleep(5) # Wait for the simulator to settle
83     MassPnfSim(args_status).status()
84     for instance in range(SIM_INSTANCES):
85         assert '"simulatorStatus":"NOT RUNNING"' in caplog.text
86         assert '"simulatorStatus":"RUNNING"' not in caplog.text
87         assert f"{PNF_SIM_CONTAINER_NAME}{instance}" in docker_containers
88     caplog.clear()
89
90 def test_start_idempotence(args_start, capfd):
91     '''Verify start idempotence'''
92     MassPnfSim(args_start).start()
93     msg = capfd.readouterr()
94     assert 'Simulator containers are already up' in msg.out
95     assert 'Starting simulator containers' not in msg.out
96
97 def test_trigger(args_trigger, caplog, capfd):
98     MassPnfSim(args_trigger).trigger()
99     msg = capfd.readouterr()
100     for instance in range(SIM_INSTANCES):
101         instance_ip_offset = instance * 16
102         ip_offset = 2
103         assert f'Triggering pnf-sim-lw-{instance} instance:' in caplog.text
104         assert f'PNF-Sim IP:  {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in msg.out
105         assert 'Simulator started' in msg.out
106     caplog.clear()
107
108 def test_trigger_status(args_status, capfd, caplog):
109     MassPnfSim(args_status).status()
110     msg = capfd.readouterr()
111     for _ in range(SIM_INSTANCES):
112         assert '"simulatorStatus":"RUNNING"' in caplog.text
113         assert '"simulatorStatus":"NOT RUNNING"' not in caplog.text
114         assert 'Up' in msg.out
115         assert 'Exit' not in msg.out
116     caplog.clear()
117
118 def test_trigger_idempotence(args_trigger, capfd):
119     MassPnfSim(args_trigger).trigger()
120     msg = capfd.readouterr()
121     assert "Cannot start simulator since it's already running" in msg.out
122     assert 'Simulator started' not in msg.out
123
124 def test_trigger_custom(args_trigger_custom, caplog, capfd):
125     MassPnfSim(args_trigger_custom).trigger_custom()
126     msg = capfd.readouterr()
127     for instance in range(SIM_INSTANCES):
128         instance_ip_offset = instance * 16
129         ip_offset = 2
130         assert f'Triggering pnf-sim-lw-{instance} instance:' in caplog.text
131         assert f'PNF-Sim IP:  {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in msg.out
132         assert 'Simulator started' not in msg.out
133         assert "Cannot start simulator since it's already running" in msg.out
134     caplog.clear()
135
136 def test_stop(args_stop, caplog, capfd):
137     MassPnfSim(args_stop).stop()
138     msg = capfd.readouterr()
139     for instance in range(SIM_INSTANCES):
140         instance_ip_offset = instance * 16
141         ip_offset = 2
142         assert f'Stopping pnf-sim-lw-{instance} instance:' in caplog.text
143         assert f'PNF-Sim IP:  {str(ip_address(IPSTART) + ip_offset + instance_ip_offset)}' in msg.out
144         assert f"ROP_file_creator.sh {instance}" not in popen('ps afx').read()
145     caplog.clear()
146
147 def test_stop_idempotence(args_stop, caplog, capfd):
148     MassPnfSim(args_stop).stop()
149     msg = capfd.readouterr()
150     for instance in range(SIM_INSTANCES):
151         assert f'Stopping pnf-sim-lw-{instance} instance:' in caplog.text
152         assert 'ROP_file_creator.sh already not running' in msg.out
153         assert 'Simulator containers are already down' in msg.out
154     caplog.clear()
155
156 def test_clean(args_clean):
157     m = MassPnfSim(args_clean)
158     m.clean()
159     assert not glob(f"{m.sim_dirname_pattern}*")