blob: 6507e056a6d5ff3f318c7784605c6dd6d6d93694 [file] [log] [blame]
TamasBakaid38feb62019-02-28 09:06:19 +00001#!/usr/bin/env bash
2
3set -euo pipefail
4
5COMPOSE_FILE_NAME=docker-compose.yml
6NETOPEER_CONTAINER_NAME=netopeer
7SIMULATOR_CONTAINER_NAME=pnf-simulator
8SIMULATOR_PORT=5000
TamasBakai114c21c2019-03-19 09:56:28 +00009
10SIMULATOR_BASE=http://localhost:$SIMULATOR_PORT/simulator/
11SIMULATOR_START_URL=$SIMULATOR_BASE/start
12SIMULATOR_STOP_URL=$SIMULATOR_BASE/stop
13SIMULATOR_STATUS_URL=$SIMULATOR_BASE/status
14
TamasBakaid38feb62019-02-28 09:06:19 +000015RUNNING_COMPOSE_CONFIG=$COMPOSE_FILE_NAME
16
17function main(){
18
19 COMMAND=${1:-"help"}
20
21 case $COMMAND in
22 "compose")
TamasBakaib59bffb2019-03-22 09:52:03 +000023 compose $2 $3 $4 $5 $6 $7 $8 $9 "${10}" "${11}" ;;
24 #IPGW, #IPSUBNET, #I, #IPVES, #IPPNFSIM, #IPFILESERVER, #PORTSFTP, #PORTFTPS, #IPFTPS, #IPSFTP
TamasBakaid38feb62019-02-28 09:06:19 +000025 "build")
26 build_image;;
27 "start")
28 start $COMPOSE_FILE_NAME;;
29 "stop")
TamasBakaibab325b2019-03-26 09:20:16 +000030 if [[ -z ${2+x} ]]
31 then
32 echo "Error: action 'stop' requires the instance identifier"
33 exit
34 fi
RehanRaza48f92042019-03-20 08:12:55 +000035 stop $2;;
TamasBakaid38feb62019-02-28 09:06:19 +000036 "run-simulator")
37 run_simulator;;
TamasBakai114c21c2019-03-19 09:56:28 +000038 "trigger-simulator")
39 trigger_simulator;;
TamasBakaid38feb62019-02-28 09:06:19 +000040 "stop-simulator")
41 stop_simulator;;
42 "status")
43 get_status;;
44 "clear-logs")
45 clear_logs;;
46 *)
47 print_help;;
48 esac
49}
50
TamasBakai114c21c2019-03-19 09:56:28 +000051
52function 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
TamasBakaid38feb62019-02-28 09:06:19 +000063function 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 IPVES=$4
71 export IPPNFSIM=$5
TamasBakaib59bffb2019-03-22 09:52:03 +000072 export IPFILESERVER=$6
73 export PORTSFTP=$7
74 export PORTFTPS=$8
75 export IPFTPS=$9
76 export IPSFTP=${10}
RehanRazac5121c52019-04-04 12:42:15 +000077 LOCALTIME=$(ls -l /etc/localtime)
78 export TIMEZONE=${LOCALTIME//*zoneinfo\/}
TamasBakaid38feb62019-02-28 09:06:19 +000079
80 #will insert $I to distinguish containers, networks properly
81 #docker compose cannot substitute these, as they are keys, not values.
82 envsubst < docker-compose-template.yml > docker-compose-temporary.yml
83 #variable substitution
84 docker-compose -f docker-compose-temporary.yml config > docker-compose.yml
85 rm docker-compose-temporary.yml
86
RehanRaza48f92042019-03-20 08:12:55 +000087 ./ROP_file_creator.sh $I &
TamasBakaid38feb62019-02-28 09:06:19 +000088
89 set_vsftpd_file_owner
90
TamasBakaib59bffb2019-03-22 09:52:03 +000091 write_config $IPVES $IPFILESERVER $PORTSFTP $PORTFTPS $IPPNFSIM
TamasBakaid38feb62019-02-28 09:06:19 +000092
93}
94
95function build_image(){
96 if [ -f pom.xml ]; then
RehanRazaf2a0cfd2019-04-09 08:18:07 +000097 mvn clean package docker:build -Dcheckstyle.skip
TamasBakaid38feb62019-02-28 09:06:19 +000098 else
99 echo "pom.xml file not found"
100 exit 1
101 fi
102}
103
104function set_vsftpd_file_owner() {
105 sudo chown root ./config/vsftpd_ssl.conf
106}
107
108
109function write_config(){
110 #building a YML file for usage in Java
TamasBakaibab325b2019-03-26 09:20:16 +0000111 echo "urlves: $1" > config/config.yml
112 echo "urlsftp: sftp://onap:pano@$2:$3" >> config/config.yml
113 echo "urlftps: ftps://onap:pano@$2:$4" >> config/config.yml
TamasBakaib59bffb2019-03-22 09:52:03 +0000114 echo "ippnfsim: $5" >> config/config.yml
TamasBakaibab325b2019-03-26 09:20:16 +0000115 echo "defaultfileserver: sftp" >> config/config.yml
TamasBakaid38feb62019-02-28 09:06:19 +0000116}
117
118function start(){
119
TamasBakai114c21c2019-03-19 09:56:28 +0000120 get_pnfsim_ip
TamasBakaid38feb62019-02-28 09:06:19 +0000121 if [[ $(running_containers) ]]; then
122 echo "Simulator containers are already up"
123 else
124 echo "Starting simulator containers using netconf model specified in config/netconf.env"
125 set_vsftpd_file_owner
126 archive_logs
127 docker-compose -f $1 up -d
128 RUNNING_COMPOSE_CONFIG=$1
129 fi
130}
131
132function running_containers(){
133 docker-compose -f $COMPOSE_FILE_NAME ps -q
134}
135
136function stop(){
TamasBakai114c21c2019-03-19 09:56:28 +0000137 get_pnfsim_ip
TamasBakaibab325b2019-03-26 09:20:16 +0000138 kill $(ps -ef | grep "[.]/ROP_file_creator.sh $1" | head -n 1 | awk '{print $2}')
RehanRaza48f92042019-03-20 08:12:55 +0000139
TamasBakaid38feb62019-02-28 09:06:19 +0000140 if [[ $(running_containers) ]]; then
141 docker-compose -f $RUNNING_COMPOSE_CONFIG down
142 docker-compose -f $RUNNING_COMPOSE_CONFIG rm
143 else
144 echo "Simulator containers are already down"
145 fi
146}
147
TamasBakai114c21c2019-03-19 09:56:28 +0000148function trigger_simulator(){
149get_pnfsim_ip
150cat << EndOfMessage
151Simulator response:
152$(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)
153EndOfMessage
154}
TamasBakaid38feb62019-02-28 09:06:19 +0000155
TamasBakai114c21c2019-03-19 09:56:28 +0000156function run_simulator(){
157get_pnfsim_ip
TamasBakaid38feb62019-02-28 09:06:19 +0000158cat << EndOfMessage
159Simulator response:
160$(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)
161EndOfMessage
162}
163
164function stop_simulator(){
TamasBakai114c21c2019-03-19 09:56:28 +0000165get_pnfsim_ip
TamasBakaid38feb62019-02-28 09:06:19 +0000166cat << EndOfMessage
167Simulator response:
168$(curl -s -X POST $SIMULATOR_STOP_URL)
169EndOfMessage
170}
171
172function get_status(){
TamasBakai114c21c2019-03-19 09:56:28 +0000173 get_pnfsim_ip
TamasBakaid38feb62019-02-28 09:06:19 +0000174 if [[ $(running_containers) ]]; then
175 print_status
176 else
177 echo "Simulator containers are down"
178 fi
179}
180
181function print_status(){
TamasBakai114c21c2019-03-19 09:56:28 +0000182get_pnfsim_ip
TamasBakaid38feb62019-02-28 09:06:19 +0000183cat << EndOfMessage
184$(docker-compose -f $RUNNING_COMPOSE_CONFIG ps)
185
186Simulator response:
187$(curl -s -X GET $SIMULATOR_STATUS_URL)
188EndOfMessage
189}
190
191function print_help(){
192cat << EndOfMessage
193Available options:
194build - locally builds simulator image from existing code
195start - starts simulator and netopeer2 containers using remote simulator image and specified model name
196compose - customize the docker-compose and configuration based on arguments
TamasBakai114c21c2019-03-19 09:56:28 +0000197trigger-simulator - start monitoring the ROP files and report periodically
TamasBakaid38feb62019-02-28 09:06:19 +0000198run-simulator - starts sending PNF registration messages with parameters specified in config.json
199stop-simulator - stop sending PNF registration messages
200stop - stops both containers
201status - prints simulator status
202clear-logs - deletes log folder
203
204Starting simulation:
205- Setup the instance of this simulator by:
206 - ./simulator.sh compose IPGW IPSUBNET I IPVES IPPNFSIM IPFTPS IPSFTP
207 where Gw and subnet will be used for docker network
208 where I is the integer suffix to differentiate instances
209 where IPVES is the address of the VES collector
210 where IPPNFSIM, IPFTPS, IPSFTP are the addresses for containers
211 e.g. ./simulator.sh compose 10.11.0.65 10.11.0.64 3 10.11.0.2 10.11.0.66 10.11.0.67 10.11.0.68
212
213- Setup environment with "./simulator.sh start". It will download required docker images from the internet and run them on docker machine
214- 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}
215
216To stop simulation use "./simulator.sh stop-simulator" command. To check simulator's status use "./simulator.sh status".
217If you want to change message parameters simply edit config.json, then start the simulation with "./simulator.sh run-simulator" again
218Logs are written to logs/pnf-simulator.log.
219
220If you change the source code you have to rebuild image with "./simulator.sh build" and run "./simulator.sh start" again
221EndOfMessage
222}
223
224function archive_logs(){
225
226 if [ -d logs ]; then
227 echo "Moving log file to archive"
228 DIR_PATH=logs/archive/simulator[$(timestamp)]
229 mkdir -p $DIR_PATH
230 if [ -f logs/pnfsimulator.log ]; then
231 mv logs/pnfsimulator.log $DIR_PATH
232 fi
233
234 if [ -f logs/*.xml ]; then
235 mv logs/*.xml $DIR_PATH
236 fi
237
238 else
239 mkdir logs
240 fi
241}
242
243function clear_logs(){
244
245 if [[ $(running_containers) ]]; then
246 echo "Cannot delete logs when simulator is running"
247 else
248 rm -rf logs
249 fi
250}
251
252function timestamp(){
253 date "+%Y-%m-%d_%T"
254}
255
256main $@