Newer
Older
#!/bin/bash
# Copyright 2016 Telefónica Investigación y Desarrollo S.A.U.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
function usage(){
echo -e "usage: $0 [OPTIONS]"
echo -e "Install OSM from binaries or source code (by default, from binaries)"
echo -e " OPTIONS"
echo -e " -r <repo>: use specified repository name for osm packages"
echo -e " -R <release>: use specified release for osm binaries (deb packages, lxd images, ...)"
echo -e " -u <repo base>: use specified repository url for osm packages"
echo -e " -k <repo key>: use specified repository public key url"
echo -e " -b <refspec>: install OSM from source code using a specific branch (master, v2.0, ...) or tag"
echo -e " -b master (main dev branch)"
echo -e " -b v2.0 (v2.0 branch)"
echo -e " -b tags/v1.1.0 (a specific tag)"
echo -e " ..."
garciadeblas
committed
echo -e " --vimemu: additionally deploy the VIM emulator as a docker container"
echo -e " --elk_stack: additionally deploy an ELK docker stack for event logging"
echo -e " --pm_stack: additionally deploy a Prometheus+Grafana stack for performance monitoring (PM)"
echo -e " -o <ADDON>: do not install OSM, but ONLY one of the addons (vimemu, elk_stack, pm_stack) (assumes OSM is already installed)"
garciadeblas
committed
echo -e " -D <devops path> use local devops installation path"
echo -e " --nolxd: do not install and configure LXD, allowing unattended installations (assumes LXD is already installed and confifured)"
garciadeblas
committed
echo -e " --uninstall: uninstall OSM: remove the containers and delete NAT rules"
echo -e " --source: install OSM from source code using the latest stable tag"
echo -e " --develop: (deprecated, use '-b master') install OSM from source code using the master branch"
echo -e " --soui: install classic build of OSM (Rel THREE v3.1, based on LXD containers, with SO and UI)"
echo -e " --lxdimages: (only for Rel THREE with --soui) download lxd images from OSM repository instead of creating them from scratch"
echo -e " -l <lxd_repo>: (only for Rel THREE with --soui) use specified repository url for lxd images"
echo -e " -p <path>: (only for Rel THREE with --soui) use specified repository path for lxd images"
# echo -e " --reconfigure: reconfigure the modules (DO NOT change NAT rules)"
echo -e " --nat: (only for Rel THREE with --soui) install only NAT rules"
echo -e " --noconfigure: (only for Rel THREE with --soui) DO NOT install osmclient, DO NOT install NAT rules, DO NOT configure modules"
# echo -e " --update: update to the latest stable release or to the latest commit if using a specific branch"
echo -e " --showopts: print chosen options and exit (only for debugging)"
echo -e " -y: do not prompt for confirmation, assumes yes"
echo -e " -h / --help: print this help"
}
#Uninstall OSM: remove containers
function uninstall(){
echo -e "\nUninstalling OSM"
if [ $RC_CLONE ] || [ -n "$TEST_INSTALLER" ]; then
$OSM_DEVOPS/jenkins/host/clean_container RO
$OSM_DEVOPS/jenkins/host/clean_container VCA
$OSM_DEVOPS/jenkins/host/clean_container MON
$OSM_DEVOPS/jenkins/host/clean_container SO
#$OSM_DEVOPS/jenkins/host/clean_container UI
else
lxc stop RO && lxc delete RO
lxc stop VCA && lxc delete VCA
lxc stop MON && lxc delete MON
lxc stop SO-ub && lxc delete SO-ub
fi
echo -e "\nDeleting imported lxd images if they exist"
lxc image show osm-ro &>/dev/null && lxc image delete osm-ro
lxc image show osm-vca &>/dev/null && lxc image delete osm-vca
lxc image show osm-soui &>/dev/null && lxc image delete osm-soui
return 0
}
if sg docker -c "docker stack ps ${stack}" ; then
echo -e "\nRemoving stack ${stack}" && sg docker -c "docker stack rm ${stack}"
COUNTER=0
result=1
while [ ${COUNTER} -lt 30 ]; do
result=$(sg docker -c "docker stack ps ${stack}" | wc -l)
#echo "Dockers running: $result"
if [ "${result}" == "0" ]; then
break
fi
let COUNTER=COUNTER+1
sleep 1
done
if [ "${result}" == "0" ]; then
echo "All dockers of the stack ${stack} were removed"
else
FATAL "Some dockers of the stack ${stack} could not be removed. Could not clean it."
}
#Uninstall lightweight OSM: remove dockers
function uninstall_lightweight() {
echo -e "\nUninstalling lightweight OSM"
remove_stack osm
echo "Now osm docker images and volumes will be deleted"
newgrp docker << EONG
docker image rm osm/ro
docker image rm osm/lcm
docker image rm osm/light-ui
docker image rm osm/nbi
docker image rm osm/mon
docker image rm osm/pm
docker volume rm osm_mon_db
docker volume rm osm_mongo_db
docker volume rm osm_osm_packages
docker volume rm osm_ro_db
EONG
echo "Removing /etc/osm and /var/log/osm files"
rm -rf /etc/osm
rm -rf /var/log/osm
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
return 0
}
#Configure NAT rules, based on the current IP addresses of containers
function nat(){
echo -e "\nChecking required packages: iptables-persistent"
dpkg -l iptables-persistent &>/dev/null || ! echo -e " Not installed.\nInstalling iptables-persistent requires root privileges" || \
sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install iptables-persistent
echo -e "\nConfiguring NAT rules"
echo -e " Required root privileges"
sudo $OSM_DEVOPS/installers/nat_osm
}
function FATAL(){
echo "FATAL error: Cannot install OSM due to \"$1\""
exit 1
}
#Update RO, SO and UI:
function update(){
echo -e "\nUpdating components"
echo -e " Updating RO"
CONTAINER="RO"
MDG="RO"
INSTALL_FOLDER="/opt/openmano"
echo -e " Fetching the repo"
lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
BRANCH=""
BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
[ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
# COMMIT_ID either was previously set with -b option, or is an empty string
CHECKOUT_ID=$COMMIT_ID
[ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
[ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
if [[ $CHECKOUT_ID == "tags/"* ]]; then
REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
else
REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
fi
echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
echo " Nothing to be done."
else
echo " Update required."
lxc exec $CONTAINER -- service osm-ro stop
lxc exec $CONTAINER -- git -C /opt/openmano stash
lxc exec $CONTAINER -- git -C /opt/openmano pull --rebase
lxc exec $CONTAINER -- git -C /opt/openmano checkout $CHECKOUT_ID
lxc exec $CONTAINER -- git -C /opt/openmano stash pop
lxc exec $CONTAINER -- /opt/openmano/database_utils/migrate_mano_db.sh
lxc exec $CONTAINER -- service osm-ro start
fi
echo
echo -e " Updating SO and UI"
CONTAINER="SO-ub"
MDG="SO"
INSTALL_FOLDER="" # To be filled in
echo -e " Fetching the repo"
lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
BRANCH=""
BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
[ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
echo " FROM: $CURRENT ($CURRENT_COMMIT_ID)"
# COMMIT_ID either was previously set with -b option, or is an empty string
CHECKOUT_ID=$COMMIT_ID
[ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
[ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
if [[ $CHECKOUT_ID == "tags/"* ]]; then
REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
else
REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
fi
echo " TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
echo " Nothing to be done."
else
echo " Update required."
Loading full blame...