#!/bin/bash

##
# 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact with: OSM_TECH@list.etsi.org
##

echo "POST INSTALL OSM-RO"
OSMRO_PATH=`python -c 'import osm_ro; print osm_ro.__path__[0]'`
#OSMLIBOVIM_PATH=`python -c 'import lib_osm_openvim; print lib_osm_openvim.__path__[0]'`

#Pip packages required for vmware connector
pip2 install pip==9.0.3
pip2 install --upgrade pyvcloud==19.1.1
pip2 install --upgrade progressbar
pip2 install --upgrade prettytable
pip2 install --upgrade pyvmomi
pip2 install --upgrade pyang pyangbind
pip2 install untangle
pip2 install -e git+https://github.com/python-oca/python-oca#egg=oca
pip2 install azure

# Packages required for fos connector
pip2 install fog05rest


systemctl enable osm-ro.service

#Creation of log folder
mkdir -p /var/log/osm

#configure arg-autocomplete for this user
su $SUDO_USER -c 'activate-global-python-argcomplete --user'
if ! su  $SUDO_USER -c 'grep -q bash_completion.d/python-argcomplete.sh ${HOME}/.bashrc'
then
    echo "    inserting .bash_completion.d/python-argcomplete.sh execution at .bashrc"
    su $SUDO_USER -c 'echo ". ${HOME}/.bash_completion.d/python-argcomplete.sh" >> ~/.bashrc'
fi

echo '
To make OSM RO work, you have to install mysql and a database, and finally start osm-ro service'
echo "     ${OSMRO_PATH}/database_utils/install-db-server.sh # -h for help"
echo '     service osm-ro start'


