2 # Copyright 2016 Telefónica Investigación y Desarrollo S.A.U.
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
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
17 echo -e "usage: $0 [OPTIONS]"
18 echo -e "Install OSM from binaries or source code (by default, from binaries)"
20 echo -e " --uninstall: uninstall OSM: remove the containers and delete NAT rules"
21 echo -e " --source: install OSM from source code using the latest stable tag"
22 echo -e " -r <repo>: use specified repository name for osm packages"
23 echo -e " -R <release>: use specified release for osm binaries (deb packages, lxd images, ...)"
24 echo -e " -u <repo base>: use specified repository url for osm packages"
25 echo -e " -k <repo key>: use specified repository public key url"
26 echo -e " -b <refspec>: install OSM from source code using a specific branch (master, v2.0, ...) or tag"
27 echo -e " -b master (main dev branch)"
28 echo -e " -b v2.0 (v2.0 branch)"
29 echo -e " -b tags/v1.1.0 (a specific tag)"
31 echo -e " --lxdimages: download lxd images from OSM repository instead of creating them from scratch"
32 echo -e " -l <lxd_repo>: use specified repository url for lxd images"
33 echo -e " -p <path>: use specified repository path for lxd images"
34 echo -e " --lightweight: install lightweight build of OSM"
35 echo -e " --vimemu: additionally fetch, build, and deploy the VIM emulator as a docker container"
36 echo -e " --develop: (deprecated, use '-b master') install OSM from source code using the master branch"
37 # echo -e " --reconfigure: reconfigure the modules (DO NOT change NAT rules)"
38 echo -e " --nat: install only NAT rules"
39 echo -e " --noconfigure: DO NOT install osmclient, DO NOT install NAT rules, DO NOT configure modules"
40 # echo -e " --update: update to the latest stable release or to the latest commit if using a specific branch"
41 echo -e " --showopts: print chosen options and exit (only for debugging)"
42 echo -e " -y: do not prompt for confirmation, assumes yes"
43 echo -e " -D <devops path> use local devops installation path"
44 echo -e " -h / --help: print this help"
47 #Uninstall OSM: remove containers
49 echo -e "\nUninstalling OSM"
50 if [ $RC_CLONE ] ||
[ -n "$TEST_INSTALLER" ]; then
51 $OSM_DEVOPS/jenkins
/host
/clean_container RO
52 $OSM_DEVOPS/jenkins
/host
/clean_container VCA
53 $OSM_DEVOPS/jenkins
/host
/clean_container MON
54 $OSM_DEVOPS/jenkins
/host
/clean_container SO
55 #$OSM_DEVOPS/jenkins/host/clean_container UI
57 lxc stop RO
&& lxc delete RO
58 lxc stop VCA
&& lxc delete VCA
59 lxc stop MON
&& lxc delete MON
60 lxc stop SO-ub
&& lxc delete SO-ub
62 echo -e "\nDeleting imported lxd images if they exist"
63 lxc image show osm-ro
&>/dev
/null
&& lxc image delete osm-ro
64 lxc image show osm-vca
&>/dev
/null
&& lxc image delete osm-vca
65 lxc image show osm-soui
&>/dev
/null
&& lxc image delete osm-soui
69 #Uninstall lightweight OSM: remove dockers
70 function uninstall_lightweight
(){
71 echo -e "\nUninstalling lightweight OSM"
75 while [ ${COUNTER} -lt 30 ]; do
77 result
=$
(docker stack ps osm |
wc -l)
78 #echo "Dockers running: $result"
79 if [ "${result}" == "0" ]; then
84 if [ "${result}" == "0" ]; then
85 echo "All dockers of the stack osm were removed"
87 FATAL
"Some dockers of the stack osm could not be removed. Could not uninstall OSM in single shot. Try to uninstall again"
90 docker image
rm osm
/ro
91 docker image
rm osm
/lcm
92 docker image
rm osm
/light-ui
93 docker image
rm osm
/nbi
94 docker image
rm osm
/mon
95 docker image
rm osm
/pm
99 #Configure NAT rules, based on the current IP addresses of containers
101 echo -e "\nChecking required packages: iptables-persistent"
102 dpkg
-l iptables-persistent
&>/dev
/null ||
! echo -e " Not installed.\nInstalling iptables-persistent requires root privileges" || \
103 sudo DEBIAN_FRONTEND
=noninteractive apt-get
-yq install iptables-persistent
104 echo -e "\nConfiguring NAT rules"
105 echo -e " Required root privileges"
106 sudo
$OSM_DEVOPS/installers
/nat_osm
110 echo "FATAL error: Cannot install OSM due to \"$1\""
114 #Update RO, SO and UI:
116 echo -e "\nUpdating components"
118 echo -e " Updating RO"
121 INSTALL_FOLDER
="/opt/openmano"
122 echo -e " Fetching the repo"
123 lxc
exec $CONTAINER -- git
-C $INSTALL_FOLDER fetch
--all
125 BRANCH
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
126 [ -z "$BRANCH" ] && FATAL
"Could not find the current branch in use in the '$MDG'"
127 CURRENT
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
128 CURRENT_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
129 echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
130 # COMMIT_ID either was previously set with -b option, or is an empty string
131 CHECKOUT_ID
=$COMMIT_ID
132 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID
="tags/$LATEST_STABLE_DEVOPS"
133 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID
="$BRANCH"
134 if [[ $CHECKOUT_ID == "tags/"* ]]; then
135 REMOTE_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
137 REMOTE_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
139 echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
140 if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
141 echo " Nothing to be done."
143 echo " Update required."
144 lxc
exec $CONTAINER -- service osm-ro stop
145 lxc
exec $CONTAINER -- git
-C /opt
/openmano stash
146 lxc
exec $CONTAINER -- git
-C /opt
/openmano pull
--rebase
147 lxc
exec $CONTAINER -- git
-C /opt
/openmano checkout
$CHECKOUT_ID
148 lxc
exec $CONTAINER -- git
-C /opt
/openmano stash pop
149 lxc
exec $CONTAINER -- /opt
/openmano
/database_utils
/migrate_mano_db.sh
150 lxc
exec $CONTAINER -- service osm-ro start
154 echo -e " Updating SO and UI"
157 INSTALL_FOLDER
="" # To be filled in
158 echo -e " Fetching the repo"
159 lxc
exec $CONTAINER -- git
-C $INSTALL_FOLDER fetch
--all
161 BRANCH
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
162 [ -z "$BRANCH" ] && FATAL
"Could not find the current branch in use in the '$MDG'"
163 CURRENT
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
164 CURRENT_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
165 echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
166 # COMMIT_ID either was previously set with -b option, or is an empty string
167 CHECKOUT_ID
=$COMMIT_ID
168 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID
="tags/$LATEST_STABLE_DEVOPS"
169 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID
="$BRANCH"
170 if [[ $CHECKOUT_ID == "tags/"* ]]; then
171 REMOTE_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
173 REMOTE_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
175 echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
176 if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
177 echo " Nothing to be done."
179 echo " Update required."
180 # Instructions to be added
181 # lxc exec SO-ub -- ...
184 echo -e "Updating MON Container"
187 INSTALL_FOLDER
="/root/MON"
188 echo -e " Fetching the repo"
189 lxc
exec $CONTAINER -- git
-C $INSTALL_FOLDER fetch
--all
191 BRANCH
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
192 [ -z "$BRANCH" ] && FATAL
"Could not find the current branch in use in the '$MDG'"
193 CURRENT
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
194 CURRENT_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
195 echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
196 # COMMIT_ID either was previously set with -b option, or is an empty string
197 CHECKOUT_ID
=$COMMIT_ID
198 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID
="tags/$LATEST_STABLE_DEVOPS"
199 [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID
="$BRANCH"
200 if [[ $CHECKOUT_ID == "tags/"* ]]; then
201 REMOTE_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
203 REMOTE_COMMIT_ID
=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
205 echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
206 if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
207 echo " Nothing to be done."
209 echo " Update required."
214 function so_is_up
() {
218 SO_IP
=`lxc list SO-ub -c 4|grep eth0 |awk '{print $2}'`
223 while [ $time -le $timelength ]
225 if [[ `curl -k -X GET https://$SO_IP:8008/api/operational/vcs/info \
226 -H 'accept: application/vnd.yang.data+json' \
227 -H 'authorization: Basic YWRtaW46YWRtaW4=' \
228 -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 ]]
230 echo "RW.Restconf running....SO is up"
239 FATAL
"OSM Failed to startup. SO failed to startup"
242 function vca_is_up
() {
243 if [[ `lxc exec VCA -- juju status | grep "osm" | wc -l` -eq 1 ]]; then
244 echo "VCA is up and running"
248 FATAL
"OSM Failed to startup. VCA failed to startup"
251 function mon_is_up
() {
252 if [[ `curl http://$RO_IP:9090/openmano/ | grep "works" | wc -l` -eq 1 ]]; then
253 echo "MON is up and running"
257 FATAL
"OSM Failed to startup. MON failed to startup"
260 function ro_is_up
() {
264 RO_IP
=`lxc list RO -c 4|grep eth0 |awk '{print $2}'`
269 while [ $time -le $timelength ]; do
270 if [[ `curl http://$RO_IP:9090/openmano/ | grep "works" | wc -l` -eq 1 ]]; then
271 echo "RO is up and running"
279 FATAL
"OSM Failed to startup. RO failed to startup"
283 function configure_RO
(){
284 .
$OSM_DEVOPS/installers
/export_ips
285 echo -e " Configuring RO"
286 lxc
exec RO
-- sed -i -e "s/^\#\?log_socket_host:.*/log_socket_host: $SO_CONTAINER_IP/g" /etc
/osm
/openmanod.cfg
287 lxc
exec RO
-- service osm-ro restart
291 lxc
exec RO
-- openmano tenant-delete
-f osm
>/dev
/null
292 lxc
exec RO
-- openmano tenant-create osm
> /dev
/null
293 lxc
exec RO
-- sed -i '/export OPENMANO_TENANT=osm/d' .bashrc
294 lxc
exec RO
-- sed -i '$ i export OPENMANO_TENANT=osm' .bashrc
295 lxc
exec RO
-- sh
-c 'echo "export OPENMANO_TENANT=osm" >> .bashrc'
298 function configure_VCA
(){
299 echo -e " Configuring VCA"
300 JUJU_PASSWD
=`date +%s | sha256sum | base64 | head -c 32`
301 echo -e "$JUJU_PASSWD\n$JUJU_PASSWD" | lxc
exec VCA
-- juju change-user-password
304 function configure_SOUI
(){
305 .
$OSM_DEVOPS/installers
/export_ips
306 JUJU_CONTROLLER_IP
=`lxc exec VCA -- lxc list -c 4 |grep eth0 |awk '{print $2}'`
307 RO_TENANT_ID
=`lxc exec RO -- openmano tenant-list osm |awk '{print $1}'`
309 echo -e " Configuring MON"
310 #Information to be added about SO socket for logging
312 echo -e " Configuring SO"
313 sudo route add
-host $JUJU_CONTROLLER_IP gw
$VCA_CONTAINER_IP
314 sudo
sed -i "$ i route add -host $JUJU_CONTROLLER_IP gw $VCA_CONTAINER_IP" /etc
/rc.
local
315 # make journaling persistent
316 lxc
exec SO-ub
-- mkdir
-p /var
/log
/journal
317 lxc
exec SO-ub
-- systemd-tmpfiles
--create --prefix /var
/log
/journal
318 lxc
exec SO-ub
-- systemctl restart systemd-journald
320 echo RIFT_EXTERNAL_ADDRESS
=$DEFAULT_IP | lxc
exec SO-ub
-- tee -a /usr
/rift
/etc
/default
/launchpad
322 lxc
exec SO-ub
-- systemctl restart launchpad
324 so_is_up
$SO_CONTAINER_IP
326 #delete existing config agent (could be there on reconfigure)
327 curl
-k --request DELETE \
328 --url https
://$SO_CONTAINER_IP:8008/api
/config
/config-agent
/account
/osmjuju \
329 --header 'accept: application/vnd.yang.data+json' \
330 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
331 --header 'cache-control: no-cache' \
332 --header 'content-type: application/vnd.yang.data+json' &> /dev
/null
334 result
=$
(curl
-k --request POST \
335 --url https
://$SO_CONTAINER_IP:8008/api
/config
/config-agent \
336 --header 'accept: application/vnd.yang.data+json' \
337 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
338 --header 'cache-control: no-cache' \
339 --header 'content-type: application/vnd.yang.data+json' \
340 --data '{"account": [ { "name": "osmjuju", "account-type": "juju", "juju": { "ip-address": "'$JUJU_CONTROLLER_IP'", "port": "17070", "user": "admin", "secret": "'$JUJU_PASSWD'" } } ]}')
341 [[ $result =~ .
*success.
* ]] || FATAL
"Failed config-agent configuration: $result"
344 #result=$(curl -k --request PUT \
345 # --url https://$SO_CONTAINER_IP:8008/api/config/resource-orchestrator \
346 # --header 'accept: application/vnd.yang.data+json' \
347 # --header 'authorization: Basic YWRtaW46YWRtaW4=' \
348 # --header 'cache-control: no-cache' \
349 # --header 'content-type: application/vnd.yang.data+json' \
350 # --data '{ "openmano": { "host": "'$RO_CONTAINER_IP'", "port": "9090", "tenant-id": "'$RO_TENANT_ID'" }, "name": "osmopenmano", "account-type": "openmano" }')
352 result
=$
(curl
-k --request PUT \
353 --url https
://$SO_CONTAINER_IP:8008/api
/config
/project
/default
/ro-account
/account \
354 --header 'accept: application/vnd.yang.data+json' \
355 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
356 --header 'cache-control: no-cache' \
357 --header 'content-type: application/vnd.yang.data+json' \
358 --data '{"rw-ro-account:account": [ { "openmano": { "host": "'$RO_CONTAINER_IP'", "port": "9090", "tenant-id": "'$RO_TENANT_ID'"}, "name": "osmopenmano", "ro-account-type": "openmano" }]}')
359 [[ $result =~ .
*success.
* ]] || FATAL
"Failed resource-orchestrator configuration: $result"
361 result
=$
(curl
-k --request PATCH \
362 --url https
://$SO_CONTAINER_IP:8008/v
2/api
/config
/openidc-provider-config
/rw-ui-client
/redirect-uri \
363 --header 'accept: application/vnd.yang.data+json' \
364 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
365 --header 'cache-control: no-cache' \
366 --header 'content-type: application/vnd.yang.data+json' \
367 --data '{"redirect-uri": "https://'$DEFAULT_IP':8443/callback" }')
368 [[ $result =~ .
*success.
* ]] || FATAL
"Failed redirect-uri configuration: $result"
370 result
=$
(curl
-k --request PATCH \
371 --url https
://$SO_CONTAINER_IP:8008/v
2/api
/config
/openidc-provider-config
/rw-ui-client
/post-logout-redirect-uri \
372 --header 'accept: application/vnd.yang.data+json' \
373 --header 'authorization: Basic YWRtaW46YWRtaW4=' \
374 --header 'cache-control: no-cache' \
375 --header 'content-type: application/vnd.yang.data+json' \
376 --data '{"post-logout-redirect-uri": "https://'$DEFAULT_IP':8443/?api_server=https://'$DEFAULT_IP'" }')
377 [[ $result =~ .
*success.
* ]] || FATAL
"Failed post-logout-redirect-uri configuration: $result"
379 lxc
exec SO-ub
-- tee /etc
/network
/interfaces.d
/60-rift.cfg
<<EOF
381 iface lo:1 inet static
383 netmask 255.255.255.255
385 lxc
exec SO-ub ifup lo
:1
388 #Configure RO, VCA, and SO with the initial configuration:
389 # RO -> tenant:osm, logs to be sent to SO
390 # VCA -> juju-password
391 # SO -> route to Juju Controller, add RO account, add VCA account
392 function configure
(){
393 #Configure components
394 echo -e "\nConfiguring components"
400 function install_lxd
() {
402 sudo apt-get
install -y lxd
406 lxc network create lxdbr0 ipv4.address
=auto ipv4.nat
=true ipv6.address
=none ipv6.nat
=false
407 DEFAULT_INTERFACE
=$
(route
-n |
awk '$1~/^0.0.0.0/ {print $8}')
408 DEFAULT_MTU
=$
(ip addr show
$DEFAULT_INTERFACE | perl
-ne 'if (/mtu\s(\d+)/) {print $1;}')
409 lxc profile device
set default eth0 mtu
$DEFAULT_MTU
410 #sudo systemctl stop lxd-bridge
411 #sudo systemctl --system daemon-reload
412 #sudo systemctl enable lxd-bridge
413 #sudo systemctl start lxd-bridge
417 # ask to the user and parse a response among 'y', 'yes', 'n' or 'no'. Case insensitive
418 # Params: $1 text to ask; $2 Action by default, can be 'y' for yes, 'n' for no, other or empty for not allowed
419 # Return: true(0) if user type 'yes'; false (1) if user type 'no'
420 read -e -p "$1" USER_CONFIRMATION
422 [ -z "$USER_CONFIRMATION" ] && [ "$2" == 'y' ] && return 0
423 [ -z "$USER_CONFIRMATION" ] && [ "$2" == 'n' ] && return 1
424 [ "${USER_CONFIRMATION,,}" == "yes" ] ||
[ "${USER_CONFIRMATION,,}" == "y" ] && return 0
425 [ "${USER_CONFIRMATION,,}" == "no" ] ||
[ "${USER_CONFIRMATION,,}" == "n" ] && return 1
426 read -e -p "Please type 'yes' or 'no': " USER_CONFIRMATION
430 function launch_container_from_lxd
(){
433 export OSM_BASE_IMAGE
=$2
434 if ! container_exists
$OSM_BUILD_CONTAINER; then
436 [[ "$OSM_BUILD_CONTAINER_PRIVILEGED" == yes ]] && CONTAINER_OPTS
="$CONTAINER_OPTS -c security.privileged=true"
437 [[ "$OSM_BUILD_CONTAINER_ALLOW_NESTED" == yes ]] && CONTAINER_OPTS
="$CONTAINER_OPTS -c security.nesting=true"
438 create_container
$OSM_BASE_IMAGE $OSM_BUILD_CONTAINER $CONTAINER_OPTS
439 wait_container_up
$OSM_BUILD_CONTAINER
443 function install_osmclient
(){
444 CLIENT_RELEASE
=${RELEASE#"-R "}
445 CLIENT_REPOSITORY_KEY
="OSM%20ETSI%20Release%20Key.gpg"
446 CLIENT_REPOSITORY
=${REPOSITORY#"-r "}
447 [ -z "$REPOSITORY_BASE" ] && REPOSITORY_BASE
="-u https://osm-download.etsi.org/repository/osm/debian"
448 CLIENT_REPOSITORY_BASE
=${REPOSITORY_BASE#"-u "}
449 key_location
=$CLIENT_REPOSITORY_BASE/$CLIENT_RELEASE/$CLIENT_REPOSITORY_KEY
450 curl
$key_location | sudo apt-key add
-
451 sudo add-apt-repository
-y "deb [arch=amd64] $CLIENT_REPOSITORY_BASE/$CLIENT_RELEASE $CLIENT_REPOSITORY osmclient"
453 sudo apt-get
install -y python-pip
454 sudo
-H pip
install pip
==9.0.3
455 sudo
-H pip
install python-magic
456 sudo apt-get
install -y python-osmclient
457 #sed 's,OSM_SOL005=[^$]*,OSM_SOL005=True,' -i ${HOME}/.bashrc
458 #echo 'export OSM_HOSTNAME=localhost' >> ${HOME}/.bashrc
459 #echo 'export OSM_SOL005=True' >> ${HOME}/.bashrc
460 [ -z "$INSTALL_LIGHTWEIGHT" ] && export OSM_HOSTNAME
=`lxc list | awk '($2=="SO-ub"){print $6}'`
461 [ -z "$INSTALL_LIGHTWEIGHT" ] && export OSM_RO_HOSTNAME
=`lxc list | awk '($2=="RO"){print $6}'`
462 [ -n "$INSTALL_LIGHTWEIGHT" ] && export OSM_HOSTNAME
=localhost
463 echo -e "\nOSM client installed"
464 echo -e "You might be interested in adding the following OSM client env variables to your .bashrc file:"
465 echo " export OSM_HOSTNAME=${OSM_HOSTNAME}"
466 [ -n "$INSTALL_LIGHTWEIGHT" ] && echo " export OSM_SOL005=True"
467 [ -z "$INSTALL_LIGHTWEIGHT" ] && echo " export OSM_RO_HOSTNAME=${OSM_RO_HOSTNAME}"
471 function install_from_lxdimages
(){
472 LXD_RELEASE
=${RELEASE#"-R "}
473 if [ -n "$LXD_REPOSITORY_PATH" ]; then
474 LXD_IMAGE_DIR
="$LXD_REPOSITORY_PATH"
476 LXD_IMAGE_DIR
="$(mktemp -d -q --tmpdir "osmimages.XXXXXX
")"
477 trap 'rm -rf "$LXD_IMAGE_DIR"' EXIT
479 echo -e "\nDeleting previous lxd images if they exist"
480 lxc image show osm-ro
&>/dev
/null
&& lxc image delete osm-ro
481 lxc image show osm-vca
&>/dev
/null
&& lxc image delete osm-vca
482 lxc image show osm-soui
&>/dev
/null
&& lxc image delete osm-soui
483 echo -e "\nImporting osm-ro"
484 [ -z "$LXD_REPOSITORY_PATH" ] && wget
-O $LXD_IMAGE_DIR/osm-ro.
tar.gz
$LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-ro.
tar.gz
485 lxc image import
$LXD_IMAGE_DIR/osm-ro.
tar.gz
--alias osm-ro
486 rm -f $LXD_IMAGE_DIR/osm-ro.
tar.gz
487 echo -e "\nImporting osm-vca"
488 [ -z "$LXD_REPOSITORY_PATH" ] && wget
-O $LXD_IMAGE_DIR/osm-vca.
tar.gz
$LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-vca.
tar.gz
489 lxc image import
$LXD_IMAGE_DIR/osm-vca.
tar.gz
--alias osm-vca
490 rm -f $LXD_IMAGE_DIR/osm-vca.
tar.gz
491 echo -e "\nImporting osm-soui"
492 [ -z "$LXD_REPOSITORY_PATH" ] && wget
-O $LXD_IMAGE_DIR/osm-soui.
tar.gz
$LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-soui.
tar.gz
493 lxc image import
$LXD_IMAGE_DIR/osm-soui.
tar.gz
--alias osm-soui
494 rm -f $LXD_IMAGE_DIR/osm-soui.
tar.gz
495 launch_container_from_lxd RO osm-ro
497 launch_container_from_lxd VCA osm-vca
498 vca_is_up
&& track VCA
499 launch_container_from_lxd MON osm-mon
500 mon_is_up
&& track MON
501 launch_container_from_lxd SO osm-soui
502 #so_is_up && track SOUI
506 function install_docker_ce
() {
507 # installs and configures Docker CE
508 echo "Installing Docker CE ..."
509 sudo apt-get
-qq update
510 sudo apt-get
install -y apt-transport-https ca-certificates software-properties-common
511 curl
-fsSL https
://download.docker.com
/linux
/ubuntu
/gpg | sudo apt-key add
-
512 sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
513 sudo apt-get
-qq update
514 sudo apt-get
install -y docker-ce
515 echo "Adding user to group 'docker'"
516 sudo groupadd
-f docker
517 sudo usermod
-aG docker
$USER
518 echo "... Docker CE installation done"
520 sudo service docker restart
521 echo "... restarted Docker service"
524 function install_docker_compose
() {
525 # installs and configures docker-compose
526 echo "Installing Docker Compose ..."
527 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
528 sudo
chmod +x
/usr
/local
/bin
/docker-compose
529 echo "... Docker Compose installation done"
532 function install_juju
() {
533 echo "Installing juju"
534 sudo snap
install juju
--classic
535 sudo dpkg-reconfigure
-p medium lxd
536 sg lxd
-c "juju bootstrap localhost osm"
537 echo "Finished installation of juju"
540 function generate_docker_images
() {
541 echo "Pulling and generating docker images"
542 newgrp docker
<< EONG
543 docker pull wurstmeister/kafka
544 docker pull wurstmeister/zookeeper
547 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/MON
548 docker build ${LWTEMPDIR}/MON -f ${LWTEMPDIR}/MON/docker/Dockerfile -t osm/mon || ! echo "cannot build MON docker image" >&2
549 docker build ${LWTEMPDIR}/MON/policy_module -f ${LWTEMPDIR}/MON/policy_module/Dockerfile -t osm/pm || ! echo "cannot build PM docker image" >&2
550 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/NBI
551 docker build ${LWTEMPDIR}/NBI -f ${LWTEMPDIR}/NBI/Dockerfile.local -t osm/nbi || ! echo "cannot build NBI docker image" >&2
552 git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/RO
553 docker build ${LWTEMPDIR}/RO -f ${LWTEMPDIR}/RO/docker/Dockerfile-local -t osm/ro || ! echo "cannot build RO docker image" >&2
554 docker build ${LWTEMPDIR}/RO/lcm -t osm/lcm || ! echo "cannot build LCM docker image" >&2
555 git -C ${LWTEMPDIR} clone https://github.com/superfluidity/osm-light-ui.git
556 docker build ${LWTEMPDIR}/osm-light-ui -t osm/light-ui -f ${LWTEMPDIR}/osm-light-ui/code/docker/Dockerfile
558 echo "Finished generation of docker images"
561 function generate_docker_env_files
() {
562 echo "Generating docker env files"
563 OSMLCM_VCA_HOST
=`juju show-controller|grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'`
564 OSMLCM_VCA_SECRET
=`grep password ${HOME}/.local/share/juju/accounts.yaml |awk '{print $2}'`
565 MYSQL_ROOT_PASSWORD
=`date +%s | sha256sum | base64 | head -c 32`
566 echo "OSMLCM_VCA_HOST=${OSMLCM_VCA_HOST}" |sudo
tee ${OSM_DEVOPS}/installers
/docker
/lcm.env
567 echo "OSMLCM_VCA_SECRET=${OSMLCM_VCA_SECRET}" |sudo
tee -a ${OSM_DEVOPS}/installers
/docker
/lcm.env
568 echo "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" |sudo
tee ${OSM_DEVOPS}/installers
/docker
/ro-db.env
569 echo "RO_DB_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" |sudo
tee ${OSM_DEVOPS}/installers
/docker
/ro.env
570 echo "OS_NOTIFIER_URI=http://${DEFAULT_IP}:8662" |sudo
tee ${OSM_DEVOPS}/installers
/docker
/mon.env
571 echo "Finished generation of docker env files"
574 function deploy_lightweight
() {
575 echo "Deploying lightweight build"
576 newgrp docker
<< EONG
577 docker swarm init --advertise-addr ${DEFAULT_IP}
578 docker network create --driver=overlay --attachable --opt com.docker.network.driver.mtu=${DEFAULT_MTU} netOSM
579 docker stack deploy -c ${OSM_DEVOPS}/installers/docker/docker-compose.yaml osm
580 #docker-compose -f /usr/share/osm-devops/installers/docker/docker-compose.yaml up -d
582 echo "Finished deployment of lightweight build"
585 function install_lightweight
() {
586 echo "Installing lightweight build of OSM"
587 LWTEMPDIR
="$(mktemp -d -q --tmpdir "installosmlight.XXXXXX
")"
588 trap 'rm -rf "${LWTEMPDIR}"' EXIT
589 DEFAULT_IF
=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
590 DEFAULT_IP
=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
591 DEFAULT_MTU
=$
(ip addr show
${DEFAULT_IF} | perl
-ne 'if (/mtu\s(\d+)/) {print $1;}')
592 need_packages_lw
="lxd"
593 echo -e "Checking required packages: $need_packages_lw"
594 dpkg
-l $need_packages_lw &>/dev
/null \
595 ||
! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
596 || sudo apt-get update \
597 || FATAL
"failed to run apt-get update"
598 dpkg
-l $need_packages_lw &>/dev
/null \
599 ||
! echo -e "Installing $need_packages_lw requires root privileges." \
600 || sudo apt-get
install -y $need_packages_lw \
601 || FATAL
"failed to install $need_packages_lw"
604 #install_docker_compose
605 generate_docker_images
606 generate_docker_env_files
612 function install_vimemu
() {
615 # clone vim-emu repository (attention: branch is currently master only)
616 echo "Cloning vim-emu repository ..."
617 git clone https
://osm.etsi.org
/gerrit
/osm
/vim-emu.git
618 # build vim-emu docker
619 echo "Building vim-emu Docker container..."
620 sudo docker build
-t vim-emu-img
-f vim-emu
/Dockerfile vim-emu
/
621 # start vim-emu container as daemon
622 echo "Starting vim-emu Docker container 'vim-emu' ..."
623 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
624 echo "Waiting for 'vim-emu' container to start ..."
626 export VIMEMU_HOSTNAME
=$
(sudo docker inspect
-f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vim-emu
)
627 echo "vim-emu running at ${VIMEMU_HOSTNAME} ..."
628 echo -e "You might be interested in adding the following OSM client env variables to your .bashrc file:"
629 echo " export OSM_HOSTNAME=${OSM_HOSTNAME}"
630 echo " export OSM_RO_HOSTNAME=${OSM_RO_HOSTNAME}"
631 echo -e "You might be interested in adding the following vim-emu env variables to your .bashrc file:"
632 echo " export VIMEMU_HOSTNAME=${VIMEMU_HOSTNAME}"
633 echo -e "\nTo add the emulated VIM to OSM you should do:"
634 echo " osm vim-create --name emu-vim1 --user username --password password --auth_url http://${VIMEMU_HOSTNAME}:6001/v2.0 --tenant tenantName --account_type openstack"
637 function dump_vars
(){
638 echo "DEVELOP=$DEVELOP"
639 echo "INSTALL_FROM_SOURCE=$INSTALL_FROM_SOURCE"
640 echo "UNINSTALL=$UNINSTALL"
642 echo "UPDATE=$UPDATE"
643 echo "RECONFIGURE=$RECONFIGURE"
644 echo "TEST_INSTALLER=$TEST_INSTALLER"
645 echo "INSTALL_VIMEMU=$INSTALL_VIMEMU"
646 echo "INSTALL_LXD=$INSTALL_LXD"
647 echo "INSTALL_FROM_LXDIMAGES=$INSTALL_FROM_LXDIMAGES"
648 echo "LXD_REPOSITORY_BASE=$LXD_REPOSITORY_BASE"
649 echo "LXD_REPOSITORY_PATH=$LXD_REPOSITORY_PATH"
650 echo "INSTALL_LIGHTWEIGHT=$INSTALL_LIGHTWEIGHT"
651 echo "RELEASE=$RELEASE"
652 echo "REPOSITORY=$REPOSITORY"
653 echo "REPOSITORY_BASE=$REPOSITORY_BASE"
654 echo "REPOSITORY_KEY=$REPOSITORY_KEY"
655 echo "NOCONFIGURE=$NOCONFIGURE"
656 echo "SHOWOPTS=$SHOWOPTS"
657 echo "Install from specific refspec (-b): $COMMIT_ID"
662 duration
=$
((ctime
- SESSION_ID
))
663 url
="http://www.woopra.com/track/ce?project=osm.etsi.org&cookie=${SESSION_ID}"
664 #url="${url}&ce_campaign_name=${CAMPAIGN_NAME}"
666 [ -n "$INSTALL_FROM_SOURCE" ] && event_name
="src"
667 [ -n "$INSTALL_FROM_LXDIMAGES" ] && event_name
="lxd"
668 event_name
="${event_name}_$1"
669 url
="${url}&event=${event_name}&ce_duration=${duration}"
670 wget
-q -O /dev
/null
$url
683 INSTALL_FROM_SOURCE
=""
684 RELEASE
="-R ReleaseTHREE"
685 REPOSITORY
="-r stable"
687 INSTALL_FROM_LXDIMAGES
=""
688 LXD_REPOSITORY_BASE
="https://osm-download.etsi.org/repository/osm/lxd"
689 LXD_REPOSITORY_PATH
=""
690 INSTALL_LIGHTWEIGHT
=""
693 SESSION_ID
=`date +%s`
696 while getopts ":hy-:b:r:k:u:R:l:p:D:" o
; do
705 REPOSITORY
="-r ${OPTARG}"
708 RELEASE
="-R ${OPTARG}"
711 REPOSITORY_KEY
="-k ${OPTARG}"
714 REPOSITORY_BASE
="-u ${OPTARG}"
717 LXD_REPOSITORY_BASE
="${OPTARG}"
720 LXD_REPOSITORY_PATH
="${OPTARG}"
723 OSM_DEVOPS
="${OPTARG}"
726 [ "${OPTARG}" == "help" ] && usage
&& exit 0
727 [ "${OPTARG}" == "source" ] && INSTALL_FROM_SOURCE
="y" && continue
728 [ "${OPTARG}" == "develop" ] && DEVELOP
="y" && continue
729 [ "${OPTARG}" == "uninstall" ] && UNINSTALL
="y" && continue
730 [ "${OPTARG}" == "nat" ] && NAT
="y" && continue
731 [ "${OPTARG}" == "update" ] && UPDATE
="y" && continue
732 [ "${OPTARG}" == "reconfigure" ] && RECONFIGURE
="y" && continue
733 [ "${OPTARG}" == "test" ] && TEST_INSTALLER
="y" && continue
734 [ "${OPTARG}" == "lxdinstall" ] && INSTALL_LXD
="y" && continue
735 [ "${OPTARG}" == "lxdimages" ] && INSTALL_FROM_LXDIMAGES
="y" && continue
736 [ "${OPTARG}" == "lightweight" ] && INSTALL_LIGHTWEIGHT
="y" && continue
737 [ "${OPTARG}" == "vimemu" ] && INSTALL_VIMEMU
="y" && continue
738 [ "${OPTARG}" == "noconfigure" ] && NOCONFIGURE
="y" && continue
739 [ "${OPTARG}" == "showopts" ] && SHOWOPTS
="y" && continue
740 [ "${OPTARG}" == "daily" ] && RELEASE_DAILY
="y" && continue
741 echo -e "Invalid option: '--$OPTARG'\n" >&2
745 echo -e "Invalid option: '-$OPTARG'\n" >&2
757 if [ -n "$SHOWOPTS" ]; then
762 [ -n "$RELEASE_DAILY" ] && echo -e "\nInstalling from daily build repo" && RELEASE
="-R ReleaseTHREE-daily" && REPOSITORY
="-r testing" && COMMIT_ID
="master"
764 # if develop, we force master
765 [ -z "$COMMIT_ID" ] && [ -n "$DEVELOP" ] && COMMIT_ID
="master"
767 # forcing source from master removed. Now only install from source when explicit
768 # [ -n "$COMMIT_ID" ] && [ "$COMMIT_ID" == "master" ] && INSTALL_FROM_SOURCE="y"
770 if [ -z "$OSM_DEVOPS" ]; then
771 if [ -n "$TEST_INSTALLER" ]; then
772 echo -e "\nUsing local devops repo for OSM installation"
773 TEMPDIR
="$(dirname $(realpath $(dirname $0)))"
775 echo -e "\nCreating temporary dir for OSM installation"
776 TEMPDIR
="$(mktemp -d -q --tmpdir "installosm.XXXXXX
")"
777 trap 'rm -rf "$TEMPDIR"' EXIT
781 need_packages
="git jq wget curl tar"
782 echo -e "Checking required packages: $need_packages"
783 dpkg
-l $need_packages &>/dev
/null \
784 ||
! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
785 || sudo apt-get update \
786 || FATAL
"failed to run apt-get update"
787 dpkg
-l $need_packages &>/dev
/null \
788 ||
! echo -e "Installing $need_packages requires root privileges." \
789 || sudo apt-get
install -y $need_packages \
790 || FATAL
"failed to install $need_packages"
792 if [ -z "$OSM_DEVOPS" ]; then
793 if [ -z "$TEST_INSTALLER" ]; then
794 echo -e "\nCloning devops repo temporarily"
795 git clone https
://osm.etsi.org
/gerrit
/osm
/devops.git
$TEMPDIR
799 echo -e "\nGuessing the current stable release"
800 LATEST_STABLE_DEVOPS
=`git -C $TEMPDIR tag -l v[0-9].* | sort -V | tail -n1`
801 [ -z "$COMMIT_ID" ] && [ -z "$LATEST_STABLE_DEVOPS" ] && echo "Could not find the current latest stable release" && exit 0
802 echo "Latest tag in devops repo: $LATEST_STABLE_DEVOPS"
803 [ -z "$COMMIT_ID" ] && [ -n "$LATEST_STABLE_DEVOPS" ] && COMMIT_ID
="tags/$LATEST_STABLE_DEVOPS"
805 if [ -n "$RELEASE_DAILY" ]; then
806 echo "Using master/HEAD devops"
807 git
-C $TEMPDIR checkout master
808 elif [ -z "$TEST_INSTALLER" ]; then
809 git
-C $TEMPDIR checkout tags
/$LATEST_STABLE_DEVOPS
814 OSM_JENKINS
="$OSM_DEVOPS/jenkins"
815 .
$OSM_JENKINS/common
/all_funcs
817 [ -n "$INSTALL_LIGHTWEIGHT" ] && [ -n "$UNINSTALL" ] && uninstall_lightweight
&& echo -e "\nDONE" && exit 0
818 [ -n "$UNINSTALL" ] && uninstall
&& echo -e "\nDONE" && exit 0
819 [ -n "$NAT" ] && nat
&& echo -e "\nDONE" && exit 0
820 [ -n "$UPDATE" ] && update
&& echo -e "\nDONE" && exit 0
821 [ -n "$RECONFIGURE" ] && configure
&& echo -e "\nDONE" && exit 0
823 #Installation starts here
824 [ -n "$INSTALL_LIGHTWEIGHT" ] && install_lightweight
&& echo -e "\nDONE" && exit 0
825 echo -e "\nInstalling OSM from refspec: $COMMIT_ID"
826 if [ -n "$INSTALL_FROM_SOURCE" ] && [ -z "$ASSUME_YES" ]; then
827 ! ask_user
"The installation will take about 75-90 minutes. Continue (Y/n)? " y
&& echo "Cancelled!" && exit 1
830 echo -e "Checking required packages: lxd"
831 lxd
--version &>/dev
/null || FATAL
"lxd not present, exiting."
832 [ -n "$INSTALL_LXD" ] && echo -e "\nInstalling and configuring lxd" && install_lxd
834 wget
-q -O- https
://osm-download.etsi.org
/ftp
/osm-4.0
-four/README.txt
&> /dev
/null
837 # use local devops for containers
838 export OSM_USE_LOCAL_DEVOPS
=true
839 if [ -n "$INSTALL_FROM_SOURCE" ]; then #install from source
840 echo -e "\nCreating the containers and building from source ..."
841 $OSM_DEVOPS/jenkins
/host
/start_build RO
--notest checkout
$COMMIT_ID || FATAL
"RO container build failed (refspec: '$COMMIT_ID')"
843 $OSM_DEVOPS/jenkins
/host
/start_build VCA || FATAL
"VCA container build failed"
844 vca_is_up
&& track VCA
845 $OSM_DEVOPS/jenkins
/host
/start_build MON || FATAL
"MON install failed"
846 mon_is_up
&& track MON
847 $OSM_DEVOPS/jenkins
/host
/start_build SO checkout
$COMMIT_ID || FATAL
"SO container build failed (refspec: '$COMMIT_ID')"
848 $OSM_DEVOPS/jenkins
/host
/start_build UI checkout
$COMMIT_ID || FATAL
"UI container build failed (refspec: '$COMMIT_ID')"
849 #so_is_up && track SOUI
851 elif [ -n "$INSTALL_FROM_LXDIMAGES" ]; then #install from LXD images stored in OSM repo
852 echo -e "\nInstalling from lxd images ..."
853 install_from_lxdimages
854 else #install from binaries
855 echo -e "\nCreating the containers and installing from binaries ..."
856 $OSM_DEVOPS/jenkins
/host
/install RO
$REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL
"RO install failed"
858 $OSM_DEVOPS/jenkins
/host
/start_build VCA || FATAL
"VCA install failed"
859 vca_is_up
&& track VCA
860 $OSM_DEVOPS/jenkins
/host
/install MON || FATAL
"MON build failed"
861 mon_is_up
&& track MON
862 $OSM_DEVOPS/jenkins
/host
/install SO
$REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL
"SO install failed"
863 $OSM_DEVOPS/jenkins
/host
/install UI
$REPOSITORY $RELEASE $REPOSITORY_KEY $REPOSITORY_BASE || FATAL
"UI install failed"
864 #so_is_up && track SOUI
868 #Install iptables-persistent and configure NAT rules
869 [ -z "$NOCONFIGURE" ] && nat
871 #Configure components
872 [ -z "$NOCONFIGURE" ] && configure
875 [ -z "$NOCONFIGURE" ] && install_osmclient
877 #Install vim-emu (optional)
878 if [ -n "$INSTALL_VIMEMU" ]; then
879 echo -e "\nInstalling vim-emu ..."
883 wget
-q -O- https
://osm-download.etsi.org
/ftp
/osm-4.0
-four/README2.txt
&> /dev
/null