Drop superfluous variables and type casts
[integration.git] / test / mocks / mass-pnf-sim / mass-pnf-sim.py
1 #!/usr/bin/env python3
2 import argparse
3 import sys
4 import subprocess
5 import ipaddress
6 import time
7 import logging
8 from requests import get
9 from requests.exceptions import MissingSchema, InvalidSchema, InvalidURL, ConnectionError, ConnectTimeout
10
11 def validate_url(url):
12     '''Helper function to perform --urlves input param validation'''
13     logger = logging.getLogger("urllib3")
14     logger.setLevel(logging.WARNING)
15     try:
16         get(url, timeout=0.001)
17     except (MissingSchema, InvalidSchema, InvalidURL):
18         raise argparse.ArgumentTypeError(f'{url} is not a valid URL')
19     except (ConnectionError, ConnectTimeout):
20         pass
21     return url
22
23 def validate_ip(ip):
24     '''Helper function to validate input param is a vaild IP address'''
25     try:
26         ip_valid = ipaddress.ip_address(ip)
27     except ValueError:
28         raise argparse.ArgumentTypeError(f'{ip} is not a valid IP address')
29     else:
30         return ip_valid
31
32 if sys.stdout.isatty():
33     logging.basicConfig(level=logging.INFO, format='\033[92m[%(levelname)s]\033[0m %(message)s')
34 else:
35     logging.basicConfig(level=logging.INFO, format='[%(levelname)s] %(message)s')
36
37 parser = argparse.ArgumentParser()
38 parser.add_argument('--bootstrap', help='Bootstrap the system', type=int, metavar='COUNT')
39 parser.add_argument('--trigger', help='Trigger one single VES event from each simulator', type=int,
40                     metavar='COUNT')
41 parser.add_argument('--triggerstart', help='Trigger only a subset of the simulators (note --triggerend)', type=int,
42                     metavar='COUNT_START')
43 parser.add_argument('--triggerend', help='Last instance to trigger', type=int, metavar='COUNT_END')
44 parser.add_argument('--urlves', help='URL of the VES collector', type=validate_url, metavar='URL')
45 parser.add_argument('--ipfileserver', help='Visible IP of the file server (SFTP/FTPS) to be included in the VES event',
46                     type=validate_ip, metavar='IP')
47 parser.add_argument('--typefileserver', help='Type of the file server (SFTP/FTPS) to be included in the VES event',
48                     type=str, choices=['sftp', 'ftps'])
49 parser.add_argument('--ipstart', help='IP address range beginning', type=validate_ip, metavar='IP')
50 parser.add_argument('--clean', action='store_true', help='Clean work-dirs')
51 parser.add_argument('--start', help='Start instances', type=int, metavar='COUNT')
52 parser.add_argument('--status', help='Status', type=int, metavar='COUNT')
53 parser.add_argument('--stop', help='Stop instances', type=int, metavar='COUNT')
54 parser.add_argument('--verbose', help='Verbosity level', choices=['info', 'debug'],
55                     type=str, default='debug')
56
57 args = parser.parse_args()
58
59 logger = logging.getLogger(__name__)
60 logger.setLevel(getattr(logging, args.verbose.upper()))
61
62 if args.bootstrap and args.ipstart and args.urlves:
63     logger.info("Bootstrap:")
64
65     start_port = 2000
66     ftps_pasv_port_start = 8000
67     ftps_pasv_port_num_of_ports = 10
68
69     ftps_pasv_port_end = ftps_pasv_port_start + ftps_pasv_port_num_of_ports
70
71     for i in range(args.bootstrap):
72         logger.info("PNF simulator instance: " + str(i) + ".")
73
74         ip_subnet = args.ipstart + int(0 + (i * 16))
75         logger.debug("\tIp Subnet:" + str(ip_subnet))
76         # The IP ranges are in distance of 16 compared to each other.
77         # This is matching the /28 subnet mask used in the dockerfile inside.
78
79         ip_gw = args.ipstart + int(1 + (i * 16))
80         logger.debug("\tIP Gateway:" + str(ip_gw))
81
82         IpPnfSim = args.ipstart + int(2 + (i * 16))
83         logger.debug("\tIp Pnf SIM:" + str(IpPnfSim))
84
85         PortSftp = start_port + 1
86         PortFtps = start_port + 2
87         start_port += 2
88         UrlFtps = str(args.ipstart + int(3 + (i * 16)))
89         logger.debug("\tUrl Ftps: " + str(UrlFtps))
90
91         UrlSftp = str(args.ipstart + int(4 + (i * 16)))
92         logger.debug("\tUrl Sftp: " + str(UrlSftp))
93
94         foldername = "pnf-sim-lw-" + str(i)
95         completed = subprocess.run('mkdir ' + foldername, shell=True)
96         logger.info(f'\tCreating folder: {completed.stdout}')
97         completed = subprocess.run(
98             'cp -r pnf-sim-lightweight/* ' +
99             foldername,
100             shell=True)
101         logger.info(f'\tCloning folder: {completed.stdout}')
102
103         composercmd = "./simulator.sh compose " + \
104             str(ip_gw) + " " + \
105             str(ip_subnet) + " " + \
106             str(i) + " " + \
107             args.urlves + " " + \
108             str(IpPnfSim) + " " + \
109             str(args.ipfileserver) + " " + \
110             args.typefileserver + " " + \
111             str(PortSftp) + " " + \
112             str(PortFtps) + " " + \
113             str(UrlFtps) + " " + \
114             str(UrlSftp) + " " + \
115             str(ftps_pasv_port_start) + " " + \
116             str(ftps_pasv_port_end)
117
118         completed = subprocess.run(
119             'set -x; cd ' +
120             foldername +
121             '; ' +
122             composercmd,
123             shell=True)
124         logger.info(f'Cloning: {completed.stdout}')
125
126         ftps_pasv_port_start += ftps_pasv_port_num_of_ports + 1
127         ftps_pasv_port_end += ftps_pasv_port_num_of_ports + 1
128
129     completed = subprocess.run('set -x; cd pnf-sim-lightweight; ./simulator.sh build ', shell=True)
130     logger.info(f"Build docker image: {completed.stdout}")
131
132     sys.exit()
133
134 if args.clean:
135     completed = subprocess.run('rm -rf ./pnf-sim-lw-*', shell=True)
136     logger.info(f'Deleting: {completed.stdout}')
137     sys.exit()
138
139 if args.start:
140
141     for i in range(args.start):
142         foldername = "pnf-sim-lw-" + str(i)
143
144         completed = subprocess.run(
145             'set -x ; cd ' +
146             foldername +
147             "; bash -x ./simulator.sh start",
148             shell=True)
149         logger.info(f'Starting: {completed.stdout}')
150
151         time.sleep(5)
152
153 if args.status:
154
155     for i in range(args.status):
156         foldername = "pnf-sim-lw-" + str(i)
157
158         completed = subprocess.run(
159             'cd ' +
160             foldername +
161             "; ./simulator.sh status",
162             shell=True)
163         logger.info(f'Status: {completed.stdout}')
164
165 if args.stop:
166     for i in range(args.stop):
167         foldername = "pnf-sim-lw-" + str(i)
168
169         completed = subprocess.run(
170             'cd ' +
171             foldername +
172             "; ./simulator.sh stop " + str(i),
173             shell=True)
174         logger.info(f'Stopping: {completed.stdout}')
175
176
177 if args.trigger:
178     logger.info("Triggering VES sending:")
179
180     for i in range(args.trigger):
181         foldername = "pnf-sim-lw-" + str(i)
182
183         completed = subprocess.run(
184             'cd ' +
185             foldername +
186             "; ./simulator.sh trigger-simulator",
187             shell=True)
188         logger.info(f'Status: {completed.stdout}')
189
190 if args.triggerstart and args.triggerend:
191     logger.info("Triggering VES sending by a range of simulators:")
192
193     for i in range(args.triggerstart, args.triggerend+1):
194         foldername = "pnf-sim-lw-" + str(i)
195         logger.info("Instance being processed:" + str(i))
196
197         completed = subprocess.run(
198             'cd ' +
199             foldername +
200             "; ./simulator.sh trigger-simulator",
201             shell=True)
202         logger.info(f'Status: {completed.stdout}')
203 else:
204     logger.warning("No instruction was defined")
205     parser.print_usage()
206     sys.exit()