From c3b2c2a9a22bac5cf17813c589444d3abebaa23b Mon Sep 17 00:00:00 2001 From: Wojciech Dec Date: Tue, 16 Aug 2016 19:27:01 +0200 Subject: Adding Mitaka networking-old module with the ODL topology based port binding resolution mechanism from https://review.openstack.org/333186 Change-Id: I10d400aac9bb639c146527f0f93e6925cb74d9de Signed-off-by: Wojciech Dec --- networking-odl/devstack/entry_points | 307 +++++++++++++++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 networking-odl/devstack/entry_points (limited to 'networking-odl/devstack/entry_points') diff --git a/networking-odl/devstack/entry_points b/networking-odl/devstack/entry_points new file mode 100644 index 0000000..647960f --- /dev/null +++ b/networking-odl/devstack/entry_points @@ -0,0 +1,307 @@ +#!/bin/bash + + +# cleanup_opendaylight() - Remove residual data files, anything left over +# from previous runs that a clean run would need to clean up +function cleanup_opendaylight { + # Wipe out the data, journal and snapshots directories ... grumble grumble grumble + rm -rf $ODL_DIR/$ODL_NAME/{data,journal,snapshots} + + # Remove existing logfiles + if [[ -n "$LOGDIR" ]]; then + rm -f "$LOGDIR/$ODL_KARAF_LOG_BASE*" + fi + if [[ -n "$SCREEN_LOGDIR" ]]; then + rm -f "$SCREEN_LOGDIR/$ODL_KARAF_LOG_BASE*" + fi + rm -f "$DEST/logs/$ODL_KARAF_LOG_BASE*" + + move_interface_addresses "outof_bridge" + + unbind_opendaylight_controller +} + + +# configure_opendaylight() - Set config files, create data dirs, etc +function configure_opendaylight { + echo "Configuring OpenDaylight" + + # The logging config file in ODL + local ODL_LOGGING_CONFIG=${ODL_DIR}/${ODL_NAME}/etc/org.ops4j.pax.logging.cfg + + # Add netvirt feature in Karaf, if it's not already there + local ODLFEATUREMATCH=$(cat $ODL_DIR/$ODL_NAME/etc/org.apache.karaf.features.cfg | \ + grep featuresBoot= | grep $ODL_NETVIRT_KARAF_FEATURE) + if [ "$ODLFEATUREMATCH" == "" ]; then + sed -i "/^featuresBoot=/ s/$/,$ODL_NETVIRT_KARAF_FEATURE/" \ + $ODL_DIR/$ODL_NAME/etc/org.apache.karaf.features.cfg + fi + + if [[ "$ODL_RELEASE" =~ "helium" ]]; then + # Move Tomcat to $ODL_PORT + local _ODLPORT=$(cat $ODL_DIR/$ODL_NAME/configuration/tomcat-server.xml | \ + grep $ODL_PORT) + if [ "$_ODLPORT" == "" ]; then + sed -i "/\> $ODL_DIR/$ODL_NAME/etc/custom.properties + fi + + # Configure L3 GW MAC if it's not there + local L3GW_MAC=$(cat $ODL_DIR/$ODL_NAME/etc/custom.properties | \ + grep ^ovsdb.l3gateway.mac) + if [[ -z "$L3GW_MAC" && -n "$ODL_L3GW_MAC" ]]; then + echo "ovsdb.l3gateway.mac=$ODL_L3GW_MAC" >> $ODL_DIR/$ODL_NAME/etc/custom.properties + fi + fi + + # Remove existing logfiles + local ODL_LOGDIR=$DEST/logs + if [[ -n "$LOGDIR" ]]; then + ODL_LOGDIR=$LOGDIR + fi + + rm -f "$ODL_LOGDIR/$ODL_KARAF_LOG_BASE*" + # Log karaf output to a file + _LF=$ODL_LOGDIR/$ODL_KARAF_LOG_NAME + LF=$(echo $_LF | sed 's/\//\\\//g') + # Soft link for easy consumption + sudo mkdir -p "$ODL_LOGDIR" + ln -sf $_LF "$ODL_LOGDIR/screen-karaf.log" + if [[ -n $SCREEN_LOGDIR ]]; then + ln -sf $_LF "$SCREEN_LOGDIR/screen-karaf.log" + fi + + # Change the karaf logfile + # disable log rotation by setting max fiel size large enough + sed -i -e "/^log4j\.appender\.out\.file/ s/.*/log4j\.appender\.out\.file\=$LF/" \ + -e "/^log4j\.appender\.out\.maxFileSize/ s/.*/log4j\.appender\.out\.maxFileSize\=1024GB/" \ + $ODL_DIR/$ODL_NAME/etc/org.ops4j.pax.logging.cfg + + # Configure DEBUG logs for network virtualization in odl, if the user wants it + if [ "${ODL_NETVIRT_DEBUG_LOGS}" == "True" ]; then + local OVSDB_DEBUG_LOGS=$(cat $ODL_LOGGING_CONFIG | grep ^log4j.logger.org.opendaylight.ovsdb) + if [ "${OVSDB_DEBUG_LOGS}" == "" ]; then + echo 'log4j.logger.org.opendaylight.ovsdb = TRACE, out' >> $ODL_LOGGING_CONFIG + echo 'log4j.logger.org.opendaylight.ovsdb.lib = INFO, out' >> $ODL_LOGGING_CONFIG + echo 'log4j.logger.org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter = DEBUG, out' >> $ODL_LOGGING_CONFIG + echo 'log4j.logger.org.opendaylight.ovsdb.openstack.netvirt.impl.TenantNetworkManagerImpl = DEBUG, out' >> $ODL_LOGGING_CONFIG + echo 'log4j.logger.org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.arp.GatewayMacResolverService = DEBUG, out' >> $ODL_LOGGING_CONFIG + echo 'log4j.logger.org.opendaylight.ovsdb.plugin.md.OvsdbInventoryManager = INFO, out' >> $ODL_LOGGING_CONFIG + fi + if [[ "$ODL_RELEASE" =~ "helium" ]]; then + local ODL_NEUTRON_DEBUG_LOGS=$(cat $ODL_LOGGING_CONFIG | \ + grep ^log4j.logger.org.opendaylight.controller.networkconfig.neutron) + if [ "${ODL_NEUTRON_DEBUG_LOGS}" == "" ]; then + echo 'log4j.logger.org.opendaylight.controller.networkconfig.neutron = TRACE, out' >> $ODL_LOGGING_CONFIG + fi + else + local ODL_NEUTRON_DEBUG_LOGS=$(cat $ODL_LOGGING_CONFIG | \ + grep ^log4j.logger.org.opendaylight.neutron) + if [ "${ODL_NEUTRON_DEBUG_LOGS}" == "" ]; then + echo 'log4j.logger.org.opendaylight.neutron = TRACE, out' >> $ODL_LOGGING_CONFIG + fi + fi + fi +} + +# configure_neutron_opendaylight() - Set Neutron config files according to ODL settings +function configure_neutron_odl { + echo "Configuring ML2 for OpenDaylight" + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_odl url=$ODL_ENDPOINT + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_odl username=$ODL_USERNAME + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_odl password=$ODL_PASSWORD + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_odl port_binding_controller=$ODL_PORT_BINDING_CONTROLLER + # When it's not set, the default value is set by networking-odl + if [[ -n "$ODL_HOSTCONF_URI" ]]; then + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_odl odl_hostconf_uri=$ODL_HOSTCONF_URI + fi +} + +function configure_neutron_odl_lightweight_testing { + echo "Configuring lightweight testing for OpenDaylight" + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_odl enable_lightweight_testing=True +} + +# init_opendaylight() - Initialize databases, etc. +function init_opendaylight { + # clean up from previous (possibly aborted) runs + # create required data files + : +} + + +# install_opendaylight() - Collect source and prepare +function install_opendaylight { + echo "Installing OpenDaylight and dependent packages" + if [[ "$ODL_USING_EXISTING_JAVA" != "True" ]] + then + if ! setup_java "${ODL_REQUIRED_JAVA_VERSION:-7}"; then + exit 1 + fi + fi + + install_opendaylight_neutron_thin_ml2_driver + + # Download OpenDaylight + cd $ODL_DIR + + if [[ "$OFFLINE" != "True" ]]; then + wget -N $ODL_URL/$ODL_PKG + fi + unzip -u -o $ODL_PKG +} + + +# install_opendaylight_neutron_thin_ml2_driver() - Install the ML2 driver +function install_opendaylight_neutron_thin_ml2_driver { + echo "Installing the Networking-ODL driver for OpenDaylight" + setup_develop $NETWORKING_ODL_DIR +} + + +# install_opendaylight_compute() - Make sure OVS is installed +function install_opendaylight_compute { + if [[ "$SKIP_OVS_INSTALL" = "True" ]]; then + echo "Skipping OVS installation." + else + # packages are the same as for Neutron OVS agent + _neutron_ovs_base_install_agent_packages + fi +} + + +# start_opendaylight() - Start running processes, including screen +function start_opendaylight { + echo "Starting OpenDaylight" + + # Wipe out the data and journal directories ... grumble grumble grumble + rm -rf $ODL_DIR/$ODL_NAME/{data,journal} + + # The following variables are needed by the running karaf process. + # See the "bin/setenv" file in the OpenDaylight distribution for + # their individual meaning. + setup_java_env + export JAVA_MIN_MEM=$ODL_JAVA_MIN_MEM + export JAVA_MAX_MEM=$ODL_JAVA_MAX_MEM + export JAVA_MAX_PERM_MEM=$ODL_JAVA_MAX_PERM_MEM + run_process odl-server "$ODL_DIR/$ODL_NAME/bin/start" + + if [ -n "$ODL_BOOT_WAIT_URL" ]; then + echo "Waiting for Opendaylight to start via $ODL_BOOT_WAIT_URL ..." + # Probe ODL restconf for netvirt until it is operational + local testcmd="curl -o /dev/null --fail --silent --head -u \ + ${ODL_USERNAME}:${ODL_PASSWORD} http://${ODL_MGR_IP}:${ODL_PORT}/${ODL_BOOT_WAIT_URL}" + test_with_retry "$testcmd" "Opendaylight did not start after $ODL_BOOT_WAIT" \ + $ODL_BOOT_WAIT $ODL_RETRY_SLEEP_INTERVAL + else + echo "Waiting for Opendaylight to start ..." + # Sleep a bit to let OpenDaylight finish starting up + sleep $ODL_BOOT_WAIT + fi +} + + +# stop_opendaylight() - Stop running processes (non-screen) +function stop_opendaylight { + # Stop the karaf container + $ODL_DIR/$ODL_NAME/bin/stop + stop_process odl-server +} + + +# cleanup_opendaylight_compute() - Remove all OVS ports, bridges and disconnects +# controller from switch +function cleanup_opendaylight_compute { + # Remove the patch ports + for port in $(sudo ovs-vsctl show | grep Port | awk '{print $2}' | cut -d '"' -f 2 | grep patch); do + sudo ovs-vsctl del-port ${port} + done + + # remove all OVS ports that look like Neutron created ports + for port in $(sudo ovs-vsctl list port | grep -o -e tap[0-9a-f\-]* -e q[rg]-[0-9a-f\-]*); do + sudo ovs-vsctl del-port ${port} + done + + # Remove all the vxlan ports + for port in $(sudo ovs-vsctl list port | grep name | grep vxlan | awk '{print $3}' | cut -d '"' -f 2); do + sudo ovs-vsctl del-port ${port} + done + + # Disconnect controller from switch + unbind_opendaylight_controller + + # remove all OVS bridges created by ODL + for bridge in $(sudo ovs-vsctl list-br | grep -o -e ${OVS_BR} -e ${PUBLIC_BRIDGE}); do + sudo ovs-vsctl del-br ${bridge} + done +} + +# bind_opendaylight_controller() - set control manager to OVS +function bind_opendaylight_controller { + echo_summary "Initializing OpenDaylight" + ODL_LOCAL_IP=${ODL_LOCAL_IP:-$HOST_IP} + ODL_MGR_PORT=${ODL_MGR_PORT:-6640} + ODL_OVS_MANAGERS=${ODL_OVS_MANAGERS:-$ODL_MGR_IP} + read ovstbl <<< $(sudo ovs-vsctl get Open_vSwitch . _uuid) + local ODL_MANAGERS_PARAM=() + for manager in $(echo $ODL_OVS_MANAGERS | tr "," "\n"); do + # ovsdbd doesn't understand localhost. replace it to numerical ip address + ODL_MANAGERS_PARAM=( "${ODL_MANAGERS_PARAM[@]}" "tcp:${manager/localhost/127.0.0.1}:$ODL_MGR_PORT" ) + done + # don't overwrite the already existing managers + local ODL_MANAGERS_OLD=$(sudo ovs-vsctl get-manager) + local ODL_MANAGERS=$(echo $ODL_MANAGERS_OLD ${ODL_MANAGERS_PARAM[@]} | tr ' ' '\n' | sort | uniq | tr '\n' ' ') + sudo ovs-vsctl set-manager ${ODL_MANAGERS} + if [[ -n "$ODL_PROVIDER_MAPPINGS" ]]; then + sudo ovs-vsctl set Open_vSwitch $ovstbl \ + other_config:provider_mappings=$ODL_PROVIDER_MAPPINGS + fi + sudo ovs-vsctl set Open_vSwitch $ovstbl other_config:local_ip=$ODL_LOCAL_IP +} + +# unbind_opendaylight_controller() - disconnect controller from switch and clear bridges +function unbind_opendaylight_controller { + sudo ovs-vsctl del-manager + BRIDGES=$(sudo ovs-vsctl list-br) + for bridge in $BRIDGES ; do + sudo ovs-vsctl del-controller $bridge + done +} + + +# configure_opendaylight_l3() - configure bridges for OpenDaylight L3 forwarding +function configure_opendaylight_l3 { + wait_for_active_bridge $PUBLIC_BRIDGE $ODL_RETRY_SLEEP_INTERVAL $ODL_BOOT_WAIT + + # Note: as of Lithium-SR3 and Beryllium releases, ODL will add the OVS port(s) + # to the external bridge via the ODL_PROVIDER_MAPPINGS method. Being so, + # the usage of PUBLIC_INTERFACE is no longer necessary in ODL devstack. + + # DEPRECATED: Add public interface to public bridge, if needed + if [[ -n "$PUBLIC_INTERFACE" && "$PUBLIC_INTERFACE" != "br100" ]]; then + deprecated "Adding $PUBLIC_INTERFACE to $PUBLIC_BRIDGE." + deprecated "Use ODL_PROVIDER_MAPPINGS instead of PUBLIC_INTERFACE." + sudo ovs-vsctl --no-wait -- --may-exist add-port $PUBLIC_BRIDGE $PUBLIC_INTERFACE + sudo ip link set $PUBLIC_INTERFACE up + fi + + move_interface_addresses "into_bridge" +} -- cgit 1.2.3-korg