diff options
Diffstat (limited to 'prototypes/sfc_tacker/poc.tacker-up.sh')
-rwxr-xr-x | prototypes/sfc_tacker/poc.tacker-up.sh | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/prototypes/sfc_tacker/poc.tacker-up.sh b/prototypes/sfc_tacker/poc.tacker-up.sh new file mode 100755 index 000000000..caad3f86a --- /dev/null +++ b/prototypes/sfc_tacker/poc.tacker-up.sh @@ -0,0 +1,385 @@ +#!/bin/bash + +# +# POC Script to build/install/deploy/orchestrate Tacker on an OPNFV Brhamaputra Fuel cluster +# Script assuming it runs on the openstack primary controller (where is opendaylight +# present) and there is a fuel master on 10.20.0.2 and can be reached with default +# credentials. +# +# author: Ferenc Cserepkei <ferenc.cserepkei@ericsson.com> +# +# (c) 2016 Telefonaktiebolaget L. M. ERICSSON +# +# All rights reserved. This program and the accompanying materials are made available +# under the terms of the Apache License, Version 2.0 which accompanies this distribution, +# and is available at http://www.apache.org/licenses/LICENSE-2.0 +# + + +SSH_OPTIONS=(-o StrictHostKeyChecking=no -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null -o LogLevel=error) + +MYDIR=$(dirname $(readlink -f "$0")) +MYREPO="tacker-server" +CLIREPO="tacker-client" +DEPREPO="jsonrpclib" + +CLIENT=$(echo python-python-tackerclient_*_all.deb) +JSONRPC=$(echo python-jsonrpclib_*_all.deb) +SERVER=$(echo python-tacker_*_all.deb) + +#fuel admin user name +fadm="fadm" + +# Function checks whether crudini is available, if not - installs +function chkCrudini () { + if [[ ! -f '/usr/bin/crudini' ]]; then + wget -N http://mirrors.kernel.org/ubuntu/pool/universe/p/python-iniparse/python-iniparse_0.4-2.1build1_all.deb + wget -N http://archive.ubuntu.com/ubuntu/pool/universe/c/crudini/crudini_0.3-1_amd64.deb + dpkg -i python-iniparse_0.4-2.1build1_all.deb crudini_0.3-1_amd64.deb + fi +} + +# Function checks whether a python egg is available, if not, installs +function chkPPkg () { + PKG="$1" + IPPACK=$(python - <<'____EOF' +import pip +from os.path import join +for package in pip.get_installed_distributions(): + print(package.location) + print(join(package.location, *package._get_metadata("top_level.txt"))) +____EOF +) + echo "$IPPACK" | grep -q "$PKG" + if [ $? -ne 0 ];then + pip install "$PKG" + fi +} + +# Function setting up the build/deploy environment +function envSetup () { + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BCE5CC461FA22B08 + apt-get update + apt-get install -y git python-pip python-all debhelper + chkPPkg stdeb + chkCrudini +} + +# Function installs jsonrpclib from github +function deployJsonrpclib () { + if [[ -e "${MYDIR}/${JSONRPC}" ]]; then + echo "$JSONRPC exists." + return 1 + fi + cd $MYDIR + rm -rf $DEPREPO + git clone https://github.com/joshmarshall/jsonrpclib.git $DEPREPO + cd $DEPREPO + dpkg --purge python-jsonrpclib + python setup.py --command-packages=stdeb.command bdist_deb + cd "deb_dist" + JSONRPC=$(echo python-jsonrpclib_*_all.deb) + cp $JSONRPC $MYDIR + dpkg -i $JSONRPC +} + +# Function builds Tacker server from github +function buildTackerServer () { + if [[ -e "${MYDIR}/${SERVER}" ]]; then + echo "$SERVER exists." + return 1 + fi + cd $MYDIR + rm -rf $MYREPO + git clone -b 'SFC_colorado' https://github.com/trozet/tacker.git $MYREPO + cd $MYREPO + patch -p 1 <<EOFSCP +diff -ruN a/setup.cfg b/setup.cfg +--- a/setup.cfg 2016-02-08 10:54:37.416525934 +0100 ++++ b/setup.cfg 2016-02-08 10:55:29.293428896 +0100 +@@ -22,14 +22,14 @@ + packages = + tacker + data_files = +- etc/tacker = ++ /etc/tacker = + etc/tacker/api-paste.ini + etc/tacker/policy.json + etc/tacker/tacker.conf + etc/tacker/rootwrap.conf +- etc/rootwrap.d = ++ /etc/rootwrap.d = + etc/tacker/rootwrap.d/servicevm.filters +- etc/init.d = etc/init.d/tacker-server ++ /etc/init.d = etc/init.d/tacker-server + + [global] + setup-hooks = +EOFSCP + dpkg --purge python-tacker + python setup.py --command-packages=stdeb.command bdist_deb +} + +# Function corrects and installs the Tacker-server debian package +function blessPackage () { + pushd "${MYDIR}/${MYREPO}/deb_dist" + SERVER=$(echo python-tacker_*_all.deb) + popd + DEBFILE="${MYDIR}/${MYREPO}/deb_dist/${SERVER}" + TMPDIR=$(mktemp -d /tmp/deb.XXXXXX) || exit 1 + OUTPUT=$(basename "$DEBFILE") + if [[ -e "${MYDIR}/${OUTPUT}" ]]; then + echo "$OUTPUT exists." + rm -r "$TMPDIR" + return 1 + fi + dpkg-deb -x "$DEBFILE" "$TMPDIR" + dpkg-deb --control "$DEBFILE" "${TMPDIR}/DEBIAN" + cd "$TMPDIR" + patch -p 1 <<EOFDC +diff -ruN DEBIAN/control DEBIAN/control +--- a/DEBIAN/control 2016-08-19 11:53:10.000000000 +0000 ++++ b/DEBIAN/control 2016-08-19 12:01:49.629096317 +0000 +@@ -4,7 +4,7 @@ + Architecture: all + Maintainer: OpenStack <openstack-dev@lists.openstack.org> + Installed-Size: 1566 +-Depends: python (>= 2.7), python (<< 2.8), python:any (>= 2.7.1-0ubuntu2), python-pbr, python-paste, python-pastedeploy, python-routes, python-anyjson, python-babel, python-eventlet, python-greenlet, python-httplib2, python-requests, python-iso8601, python-jsonrpclib, python-jinja2, python-kombu, python-netaddr, python-sqlalchemy (>= 1.0~), python-sqlalchemy (<< 1.1), python-webob, python-heatclient, python-keystoneclient, alembic, python-six, python-stevedore, python-oslo.config, python-oslo.messaging-, python-oslo.rootwrap, python-novaclient ++Depends: python (>= 2.7), python (<< 2.8), python:any (>= 2.7.1-0ubuntu2), python-pbr, python-paste, python-pastedeploy, python-routes, python-anyjson, python-babel, python-eventlet, python-greenlet, python-httplib2, python-requests, python-iso8601, python-jsonrpclib, python-jinja2, python-kombu, python-netaddr, python-sqlalchemy (>= 1.0~), python-sqlalchemy (<< 1.1), python-webob, python-heatclient, python-keystoneclient, alembic, python-six, python-stevedore, python-oslo.config, python-oslo.messaging, python-oslo.rootwrap, python-novaclient + Section: python + Priority: optional + Description: OpenStack servicevm/device manager +EOFDC + cd "$MYDIR" + echo "Patching deb..." + dpkg -b "$TMPDIR" "${MYDIR}/${SERVER}" + rm -r "$TMPDIR" + dpkg -i "${MYDIR}/${SERVER}" +} + +# Function deploys Tacker-server (installs missing mandatory files: upstart, default) +function deployTackerServer () { + rm -rf /etc/default/tacker-server + cat > /etc/default/tacker-server <<EOFTD +ENABLED=true +PIDFILE=/var/run/tacker/tacker-server.pid +LOGFILE=/var/log/tacker/tacker-server.log +PATH="\${PATH:+\$PATH:}/usr/sbin:/sbin" +TMPDIR=/var/lib/tacker/tmp +EOFTD + rm -rf /etc/init/tacker.conf + cat > /etc/init/tacker.conf <<EOFSC +# tacker-server - Provides the Tacker servicevm/device manager service +description "Openstack Tacker Server" +author "Ferenc Cserepkei <ferenc.cserepkei@ericsson.com>" + +start on runlevel [2345] +stop on runlevel [!2345] + +respawn +respawn limit 20 5 +limit nofile 65535 65535 + +chdir /var/run + +pre-start script + # stop job from continuing if no config file found for daemon + [ ! -f /etc/default/tacker-server ] && { stop; exit 0; } + [ ! -f /etc/tacker/tacker.conf ] && { stop; exit 0; } + + # source the config file + . /etc/default/tacker-server + + # stop job from continuing if admin has not enabled service in + # config file. + [ -z "\$ENABLED" ] && { stop; exit 0; } + + mkdir -p /var/run/tacker + mkdir -p /var/log/tacker + echo "Starting tacker server" +end script + +pre-stop script + echo "Stopping tacker server" +end script + +exec /usr/bin/python /usr/bin/tacker-server --log-file=/var/log/tacker/tacker-server.log -v -d --config-file=/etc/tacker/tacker.conf +EOFSC +} + +# Function installs python-tackerclient from github +function deployTackerClient() { + if [[ -e "${MYDIR}/${CLIENT}" ]]; then + echo "$CLIENT exists." + return 1 + fi + cd $MYDIR + rm -rf $CLIREPO + dpkg --purge python-tackerclient + git clone -b 'SFC_refactor' https://github.com/trozet/python-tackerclient.git $CLIREPO + cd $CLIREPO + python setup.py --command-packages=stdeb.command bdist_deb + cd "deb_dist" + CLIENT=$(echo python-python-tackerclient_*_all.deb) + cp $CLIENT $MYDIR + dpkg -i "${MYDIR}/${CLIENT}" +} + +# Function removes the cloned git repositories +function remove_repo () { + if [[ -d "${MYDIR}/${1}" ]]; then + rm -r "$1" + fi +} + +# Funcion copies and installs built artifact on all remaining cluster nodes +function populate_client() { + wget -O deb http://archive.ubuntu.com/ubuntu/pool/universe/s/sshpass/sshpass_1.05-1_amd64.deb &&\ + dpkg -i deb &&\ + rm deb + + clusternodes=$(sshpass -p "r00tme" ssh ${SSH_OPTIONS[@]} root@10.20.0.2 fuel node | cut -d '|' -f 5 | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" ) + myaddr=$(ifconfig br-fw-admin | sed -n '/inet addr/s/.*addr.\([^ ]*\) .*/\1/p') + for anode in $clusternodes ; do + if [ "$anode" != "$myaddr" ] ; then + echo "Installing $CLIENT on $anode" + scp ${SSH_OPTIONS[@]} -i "${MYDIR}/.ssh/id_rsa" ${CLIENT} ${fadm}@${anode}:${CLIENT} + ssh ${SSH_OPTIONS[@]} -i "${MYDIR}/.ssh/id_rsa" ${fadm}@${anode} sudo dpkg -i ${CLIENT} + ssh ${SSH_OPTIONS[@]} -i "${MYDIR}/.ssh/id_rsa" ${fadm}@${anode} rm ${CLIENT} + fi + done +} + +# Function orchestrate the Tacker service +function orchestrate () { + rm -rf /etc/puppet/modules/tacker + pushd /etc/puppet/modules + git clone https://github.com/trozet/puppet-tacker.git tacker + rm -rf /etc/puppet/modules/tacker/.git + popd + + ### Facts ### + + # Port(s) Protocol ServiceDetails Source + # 8805-8872 tcp,udp Unassigned IANA + bind_port='8808' + + auth_uri=$(crudini --get '/etc/heat/heat.conf' 'keystone_authtoken' 'auth_uri') + identity_uri=$(crudini --get '/etc/heat/heat.conf' 'keystone_authtoken' 'identity_uri') + int_addr=$(ifconfig br-mesh | sed -n '/inet addr/s/.*addr.\([^ ]*\) .*/\1/p') + odl_addr=$(hiera management_vip) + mgmt_addr=$(ifconfig br-mgmt | sed -n '/inet addr/s/.*addr.\([^ ]*\) .*/\1/p') + pub_addr=$(ifconfig br-ex-lnx | sed -n '/inet addr/s/.*addr.\([^ ]*\) .*/\1/p') + rabbit_host=$(crudini --get '/etc/heat/heat.conf' 'oslo_messaging_rabbit' 'rabbit_hosts'| cut -d ':' -f 1) + rabbit_password=$(crudini --get '/etc/heat/heat.conf' 'oslo_messaging_rabbit' 'rabbit_password') + sql_host=$(hiera database_vip) + database_connection="mysql://tacker:tacker@${sql_host}/tacker" + internal_url="http://${int_addr}:${bind_port}" + admin_url="http://${mgmt_addr}:${bind_port}" + public_url="http://${pub_addr}:${bind_port}" + heat_api_vip=$(crudini --get '/etc/heat/heat.conf' 'heat_api' 'bind_host') + allowed_hosts="[ '${sql_host}', '${HOSTNAME%%.domain.tld}', 'localhost', '127.0.0.1', '%' ]" + heat_uri="http://${heat_api_vip}:8004/v1" + odl_port='8282' + service_tenant='services' + myRegion='RegionOne' + myPassword='tacker' + + cat > configure_tacker.pp << EOF + class mysql::config {} + include mysql::config + class mysql::server {} + include mysql::server + + class { 'tacker': + package_ensure => 'absent', + client_package_ensure => 'absent', + bind_port => '${bind_port}', + keystone_password => '${myPassword}', + keystone_tenant => '${service_tenant}', + auth_uri => '${auth_uri}', + identity_uri => '${identity_uri}', + database_connection => '${database_connection}', + rabbit_host => '${rabbit_host}', + rabbit_password => '${rabbit_password}', + heat_uri => '${heat_uri}', + opendaylight_host => '${odl_addr}', + opendaylight_port => '${odl_port}', + } + + class { 'tacker::db::mysql': + password => '${myPassword}', + allowed_hosts => ${allowed_hosts}, + } + + class { 'tacker::keystone::auth': + password => '${myPassword}', + tenant => '${service_tenant}', + admin_url => '${admin_url}', + internal_url => '${internal_url}', + public_url => '${public_url}', + region => '${myRegion}', + } +EOF + + apt-get install -y mysql-client-5.5 + cat > /usr/bin/tacker-manage <<EOFAKEMANAGE +#!/bin/bash +EOFAKEMANAGE + chmod +x /usr/bin/tacker-manage + puppet apply configure_tacker.pp + rm -f tackerc + cat > tackerc <<EOFRC +#!/bin/sh +export LC_ALL=C +export OS_NO_CACHE='true' +export OS_TENANT_NAME='${service_tenant}' +export OS_PROJECT_NAME='${service_tenant}' +export OS_USERNAME='tacker' +export OS_PASSWORD='${myPassword}' +export OS_AUTH_URL='${auth_uri}' +export OS_DEFAULT_DOMAIN='default' +export OS_AUTH_STRATEGY='keystone' +export OS_REGION_NAME='${myRegion}' +export TACKER_ENDPOINT_TYPE='internalURL' +EOFRC + chmod +x tackerc +} + +# Funcion copies and installs built environment settings on all remaining cluster nodes +function populate_rc() { + wget -O deb http://archive.ubuntu.com/ubuntu/pool/universe/s/sshpass/sshpass_1.05-1_amd64.deb &&\ + dpkg -i deb &&\ + rm deb + + clusternodes=$(sshpass -p "r00tme" ssh ${SSH_OPTIONS[@]} root@10.20.0.2 fuel node | cut -d '|' -f 5 | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" ) + myaddr=$(ifconfig br-fw-admin | sed -n '/inet addr/s/.*addr.\([^ ]*\) .*/\1/p') + for anode in $clusternodes ; do + if [ "$anode" != "$myaddr" ] ; then + echo "Populating settings to $anode" + scp ${SSH_OPTIONS[@]} -i "${MYDIR}/.ssh/id_rsa" tackerc ${fadm}@${anode}:tackerc + fi + done +} + + +envSetup +deployTackerClient +deployJsonrpclib +buildTackerServer +blessPackage +deployTackerServer +populate_client +orchestrate +populate_rc + +git clone https://github.com/trozet/sfc-random.git + +remove_repo "$MYREPO" +remove_repo "$DEPREPO" +remove_repo "$CLIREPO" + +echo "Built: ${MYDIR}/${OUTPUT}" +echo "Built: ${MYDIR}/${CLIENT}" +echo "Built: ${MYDIR}/${JSONRPC}" +echo "tackerc - mandatory environmental parameters file created" |