installer: docker build with --no-cache in vimemu and kafka exporter
[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_docker_env_files() {
585 echo "Generating docker env files"
586 OSMLCM_VCA_HOST=`juju show-controller|grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'`
587 OSMLCM_VCA_SECRET=`grep password ${HOME}/.local/share/juju/accounts.yaml |awk '{print $2}'`
588 MYSQL_ROOT_PASSWORD=`date +%s | sha256sum | base64 | head -c 32`
589 echo "OSMLCM_VCA_HOST=${OSMLCM_VCA_HOST}" |sudo tee ${OSM_DEVOPS}/installers/docker/lcm.env
590 echo "OSMLCM_VCA_SECRET=${OSMLCM_VCA_SECRET}" |sudo tee -a ${OSM_DEVOPS}/installers/docker/lcm.env
591 echo "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" |sudo tee ${OSM_DEVOPS}/installers/docker/ro-db.env
592 echo "RO_DB_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" |sudo tee ${OSM_DEVOPS}/installers/docker/ro.env
593 echo "OS_NOTIFIER_URI=http://${DEFAULT_IP}:8662" |sudo tee ${OSM_DEVOPS}/installers/docker/mon.env
594 echo "Finished generation of docker env files"
595 }
596
597 function deploy_lightweight() {
598 echo "Deploying lightweight build"
599 if [ "${DEFAULT_MTU}" != "1500" ]; then
600 DOCKER_NETS=`sg docker -c "docker network list" | awk '{print $2}' | egrep -v "^ID$" | paste -d " " -s`
601 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";}'`
602 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"
603 fi
604 newgrp docker << EONG
605 docker swarm init --advertise-addr ${DEFAULT_IP}
606 docker network create --driver=overlay --attachable --opt com.docker.network.driver.mtu=${DEFAULT_MTU} netOSM
607 docker stack deploy -c ${OSM_DEVOPS}/installers/docker/docker-compose.yaml osm
608 #docker-compose -f /usr/share/osm-devops/installers/docker/docker-compose.yaml up -d
609 EONG
610 echo "Finished deployment of lightweight build"
611 }
612
613 function deploy_elk() {
614 echo "Deploying ELK stack"
615 sg docker -c "docker stack deploy -c ${OSM_DEVOPS}/installers/docker/osm_elk/docker-compose.yml osm_elk"
616 echo "Waiting for ELK stack to be up and running"
617 time=0
618 step=2
619 timelength=20
620 elk_is_up=1
621 while [ $time -le $timelength ]; do
622 if [[ $(curl -XGET http://localhost:5601/status -I | grep "HTTP/1.1 200 OK" | wc -l ) -eq 1 ]]; then
623 elk_is_up=0
624 break
625 fi
626 sleep $step
627 time=$((time+step))
628 done
629 if [ $elk_is_up -eq 0 ]; then
630 echo "ELK is up and running. Trying to create index pattern..."
631 #Create index pattern
632 curl -f -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
633 "http://localhost:5601/api/saved_objects/index-pattern/logstash-*" \
634 -d"{\"attributes\":{\"title\":\"logstash-*\",\"timeFieldName\":\"@timestamp\"}}"
635 #Make it the default index
636 curl -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
637 "http://localhost:5601/api/kibana/settings/defaultIndex" \
638 -d"{\"value\":\"logstash-*\"}"
639 else
640 echo "Cannot connect to Kibana to create index pattern."
641 echo "Once Kibana is running, you can use the following instructions to create index pattern:"
642 echo 'curl -f -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
643 "http://localhost:5601/api/saved_objects/index-pattern/logstash-*" \
644 -d"{\"attributes\":{\"title\":\"logstash-*\",\"timeFieldName\":\"@timestamp\"}}"'
645 echo 'curl -XPOST -H "Content-Type: application/json" -H "kbn-xsrf: anything" \
646 "http://localhost:5601/api/kibana/settings/defaultIndex" \
647 -d"{\"value\":\"logstash-*\"}"'
648 fi
649 echo "Finished deployment of ELK stack"
650 return 0
651 }
652
653 function deploy_perfmon() {
654 echo "Generating osm/kafka-exporter docker image"
655 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"
656 echo "Finished generation of osm/kafka-exporter docker image"
657 echo "Deploying PM stack (Kafka exporter + Prometheus + Grafana)"
658 sg docker -c "docker stack deploy -c ${OSM_DEVOPS}/installers/docker/osm_metrics/docker-compose.yml osm_metrics"
659 echo "Finished deployment of PM stack"
660 return 0
661 }
662
663 function install_lightweight() {
664 [ "$USER" == "root" ] && FATAL "You are running the installer as root. The installer is prepared to be executed as a normal user with sudo privileges."
665 echo "Installing lightweight build of OSM"
666 LWTEMPDIR="$(mktemp -d -q --tmpdir "installosmlight.XXXXXX")"
667 trap 'rm -rf "${LWTEMPDIR}"' EXIT
668 DEFAULT_IF=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
669 DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
670 DEFAULT_MTU=$(ip addr show ${DEFAULT_IF} | perl -ne 'if (/mtu\s(\d+)/) {print $1;}')
671 need_packages_lw="lxd"
672 echo -e "Checking required packages: $need_packages_lw"
673 dpkg -l $need_packages_lw &>/dev/null \
674 || ! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
675 || sudo apt-get update \
676 || FATAL "failed to run apt-get update"
677 dpkg -l $need_packages_lw &>/dev/null \
678 || ! echo -e "Installing $need_packages_lw requires root privileges." \
679 || sudo apt-get install -y $need_packages_lw \
680 || FATAL "failed to install $need_packages_lw"
681 install_juju
682 track juju
683 install_docker_ce
684 track docker_ce
685 #install_docker_compose
686 generate_docker_images
687 track docker_build
688 generate_docker_env_files
689 deploy_lightweight
690 track docker_deploy
691 [ -n "$INSTALL_VIMEMU" ] && install_vimemu && track vimemu
692 [ -n "$INSTALL_ELK" ] && deploy_elk && track elk
693 [ -n "$INSTALL_PERFMON" ] && deploy_perfmon && track perfmon
694 install_osmclient
695 track osmclient
696 wget -q -O- https://osm-download.etsi.org/ftp/osm-4.0-four/README2.txt &> /dev/null
697 track end
698 return 0
699 }
700
701 function install_vimemu() {
702 echo "\nInstalling vim-emu"
703 EMUTEMPDIR="$(mktemp -d -q --tmpdir "installosmvimemu.XXXXXX")"
704 trap 'rm -rf "${EMUTEMPDIR}"' EXIT
705 # clone vim-emu repository (attention: branch is currently master only)
706 echo "Cloning vim-emu repository ..."
707 git clone https://osm.etsi.org/gerrit/osm/vim-emu.git $EMUTEMPDIR
708 # build vim-emu docker
709 echo "Building vim-emu Docker container..."
710 sudo docker build -t vim-emu-img -f $EMUTEMPDIR/Dockerfile --no-cache $EMUTEMPDIR/
711 # start vim-emu container as daemon
712 echo "Starting vim-emu Docker container 'vim-emu' ..."
713 if [ -n "$INSTALL_LIGHTWEIGHT" ]; then
714 # in lightweight mode, the emulator needs to be attached to netOSM
715 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
716 else
717 # classic build mode
718 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
719 fi
720 echo "Waiting for 'vim-emu' container to start ..."
721 sleep 5
722 export VIMEMU_HOSTNAME=$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vim-emu)
723 echo "vim-emu running at ${VIMEMU_HOSTNAME} ..."
724 # print vim-emu connection info
725 echo -e "\nYou might be interested in adding the following vim-emu env variables to your .bashrc file:"
726 echo " export VIMEMU_HOSTNAME=${VIMEMU_HOSTNAME}"
727 echo -e "To add the emulated VIM to OSM you should do:"
728 echo " osm vim-create --name emu-vim1 --user username --password password --auth_url http://${VIMEMU_HOSTNAME}:6001/v2.0 --tenant tenantName --account_type openstack"
729 }
730
731 function dump_vars(){
732 echo "DEVELOP=$DEVELOP"
733 echo "INSTALL_FROM_SOURCE=$INSTALL_FROM_SOURCE"
734 echo "UNINSTALL=$UNINSTALL"
735 echo "NAT=$NAT"
736 echo "UPDATE=$UPDATE"
737 echo "RECONFIGURE=$RECONFIGURE"
738 echo "TEST_INSTALLER=$TEST_INSTALLER"
739 echo "INSTALL_VIMEMU=$INSTALL_VIMEMU"
740 echo "INSTALL_LXD=$INSTALL_LXD"
741 echo "INSTALL_FROM_LXDIMAGES=$INSTALL_FROM_LXDIMAGES"
742 echo "LXD_REPOSITORY_BASE=$LXD_REPOSITORY_BASE"
743 echo "LXD_REPOSITORY_PATH=$LXD_REPOSITORY_PATH"
744 echo "INSTALL_LIGHTWEIGHT=$INSTALL_LIGHTWEIGHT"
745 echo "INSTALL_ONLY=$INSTALL_ONLY"
746 echo "INSTALL_ELK=$INSTALL_ELK"
747 echo "INSTALL_PERFMON=$INSTALL_PERFMON"
748 echo "RELEASE=$RELEASE"
749 echo "REPOSITORY=$REPOSITORY"
750 echo "REPOSITORY_BASE=$REPOSITORY_BASE"
751 echo "REPOSITORY_KEY=$REPOSITORY_KEY"
752 echo "NOCONFIGURE=$NOCONFIGURE"
753 echo "SHOWOPTS=$SHOWOPTS"
754 echo "Install from specific refspec (-b): $COMMIT_ID"
755 }
756
757 function track(){
758 ctime=`date +%s`
759 duration=$((ctime - SESSION_ID))
760 url="http://www.woopra.com/track/ce?project=osm.etsi.org&cookie=${SESSION_ID}"
761 #url="${url}&ce_campaign_name=${CAMPAIGN_NAME}"
762 event_name="bin"
763 [ -z "$INSTALL_LIGHTWEIGHT" ] && [ -n "$INSTALL_FROM_SOURCE" ] && event_name="binsrc"
764 [ -z "$INSTALL_LIGHTWEIGHT" ] && [ -n "$INSTALL_FROM_LXDIMAGES" ] && event_name="lxd"
765 [ -n "$INSTALL_LIGHTWEIGHT" ] && event_name="lw"
766 event_name="${event_name}_$1"
767 url="${url}&event=${event_name}&ce_duration=${duration}"
768 wget -q -O /dev/null $url
769 }
770
771 UNINSTALL=""
772 DEVELOP=""
773 NAT=""
774 UPDATE=""
775 RECONFIGURE=""
776 TEST_INSTALLER=""
777 INSTALL_LXD=""
778 SHOWOPTS=""
779 COMMIT_ID=""
780 ASSUME_YES=""
781 INSTALL_FROM_SOURCE=""
782 RELEASE="-R ReleaseTHREE"
783 REPOSITORY="-r stable"
784 INSTALL_VIMEMU=""
785 INSTALL_FROM_LXDIMAGES=""
786 LXD_REPOSITORY_BASE="https://osm-download.etsi.org/repository/osm/lxd"
787 LXD_REPOSITORY_PATH=""
788 INSTALL_LIGHTWEIGHT="y"
789 INSTALL_ONLY=""
790 INSTALL_ELK=""
791 INSTALL_PERFMON=""
792 NOCONFIGURE=""
793 RELEASE_DAILY=""
794 SESSION_ID=`date +%s`
795 OSM_DEVOPS=
796
797 while getopts ":hy-:b:r:k:u:R:l:p:D:o:" o; do
798 case "${o}" in
799 h)
800 usage && exit 0
801 ;;
802 b)
803 COMMIT_ID=${OPTARG}
804 ;;
805 r)
806 REPOSITORY="-r ${OPTARG}"
807 ;;
808 R)
809 RELEASE="-R ${OPTARG}"
810 ;;
811 k)
812 REPOSITORY_KEY="-k ${OPTARG}"
813 ;;
814 u)
815 REPOSITORY_BASE="-u ${OPTARG}"
816 ;;
817 l)
818 LXD_REPOSITORY_BASE="${OPTARG}"
819 ;;
820 p)
821 LXD_REPOSITORY_PATH="${OPTARG}"
822 ;;
823 D)
824 OSM_DEVOPS="${OPTARG}"
825 ;;
826 o)
827 INSTALL_ONLY="y"
828 [ "${OPTARG}" == "vimemu" ] && INSTALL_VIMEMU="y" && continue
829 [ "${OPTARG}" == "elk_stack" ] && INSTALL_ELK="y" && continue
830 [ "${OPTARG}" == "pm_stack" ] && INSTALL_PERFMON="y" && continue
831 ;;
832 -)
833 [ "${OPTARG}" == "help" ] && usage && exit 0
834 [ "${OPTARG}" == "source" ] && INSTALL_FROM_SOURCE="y" && continue
835 [ "${OPTARG}" == "develop" ] && DEVELOP="y" && continue
836 [ "${OPTARG}" == "uninstall" ] && UNINSTALL="y" && continue
837 [ "${OPTARG}" == "nat" ] && NAT="y" && continue
838 [ "${OPTARG}" == "update" ] && UPDATE="y" && continue
839 [ "${OPTARG}" == "reconfigure" ] && RECONFIGURE="y" && continue
840 [ "${OPTARG}" == "test" ] && TEST_INSTALLER="y" && continue
841 [ "${OPTARG}" == "lxdinstall" ] && INSTALL_LXD="y" && continue
842 [ "${OPTARG}" == "lxdimages" ] && INSTALL_FROM_LXDIMAGES="y" && continue
843 [ "${OPTARG}" == "lightweight" ] && INSTALL_LIGHTWEIGHT="y" && continue
844 [ "${OPTARG}" == "soui" ] && INSTALL_LIGHTWEIGHT="" && RELEASE="-R ReleaseTHREE" && REPOSITORY="-r stable" && continue
845 [ "${OPTARG}" == "vimemu" ] && INSTALL_VIMEMU="y" && continue
846 [ "${OPTARG}" == "elk_stack" ] && INSTALL_ELK="y" && continue
847 [ "${OPTARG}" == "pm_stack" ] && INSTALL_PERFMON="y" && continue
848 [ "${OPTARG}" == "noconfigure" ] && NOCONFIGURE="y" && continue
849 [ "${OPTARG}" == "showopts" ] && SHOWOPTS="y" && continue
850 [ "${OPTARG}" == "daily" ] && RELEASE_DAILY="y" && continue
851 echo -e "Invalid option: '--$OPTARG'\n" >&2
852 usage && exit 1
853 ;;
854 \?)
855 echo -e "Invalid option: '-$OPTARG'\n" >&2
856 usage && exit 1
857 ;;
858 y)
859 ASSUME_YES="y"
860 ;;
861 *)
862 usage && exit 1
863 ;;
864 esac
865 done
866
867 [ -n "$INSTALL_FROM_LXDIMAGES" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --lxd can only be used with --soui"
868 [ -n "$NAT" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --nat can only be used with --soui"
869 [ -n "$NOCONFIGURE" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --noconfigure can only be used with --soui"
870
871 if [ -n "$SHOWOPTS" ]; then
872 dump_vars
873 exit 0
874 fi
875
876 [ -n "$RELEASE_DAILY" ] && echo -e "\nInstalling from daily build repo" && RELEASE="-R ReleaseTHREE-daily" && REPOSITORY="-r testing" && COMMIT_ID="master"
877
878 # if develop, we force master
879 [ -z "$COMMIT_ID" ] && [ -n "$DEVELOP" ] && COMMIT_ID="master"
880
881 # forcing source from master removed. Now only install from source when explicit
882 # [ -n "$COMMIT_ID" ] && [ "$COMMIT_ID" == "master" ] && INSTALL_FROM_SOURCE="y"
883
884 if [ -z "$OSM_DEVOPS" ]; then
885 if [ -n "$TEST_INSTALLER" ]; then
886 echo -e "\nUsing local devops repo for OSM installation"
887 TEMPDIR="$(dirname $(realpath $(dirname $0)))"
888 else
889 echo -e "\nCreating temporary dir for OSM installation"
890 TEMPDIR="$(mktemp -d -q --tmpdir "installosm.XXXXXX")"
891 trap 'rm -rf "$TEMPDIR"' EXIT
892 fi
893 fi
894
895 need_packages="git jq wget curl tar"
896 echo -e "Checking required packages: $need_packages"
897 dpkg -l $need_packages &>/dev/null \
898 || ! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
899 || sudo apt-get update \
900 || FATAL "failed to run apt-get update"
901 dpkg -l $need_packages &>/dev/null \
902 || ! echo -e "Installing $need_packages requires root privileges." \
903 || sudo apt-get install -y $need_packages \
904 || FATAL "failed to install $need_packages"
905
906 if [ -z "$OSM_DEVOPS" ]; then
907 if [ -z "$TEST_INSTALLER" ]; then
908 echo -e "\nCloning devops repo temporarily"
909 git clone https://osm.etsi.org/gerrit/osm/devops.git $TEMPDIR
910 RC_CLONE=$?
911 fi
912
913 echo -e "\nGuessing the current stable release"
914 LATEST_STABLE_DEVOPS=`git -C $TEMPDIR tag -l v[0-9].* | sort -V | tail -n1`
915 [ -z "$COMMIT_ID" ] && [ -z "$LATEST_STABLE_DEVOPS" ] && echo "Could not find the current latest stable release" && exit 0
916 echo "Latest tag in devops repo: $LATEST_STABLE_DEVOPS"
917 [ -z "$COMMIT_ID" ] && [ -n "$LATEST_STABLE_DEVOPS" ] && COMMIT_ID="tags/$LATEST_STABLE_DEVOPS"
918
919 if [ -n "$RELEASE_DAILY" ]; then
920 echo "Using master/HEAD devops"
921 git -C $TEMPDIR checkout master
922 elif [ -z "$TEST_INSTALLER" ]; then
923 git -C $TEMPDIR checkout tags/$LATEST_STABLE_DEVOPS
924 fi
925 OSM_DEVOPS=$TEMPDIR
926 fi
927
928 OSM_JENKINS="$OSM_DEVOPS/jenkins"
929 . $OSM_JENKINS/common/all_funcs
930
931 [ -n "$INSTALL_LIGHTWEIGHT" ] && [ -n "$UNINSTALL" ] && uninstall_lightweight && echo -e "\nDONE" && exit 0
932 [ -n "$UNINSTALL" ] && uninstall && echo -e "\nDONE" && exit 0
933 [ -n "$NAT" ] && nat && echo -e "\nDONE" && exit 0
934 [ -n "$UPDATE" ] && update && echo -e "\nDONE" && exit 0
935 [ -n "$RECONFIGURE" ] && configure && echo -e "\nDONE" && exit 0
936 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_ELK" ] && deploy_elk
937 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_PERFMON" ] && deploy_perfmon
938 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_VIMEMU" ] && install_vimemu
939 [ -n "$INSTALL_ONLY" ] && echo -e "\nDONE" && exit 0
940
941 #Installation starts here
942 wget -q -O- https://osm-download.etsi.org/ftp/osm-4.0-four/README.txt &> /dev/null
943 track start
944
945 [ -n "$INSTALL_LIGHTWEIGHT" ] && install_lightweight && echo -e "\nDONE" && exit 0
946 echo -e "\nInstalling OSM from refspec: $COMMIT_ID"
947 if [ -n "$INSTALL_FROM_SOURCE" ] && [ -z "$ASSUME_YES" ]; then
948 ! ask_user "The installation will take about 75-90 minutes. Continue (Y/n)? " y && echo "Cancelled!" && exit 1
949 fi
950
951 echo -e "Checking required packages: lxd"
952 lxd --version &>/dev/null || FATAL "lxd not present, exiting."
953 [ -n "$INSTALL_LXD" ] && echo -e "\nInstalling and configuring lxd" && install_lxd
954
955 # use local devops for containers
956 export OSM_USE_LOCAL_DEVOPS=true
957 if [ -n "$INSTALL_FROM_SOURCE" ]; then #install from source
958 echo -e "\nCreating the containers and building from source ..."
959 $OSM_DEVOPS/jenkins/host/start_build RO --notest checkout $COMMIT_ID || FATAL "RO container build failed (refspec: '$COMMIT_ID')"
960 ro_is_up && track RO
961 $OSM_DEVOPS/jenkins/host/start_build VCA || FATAL "VCA container build failed"
962 vca_is_up && track VCA
963 $OSM_DEVOPS/jenkins/host/start_build MON || FATAL "MON install failed"
964 mon_is_up && track MON
965 $OSM_DEVOPS/jenkins/host/start_build SO checkout $COMMIT_ID || FATAL "SO container build failed (refspec: '$COMMIT_ID')"
966 $OSM_DEVOPS/jenkins/host/start_build UI checkout $COMMIT_ID || FATAL "UI container build failed (refspec: '$COMMIT_ID')"
967 #so_is_up && track SOUI
968 track SOUI
969 elif [ -n "$INSTALL_FROM_LXDIMAGES" ]; then #install from LXD images stored in OSM repo
970 echo -e "\nInstalling from lxd images ..."
971 install_from_lxdimages
972 else #install from binaries
973 echo -e "\nCreating the containers and installing from binaries ..."
974 $OSM_DEVOPS/jenkins/host/install RO $REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL "RO install failed"
975 ro_is_up && track RO
976 $OSM_DEVOPS/jenkins/host/start_build VCA || FATAL "VCA install failed"
977 vca_is_up && track VCA
978 $OSM_DEVOPS/jenkins/host/install MON || FATAL "MON build failed"
979 mon_is_up && track MON
980 $OSM_DEVOPS/jenkins/host/install SO $REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL "SO install failed"
981 $OSM_DEVOPS/jenkins/host/install UI $REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL "UI install failed"
982 #so_is_up && track SOUI
983 track SOUI
984 fi
985
986 #Install iptables-persistent and configure NAT rules
987 [ -z "$NOCONFIGURE" ] && nat
988
989 #Configure components
990 [ -z "$NOCONFIGURE" ] && configure
991
992 #Install osmclient
993 [ -z "$NOCONFIGURE" ] && install_osmclient
994
995 #Install vim-emu (optional)
996 [ -n "$INSTALL_VIMEMU" ] && install_docker_ce && install_vimemu
997
998 wget -q -O- https://osm-download.etsi.org/ftp/osm-4.0-four/README2.txt &> /dev/null
999 track end
1000 echo -e "\nDONE"
1001