#!/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 pyone
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'


