full_install: create config and log osm folders
[osm/devops.git] / installers / full_install_osm.sh
1 #!/bin/bash
2 # Copyright 2016 Telefónica Investigación y Desarrollo S.A.U.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 function usage(){
17 echo -e "usage: $0 [OPTIONS]"
18 echo -e "Install OSM from binaries or source code (by default, from binaries)"
19 echo -e " OPTIONS"
20 echo -e " -r <repo>: use specified repository name for osm packages"
21 echo -e " -R <release>: use specified release for osm binaries (deb packages, lxd images, ...)"
22 echo -e " -u <repo base>: use specified repository url for osm packages"
23 echo -e " -k <repo key>: use specified repository public key url"
24 echo -e " -b <refspec>: install OSM from source code using a specific branch (master, v2.0, ...) or tag"
25 echo -e " -b master (main dev branch)"
26 echo -e " -b v2.0 (v2.0 branch)"
27 echo -e " -b tags/v1.1.0 (a specific tag)"
28 echo -e " ..."
29 echo -e " --vimemu: additionally deploy the VIM emulator as a docker container"
30 echo -e " --elk_stack: additionally deploy an ELK docker stack for event logging"
31 echo -e " --pm_stack: additionally deploy a Prometheus+Grafana stack for performance monitoring (PM)"
32 echo -e " -o <ADDON>: do not install OSM, but ONLY one of the addons (vimemu, elk_stack, pm_stack) (assumes OSM is already installed)"
33 echo -e " -D <devops path> use local devops installation path"
34 echo -e " --uninstall: uninstall OSM: remove the containers and delete NAT rules"
35 echo -e " --source: install OSM from source code using the latest stable tag"
36 echo -e " --lxdimages: download lxd images from OSM repository instead of creating them from scratch"
37 echo -e " -l <lxd_repo>: use specified repository url for lxd images"
38 echo -e " -p <path>: use specified repository path for lxd images"
39 echo -e " --soui: install classic build of OSM (Rel THREE v3.1, based on LXD containers, with SO and UI)"
40 echo -e " --develop: (deprecated, use '-b master') install OSM from source code using the master branch"
41 # echo -e " --reconfigure: reconfigure the modules (DO NOT change NAT rules)"
42 echo -e " --nat: install only NAT rules"
43 echo -e " --noconfigure: DO NOT install osmclient, DO NOT install NAT rules, DO NOT configure modules"
44 # echo -e " --update: update to the latest stable release or to the latest commit if using a specific branch"
45 echo -e " --showopts: print chosen options and exit (only for debugging)"
46 echo -e " -y: do not prompt for confirmation, assumes yes"
47 echo -e " -h / --help: print this help"
48 }
49
50 #Uninstall OSM: remove containers
51 function uninstall(){
52 echo -e "\nUninstalling OSM"
53 if [ $RC_CLONE ] || [ -n "$TEST_INSTALLER" ]; then
54 $OSM_DEVOPS/jenkins/host/clean_container RO
55 $OSM_DEVOPS/jenkins/host/clean_container VCA
56 $OSM_DEVOPS/jenkins/host/clean_container MON
57 $OSM_DEVOPS/jenkins/host/clean_container SO
58 #$OSM_DEVOPS/jenkins/host/clean_container UI
59 else
60 lxc stop RO && lxc delete RO
61 lxc stop VCA && lxc delete VCA
62 lxc stop MON && lxc delete MON
63 lxc stop SO-ub && lxc delete SO-ub
64 fi
65 echo -e "\nDeleting imported lxd images if they exist"
66 lxc image show osm-ro &>/dev/null && lxc image delete osm-ro
67 lxc image show osm-vca &>/dev/null && lxc image delete osm-vca
68 lxc image show osm-soui &>/dev/null && lxc image delete osm-soui
69 return 0
70 }
71
72 #Uninstall lightweight OSM: remove dockers
73 function uninstall_lightweight(){
74 echo -e "\nUninstalling lightweight OSM"
75 sg docker -c "docker stack rm osm"
76 COUNTER=0
77 result=1
78 while [ ${COUNTER} -lt 30 ]; do
79 sleep 1
80 result=$(sg docker -c "docker stack ps osm" | wc -l)
81 #echo "Dockers running: $result"
82 if [ "${result}" == "0" ]; then
83 break
84 fi
85 let COUNTER=COUNTER+1
86 done
87 if [ "${result}" == "0" ]; then
88 echo "All dockers of the stack osm were removed"
89 else
90 FATAL "Some dockers of the stack osm could not be removed. Could not uninstall OSM in single shot. Try to uninstall again"
91 fi
92 sleep 5
93 echo "Now osm docker images and volumes will be deleted"
94 newgrp docker << EONG
95 docker image rm osm/ro
96 docker image rm osm/lcm
97 docker image rm osm/light-ui
98 docker image rm osm/nbi
99 docker image rm osm/mon
100 docker image rm osm/pm
101 docker volume rm osm_mon_db
102 docker volume rm osm_mongo_db
103 docker volume rm osm_osm_packages
104 docker volume rm osm_ro_db
105 EONG
106 return 0
107 }
108
109 #Configure NAT rules, based on the current IP addresses of containers
110 function nat(){
111 echo -e "\nChecking required packages: iptables-persistent"
112 dpkg -l iptables-persistent &>/dev/null || ! echo -e " Not installed.\nInstalling iptables-persistent requires root privileges" || \
113 sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install iptables-persistent
114 echo -e "\nConfiguring NAT rules"
115 echo -e " Required root privileges"
116 sudo $OSM_DEVOPS/installers/nat_osm
117 }
118
119 function FATAL(){
120 echo "FATAL error: Cannot install OSM due to \"$1\""
121 exit 1
122 }
123
124 #Update RO, SO and UI:
125 function update(){
126 echo -e "\nUpdating components"
127
128 echo -e " Updating RO"
129 CONTAINER="RO"
130 MDG="RO"
131 INSTALL_FOLDER="/opt/openmano"
132 echo -e " Fetching the repo"
133 lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
134 BRANCH=""
135 BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
136 [ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
137 CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
138 CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
139 echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
140 # COMMIT_ID either was previously set with -b option, or is an empty string
141 CHECKOUT_ID=$COMMIT_ID
142 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
143 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
144 if [[ $CHECKOUT_ID == "tags/"* ]]; then
145 REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
146 else
147 REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
148 fi
149 echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
150 if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
151 echo " Nothing to be done."
152 else
153 echo " Update required."
154 lxc exec $CONTAINER -- service osm-ro stop
155 lxc exec $CONTAINER -- git -C /opt/openmano stash
156 lxc exec $CONTAINER -- git -C /opt/openmano pull --rebase
157 lxc exec $CONTAINER -- git -C /opt/openmano checkout $CHECKOUT_ID
158 lxc exec $CONTAINER -- git -C /opt/openmano stash pop
159 lxc exec $CONTAINER -- /opt/openmano/database_utils/migrate_mano_db.sh
160 lxc exec $CONTAINER -- service osm-ro start
161 fi
162 echo
163
164 echo -e " Updating SO and UI"
165 CONTAINER="SO-ub"
166 MDG="SO"
167 INSTALL_FOLDER="" # To be filled in
168 echo -e " Fetching the repo"
169 lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
170 BRANCH=""
171 BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
172 [ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
173 CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
174 CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
175 echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
176 # COMMIT_ID either was previously set with -b option, or is an empty string
177 CHECKOUT_ID=$COMMIT_ID
178 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
179 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
180 if [[ $CHECKOUT_ID == "tags/"* ]]; then
181 REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
182 else
183 REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
184 fi
185 echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
186 if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
187 echo " Nothing to be done."
188 else
189 echo " Update required."
190 # Instructions to be added
191 # lxc exec SO-ub -- ...
192 fi
193 echo
194 echo -e "Updating MON Container"
195 CONTAINER="MON"
196 MDG="MON"
197 INSTALL_FOLDER="/root/MON"
198 echo -e " Fetching the repo"
199 lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
200 BRANCH=""
201 BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
202 [ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
203 CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
204 CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
205 echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
206 # COMMIT_ID either was previously set with -b option, or is an empty string
207 CHECKOUT_ID=$COMMIT_ID
208 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
209 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
210 if [[ $CHECKOUT_ID == "tags/"* ]]; then
211 REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
212 else
213 REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
214 fi
215 echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
216 if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
217 echo " Nothing to be done."
218 else
219 echo " Update required."
220 fi
221 echo
222 }
223
224 function so_is_up() {
225 if [ -n "$1" ]; then
226 SO_IP=$1
227 else
228 SO_IP=`lxc list SO-ub -c 4|grep eth0 |awk '{print $2}'`
229 fi
230 time=0
231 step=5
232 timelength=300
233 while [ $time -le $timelength ]
234 do
235 if [[ `curl -k -X GET https://$SO_IP:8008/api/operational/vcs/info \
236 -H 'accept: application/vnd.yang.data+json' \
237 -H 'authorization: Basic YWRtaW46YWRtaW4=' \
238 -H 'cache-control: no-cache' 2> /dev/null | jq '.[].components.component_info[] | select(.component_name=="RW.Restconf")' 2>/dev/null | grep "RUNNING" | wc -l` -eq 1 ]]
239 then
240 echo "RW.Restconf running....SO is up"
241 return 0
242 fi
243
244 sleep $step
245 echo -n "."
246 time=$((time+step))
247 done
248
249 FATAL "OSM Failed to startup. SO failed to startup"
250 }
251
252 function vca_is_up() {
253 if [[ `lxc exec VCA -- juju status | grep "osm" | wc -l` -eq 1 ]]; then
254 echo "VCA is up and running"
255 return 0
256 fi
257
258 FATAL "OSM Failed to startup. VCA failed to startup"
259 }
260
261 function mon_is_up() {
262 if [[ `curl http://$RO_IP:9090/openmano/ | grep "works" | wc -l` -eq 1 ]]; then
263 echo "MON is up and running"
264 return 0
265 fi
266
267 FATAL "OSM Failed to startup. MON failed to startup"
268 }
269
270 function ro_is_up() {
271 if [ -n "$1" ]; then
272 RO_IP=$1
273 else
274 RO_IP=`lxc list RO -c 4|grep eth0 |awk '{print $2}'`
275 fi
276 time=0
277 step=2
278 timelength=20
279 while [ $time -le $timelength ]; do
280 if [[ `curl http://$RO_IP:9090/openmano/ | grep "works" | wc -l` -eq 1 ]]; then
281 echo "RO is up and running"
282 return 0
283 fi
284 sleep $step
285 echo -n "."
286 time=$((time+step))
287 done
288
289 FATAL "OSM Failed to startup. RO failed to startup"
290 }
291
292
293 function configure_RO(){
294 . $OSM_DEVOPS/installers/export_ips
295 echo -e " Configuring RO"
296 lxc exec RO -- sed -i -e "s/^\#\?log_socket_host:.*/log_socket_host: $SO_CONTAINER_IP/g" /etc/osm/openmanod.cfg
297 lxc exec RO -- service osm-ro restart
298
299 ro_is_up
300
301 lxc exec RO -- openmano tenant-delete -f osm >/dev/null
302 lxc exec RO -- openmano tenant-create osm > /dev/null
303 lxc exec RO -- sed -i '/export OPENMANO_TENANT=osm/d' .bashrc
304 lxc exec RO -- sed -i '$ i export OPENMANO_TENANT=osm' .bashrc
305 lxc exec RO -- sh -c 'echo "export OPENMANO_TENANT=osm" >> .bashrc'
306 }
307
308 function configure_VCA(){
309 echo -e " Configuring VCA"
310 JUJU_PASSWD=`date +%s | sha256sum | base64 | head -c 32`
311 echo -e "$JUJU_PASSWD\n$JUJU_PASSWD" | lxc exec VCA -- juju change-user-password
312 }
313
314 function configure_SOUI(){
315 . $OSM_DEVOPS/installers/export_ips
316 JUJU_CONTROLLER_IP=`lxc exec VCA -- lxc list -c 4 |grep eth0 |awk '{print $2}'`
317 RO_TENANT_ID=`lxc exec RO -- openmano tenant-list osm |awk '{print $1}'`
318
319 echo -e " Configuring MON"
320 #Information to be added about SO socket for logging
321
322 echo -e " Configuring SO"
323 sudo route add -host $JUJU_CONTROLLER_IP gw $VCA_CONTAINER_IP
324 sudo ip route add 10.44.127.0/24 via $VCA_CONTAINER_IP
325 sudo sed -i "$ i route add -host $JUJU_CONTROLLER_IP gw $VCA_CONTAINER_IP" /etc/rc.local
326 sudo sed -i "$ i ip route add 10.44.127.0/24 via $VCA_CONTAINER_IP" /etc/rc.local
327 # make journaling persistent
328 lxc exec SO-ub -- mkdir -p /var/log/journal
329 lxc exec SO-ub -- systemd-tmpfiles --create --prefix /var/log/journal
330 lxc exec SO-ub -- systemctl restart systemd-journald
331
332 echo RIFT_EXTERNAL_ADDRESS=$DEFAULT_IP | lxc exec SO-ub -- tee -a /usr/rift/etc/default/launchpad
333
334 lxc exec SO-ub -- systemctl restart launchpad
335
336 so_is_up $SO_CONTAINER_IP
337
338 #delete existing config agent (could be there on reconfigure)
339 curl -k --request DELETE \
340 --url https://$SO_CONTAINER_IP:8008/api/config/config-agent/account/osmjuju \
341 --header 'accept: application/vnd.yang.data+json' \
342 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
343 --header 'cache-control: no-cache' \
344 --header 'content-type: application/vnd.yang.data+json' &> /dev/null
345
346 result=$(curl -k --request POST \
347 --url https://$SO_CONTAINER_IP:8008/api/config/config-agent \
348 --header 'accept: application/vnd.yang.data+json' \
349 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
350 --header 'cache-control: no-cache' \
351 --header 'content-type: application/vnd.yang.data+json' \
352 --data '{"account": [ { "name": "osmjuju", "account-type": "juju", "juju": { "ip-address": "'$JUJU_CONTROLLER_IP'", "port": "17070", "user": "admin", "secret": "'$JUJU_PASSWD'" } } ]}')
353 [[ $result =~ .*success.* ]] || FATAL "Failed config-agent configuration: $result"
354
355 #R1/R2 config line
356 #result=$(curl -k --request PUT \
357 # --url https://$SO_CONTAINER_IP:8008/api/config/resource-orchestrator \
358 # --header 'accept: application/vnd.yang.data+json' \
359 # --header 'authorization: Basic YWRtaW46YWRtaW4=' \
360 # --header 'cache-control: no-cache' \
361 # --header 'content-type: application/vnd.yang.data+json' \
362 # --data '{ "openmano": { "host": "'$RO_CONTAINER_IP'", "port": "9090", "tenant-id": "'$RO_TENANT_ID'" }, "name": "osmopenmano", "account-type": "openmano" }')
363
364 result=$(curl -k --request PUT \
365 --url https://$SO_CONTAINER_IP:8008/api/config/project/default/ro-account/account \
366 --header 'accept: application/vnd.yang.data+json' \
367 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
368 --header 'cache-control: no-cache' \
369 --header 'content-type: application/vnd.yang.data+json' \
370 --data '{"rw-ro-account:account": [ { "openmano": { "host": "'$RO_CONTAINER_IP'", "port": "9090", "tenant-id": "'$RO_TENANT_ID'"}, "name": "osmopenmano", "ro-account-type": "openmano" }]}')
371 [[ $result =~ .*success.* ]] || FATAL "Failed resource-orchestrator configuration: $result"
372
373 result=$(curl -k --request PATCH \
374 --url https://$SO_CONTAINER_IP:8008/v2/api/config/openidc-provider-config/rw-ui-client/redirect-uri \
375 --header 'accept: application/vnd.yang.data+json' \
376 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
377 --header 'cache-control: no-cache' \
378 --header 'content-type: application/vnd.yang.data+json' \
379 --data '{"redirect-uri": "https://'$DEFAULT_IP':8443/callback" }')
380 [[ $result =~ .*success.* ]] || FATAL "Failed redirect-uri configuration: $result"
381
382 result=$(curl -k --request PATCH \
383 --url https://$SO_CONTAINER_IP:8008/v2/api/config/openidc-provider-config/rw-ui-client/post-logout-redirect-uri \
384 --header 'accept: application/vnd.yang.data+json' \
385 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
386 --header 'cache-control: no-cache' \
387 --header 'content-type: application/vnd.yang.data+json' \
388 --data '{"post-logout-redirect-uri": "https://'$DEFAULT_IP':8443/?api_server=https://'$DEFAULT_IP'" }')
389 [[ $result =~ .*success.* ]] || FATAL "Failed post-logout-redirect-uri configuration: $result"
390
391 lxc exec SO-ub -- tee /etc/network/interfaces.d/60-rift.cfg <<EOF
392 auto lo:1
393 iface lo:1 inet static
394 address $DEFAULT_IP
395 netmask 255.255.255.255
396 EOF
397 lxc exec SO-ub ifup lo:1
398 }
399
400 #Configure RO, VCA, and SO with the initial configuration:
401 # RO -> tenant:osm, logs to be sent to SO
402 # VCA -> juju-password
403 # SO -> route to Juju Controller, add RO account, add VCA account
404 function configure(){
405 #Configure components
406 echo -e "\nConfiguring components"
407 configure_RO
408 configure_VCA
409 configure_SOUI
410 }
411
412 function install_lxd() {
413 sudo apt-get update
414 sudo apt-get install -y lxd
415 newgrp lxd
416 lxd init --auto
417 lxd waitready
418 lxc network create lxdbr0 ipv4.address=auto ipv4.nat=true ipv6.address=none ipv6.nat=false
419 DEFAULT_INTERFACE=$(route -n | awk '$1~/^0.0.0.0/ {print $8}')
420 DEFAULT_MTU=$(ip addr show $DEFAULT_INTERFACE | perl -ne 'if (/mtu\s(\d+)/) {print $1;}')
421 lxc profile device set default eth0 mtu $DEFAULT_MTU
422 #sudo systemctl stop lxd-bridge
423 #sudo systemctl --system daemon-reload
424 #sudo systemctl enable lxd-bridge
425 #sudo systemctl start lxd-bridge
426 }
427
428 function ask_user(){
429 # ask to the user and parse a response among 'y', 'yes', 'n' or 'no'. Case insensitive
430 # Params: $1 text to ask; $2 Action by default, can be 'y' for yes, 'n' for no, other or empty for not allowed
431 # Return: true(0) if user type 'yes'; false (1) if user type 'no'
432 read -e -p "$1" USER_CONFIRMATION
433 while true ; do
434 [ -z "$USER_CONFIRMATION" ] && [ "$2" == 'y' ] && return 0
435 [ -z "$USER_CONFIRMATION" ] && [ "$2" == 'n' ] && return 1
436 [ "${USER_CONFIRMATION,,}" == "yes" ] || [ "${USER_CONFIRMATION,,}" == "y" ] && return 0
437 [ "${USER_CONFIRMATION,,}" == "no" ] || [ "${USER_CONFIRMATION,,}" == "n" ] && return 1
438 read -e -p "Please type 'yes' or 'no': " USER_CONFIRMATION
439 done
440 }
441
442 function launch_container_from_lxd(){
443 export OSM_MDG=$1
444 OSM_load_config
445 export OSM_BASE_IMAGE=$2
446 if ! container_exists $OSM_BUILD_CONTAINER; then
447 CONTAINER_OPTS=""
448 [[ "$OSM_BUILD_CONTAINER_PRIVILEGED" == yes ]] && CONTAINER_OPTS="$CONTAINER_OPTS -c security.privileged=true"
449 [[ "$OSM_BUILD_CONTAINER_ALLOW_NESTED" == yes ]] && CONTAINER_OPTS="$CONTAINER_OPTS -c security.nesting=true"
450 create_container $OSM_BASE_IMAGE $OSM_BUILD_CONTAINER $CONTAINER_OPTS
451 wait_container_up $OSM_BUILD_CONTAINER
452 fi
453 }
454
455 function install_osmclient(){
456 CLIENT_RELEASE=${RELEASE#"-R "}
457 CLIENT_REPOSITORY_KEY="OSM%20ETSI%20Release%20Key.gpg"
458 CLIENT_REPOSITORY=${REPOSITORY#"-r "}
459 [ -z "$REPOSITORY_BASE" ] && REPOSITORY_BASE="-u https://osm-download.etsi.org/repository/osm/debian"
460 CLIENT_REPOSITORY_BASE=${REPOSITORY_BASE#"-u "}
461 key_location=$CLIENT_REPOSITORY_BASE/$CLIENT_RELEASE/$CLIENT_REPOSITORY_KEY
462 curl $key_location | sudo apt-key add -
463 sudo add-apt-repository -y "deb [arch=amd64] $CLIENT_REPOSITORY_BASE/$CLIENT_RELEASE $CLIENT_REPOSITORY osmclient"
464 sudo apt-get update
465 sudo apt-get install -y python-pip
466 sudo -H pip install pip==9.0.3
467 sudo -H pip install python-magic
468 sudo apt-get install -y python-osmclient
469 #sed 's,OSM_SOL005=[^$]*,OSM_SOL005=True,' -i ${HOME}/.bashrc
470 #echo 'export OSM_HOSTNAME=localhost' >> ${HOME}/.bashrc
471 #echo 'export OSM_SOL005=True' >> ${HOME}/.bashrc
472 [ -z "$INSTALL_LIGHTWEIGHT" ] && export OSM_HOSTNAME=`lxc list | awk '($2=="SO-ub"){print $6}'`
473 [ -z "$INSTALL_LIGHTWEIGHT" ] && export OSM_RO_HOSTNAME=`lxc list | awk '($2=="RO"){print $6}'`
474 [ -n "$INSTALL_LIGHTWEIGHT" ] && export OSM_HOSTNAME=127.0.0.1
475 echo -e "\nOSM client installed"
476 echo -e "You might be interested in adding the following OSM client env variables to your .bashrc file:"
477 echo " export OSM_HOSTNAME=${OSM_HOSTNAME}"
478 [ -n "$INSTALL_LIGHTWEIGHT" ] && echo " export OSM_SOL005=True"
479 [ -z "$INSTALL_LIGHTWEIGHT" ] && echo " export OSM_RO_HOSTNAME=${OSM_RO_HOSTNAME}"
480 return 0
481 }
482
483 function install_from_lxdimages(){
484 LXD_RELEASE=${RELEASE#"-R "}
485 if [ -n "$LXD_REPOSITORY_PATH" ]; then
486 LXD_IMAGE_DIR="$LXD_REPOSITORY_PATH"
487 else
488 LXD_IMAGE_DIR="$(mktemp -d -q --tmpdir "osmimages.XXXXXX")"
489 trap 'rm -rf "$LXD_IMAGE_DIR"' EXIT
490 fi
491 echo -e "\nDeleting previous lxd images if they exist"
492 lxc image show osm-ro &>/dev/null && lxc image delete osm-ro
493 lxc image show osm-vca &>/dev/null && lxc image delete osm-vca
494 lxc image show osm-soui &>/dev/null && lxc image delete osm-soui
495 echo -e "\nImporting osm-ro"
496 [ -z "$LXD_REPOSITORY_PATH" ] && wget -O $LXD_IMAGE_DIR/osm-ro.tar.gz $LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-ro.tar.gz
497 lxc image import $LXD_IMAGE_DIR/osm-ro.tar.gz --alias osm-ro
498 rm -f $LXD_IMAGE_DIR/osm-ro.tar.gz
499 echo -e "\nImporting osm-vca"
500 [ -z "$LXD_REPOSITORY_PATH" ] && wget -O $LXD_IMAGE_DIR/osm-vca.tar.gz $LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-vca.tar.gz
501 lxc image import $LXD_IMAGE_DIR/osm-vca.tar.gz --alias osm-vca
502 rm -f $LXD_IMAGE_DIR/osm-vca.tar.gz
503 echo -e "\nImporting osm-soui"
504 [ -z "$LXD_REPOSITORY_PATH" ] && wget -O $LXD_IMAGE_DIR/osm-soui.tar.gz $LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-soui.tar.gz
505 lxc image import $LXD_IMAGE_DIR/osm-soui.tar.gz --alias osm-soui
506 rm -f $LXD_IMAGE_DIR/osm-soui.tar.gz
507 launch_container_from_lxd RO osm-ro
508 ro_is_up && track RO
509 launch_container_from_lxd VCA osm-vca
510 vca_is_up && track VCA
511 launch_container_from_lxd MON osm-mon
512 mon_is_up && track MON
513 launch_container_from_lxd SO osm-soui
514 #so_is_up && track SOUI
515 track SOUI
516 }
517
518 function install_docker_ce() {
519 # installs and configures Docker CE
520 echo "Installing Docker CE ..."
521 sudo apt-get -qq update
522 sudo apt-get install -y apt-transport-https ca-certificates software-properties-common
523 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
524 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
525 sudo apt-get -qq update
526 sudo apt-get install -y docker-ce
527 echo "Adding user to group 'docker'"
528 sudo groupadd -f docker
529 sudo usermod -aG docker $USER
530 sleep 2
531 sudo service docker restart
532 echo "... restarted Docker service"
533 sg docker -c "docker version" || FATAL "Docker installation failed"
534 echo "... Docker CE installation done"
535 return 0
536 }
537
538 function install_docker_compose() {
539 # installs and configures docker-compose
540 echo "Installing Docker Compose ..."
541 sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
542 sudo chmod +x /usr/local/bin/docker-compose
543 echo "... Docker Compose installation done"
544 }
545
546 function install_juju() {
547 echo "Installing juju"
548 sudo snap install juju --classic
549 sudo dpkg-reconfigure -p medium lxd
550 sg lxd -c "juju bootstrap --bootstrap-series=xenial localhost osm"
551 [ $(juju status |grep "osm" |wc -l) -eq 1 ] || FATAL "Juju installation failed"
552 echo "Finished installation of juju"
553 }
554
555 function generate_docker_images() {
556 echo "Pulling and generating docker images"
557 newgrp docker << EONG
558 docker pull wurstmeister/kafka
559 docker pull wurstmeister/zookeeper
560 docker pull mongo
561 docker pull mysql:5
562 EONG
563 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/MON
564 git -C ${LWTEMPDIR}/MON checkout ${COMMIT_ID}
565 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/NBI
566 git -C ${LWTEMPDIR}/NBI checkout ${COMMIT_ID}
567 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/RO
568 git -C ${LWTEMPDIR}/RO checkout ${COMMIT_ID}
569 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/LCM
570 git -C ${LWTEMPDIR}/LCM checkout ${COMMIT_ID}
571 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/LW-UI
572 git -C ${LWTEMPDIR}/LW-UI checkout ${COMMIT_ID}
573 newgrp docker << EONG
574 docker build ${LWTEMPDIR}/MON -f ${LWTEMPDIR}/MON/docker/Dockerfile -t osm/mon --no-cache || ! echo "cannot build MON docker image" >&2
575 docker build ${LWTEMPDIR}/MON/policy_module -f ${LWTEMPDIR}/MON/policy_module/Dockerfile -t osm/pm --no-cache || ! echo "cannot build PM docker image" >&2
576 docker build ${LWTEMPDIR}/NBI -f ${LWTEMPDIR}/NBI/Dockerfile.local -t osm/nbi --no-cache || ! echo "cannot build NBI docker image" >&2
577 docker build ${LWTEMPDIR}/RO -f ${LWTEMPDIR}/RO/docker/Dockerfile-local -t osm/ro --no-cache || ! echo "cannot build RO docker image" >&2
578 docker build ${LWTEMPDIR}/LCM -f ${LWTEMPDIR}/LCM/Dockerfile.local -t osm/lcm --no-cache || ! echo "cannot build LCM docker image" >&2
579 docker build ${LWTEMPDIR}/LW-UI -t osm/light-ui -f ${LWTEMPDIR}/LW-UI/Dockerfile --no-cache || ! echo "cannot build LW-UI docker image" >&2
580 EONG
581 echo "Finished generation of docker images"
582 }
583
584 function generate_config_log_folders() {
585 echo "Generating config and log folders"
586 sudo mkdir -p /etc/osm
587 sudo mkdir -p /var/log/osm
588 echo "Finished generation of config and log folders"
589 }
590
591 function generate_docker_env_files() {
592 echo "Generating docker env files"
593 OSMLCM_VCA_HOST=`juju show-controller|grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'`
594 OSMLCM_VCA_SECRET=`grep password ${HOME}/.local/share/juju/accounts.yaml |awk '{print $2}'`
595 MYSQL_ROOT_PASSWORD=`date +%s | sha256sum | base64 | head -c 32`
596 echo "OSMLCM_VCA_HOST=${OSMLCM_VCA_HOST}" |sudo tee ${OSM_DEVOPS}/installers/docker/lcm.env
597 echo "OSMLCM_VCA_SECRET=${OSMLCM_VCA_SECRET}" |sudo tee -a ${OSM_DEVOPS}/installers/docker/lcm.env
598 echo "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" |sudo tee ${OSM_DEVOPS}/installers/docker/ro-db.env
599 echo "RO_DB_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" |sudo tee ${OSM_DEVOPS}/installers/docker/ro.env
600 echo "OS_NOTIFIER_URI=http://${DEFAULT_IP}:8662" |sudo tee ${OSM_DEVOPS}/installers/docker/mon.env
601 echo "Finished generation of docker env files"
602 }
603
604 function deploy_lightweight() {
605 echo "Deploying lightweight build"
606 if [ "${DEFAULT_MTU}" != "1500" ]; then
607 DOCKER_NETS=`sg docker -c "docker network list" | awk '{print $2}' | egrep -v "^ID$" | paste -d " " -s`
608 DOCKER_GW_NET=`sg docker -c "docker network inspect ${DOCKER_NETS}" | grep Subnet | awk -F\" '{print $4}' | egrep "^172" | sort -u | tail -1 | awk -F\. '{if ($2 != 255) print $1"."$2+1"."$3"."$4; else print "-1";}'`
609 sg docker -c "docker network create --subnet ${DOCKER_GW_NET} --opt com.docker.network.bridge.name=docker_gwbridge --opt com.docker.network.bridge.enable_icc=false --opt com.docker.network.bridge.enable_ip_masquerade=true --opt com.docker.network.driver.mtu=${DEFAULT_MTU} docker_gwbridge"
610 fi
611 newgrp docker << EONG
612 docker swarm init --advertise-addr ${DEFAULT_IP}
613 docker network create --driver=overlay --attachable --opt com.docker.network.driver.mtu=${DEFAULT_MTU} netOSM
614 docker stack deploy -c ${OSM_DEVOPS}/installers/docker/docker-compose.yaml osm
615 #docker-compose -f /usr/share/osm-devops/installers/docker/docker-compose.yaml up -d
616 EONG
617 echo "Finished deployment of lightweight build"
618 }
619
620 function deploy_elk() {
621 echo "Deploying ELK stack"
622 sg docker -c "docker stack deploy -c ${OSM_DEVOPS}/installers/docker/osm_elk/docker-compose.yml osm_elk"
623 echo "Waiting for ELK stack to be up and running"
624 time=0
625 step=2
626 timelength=20
627 elk_is_up=1
628 while [ $time -le $timelength ]; do
629 if [[ $(curl -XGET http://localhost:5601/status -I | grep "HTTP/1.1 200 OK" | wc -l ) -eq 1 ]]; then
630 elk_is_up=0
631 break
632 fi
633 sleep $step
634 time=$((time+step))
635 done
636 if [ $elk_is_up -eq 0 ]; then
637 echo "ELK is up and running. Trying to create index pattern..."
638 #Create index pattern
639 curl -f -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
640 "http://localhost:5601/api/saved_objects/index-pattern/logstash-*" \
641 -d"{\"attributes\":{\"title\":\"logstash-*\",\"timeFieldName\":\"@timestamp\"}}"
642 #Make it the default index
643 curl -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
644 "http://localhost:5601/api/kibana/settings/defaultIndex" \
645 -d"{\"value\":\"logstash-*\"}"
646 else
647 echo "Cannot connect to Kibana to create index pattern."
648 echo "Once Kibana is running, you can use the following instructions to create index pattern:"
649 echo 'curl -f -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
650 "http://localhost:5601/api/saved_objects/index-pattern/logstash-*" \
651 -d"{\"attributes\":{\"title\":\"logstash-*\",\"timeFieldName\":\"@timestamp\"}}"'
652 echo 'curl -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
653 "http://localhost:5601/api/kibana/settings/defaultIndex" \
654 -d"{\"value\":\"logstash-*\"}"'
655 fi
656 echo "Finished deployment of ELK stack"
657 return 0
658 }
659
660 function deploy_perfmon() {
661 echo "Generating osm/kafka-exporter docker image"
662 sg docker -c "docker build ${OSM_DEVOPS}/installers/docker/osm_metrics/kafka-exporter -f ${OSM_DEVOPS}/installers/docker/osm_metrics/kafka-exporter/Dockerfile -t osm/kafka-exporter --no-cache || ! echo 'cannot build kafka-exporter docker image' >&2"
663 echo "Finished generation of osm/kafka-exporter docker image"
664 echo "Deploying PM stack (Kafka exporter + Prometheus + Grafana)"
665 sg docker -c "docker stack deploy -c ${OSM_DEVOPS}/installers/docker/osm_metrics/docker-compose.yml osm_metrics"
666 echo "Finished deployment of PM stack"
667 return 0
668 }
669
670 function install_lightweight() {
671 [ "$USER" == "root" ] && FATAL "You are running the installer as root. The installer is prepared to be executed as a normal user with sudo privileges."
672 echo "Installing lightweight build of OSM"
673 LWTEMPDIR="$(mktemp -d -q --tmpdir "installosmlight.XXXXXX")"
674 trap 'rm -rf "${LWTEMPDIR}"' EXIT
675 DEFAULT_IF=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
676 DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
677 DEFAULT_MTU=$(ip addr show ${DEFAULT_IF} | perl -ne 'if (/mtu\s(\d+)/) {print $1;}')
678 need_packages_lw="lxd"
679 echo -e "Checking required packages: $need_packages_lw"
680 dpkg -l $need_packages_lw &>/dev/null \
681 || ! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
682 || sudo apt-get update \
683 || FATAL "failed to run apt-get update"
684 dpkg -l $need_packages_lw &>/dev/null \
685 || ! echo -e "Installing $need_packages_lw requires root privileges." \
686 || sudo apt-get install -y $need_packages_lw \
687 || FATAL "failed to install $need_packages_lw"
688 install_juju
689 track juju
690 install_docker_ce
691 track docker_ce
692 #install_docker_compose
693 generate_docker_images
694 track docker_build
695 generate_docker_env_files
696 deploy_lightweight
697 track docker_deploy
698 [ -n "$INSTALL_VIMEMU" ] && install_vimemu && track vimemu
699 [ -n "$INSTALL_ELK" ] && deploy_elk && track elk
700 [ -n "$INSTALL_PERFMON" ] && deploy_perfmon && track perfmon
701 install_osmclient
702 track osmclient
703 wget -q -O- https://osm-download.etsi.org/ftp/osm-4.0-four/README2.txt &> /dev/null
704 track end
705 return 0
706 }
707
708 function install_vimemu() {
709 echo "\nInstalling vim-emu"
710 EMUTEMPDIR="$(mktemp -d -q --tmpdir "installosmvimemu.XXXXXX")"
711 trap 'rm -rf "${EMUTEMPDIR}"' EXIT
712 # clone vim-emu repository (attention: branch is currently master only)
713 echo "Cloning vim-emu repository ..."
714 git clone https://osm.etsi.org/gerrit/osm/vim-emu.git $EMUTEMPDIR
715 # build vim-emu docker
716 echo "Building vim-emu Docker container..."
717 sudo docker build -t vim-emu-img -f $EMUTEMPDIR/Dockerfile --no-cache $EMUTEMPDIR/
718 # start vim-emu container as daemon
719 echo "Starting vim-emu Docker container 'vim-emu' ..."
720 if [ -n "$INSTALL_LIGHTWEIGHT" ]; then
721 # in lightweight mode, the emulator needs to be attached to netOSM
722 sudo docker run --name vim-emu -t -d --rm --privileged --pid='host' --network=netOSM -v /var/run/docker.sock:/var/run/docker.sock vim-emu-img python examples/osm_default_daemon_topology_2_pop.py
723 else
724 # classic build mode
725 sudo docker run --name vim-emu -t -d --rm --privileged --pid='host' -v /var/run/docker.sock:/var/run/docker.sock vim-emu-img python examples/osm_default_daemon_topology_2_pop.py
726 fi
727 echo "Waiting for 'vim-emu' container to start ..."
728 sleep 5
729 export VIMEMU_HOSTNAME=$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vim-emu)
730 echo "vim-emu running at ${VIMEMU_HOSTNAME} ..."
731 # print vim-emu connection info
732 echo -e "\nYou might be interested in adding the following vim-emu env variables to your .bashrc file:"
733 echo " export VIMEMU_HOSTNAME=${VIMEMU_HOSTNAME}"
734 echo -e "To add the emulated VIM to OSM you should do:"
735 echo " osm vim-create --name emu-vim1 --user username --password password --auth_url http://${VIMEMU_HOSTNAME}:6001/v2.0 --tenant tenantName --account_type openstack"
736 }
737
738 function dump_vars(){
739 echo "DEVELOP=$DEVELOP"
740 echo "INSTALL_FROM_SOURCE=$INSTALL_FROM_SOURCE"
741 echo "UNINSTALL=$UNINSTALL"
742 echo "NAT=$NAT"
743 echo "UPDATE=$UPDATE"
744 echo "RECONFIGURE=$RECONFIGURE"
745 echo "TEST_INSTALLER=$TEST_INSTALLER"
746 echo "INSTALL_VIMEMU=$INSTALL_VIMEMU"
747 echo "INSTALL_LXD=$INSTALL_LXD"
748 echo "INSTALL_FROM_LXDIMAGES=$INSTALL_FROM_LXDIMAGES"
749 echo "LXD_REPOSITORY_BASE=$LXD_REPOSITORY_BASE"
750 echo "LXD_REPOSITORY_PATH=$LXD_REPOSITORY_PATH"
751 echo "INSTALL_LIGHTWEIGHT=$INSTALL_LIGHTWEIGHT"
752 echo "INSTALL_ONLY=$INSTALL_ONLY"
753 echo "INSTALL_ELK=$INSTALL_ELK"
754 echo "INSTALL_PERFMON=$INSTALL_PERFMON"
755 echo "RELEASE=$RELEASE"
756 echo "REPOSITORY=$REPOSITORY"
757 echo "REPOSITORY_BASE=$REPOSITORY_BASE"
758 echo "REPOSITORY_KEY=$REPOSITORY_KEY"
759 echo "NOCONFIGURE=$NOCONFIGURE"
760 echo "SHOWOPTS=$SHOWOPTS"
761 echo "Install from specific refspec (-b): $COMMIT_ID"
762 }
763
764 function track(){
765 ctime=`date +%s`
766 duration=$((ctime - SESSION_ID))
767 url="http://www.woopra.com/track/ce?project=osm.etsi.org&cookie=${SESSION_ID}"
768 #url="${url}&ce_campaign_name=${CAMPAIGN_NAME}"
769 event_name="bin"
770 [ -z "$INSTALL_LIGHTWEIGHT" ] && [ -n "$INSTALL_FROM_SOURCE" ] && event_name="binsrc"
771 [ -z "$INSTALL_LIGHTWEIGHT" ] && [ -n "$INSTALL_FROM_LXDIMAGES" ] && event_name="lxd"
772 [ -n "$INSTALL_LIGHTWEIGHT" ] && event_name="lw"
773 event_name="${event_name}_$1"
774 url="${url}&event=${event_name}&ce_duration=${duration}"
775 wget -q -O /dev/null $url
776 }
777
778 UNINSTALL=""
779 DEVELOP=""
780 NAT=""
781 UPDATE=""
782 RECONFIGURE=""
783 TEST_INSTALLER=""
784 INSTALL_LXD=""
785 SHOWOPTS=""
786 COMMIT_ID=""
787 ASSUME_YES=""
788 INSTALL_FROM_SOURCE=""
789 RELEASE="-R ReleaseTHREE"
790 REPOSITORY="-r stable"
791 INSTALL_VIMEMU=""
792 INSTALL_FROM_LXDIMAGES=""
793 LXD_REPOSITORY_BASE="https://osm-download.etsi.org/repository/osm/lxd"
794 LXD_REPOSITORY_PATH=""
795 INSTALL_LIGHTWEIGHT="y"
796 INSTALL_ONLY=""
797 INSTALL_ELK=""
798 INSTALL_PERFMON=""
799 NOCONFIGURE=""
800 RELEASE_DAILY=""
801 SESSION_ID=`date +%s`
802 OSM_DEVOPS=
803
804 while getopts ":hy-:b:r:k:u:R:l:p:D:o:" o; do
805 case "${o}" in
806 h)
807 usage && exit 0
808 ;;
809 b)
810 COMMIT_ID=${OPTARG}
811 ;;
812 r)
813 REPOSITORY="-r ${OPTARG}"
814 ;;
815 R)
816 RELEASE="-R ${OPTARG}"
817 ;;
818 k)
819 REPOSITORY_KEY="-k ${OPTARG}"
820 ;;
821 u)
822 REPOSITORY_BASE="-u ${OPTARG}"
823 ;;
824 l)
825 LXD_REPOSITORY_BASE="${OPTARG}"
826 ;;
827 p)
828 LXD_REPOSITORY_PATH="${OPTARG}"
829 ;;
830 D)
831 OSM_DEVOPS="${OPTARG}"
832 ;;
833 o)
834 INSTALL_ONLY="y"
835 [ "${OPTARG}" == "vimemu" ] && INSTALL_VIMEMU="y" && continue
836 [ "${OPTARG}" == "elk_stack" ] && INSTALL_ELK="y" && continue
837 [ "${OPTARG}" == "pm_stack" ] && INSTALL_PERFMON="y" && continue
838 ;;
839 -)
840 [ "${OPTARG}" == "help" ] && usage && exit 0
841 [ "${OPTARG}" == "source" ] && INSTALL_FROM_SOURCE="y" && continue
842 [ "${OPTARG}" == "develop" ] && DEVELOP="y" && continue
843 [ "${OPTARG}" == "uninstall" ] && UNINSTALL="y" && continue
844 [ "${OPTARG}" == "nat" ] && NAT="y" && continue
845 [ "${OPTARG}" == "update" ] && UPDATE="y" && continue
846 [ "${OPTARG}" == "reconfigure" ] && RECONFIGURE="y" && continue
847 [ "${OPTARG}" == "test" ] && TEST_INSTALLER="y" && continue
848 [ "${OPTARG}" == "lxdinstall" ] && INSTALL_LXD="y" && continue
849 [ "${OPTARG}" == "lxdimages" ] && INSTALL_FROM_LXDIMAGES="y" && continue
850 [ "${OPTARG}" == "lightweight" ] && INSTALL_LIGHTWEIGHT="y" && continue
851 [ "${OPTARG}" == "soui" ] && INSTALL_LIGHTWEIGHT="" && RELEASE="-R ReleaseTHREE" && REPOSITORY="-r stable" && continue
852 [ "${OPTARG}" == "vimemu" ] && INSTALL_VIMEMU="y" && continue
853 [ "${OPTARG}" == "elk_stack" ] && INSTALL_ELK="y" && continue
854 [ "${OPTARG}" == "pm_stack" ] && INSTALL_PERFMON="y" && continue
855 [ "${OPTARG}" == "noconfigure" ] && NOCONFIGURE="y" && continue
856 [ "${OPTARG}" == "showopts" ] && SHOWOPTS="y" && continue
857 [ "${OPTARG}" == "daily" ] && RELEASE_DAILY="y" && continue
858 echo -e "Invalid option: '--$OPTARG'\n" >&2
859 usage && exit 1
860 ;;
861 \?)
862 echo -e "Invalid option: '-$OPTARG'\n" >&2
863 usage && exit 1
864 ;;
865 y)
866 ASSUME_YES="y"
867 ;;
868 *)
869 usage && exit 1
870 ;;
871 esac
872 done
873
874 [ -n "$INSTALL_FROM_LXDIMAGES" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --lxd can only be used with --soui"
875 [ -n "$NAT" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --nat can only be used with --soui"
876 [ -n "$NOCONFIGURE" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --noconfigure can only be used with --soui"
877
878 if [ -n "$SHOWOPTS" ]; then
879 dump_vars
880 exit 0
881 fi
882
883 [ -n "$RELEASE_DAILY" ] && echo -e "\nInstalling from daily build repo" && RELEASE="-R ReleaseTHREE-daily" && REPOSITORY="-r testing" && COMMIT_ID="master"
884
885 # if develop, we force master
886 [ -z "$COMMIT_ID" ] && [ -n "$DEVELOP" ] && COMMIT_ID="master"
887
888 # forcing source from master removed. Now only install from source when explicit
889 # [ -n "$COMMIT_ID" ] && [ "$COMMIT_ID" == "master" ] && INSTALL_FROM_SOURCE="y"
890
891 if [ -z "$OSM_DEVOPS" ]; then
892 if [ -n "$TEST_INSTALLER" ]; then
893 echo -e "\nUsing local devops repo for OSM installation"
894 TEMPDIR="$(dirname $(realpath $(dirname $0)))"
895 else
896 echo -e "\nCreating temporary dir for OSM installation"
897 TEMPDIR="$(mktemp -d -q --tmpdir "installosm.XXXXXX")"
898 trap 'rm -rf "$TEMPDIR"' EXIT
899 fi
900 fi
901
902 need_packages="git jq wget curl tar"
903 echo -e "Checking required packages: $need_packages"
904 dpkg -l $need_packages &>/dev/null \
905 || ! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
906 || sudo apt-get update \
907 || FATAL "failed to run apt-get update"
908 dpkg -l $need_packages &>/dev/null \
909 || ! echo -e "Installing $need_packages requires root privileges." \
910 || sudo apt-get install -y $need_packages \
911 || FATAL "failed to install $need_packages"
912
913 if [ -z "$OSM_DEVOPS" ]; then
914 if [ -z "$TEST_INSTALLER" ]; then
915 echo -e "\nCloning devops repo temporarily"
916 git clone https://osm.etsi.org/gerrit/osm/devops.git $TEMPDIR
917 RC_CLONE=$?
918 fi
919
920 echo -e "\nGuessing the current stable release"
921 LATEST_STABLE_DEVOPS=`git -C $TEMPDIR tag -l v[0-9].* | sort -V | tail -n1`
922 [ -z "$COMMIT_ID" ] && [ -z "$LATEST_STABLE_DEVOPS" ] && echo "Could not find the current latest stable release" && exit 0
923 echo "Latest tag in devops repo: $LATEST_STABLE_DEVOPS"
924 [ -z "$COMMIT_ID" ] && [ -n "$LATEST_STABLE_DEVOPS" ] && COMMIT_ID="tags/$LATEST_STABLE_DEVOPS"
925
926 if [ -n "$RELEASE_DAILY" ]; then
927 echo "Using master/HEAD devops"
928 git -C $TEMPDIR checkout master
929 elif [ -z "$TEST_INSTALLER" ]; then
930 git -C $TEMPDIR checkout tags/$LATEST_STABLE_DEVOPS
931 fi
932 OSM_DEVOPS=$TEMPDIR
933 fi
934
935 OSM_JENKINS="$OSM_DEVOPS/jenkins"
936 . $OSM_JENKINS/common/all_funcs
937
938 [ -n "$INSTALL_LIGHTWEIGHT" ] && [ -n "$UNINSTALL" ] && uninstall_lightweight && echo -e "\nDONE" && exit 0
939 [ -n "$UNINSTALL" ] && uninstall && echo -e "\nDONE" && exit 0
940 [ -n "$NAT" ] && nat && echo -e "\nDONE" && exit 0
941 [ -n "$UPDATE" ] && update && echo -e "\nDONE" && exit 0
942 [ -n "$RECONFIGURE" ] && configure && echo -e "\nDONE" && exit 0
943 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_ELK" ] && deploy_elk
944 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_PERFMON" ] && deploy_perfmon
945 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_VIMEMU" ] && install_vimemu
946 [ -n "$INSTALL_ONLY" ] && echo -e "\nDONE" && exit 0
947
948 #Installation starts here
949 wget -q -O- https://osm-download.etsi.org/ftp/osm-4.0-four/README.txt &> /dev/null
950 track start
951
952 [ -n "$INSTALL_LIGHTWEIGHT" ] && install_lightweight && echo -e "\nDONE" && exit 0
953 echo -e "\nInstalling OSM from refspec: $COMMIT_ID"
954 if [ -n "$INSTALL_FROM_SOURCE" ] && [ -z "$ASSUME_YES" ]; then
955 ! ask_user "The installation will take about 75-90 minutes. Continue (Y/n)? " y && echo "Cancelled!" && exit 1
956 fi
957
958 echo -e "Checking required packages: lxd"
959 lxd --version &>/dev/null || FATAL "lxd not present, exiting."
960 [ -n "$INSTALL_LXD" ] && echo -e "\nInstalling and configuring lxd" && install_lxd
961
962 # use local devops for containers
963 export OSM_USE_LOCAL_DEVOPS=true
964 if [ -n "$INSTALL_FROM_SOURCE" ]; then #install from source
965 echo -e "\nCreating the containers and building from source ..."
966 $OSM_DEVOPS/jenkins/host/start_build RO --notest checkout $COMMIT_ID || FATAL "RO container build failed (refspec: '$COMMIT_ID')"
967 ro_is_up && track RO
968 $OSM_DEVOPS/jenkins/host/start_build VCA || FATAL "VCA container build failed"
969 vca_is_up && track VCA
970 $OSM_DEVOPS/jenkins/host/start_build MON || FATAL "MON install failed"
971 mon_is_up && track MON
972 $OSM_DEVOPS/jenkins/host/start_build SO checkout $COMMIT_ID || FATAL "SO container build failed (refspec: '$COMMIT_ID')"
973 $OSM_DEVOPS/jenkins/host/start_build UI checkout $COMMIT_ID || FATAL "UI container build failed (refspec: '$COMMIT_ID')"
974 #so_is_up && track SOUI
975 track SOUI
976 elif [ -n "$INSTALL_FROM_LXDIMAGES" ]; then #install from LXD images stored in OSM repo
977 echo -e "\nInstalling from lxd images ..."
978 install_from_lxdimages
979 else #install from binaries
980 echo -e "\nCreating the containers and installing from binaries ..."
981 $OSM_DEVOPS/jenkins/host/install RO $REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL "RO install failed"
982 ro_is_up && track RO
983 $OSM_DEVOPS/jenkins/host/start_build VCA || FATAL "VCA install failed"
984 vca_is_up && track VCA
985 $OSM_DEVOPS/jenkins/host/install MON || FATAL "MON build failed"
986 mon_is_up && track MON
987 $OSM_DEVOPS/jenkins/host/install SO $REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL "SO install failed"
988 $OSM_DEVOPS/jenkins/host/install UI $REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL "UI install failed"
989 #so_is_up && track SOUI
990 track SOUI
991 fi
992
993 #Install iptables-persistent and configure NAT rules
994 [ -z "$NOCONFIGURE" ] && nat
995
996 #Configure components
997 [ -z "$NOCONFIGURE" ] && configure
998
999 #Install osmclient
1000 [ -z "$NOCONFIGURE" ] && install_osmclient
1001
1002 #Install vim-emu (optional)
1003 [ -n "$INSTALL_VIMEMU" ] && install_docker_ce && install_vimemu
1004
1005 wget -q -O- https://osm-download.etsi.org/ftp/osm-4.0-four/README2.txt &> /dev/null
1006 track end
1007 echo -e "\nDONE"
1008