deb-networking-cisco/devstack/csr1kv/cisco_neutron

276 lines
9.4 KiB
Bash

#!/usr/bin/env bash
#
# lib/neutron
# functions - functions specific to neutron
# Dependencies:
# ``functions`` file
# ``DEST`` must be defined
# ``STACK_USER`` must be defined
# ``stack.sh`` calls the entry points in this order:
#
# - net_configure_neutron
# - net_start_neutron_agents
# - net_create_neutron_initial_network
#
# ``unstack.sh`` calls the entry points in this order:
#
# - net_stop_neutron
# Neutron Networking
# ------------------
# Make sure that neutron is enabled in ``ENABLED_SERVICES``. If you want
# to run Neutron on this host, make sure that q-svc is also in
# ``ENABLED_SERVICES``.
#
# See "Neutron Network Configuration" below for additional variables
# that must be set in localrc for connectivity across hosts with
# Neutron.
#
# With Neutron networking the NETWORK_MANAGER variable is ignored.
# Settings
# --------
# Set up default directories
NEUTRON_CONF_DIR=/etc/neutron
NEUTRON_CONF=$NEUTRON_CONF_DIR/neutron.conf
count=0
Q_CISCO_CSR1KV_SETUP_SCRIPT_DIR=${Q_CISCO_CSR1KV_SETUP_SCRIPT_DIR:-$DIR_CISCO/devstack/csr1kv}
# Default Neutron Plugin
Q_PLUGIN=${Q_PLUGIN:-cisco}
# Default Neutron Port
Q_PORT=${Q_PORT:-9696}
# Default protocol
Q_PROTOCOL=${Q_PROTOCOL:-$SERVICE_PROTOCOL}
# RHEL's support for namespaces requires using veths with ovs
Q_USE_ROOTWRAP=${Q_USE_ROOTWRAP:-True}
# nova vif driver that all plugins should use
Q_NOTIFY_NOVA_PORT_STATUS_CHANGES=${Q_NOTIFY_NOVA_PORT_STATUS_CHANGES:-True}
Q_NOTIFY_NOVA_PORT_DATA_CHANGES=${Q_NOTIFY_NOVA_PORT_DATA_CHANGES:-True}
Q_CISCO_MGMT_CFG_AGENT_IP=10.0.100.2
# Enable ASR1K
Q_CISCO_ASR1K_ENABLED=${Q_CISCO_ASR1K_ENABLED:-True}
# MySQL info
MYSQL_USER=${MYSQL_USER:root}
MYSQL_PASSWORD=${MYSQL_PASSWORD:password}
source $DIR_CISCO/devstack/csr1kv/cisco
source $DIR_CISCO/devstack/csr1kv/cisco_router
source $DIR_CISCO/devstack/csr1kv/ciscocfgagent
# Cisco Routing Service Plugin functions
# ---------------------------------
# Use security group or not
# Save trace setting
XTRACE=$(set +o | grep xtrace)
set +o xtrace
# Functions
# ---------
# Test if any Neutron services are enabled
# is_neutron_enabled
function is_neutron_enabled {
[[ ,${ENABLED_SERVICES} =~ ,"q-" ]] && return 0
return 1
}
function configure_cisco_csr_router {
net_create_neutron_accounts
net_configure_neutron
net_start_neutron_agents
Q_L3_ENABLED="False"
}
function start_cisco_csr_router {
if [[ "$count" == 0 ]];then
if [[ "$Q_CISCO_ASR1K_ENABLED" == "True" ]]; then
setup_for_asr1k
else
setup_for_csr1kv
fi
Q_L3_ENABLED="True"
net_create_neutron_initial_network
count=$((count+1))
fi
}
# net_configure_neutron()
# Set common config for Cisco router after neutron server and agents.
function net_configure_neutron {
# goes before q-svc to init Q_SERVICE_PLUGIN_CLASSES
if is_service_enabled q-ciscorouter; then
_configure_neutron_cisco_router
fi
if is_service_enabled q-agt q-svc; then
_configure_neutron_service
fi
}
function get_or_add_user_role {
# Gets user role id
local user_role_id=$(openstack user role list \
$2 \
--project $3 \
--column "ID" \
--column "Name" \
| grep " $1 " | get_field 1)
if [[ -z "$user_role_id" ]]; then
# Adds role to user
user_role_id=$(openstack role add \
$1 \
--user $2 \
--project $3 \
| grep " id " | get_field 2)
fi
echo $user_role_id
}
# net_create_neutron_accounts() - Set up common required neutron accounts
# Tenant User Roles
# ------------------------------------------------------------------
# service neutron admin # if enabled
# Migrated from keystone_data.sh
function net_create_neutron_accounts {
local service_tenant=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
local service_role=$(openstack role list | awk "/ service / { print \$2 }")
if [[ "$ENABLED_SERVICES" =~ "q-svc" ]]; then
local neutron_user=$(get_or_create_user "neutron" \
"$SERVICE_PASSWORD" $service_tenant)
get_or_add_user_role $service_role $neutron_user $service_tenant
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
local neutron_service=$(get_or_create_service "neutron" \
"network" "Neutron Service")
get_or_create_endpoint $neutron_service \
"$REGION_NAME" \
"$Q_PROTOCOL://$SERVICE_HOST:$Q_PORT/" \
"$Q_PROTOCOL://$SERVICE_HOST:$Q_PORT/" \
"$Q_PROTOCOL://$SERVICE_HOST:$Q_PORT/"
fi
fi
}
function setup_for_asr1k {
if [[ "$Q_PLUGIN" == "ml2" ]]; then
plugin=ovs
fi
echo "Running ASR1K setup scripts with ${MYSQL_USER} ${MYSQL_PASSWORD}"
if [[ -f $TOP_DIR/localrc ]]; then
localrc_name=$TOP_DIR/localrc
else
localrc_name=$TOP_DIR/local.conf
fi
(cd $Q_CISCO_CSR1KV_SETUP_SCRIPT_DIR; ./csr1kv_install_all.sh neutron $plugin $localrc_name $MYSQL_USER $MYSQL_PASSWORD $Q_CISCO_MGMT_CFG_AGENT_IP True)
}
function setup_for_csr1kv {
if [[ "$Q_PLUGIN" == "csr1kv_openvswitch" ]]; then
plugin=ovs
elif [[ "$Q_PLUGIN" == "cisco" || "${Q_CISCO_PLUGIN_SUBPLUGINS[0]}" == "n1kv" ]]; then
plugin=n1kv
else
die $LINENO "Not a deployment with CSR1kv. Exiting!"
fi
echo "Running CSR1Kv setup with ${MYSQL_USER} ${MYSQL_PASSWORD}"
if [[ -f $TOP_DIR/localrc ]]; then
localrc_name=$TOP_DIR/localrc
else
localrc_name=$TOP_DIR/local.conf
fi
(cd $Q_CISCO_CSR1KV_SETUP_SCRIPT_DIR; ./csr1kv_install_all.sh neutron $plugin $localrc_name $MYSQL_USER $MYSQL_PASSWORD $Q_CISCO_MGMT_CFG_AGENT_IP False)
}
function net_create_neutron_initial_network {
if [ "$Q_L3_ENABLED" == "True" && $NEUTRON_CREATE_INITIAL_NETWORK = "True" ]; then
# Create a router, and add the private subnet as one of its interfaces
if [[ "$Q_L3_ROUTER_PER_TENANT" == "True" ]]; then
# create a tenant-owned router.
DEMO_TENANT_NAME="demo"
DEMO_TENANT_ID=$(openstack project list | awk "/ $DEMO_TENANT_NAME / { print \$2 }")
ROUTER_ID=$(neutron router-create --tenant-id $DEMO_TENANT_ID $Q_ROUTER_NAME | grep ' id ' | get_field 2)
die_if_not_set $LINENO ROUTER_ID "Failure creating ROUTER_ID for $TENANT_ID $Q_ROUTER_NAME"
else
# Plugin only supports creating a single router, which should be admin owned.
ROUTER_ID=$(neutron router-create $Q_ROUTER_NAME | grep ' id ' | get_field 2)
die_if_not_set $LINENO ROUTER_ID "Failure creating ROUTER_ID for $Q_ROUTER_NAME"
fi
# Create an external network, and a subnet. Configure the external network as router gw
if [ "$Q_USE_PROVIDERNET_FOR_PUBLIC" = "True" ]; then
EXT_NET_ID=$(neutron net-create "$PUBLIC_NETWORK_NAME" -- --router:external=True --provider:network_type=flat --provider:physical_network=${PUBLIC_PHYSICAL_NETWORK} | grep ' id ' | get_field 2)
else
EXT_NET_ID=$(neutron net-create "$PUBLIC_NETWORK_NAME" -- --router:external=True | grep ' id ' | get_field 2)
fi
die_if_not_set $LINENO EXT_NET_ID "Failure creating EXT_NET_ID for $PUBLIC_NETWORK_NAME"
if [[ "$IP_VERSION" =~ 4.* ]]; then
# Configure router for IPv4 public access
_neutron_configure_router_v4
fi
if [[ "$IP_VERSION" =~ .*6 ]]; then
# Configure router for IPv6 public access
_neutron_configure_router_v6
fi
fi
}
# Start running processes, including screen
function net_start_neutron_agents {
if is_service_enabled ciscocfgagent; then
start_the_ciscocfgagent
fi
}
# net_stop_neutron() - Stop running processes (non-screen)
function net_stop_neutron {
if is_service_enabled q-ciscorouter; then
neutron_cisco_router_stop
fi
}
function _configure_neutron_cisco_router {
neutron_cisco_router_configure_common
}
# _configure_neutron_service() - Set config files for neutron service
# It is called when q-svc is enabled.
function _configure_neutron_service {
Q_API_PASTE_FILE=$NEUTRON_CONF_DIR/api-paste.ini
Q_POLICY_FILE=$NEUTRON_CONF_DIR/policy.json
# Update either configuration file with plugin
iniset $NEUTRON_CONF DEFAULT core_plugin $Q_PLUGIN_CLASS
if [[ $Q_SERVICE_PLUGIN_CLASSES != '' ]]; then
iniset $NEUTRON_CONF DEFAULT service_plugins $Q_SERVICE_PLUGIN_CLASSES
fi
# Configuration for neutron notifations to nova.
iniset $NEUTRON_CONF DEFAULT notify_nova_on_port_status_changes $Q_NOTIFY_NOVA_PORT_STATUS_CHANGES
iniset $NEUTRON_CONF DEFAULT notify_nova_on_port_data_changes $Q_NOTIFY_NOVA_PORT_DATA_CHANGES
iniset $NEUTRON_CONF DEFAULT nova_url "$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2"
iniset $NEUTRON_CONF DEFAULT nova_admin_username nova
iniset $NEUTRON_CONF DEFAULT nova_admin_password $SERVICE_PASSWORD
ADMIN_TENANT_ID=$(openstack project list | awk "/ service / { print \$2 }")
iniset $NEUTRON_CONF DEFAULT nova_admin_tenant_id $ADMIN_TENANT_ID
iniset $NEUTRON_CONF DEFAULT nova_admin_auth_url "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_AUTH_PORT/v2.0"
# Configure plugin
net_neutron_plugin_configure_service
}
# Restore xtrace
$XTRACE
# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End: