#!/bin/bash
#
# Copyright (C) 2012, Red Hat, Inc.
#
# 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.
#

# The script supports the plugins below
declare -a SUPPORTED_PLUGINS=(linuxbridge openvswitch)

#
# Print --help output and exit.
#
usage() {

cat << EOF
The helper script will install the necessary support for the selected plugin.

Usage: neutron-node-setup [options]
Options:
	--help        | -h
		Print usage information.
        --plugin      | -p
                The neutron plugin. Supported plugins:-
                    ${SUPPORTED_PLUGINS[*]}
        --qhost       | -q
		The Neutron hostname (assumes that this is also the QPID host).
EOF

	exit 0
}

is_valid_plugin() {
	local i=
	for i in "${SUPPORTED_PLUGINS[@]}"; do
		if [ "$i" == "$1" ]; then
			return 0 
		fi
	done
	return 1
}

NEUTRON_USER=neutron
LB_CONF=/etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini
OVS_CONF=/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini

# Nova specific
NOVA_CONF=/etc/nova/nova.conf

while [ $# -gt 0 ]
do
	case "$1" in
		-h|--help)
			usage
			;;
                -p|--plugin)
                        shift
                        NEUTRON_PLUGIN=${1}
                        ;;
                -q|--qhost)
                        shift
                        Q_HOST=${1}
                        ;;
		*)
			# ignore
			shift
			;;
	esac
	shift
done

# if the plugin is not defined
if [ -z ${NEUTRON_PLUGIN} ] ; then
        echo "Please select a plugin from: ${SUPPORTED_PLUGINS[*]}"
        echo "Choice:"
        read NEUTRON_PLUGIN
fi

# check that the plugin is valid
is_valid_plugin ${NEUTRON_PLUGIN}
if [ $? -ne 0 ]; then
        echo "Plugin '${NEUTRON_PLUGIN}' not supported. Supported plugins:-"
        echo "    ${SUPPORTED_PLUGINS[*]}"
        exit 0
fi

echo "Neutron plugin: ${NEUTRON_PLUGIN}"

if ! [ -e "/etc/neutron/plugins/${NEUTRON_PLUGIN}" ]; then
	echo "Please install the ${NEUTRON_PLUGIN} neutron plugin"
        exit 0
fi

#if the database hostname and is not defined and is required
if [ -z ${Q_HOST} ] ; then
    echo "Please enter the Neutron hostname:"
    read Q_HOST
fi

Q_PORT=9696
Q_CONF=/etc/neutron/neutron.conf
# QPID
openstack-config --set ${Q_CONF} DEFAULT rpc_backend neutron.openstack.common.rpc.impl_qpid
openstack-config --set ${Q_CONF} DEFAULT qpid_hostname ${Q_HOST}

case "${NEUTRON_PLUGIN}" in
"linuxbridge")
;;

"openvswitch")
        if ! rpm -q openvswitch > /dev/null
        then
                echo "Please install openvswitch"
                exit 0
        fi
        OVS_CONF=/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
        openstack-config --set ${OVS_CONF} SECURITYGROUP firewall_driver neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
;;

esac

echo "Would you like to update the nova configuration files? (y/n): "
read response
case "$response" in
y|Y)
        ;;
*)
        echo "Complete!"
        exit 0
esac

# Keystone specific
OS_USERNAME=${OS_USERNAME:-neutron}
OS_PASSWORD=${OS_PASSWORD:-servicepass}
OS_AUTH_URL=${OS_AUTH_URL:-http://127.0.0.1:35357/v2.0/}
OS_TENANT_NAME=${OS_TENANT_NAME:-service}

# If OpenStack is installed then configure nova.conf
if ! [ -e "${NOVA_CONF}" ]; then
        echo "Please install OpenStack compute and then set the values"
        echo "in /etc/nova/nova.conf DEFAULT section"
        echo "    network_api_class=nova.network.neutronv2.api.API"
        echo "    neutron_admin_username=${OS_USERNAME}"
        echo "    neutron_admin_password=${OS_PASSWORD}"
        echo "    neutron_admin_auth_url=${OS_AUTH_URL}"
        echo "    neutron_auth_strategy=keystone"
        echo "    neutron_admin_tenant_name=${OS_TENANT_NAME}"
        echo "    neutron_url=http://${Q_HOST}:${Q_PORT}/"
        echo "    firewall_driver=nova.virt.firewall.NoopFirewallDriver"
        echo "    security_group_api=neutron"
else
        openstack-config --set ${NOVA_CONF} DEFAULT network_api_class nova.network.neutronv2.api.API
        openstack-config --set ${NOVA_CONF} DEFAULT neutron_admin_username ${OS_USERNAME}
        openstack-config --set ${NOVA_CONF} DEFAULT neutron_admin_password ${OS_PASSWORD}
        openstack-config --set ${NOVA_CONF} DEFAULT neutron_admin_auth_url ${OS_AUTH_URL}
        openstack-config --set ${NOVA_CONF} DEFAULT neutron_auth_strategy keystone 
        openstack-config --set ${NOVA_CONF} DEFAULT neutron_admin_tenant_name ${OS_TENANT_NAME}
        openstack-config --set ${NOVA_CONF} DEFAULT neutron_url http://${Q_HOST}:${Q_PORT}/
        openstack-config --set ${NOVA_CONF} DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
        openstack-config --set ${NOVA_CONF} DEFAULT security_group_api neutron
fi

echo "Configuration updates complete!"
