3de96dafe2b25235c319b85056af113563b684fa
[integration.git] / test / mocks / mass-pnf-sim / pnf-sim-lightweight / simulator.sh
1 #!/usr/bin/env bash
2
3 set -euo pipefail
4
5 COMPOSE_FILE_NAME=docker-compose.yml
6 NETOPEER_CONTAINER_NAME=netopeer
7 SIMULATOR_CONTAINER_NAME=pnf-simulator
8 SIMULATOR_PORT=5000
9
10 SIMULATOR_BASE=http://localhost:$SIMULATOR_PORT/simulator/
11 SIMULATOR_START_URL=$SIMULATOR_BASE/start
12 SIMULATOR_STOP_URL=$SIMULATOR_BASE/stop
13 SIMULATOR_STATUS_URL=$SIMULATOR_BASE/status
14
15 RUNNING_COMPOSE_CONFIG=$COMPOSE_FILE_NAME
16
17 function main(){
18
19     COMMAND=${1:-"help"}
20
21     case $COMMAND in
22         "compose")
23             compose $2 $3 $4 $5 $6 $7 $8 $9 "${10}" "${11}" "${12}" "${13}" "${14}" ;;
24              #IPGW, #IPSUBNET, #I, #URLVES, #IPPNFSIM, #IPFILESERVER, #TYPEFILESERVER, #PORTSFTP, #PORTFTPS, #IPFTPS, #IPSFTP, #FTPS_PASV_MIN, #FTPS_PAST_MAX
25         "build")
26             build_image;;
27         "start")
28             start $COMPOSE_FILE_NAME;;
29         "stop")
30             if [[ -z ${2+x} ]]
31             then
32                echo "Error: action 'stop' requires the instance identifier"
33                exit
34             fi
35             stop $2;;
36         "run-simulator")
37             run_simulator;;
38         "trigger-simulator")
39             trigger_simulator;;
40         "stop-simulator")
41             stop_simulator;;
42         "status")
43              get_status;;
44         "clear-logs")
45              clear_logs;;
46         *)
47             print_help;;
48     esac
49 }
50
51
52 function get_pnfsim_ip() {
53
54         export IPPNFSIM=$(cat ./config/config.yml | grep ippnfsim | awk -F'[ ]' '{print $2}')
55         echo "PNF-Sim IP: " $IPPNFSIM
56         
57         export SIMULATOR_BASE=http://$IPPNFSIM:$SIMULATOR_PORT/simulator/
58         export SIMULATOR_START_URL=$SIMULATOR_BASE/start
59         export SIMULATOR_STOP_URL=$SIMULATOR_BASE/stop
60         export SIMULATOR_STATUS_URL=$SIMULATOR_BASE/status
61 }
62
63 function compose(){
64         #creating custom docker-compose based on IP arguments
65         #creting config.json by injecting the same IP
66         
67         export IPGW=$1
68         export IPSUBNET=$2
69         export I=$3
70         export URLVES=$4
71         export IPPNFSIM=$5
72         export IPFILESERVER=$6
73         export TYPEFILESERVER=$7
74         export PORTSFTP=$8
75         export PORTFTPS=$9
76         export IPFTPS=${10}
77         export IPSFTP=${11}
78         export FTPS_PASV_MIN=${12}
79         export FTPS_PASV_MAX=${13}
80         LOCALTIME=$(ls -l /etc/localtime)
81         export TIMEZONE=${LOCALTIME//*zoneinfo\/}
82
83         #will insert $I to distinguish containers, networks properly
84         #docker compose cannot substitute these, as they are keys, not values.
85         envsubst < docker-compose-template.yml > docker-compose-temporary.yml
86         #variable substitution
87         docker-compose -f docker-compose-temporary.yml config > docker-compose.yml
88         rm docker-compose-temporary.yml
89
90         ./ROP_file_creator.sh $I &
91
92         write_config $URLVES $IPFILESERVER $TYPEFILESERVER $PORTSFTP $PORTFTPS $IPPNFSIM
93
94         cd config
95     envsubst < vsftpd_ssl-TEMPLATE.conf > vsftpd_ssl.conf
96         cd -
97
98         set_vsftpd_file_owner
99
100 }
101
102 function build_image(){
103     if [ -f pom.xml ]; then
104         mvn clean package docker:build -Dcheckstyle.skip
105     else
106         echo "pom.xml file not found"
107         exit 1
108     fi
109 }
110
111 function set_vsftpd_file_owner() {
112     sudo chown root ./config/vsftpd_ssl.conf
113 }
114
115
116 function write_config(){
117         #building a YML file for usage in Java
118         echo "urlves: $1" > config/config.yml
119         echo "urlsftp: sftp://onap:pano@$2:$4" >> config/config.yml
120         echo "urlftps: ftps://onap:pano@$2:$5" >> config/config.yml
121         echo "ippnfsim: $6" >> config/config.yml
122         echo "typefileserver: $3" >> config/config.yml
123 }
124
125 function start(){
126
127         get_pnfsim_ip
128     if [[ $(running_containers) ]]; then
129         echo "Simulator containers are already up"
130     else
131         echo "Starting simulator containers using netconf model specified in config/netconf.env"
132         set_vsftpd_file_owner
133         archive_logs
134         docker-compose -f $1 up -d
135         RUNNING_COMPOSE_CONFIG=$1
136     fi
137 }
138
139 function running_containers(){
140    docker-compose -f $COMPOSE_FILE_NAME ps -q
141 }
142
143 function stop(){
144         get_pnfsim_ip
145     kill $(ps -ef | grep "[.]/ROP_file_creator.sh $1" | head -n 1 | awk '{print $2}')
146
147     if [[ $(running_containers) ]]; then
148         docker-compose -f $RUNNING_COMPOSE_CONFIG down
149         docker-compose -f $RUNNING_COMPOSE_CONFIG rm
150     else
151         echo "Simulator containers are already down"
152     fi
153 }
154
155 function trigger_simulator(){
156 get_pnfsim_ip
157 cat << EndOfMessage
158 Simulator response:
159 $(curl -s -X POST -H "Content-Type: application/json" -H "X-ONAP-RequestID: 123" -H "X-InvocationID: 456" -d @config/config.json $SIMULATOR_START_URL)
160 EndOfMessage
161 }
162
163 function run_simulator(){
164 get_pnfsim_ip
165 cat << EndOfMessage
166 Simulator response:
167 $(curl -s -X POST -H "Content-Type: application/json" -H "X-ONAP-RequestID: 123" -H "X-InvocationID: 456" -d @config/$CONFIG_JSON $SIMULATOR_START_URL)
168 EndOfMessage
169 }
170
171 function stop_simulator(){
172 get_pnfsim_ip
173 cat << EndOfMessage
174 Simulator response:
175 $(curl -s -X POST $SIMULATOR_STOP_URL)
176 EndOfMessage
177 }
178
179 function get_status(){
180         get_pnfsim_ip
181     if [[ $(running_containers) ]]; then
182         print_status
183     else
184         echo "Simulator containers are down"
185     fi
186 }
187
188 function print_status(){
189 get_pnfsim_ip
190 cat << EndOfMessage
191 $(docker-compose -f $RUNNING_COMPOSE_CONFIG ps)
192
193 Simulator response:
194 $(curl -s -X GET $SIMULATOR_STATUS_URL)
195 EndOfMessage
196 }
197
198 function print_help(){
199 cat << EndOfMessage
200 Available options:
201 build - locally builds simulator image from existing code
202 start - starts simulator and netopeer2 containers using remote simulator image and specified model name
203 compose - customize the docker-compose and configuration based on arguments
204 trigger-simulator - start monitoring the ROP files and report periodically
205 run-simulator - starts sending PNF registration messages with parameters specified in config.json
206 stop-simulator - stop sending PNF registration messages
207 stop - stops both containers
208 status - prints simulator status
209 clear-logs - deletes log folder
210
211 Starting simulation:
212 - Setup the instance of this simulator by:
213   - ./simulator.sh compose IPGW IPSUBNET I URLVES IPPNFSIM IPFILESERVER TYPEFILESERVER PORTSFTP PORTFTPS IPFTPS IPSFTP
214         where IPGW and IPSUBNET will be used for docker network
215         where I is the integer suffix to differentiate instances
216         where URLVES is the URL of the VES collector
217         where IPPNFSIM, IPFILESERVER, IPFTPS, IPSFTP are the IP addresses for containers
218     where TYPEFILESERVER is the type of fileserver, i.e., FTPS or SFTP
219         where PORTSFTP, PORTFTPS are the SFTP and FTPS ports
220         e.g. ./simulator.sh compose 10.11.0.65 10.11.0.64 3 http://10.11.0.69:10000/eventListener/v7 10.11.0.2 10.11.0.66 ftps 2001 2002 10.11.0.67 10.11.0.68
221
222 - Setup environment with "./simulator.sh start". It will download required docker images from the internet and run them on docker machine
223 - To start the simulation use "./simulator.sh run-simulator", which will start sending PNF registration messages with parameters specified in config.json    {TODO, might not be needed}
224
225 To stop simulation use "./simulator.sh stop-simulator" command. To check simulator's status use "./simulator.sh status".
226 If you want to change message parameters simply edit config.json, then start the simulation with "./simulator.sh run-simulator" again
227 Logs are written to logs/pnf-simulator.log.
228
229 If you change the source code you have to rebuild image with "./simulator.sh build" and run "./simulator.sh start" again
230 EndOfMessage
231 }
232
233 function archive_logs(){
234
235     if [ -d logs ]; then
236         echo "Moving log file to archive"
237         DIR_PATH=logs/archive/simulator[$(timestamp)]
238         mkdir -p $DIR_PATH
239         if [ -f logs/pnfsimulator.log ]; then
240            mv logs/pnfsimulator.log $DIR_PATH
241         fi
242
243         if [ -f logs/*.xml ]; then
244             mv logs/*.xml $DIR_PATH
245         fi
246
247     else
248         mkdir logs
249     fi
250 }
251
252 function clear_logs(){
253
254     if [[ $(running_containers) ]]; then
255         echo "Cannot delete logs when simulator is running"
256     else
257          rm -rf logs
258     fi
259 }
260
261 function timestamp(){
262   date "+%Y-%m-%d_%T"
263 }
264
265 main $@