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