summaryrefslogtreecommitdiffstats
path: root/networking-odl/devstack
diff options
context:
space:
mode:
Diffstat (limited to 'networking-odl/devstack')
-rw-r--r--networking-odl/devstack/README.rst80
-rw-r--r--networking-odl/devstack/devstackgaterc62
-rw-r--r--networking-odl/devstack/entry_points307
-rw-r--r--networking-odl/devstack/functions120
-rw-r--r--networking-odl/devstack/local.conf.example42
-rw-r--r--networking-odl/devstack/odl-releases/beryllium-0.4.04
-rw-r--r--networking-odl/devstack/odl-releases/beryllium-0.4.1-SR14
-rw-r--r--networking-odl/devstack/odl-releases/beryllium-0.4.2-SR24
-rw-r--r--networking-odl/devstack/odl-releases/beryllium-0.4.3-SR34
-rw-r--r--networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.35
-rw-r--r--networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.45
-rw-r--r--networking-odl/devstack/odl-releases/boron-snapshot-0.5.05
-rw-r--r--networking-odl/devstack/odl-releases/carbon-snapshot-0.6.05
-rw-r--r--networking-odl/devstack/odl-releases/common14
-rw-r--r--networking-odl/devstack/odl-releases/helium-0.2.3-SR317
-rw-r--r--networking-odl/devstack/odl-releases/lithium-0.3.1-SR14
-rw-r--r--networking-odl/devstack/odl-releases/lithium-0.3.2-SR24
-rw-r--r--networking-odl/devstack/odl-releases/lithium-0.3.3-SR34
-rw-r--r--networking-odl/devstack/odl-releases/lithium-0.3.4-SR44
-rw-r--r--networking-odl/devstack/override-defaults37
-rw-r--r--networking-odl/devstack/plugin.sh151
-rw-r--r--networking-odl/devstack/post_test_hook.sh43
-rw-r--r--networking-odl/devstack/pre_test_hook.sh77
-rw-r--r--networking-odl/devstack/settings72
-rw-r--r--networking-odl/devstack/settings.odl116
-rw-r--r--networking-odl/devstack/setup_java.sh207
26 files changed, 1397 insertions, 0 deletions
diff --git a/networking-odl/devstack/README.rst b/networking-odl/devstack/README.rst
new file mode 100644
index 0000000..2b4bd1c
--- /dev/null
+++ b/networking-odl/devstack/README.rst
@@ -0,0 +1,80 @@
+======================
+ Enabling in Devstack
+======================
+
+1. Download DevStack
+
+2. Copy the sample local.conf over::
+
+ cp devstack/local.conf.example local.conf
+
+3. Optionally, to manually configure this:
+
+ Add this repo as an external repository::
+
+ > cat local.conf
+ [[local|localrc]]
+ enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl
+
+4. Optionally, to enable support for OpenDaylight L3 router functionality,
+ add the below.
+ Note: This is only relevant when using old netvirt (ovsdb based, default)::
+
+ > cat local.conf
+ [[local|localrc]]
+ ODL_L3=True
+
+5. If you need to route the traffic out of the box (e.g. br-ex), set
+ ODL_PROVIDER_MAPPINGS to map the physical provider network to device
+ mapping, as shown below::
+
+ > cat local.conf
+ [[local|localrc]]
+ ODL_L3=True
+ ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-br-ex:eth2} # for old netvirt (ovsdb based)
+ ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-physnet1:eth2} # for new netvirt (vpnservice based)
+
+6. Optionally, to enable support for OpenDaylight with LBaaS V2, add this::
+
+ > cat local.conf
+ [[local|localrc]]
+ enable_plugin neutron-lbaas http://git.openstack.org/openstack/neutron-lbaas
+ enable_service q-lbaasv2
+ NEUTRON_LBAAS_SERVICE_PROVIDERV2="LOADBALANCERV2:opendaylight:networking_odl.lbaas.driver_v2.OpenDaylightLbaasDriverV2:default"
+
+7. run ``stack.sh``
+
+8. Note: In a multi-node devstack environment, for each compute node you will
+ want to add this to the local.conf file::
+
+ > cat local.conf
+ [[local|localrc]]
+ enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl
+ ODL_MODE=compute
+
+9. Note: In a node using a release of Open vSwitch provided from another source
+ than your Linux distribution you have to enable in your local.conf skipping
+ of OVS installation step by setting *SKIP_OVS_INSTALL=True*. For example
+ when stacking together with `networking-ovs-dpdk
+ <https://github.com/openstack/networking-ovs-dpdk/>`_ Neutron plug-in to
+ avoid conflicts between openvswitch and ovs-dpdk you have to add this to
+ the local.conf file::
+
+ > cat local.conf
+ [[local|localrc]]
+ enable_plugin networking-ovs-dpdk http://git.openstack.org/openstack/networking-ovs-dpdk
+ enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl
+ SKIP_OVS_INSTALL=True
+ Q_ML2_PLUGIN_MECHANISM_DRIVERS=opendaylight
+
+10. Note: Optionally, to use the new netvirt implementation
+ (netvirt-vpnservice-openstack), add the following to the local.conf file
+ (only allinone topology is currently supported by devstack, since tunnel
+ endpoints are not automatically configured). For tunnel configurations
+ after loading devstack, please refer to this guide
+ https://wiki.opendaylight.org/view/Netvirt:_L2Gateway_HowTo#Configuring_Tunnels::
+
+ > cat local.conf
+ [[local|localrc]]
+ ODL_NETVIRT_KARAF_FEATURE=odl-restconf-all,odl-aaa-authn,odl-dlux-core,odl-mdsal-apidocs,odl-netvirt-vpnservice-openstack
+ ODL_BOOT_WAIT_URL=restconf/operational/network-topology:network-topology/ # Workaround since netvirt:1 no longer exists in DS!
diff --git a/networking-odl/devstack/devstackgaterc b/networking-odl/devstack/devstackgaterc
new file mode 100644
index 0000000..474cdc0
--- /dev/null
+++ b/networking-odl/devstack/devstackgaterc
@@ -0,0 +1,62 @@
+# 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.
+
+#
+# This script is executed in the OpenStack CI job that runs DevStack + tempest.
+# You can find the CI job configuration here:
+#
+# http://git.openstack.org/cgit/openstack-infra/project-config/tree/jenkins/jobs/networking-odl.yaml
+#
+
+export OVERRIDE_ENABLED_SERVICES=q-svc,q-dhcp,q-meta,quantum,tempest,n-api,n-cond,n-cpu,n-crt,n-obj,n-sch,g-api,g-reg,mysql,rabbit,key,dstat
+
+# By default this variable is set to br100, and it is used to determine the value of PUBLIC_INTERFACE.
+# PUBLIC_INTERFACE is wired to PUBLIC_BRIDGE to route traffic externally. Since, we don't currently
+# need to route external traffic in the gate (no multi-node testing), this can be unset.
+unset PUBLIC_INTERFACE
+
+# Begin list of exclusions.
+r="^(?!.*"
+
+# exclude the slow tag (part of the default for 'full')
+r="$r(?:.*\[.*\bslow\b.*\])"
+
+# exclude things that just aren't enabled:
+r="$r|(?:tempest\.api\.network\.admin\.test_quotas\.QuotasTest\.test_lbaas_quotas.*)"
+r="$r|(?:tempest\.api\.network\.test_load_balancer.*)"
+r="$r|(?:tempest\.scenario\.test_load_balancer.*)"
+r="$r|(?:tempest\.scenario\.test_network_basic_ops.*)"
+r="$r|(?:tempest\.scenario\.test_security_groups_basic_ops.*)"
+r="$r|(?:tempest\.api\.network\.admin\.test_load_balancer.*)"
+r="$r|(?:tempest\.api\.network\.admin\.test_lbaas.*)"
+r="$r|(?:tempest\.api\.network\.test_fwaas_extensions.*)"
+r="$r|(?:tempest\.api\.network\.test_vpnaas_extensions.*)"
+r="$r|(?:tempest\.api\.network\.test_metering_extensions.*)"
+r="$r|(?:tempest\.thirdparty\.boto\.test_s3.*)"
+
+# exclude stuff we're less likely to break because i'm impatient
+r="$r|(?:tempest\.api\.identity.*)"
+r="$r|(?:tempest\.api\.image.*)"
+r="$r|(?:tempest\.api\.volume.*)"
+
+# Current list of failing tests that need to be triaged, have bugs filed, and
+# fixed as appropriate.
+# (none)
+
+# End list of exclusions.
+r="$r)"
+
+# only run tempest.api/scenario/thirdparty tests (part of the default for 'full')
+r="$r(tempest\.(api|scenario|thirdparty)).*$"
+
+export DEVSTACK_GATE_TEMPEST_REGEX="$r"
+enable_service "$OVERRIDE_ENABLED_SERVICES"
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 "/\<Connector port/ s/808./$ODL_PORT/" \
+ $ODL_DIR/$ODL_NAME/configuration/tomcat-server.xml
+ fi
+ else
+ # Move Jetty to $ODL_PORT
+ local _ODLPORT=$(cat $ODL_DIR/$ODL_NAME/etc/jetty.xml | grep $ODL_PORT)
+ if [ "$_ODLPORT" == "" ]; then
+ sed -i "/\<Property name\=\"jetty\.port/ s/808./$ODL_PORT/" \
+ $ODL_DIR/$ODL_NAME/etc/jetty.xml
+ fi
+ fi
+
+ # Configure L3 if the user wants it for NETVIRT_OVSDB
+ # L3 is always enabled in NETVIRT_VPNSERVICE
+ if [[ ",$ODL_NETVIRT_KARAF_FEATURE," =~ ",$ODL_NETVIRT_KARAF_FEATURE_OVSDB," ]] && [ "${ODL_L3}" == "True" ]; then
+ # Configure L3 FWD if it's not there
+ local L3FWD=$(cat $ODL_DIR/$ODL_NAME/etc/custom.properties | \
+ grep ^ovsdb.l3.fwd.enabled)
+ if [ "$L3FWD" == "" ]; then
+ echo "ovsdb.l3.fwd.enabled=yes" >> $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"
+}
diff --git a/networking-odl/devstack/functions b/networking-odl/devstack/functions
new file mode 100644
index 0000000..ebd14da
--- /dev/null
+++ b/networking-odl/devstack/functions
@@ -0,0 +1,120 @@
+#!/bin/bash
+#
+# functions - OpenDaylight driver utility functions
+
+# Get build information
+function odl_update_maven_metadata_xml {
+ local MAVENMETAFILE=$1
+ local NEXUSPATH=$2
+ local BUNDLEVERSION=$3
+ local OFFLINE=$4
+
+ if [[ "$OFFLINE" == "True" ]]; then
+ return
+ fi
+
+ # Remove stale MAVENMETAFILE for cases where you switch releases
+ rm -f $MAVENMETAFILE
+
+ # Acquire the timestamp information from maven-metadata.xml
+ wget -O $MAVENMETAFILE ${NEXUSPATH}/${BUNDLEVERSION}/maven-metadata.xml
+}
+
+function _odl_export_snapshot_url_pkg {
+ local ODL_DIR=$1
+ local ODL_URL_PREFIX=$2
+ local BUNDLEVERSION=$3
+ local OFFLINE=$4
+ local BUNDLE_TIMESTAMP=$5
+
+ local MAVENMETAFILE=$ODL_DIR/maven-metadata.xml
+ local NEXUSPATH="${ODL_URL_PREFIX}/${ODL_URL_SNAPSHOT_REPOSITORY_PATH}/org/opendaylight/integration/distribution-karaf"
+
+ if [ "$BUNDLE_TIMESTAMP" == "latest" ]; then
+ odl_update_maven_metadata_xml $MAVENMETAFILE $NEXUSPATH $BUNDLEVERSION $OFFLINE
+ if is_ubuntu; then
+ install_package libxml-xpath-perl
+ BUNDLE_TIMESTAMP=`xpath -e "//snapshotVersion[extension='zip'][1]/value/text()" $MAVENMETAFILE 2>/dev/null`
+ else
+ yum_install perl-XML-XPath
+ BUNDLE_TIMESTAMP=`xpath $MAVENMETAFILE "//snapshotVersion[extension='zip'][1]/value/text()" 2>/dev/null`
+ fi
+ fi
+
+ export ODL_URL=${NEXUSPATH}/${BUNDLEVERSION}
+ export ODL_PKG=distribution-karaf-${BUNDLE_TIMESTAMP}.zip
+}
+
+function _odl_export_release_url_pkg {
+ local ODL_URL_PREFIX=$1
+ local BUNDLEVERSION=$2
+ local NEXUSPATH="${ODL_URL_PREFIX}/${ODL_URL_RELEASE_REPOSITORY_PATH}/org/opendaylight/integration/distribution-karaf"
+
+ export ODL_URL=${NEXUSPATH}/${BUNDLEVERSION}
+ export ODL_PKG=distribution-karaf-${BUNDLEVERSION}.zip
+}
+
+function setup_opendaylight_package {
+ if [[ -n "$ODL_SNAPSHOT_VERSION" ]]; then
+ _odl_export_snapshot_url_pkg ${ODL_DIR} ${ODL_URL_PREFIX} ${ODL_BUNDLEVERSION} ${OFFLINE} ${ODL_SNAPSHOT_VERSION}
+ else
+ _odl_export_release_url_pkg ${ODL_URL_PREFIX} ${ODL_BUNDLEVERSION}
+ fi
+}
+
+# Test if OpenDaylight is enabled
+function is_opendaylight_enabled {
+ [[ ,${ENABLED_SERVICES} =~ ,"odl-" ]] && return 0
+ return 1
+}
+
+
+# Check that the bridge is up and running
+function wait_for_active_bridge {
+ local BRIDGE=$1
+ local SLEEP_INTERVAL=$2
+ local MAX_WAIT=$3
+
+ echo "Waiting for bridge $BRIDGE to be available..."
+ local testcmd="sudo ovs-vsctl list Bridge | grep $BRIDGE"
+ test_with_retry "$testcmd" \
+ "$BRIDGE did not become available in $MAX_WAIT seconds." \
+ $MAX_WAIT $SLEEP_INTERVAL
+ echo "Bridge $BRIDGE is available."
+}
+
+# Move the public IP addresses to the OVS bridge on startup,
+# or back to the public interface on cleanup
+function move_interface_addresses {
+ local direction=$1
+
+ if [[ -n "$ODL_PROVIDER_MAPPINGS" ]]; then
+ local VETH_INTERFACE=$(echo $ODL_PROVIDER_MAPPINGS | cut -d ':' -f1)
+ local PHYSICAL_INTERFACE=$(echo $ODL_PROVIDER_MAPPINGS | cut -d ':' -f2)
+
+ if [[ "$direction" == "into_bridge" ]]; then
+ _move_neutron_addresses_route "$PHYSICAL_INTERFACE" "$VETH_INTERFACE" True False "inet"
+ if _has_public_ipv6_address "$PHYSICAL_INTERFACE"; then
+ _move_neutron_addresses_route "$PHYSICAL_INTERFACE" "$VETH_INTERFACE" False False "inet6"
+ fi
+ elif [[ "$direction" == "outof_bridge" ]]; then
+ _move_neutron_addresses_route "$VETH_INTERFACE" "$PHYSICAL_INTERFACE" False True "inet"
+ if _has_public_ipv6_address "$VETH_INTERFACE"; then
+ _move_neutron_addresses_route "$VETH_INTERFACE" "$PHYSICAL_INTERFACE" False False "inet6"
+ fi
+ fi
+ fi
+}
+
+# Check that the interface has an IP v6 address which
+# is routable on external network
+function _has_public_ipv6_address {
+ local interface=$1
+ local interface_public_ipv6_addresses=$(ip -f inet6 a s dev "$interface" | grep -c 'global')
+ echo "$interface public IPv6 address count: $interface_public_ipv6_addresses"
+ if [[ "$interface_public_ipv6_addresses" != 0 ]]; then
+ return 0
+ else
+ return 1
+ fi
+}
diff --git a/networking-odl/devstack/local.conf.example b/networking-odl/devstack/local.conf.example
new file mode 100644
index 0000000..9a6bd97
--- /dev/null
+++ b/networking-odl/devstack/local.conf.example
@@ -0,0 +1,42 @@
+[[local|localrc]]
+LOGFILE=stack.sh.log
+SCREEN_LOGDIR=/opt/stack/data/log
+LOG_COLOR=False
+
+disable_service swift
+disable_service cinder
+disable_service n-net
+enable_service q-svc
+enable_service q-dhcp
+enable_service q-l3
+enable_service q-meta
+enable_service q-vpn
+enable_service q-metering
+enable_service q-lbaas
+enable_service q-fwaas
+enable_service neutron
+enable_service tempest
+
+enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl
+
+ENABLE_TENANT_TUNNELS=True
+
+HOST_NAME=$(hostname)
+SERVICE_HOST_NAME=${HOST_NAME}
+SERVICE_HOST=$HOST_NAME
+
+VNCSERVER_PROXYCLIENT_ADDRESS=$SERVICE_HOST
+VNCSERVER_LISTEN=0.0.0.0
+
+MYSQL_HOST=$SERVICE_HOST
+RABBIT_HOST=$SERVICE_HOST
+GLANCE_HOSTPORT=$SERVICE_HOST:9292
+KEYSTONE_AUTH_HOST=$SERVICE_HOST
+KEYSTONE_SERVICE_HOST=$SERVICE_HOST
+
+MYSQL_PASSWORD=mysql
+RABBIT_PASSWORD=rabbit
+SERVICE_TOKEN=service
+SERVICE_PASSWORD=admin
+ADMIN_PASSWORD=admin
+
diff --git a/networking-odl/devstack/odl-releases/beryllium-0.4.0 b/networking-odl/devstack/odl-releases/beryllium-0.4.0
new file mode 100644
index 0000000..4ed5b73
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/beryllium-0.4.0
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.4.0-Beryllium'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/beryllium-0.4.1-SR1 b/networking-odl/devstack/odl-releases/beryllium-0.4.1-SR1
new file mode 100644
index 0000000..f659a38
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/beryllium-0.4.1-SR1
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.4.1-Beryllium-SR1'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/beryllium-0.4.2-SR2 b/networking-odl/devstack/odl-releases/beryllium-0.4.2-SR2
new file mode 100644
index 0000000..230682b
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/beryllium-0.4.2-SR2
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.4.2-Beryllium-SR2'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/beryllium-0.4.3-SR3 b/networking-odl/devstack/odl-releases/beryllium-0.4.3-SR3
new file mode 100644
index 0000000..2edebc0
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/beryllium-0.4.3-SR3
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.4.3-Beryllium-SR3'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.3 b/networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.3
new file mode 100644
index 0000000..a0d8ecc
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.3
@@ -0,0 +1,5 @@
+ODL_BUNDLEVERSION='0.4.3-SNAPSHOT'
+ODL_SNAPSHOT_VERSION=${ODL_SNAPSHOT_VERSION:-latest}
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.4 b/networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.4
new file mode 100644
index 0000000..3ea7fac
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/beryllium-snapshot-0.4.4
@@ -0,0 +1,5 @@
+ODL_BUNDLEVERSION='0.4.4-SNAPSHOT'
+ODL_SNAPSHOT_VERSION=${ODL_SNAPSHOT_VERSION:-latest}
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/boron-snapshot-0.5.0 b/networking-odl/devstack/odl-releases/boron-snapshot-0.5.0
new file mode 100644
index 0000000..1afdb92
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/boron-snapshot-0.5.0
@@ -0,0 +1,5 @@
+ODL_BUNDLEVERSION='0.5.0-SNAPSHOT'
+ODL_SNAPSHOT_VERSION=${ODL_SNAPSHOT_VERSION:-latest}
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/carbon-snapshot-0.6.0 b/networking-odl/devstack/odl-releases/carbon-snapshot-0.6.0
new file mode 100644
index 0000000..102de66
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/carbon-snapshot-0.6.0
@@ -0,0 +1,5 @@
+ODL_BUNDLEVERSION='0.6.0-SNAPSHOT'
+ODL_SNAPSHOT_VERSION=${ODL_SNAPSHOT_VERSION:-latest}
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-8}
diff --git a/networking-odl/devstack/odl-releases/common b/networking-odl/devstack/odl-releases/common
new file mode 100644
index 0000000..ec57dd9
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/common
@@ -0,0 +1,14 @@
+# karaf distribution name of ODL to download
+export ODL_NAME=${ODL_NAME:-distribution-karaf-${ODL_BUNDLEVERSION}}
+
+# The network virtualization older feature name (ovsdb based)
+export ODL_NETVIRT_KARAF_FEATURE_OVSDB=${ODL_NETVIRT_KARAF_FEATURE_OVSDB:-odl-ovsdb-openstack}
+
+# The network virtualization newer feature name (vpnservice based)
+export ODL_NETVIRT_KARAF_FEATURE_VPNSERVICE=${ODL_NETVIRT_KARAF_FEATURE_VPNSERVICE:-odl-netvirt-openstack}
+
+# The network virtualization feature used by opendaylight loaded by Karaf
+export ODL_NETVIRT_KARAF_FEATURE=${ODL_NETVIRT_KARAF_FEATURE:-odl-neutron-service,odl-restconf-all,odl-aaa-authn,odl-dlux-core,odl-mdsal-apidocs,$ODL_NETVIRT_KARAF_FEATURE_OVSDB}
+
+# The url that this version of ODL netvirt can use to know ODL is fully up
+export ODL_BOOT_WAIT_URL=${ODL_BOOT_WAIT_URL:-restconf/operational/network-topology:network-topology/topology/netvirt:1}
diff --git a/networking-odl/devstack/odl-releases/helium-0.2.3-SR3 b/networking-odl/devstack/odl-releases/helium-0.2.3-SR3
new file mode 100644
index 0000000..70149e9
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/helium-0.2.3-SR3
@@ -0,0 +1,17 @@
+# Short name of ODL package
+export ODL_NAME=distribution-karaf-0.2.3-Helium-SR3
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-7}
+
+# overwrite this function
+function setup_opendaylight_package {
+ # The OpenDaylight URL
+ export ODL_URL=${ODL_URL_PREFIX}/content/repositories/public/org/opendaylight/integration/distribution-karaf/0.2.3-Helium-SR3
+
+ # The OpenDaylight Package
+ export ODL_PKG=distribution-karaf-0.2.3-Helium-SR3.zip
+}
+
+# The network virtualization feature used by opendaylight loaded by Karaf
+ODL_NETVIRT_KARAF_FEATURE=${ODL_NETVIRT_KARAF_FEATURE:-odl-base-all,odl-restconf-all,odl-aaa-authn,odl-dlux-core,odl-mdsal-apidocs,odl-adsal-northbound,odl-nsf-all,odl-ovsdb-northbound,odl-ovsdb-openstack}
diff --git a/networking-odl/devstack/odl-releases/lithium-0.3.1-SR1 b/networking-odl/devstack/odl-releases/lithium-0.3.1-SR1
new file mode 100644
index 0000000..81283a7
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/lithium-0.3.1-SR1
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.3.1-Lithium-SR1'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-7}
diff --git a/networking-odl/devstack/odl-releases/lithium-0.3.2-SR2 b/networking-odl/devstack/odl-releases/lithium-0.3.2-SR2
new file mode 100644
index 0000000..ff52cad
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/lithium-0.3.2-SR2
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.3.2-Lithium-SR2'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-7}
diff --git a/networking-odl/devstack/odl-releases/lithium-0.3.3-SR3 b/networking-odl/devstack/odl-releases/lithium-0.3.3-SR3
new file mode 100644
index 0000000..a1ff407
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/lithium-0.3.3-SR3
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.3.3-Lithium-SR3'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-7}
diff --git a/networking-odl/devstack/odl-releases/lithium-0.3.4-SR4 b/networking-odl/devstack/odl-releases/lithium-0.3.4-SR4
new file mode 100644
index 0000000..da2f692
--- /dev/null
+++ b/networking-odl/devstack/odl-releases/lithium-0.3.4-SR4
@@ -0,0 +1,4 @@
+export ODL_BUNDLEVERSION='0.3.4-Lithium-SR4'
+
+# Java major version required to run OpenDaylight: 7, 8, ...
+ODL_REQUIRED_JAVA_VERSION=${ODL_REQUIRED_JAVA_VERSION:-7}
diff --git a/networking-odl/devstack/override-defaults b/networking-odl/devstack/override-defaults
new file mode 100644
index 0000000..399a528
--- /dev/null
+++ b/networking-odl/devstack/override-defaults
@@ -0,0 +1,37 @@
+# Override few things here as early as we can
+
+# We will enable the opendaylight ML2 MechanismDriver v1 version by default.
+# Note we are also enabling the logger driver, which is helpful for
+# debugging things on the Neutron side.
+if [[ "$ODL_V2DRIVER" == "True" ]]
+then
+ V2_POSTFIX="_v2"
+else
+ V2_POSTFIX=""
+fi
+
+Q_ML2_PLUGIN_MECHANISM_DRIVERS=${Q_ML2_PLUGIN_MECHANISM_DRIVERS:-"opendaylight${V2_POSTFIX},logger"}
+
+# This triggers the provisioning of L3 resources like routers and
+# external network, if not overriden.
+Q_L3_ENABLED=${Q_L3_ENABLED:-True}
+
+# We have to disable the neutron L2 agent. OpenDaylight does not use the
+# L2 agent, it instead uses a combination of OpenFlow and OVSDB commands
+# to program OVS on each compute and network node host.
+disable_service q-agt
+
+# If ODL_L3 is enabled, then we don't need the L3 agent and OpenDaylight
+# is going to act as the ML2's L3 service plugin.
+# NETVIRT_VPNSERVICE feature enables ODL L3 by default, so ODL_L3 is disregarded.
+if [[ ",$ODL_NETVIRT_KARAF_FEATURE," =~ ",$ODL_NETVIRT_KARAF_FEATURE_VPNSERVICE," ]] || [ "$ODL_L3" == "True" ];
+then
+ disable_service q-l3
+ ML2_L3_PLUGIN="${ML2_L3_PLUGIN:-odl-router${V2_POSTFIX}}"
+fi
+
+# [networking-feature-enabled] api-extensions
+# api-extensions=all means any kind of extensions is enabled irrelevant of what plugin supports
+# ML2 plugin with ODL driver supports only the following extensions, not all
+# Those list must be maintained as ML2 plugin with ODL driver supports more extensions
+NETWORK_API_EXTENSIONS=${NETWORK_API_EXTENSIONS:-"dns-integration,address-scope,ext-gw-mode,binding,agent,subnet_allocation,dhcp_agent_scheduler,external-net,flavors,net-mtu,quotas,provider,multi-provider,extraroute,vlan-transparent,router,extra_dhcp_opt,security-group,rbac-policies,port-security,allowed-address-pairs,dvr"}
diff --git a/networking-odl/devstack/plugin.sh b/networking-odl/devstack/plugin.sh
new file mode 100644
index 0000000..a65840d
--- /dev/null
+++ b/networking-odl/devstack/plugin.sh
@@ -0,0 +1,151 @@
+#!/bin/bash
+#
+# devstack/plugin.sh
+# Functions to control the configuration and operation of the opendaylight service
+
+# Save trace setting
+_XTRACE_NETWORKING_ODL=$(set +o | grep xtrace)
+set +o xtrace
+
+# OpenDaylight directories
+NETWORKING_ODL_DIR=$DEST/networking-odl
+ODL_DIR=$DEST/opendaylight
+
+# Make sure $ODL_DIR exists
+mkdir -p $ODL_DIR
+
+# Import utility functions
+source $TOP_DIR/functions
+source $NETWORKING_ODL_DIR/devstack/functions
+
+# Import bridge data
+source $TOP_DIR/lib/neutron_plugins/ovs_base
+
+# Import ODL settings
+source $NETWORKING_ODL_DIR/devstack/settings.odl
+source $NETWORKING_ODL_DIR/devstack/odl-releases/$ODL_RELEASE
+source $NETWORKING_ODL_DIR/devstack/odl-releases/common
+
+# Utilities functions for setting up Java
+source $NETWORKING_ODL_DIR/devstack/setup_java.sh
+
+# Import Entry Points
+# -------------------
+source $NETWORKING_ODL_DIR/devstack/entry_points
+
+# Restore xtrace
+$_XTRACE_NETWORKING_ODL
+
+if [[ "$ODL_USING_EXISTING_JAVA" == "True" ]]
+then
+ echo 'Using installed java.'
+ java -version || exit 1
+fi
+
+# main loop
+if is_service_enabled odl-server; then
+ if [[ "$1" == "stack" && "$2" == "install" ]]; then
+ setup_opendaylight_package
+ install_opendaylight
+ configure_opendaylight
+ init_opendaylight
+ elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
+ configure_neutron_odl
+ # This has to start before Neutron
+ start_opendaylight
+ elif [[ "$1" == "stack" && "$2" == "post-extra" ]]; then
+ # no-op
+ :
+ fi
+
+ if [[ "$1" == "unstack" ]]; then
+ stop_opendaylight
+ cleanup_opendaylight
+ fi
+
+ if [[ "$1" == "clean" ]]; then
+ # no-op
+ :
+ fi
+fi
+
+if is_service_enabled odl-compute; then
+ if [[ "$1" == "stack" && "$2" == "install" ]]; then
+ install_opendaylight_compute
+ elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
+ if is_service_enabled nova; then
+ create_nova_conf_neutron
+ fi
+ bind_opendaylight_controller
+ wait_for_active_bridge $OVS_BR $ODL_RETRY_SLEEP_INTERVAL $ODL_BOOT_WAIT
+
+ # L3 needs to be configured only for netvirt-ovsdb - in netvirt-vpnservice L3 is configured
+ # by provider_mappings, and the provider mappings are added to br-int by default
+ if [[ ",$ODL_NETVIRT_KARAF_FEATURE," =~ ",$ODL_NETVIRT_KARAF_FEATURE_OVSDB," ]] && [ "${ODL_L3}" == "True" ]; then
+ configure_opendaylight_l3
+ fi
+ elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
+ # no-op
+ :
+ elif [[ "$1" == "stack" && "$2" == "post-extra" ]]; then
+ # no-op
+ :
+ fi
+
+ if [[ "$1" == "unstack" ]]; then
+ cleanup_opendaylight_compute
+ fi
+
+ if [[ "$1" == "clean" ]]; then
+ # no-op
+ :
+ fi
+fi
+
+if is_service_enabled odl-neutron; then
+ if [[ "$1" == "stack" && "$2" == "install" ]]; then
+ install_opendaylight_neutron_thin_ml2_driver
+ elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
+ configure_neutron_odl
+ elif [[ "$1" == "stack" && "$2" == "post-extra" ]]; then
+ # no-op
+ :
+ fi
+
+ if [[ "$1" == "unstack" ]]; then
+ # no-op
+ :
+ fi
+
+ if [[ "$1" == "clean" ]]; then
+ # no-op
+ :
+ fi
+fi
+
+if is_service_enabled odl-lightweight-testing; then
+ if [[ "$1" == "stack" && "$2" == "install" ]]; then
+ install_opendaylight_neutron_thin_ml2_driver
+ elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
+ configure_neutron_odl
+ configure_neutron_odl_lightweight_testing
+ elif [[ "$1" == "stack" && "$2" == "post-extra" ]]; then
+ # no-op
+ :
+ fi
+
+ if [[ "$1" == "unstack" ]]; then
+ # no-op
+ :
+ fi
+
+ if [[ "$1" == "clean" ]]; then
+ # no-op
+ :
+ fi
+fi
+
+# Tell emacs to use shell-script-mode
+## Local variables:
+## mode: shell-script
+## End:
diff --git a/networking-odl/devstack/post_test_hook.sh b/networking-odl/devstack/post_test_hook.sh
new file mode 100644
index 0000000..64d291e
--- /dev/null
+++ b/networking-odl/devstack/post_test_hook.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+set -xe
+
+GATE_DEST=$BASE/new
+DEVSTACK_PATH=$GATE_DEST/devstack
+
+source $DEVSTACK_PATH/functions
+source $DEVSTACK_PATH/localrc
+
+TEMPEST_CODE_DIR="$BASE/new/tempest"
+TEMPEST_DATA_DIR="$DATA_DIR/tempest"
+NETWORKING_ODL_DIR="$BASE/new/networking-odl"
+
+IS_GATE=$(trueorfalse False IS_GATE)
+if [[ "$IS_GATE" == "True" ]]
+then
+ source $NETWORKING_ODL_DIR/devstack/devstackgaterc
+fi
+
+owner=stack
+sudo_env="TEMPEST_CONFIG_DIR=$TEMPEST_CODE_DIR/etc"
+
+cd $TEMPEST_CODE_DIR
+sudo chown -R $owner:stack $TEMPEST_CODE_DIR
+sudo mkdir -p "$TEMPEST_DATA_DIR"
+sudo chown -R $owner:stack $TEMPEST_DATA_DIR
+source $DEVSTACK_PATH/openrc admin admin
+
+echo "Some pre-process info"
+neutron net-list
+neutron port-list
+neutron subnet-list
+neutron router-list
+
+echo "Running networking-odl test suite"
+sudo -H -u $owner $sudo_env tools/pretty_tox_serial.sh "$DEVSTACK_GATE_TEMPEST_REGEX"
+
+echo "Some post-process info"
+neutron net-list
+neutron port-list
+neutron subnet-list
+neutron router-list
diff --git a/networking-odl/devstack/pre_test_hook.sh b/networking-odl/devstack/pre_test_hook.sh
new file mode 100644
index 0000000..df11e2a
--- /dev/null
+++ b/networking-odl/devstack/pre_test_hook.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+
+set -xe
+
+# Drop a token that marks the build as coming from openstack infra
+GATE_DEST=$BASE/new
+DEVSTACK_PATH=$GATE_DEST/devstack
+
+case "$ODL_RELEASE_BASE" in
+ carbon-snapshot)
+ ODL_RELEASE=carbon-snapshot-0.6.0
+ ;;
+ boron-snapshot)
+ ODL_RELEASE=boron-snapshot-0.5.0
+ ;;
+ beryllium-snapshot)
+ ODL_RELEASE=beryllium-snapshot-0.4.4
+ ;;
+ *)
+ echo "Unknown ODL release base: $ODL_RELEASE_BASE"
+ exit 1
+ ;;
+esac
+
+case "$ODL_GATE_V2DRIVER" in
+ v2driver)
+ ODL_V2DRIVER=True
+ ;;
+ v1driver|*)
+ ODL_V2DRIVER=False
+ ;;
+esac
+
+case "$ODL_GATE_PORT_BINDING" in
+ pseudo-agentdb-binding)
+ ODL_PORT_BINDING_CONTROLLER=pseudo-agentdb-binding
+ ;;
+ legacy-port-binding)
+ ODL_PORT_BINDING_CONTROLLER=legacy-port-binding
+ ;;
+ network-topology|*)
+ ODL_PORT_BINDING_CONTROLLER=network-topology
+ ;;
+esac
+
+case "$ODL_GATE_SERVICE_PROVIDER" in
+ vpnservice)
+ ODL_NETVIRT_KARAF_FEATURE=odl-neutron-service,odl-restconf-all,odl-aaa-authn,odl-dlux-core,odl-mdsal-apidocs,odl-netvirt-openstack
+ ;;
+ netvirt|*)
+ ODL_NETVIRT_KARAF_FEATURE=odl-neutron-service,odl-restconf-all,odl-aaa-authn,odl-dlux-core,odl-mdsal-apidocs,odl-ovsdb-openstack
+ ;;
+esac
+
+cat <<EOF >> $DEVSTACK_PATH/localrc
+
+IS_GATE=True
+
+# Set here the ODL release to use for the Gate job
+ODL_RELEASE=${ODL_RELEASE}
+
+# Set here which driver, v1 or v2 driver
+ODL_V2DRIVER=${ODL_V2DRIVER}
+
+# Set here which port binding controller
+ODL_PORT_BINDING_CONTROLLER=${ODL_PORT_BINDING_CONTROLLER}
+
+# Set here which ODL openstack service provider to use
+ODL_NETVIRT_KARAF_FEATURE=${ODL_NETVIRT_KARAF_FEATURE}
+
+# Switch to using the ODL's L3 implementation
+ODL_L3=True
+
+# Enable debug logs for odl ovsdb
+ODL_NETVIRT_DEBUG_LOGS=True
+
+EOF
diff --git a/networking-odl/devstack/settings b/networking-odl/devstack/settings
new file mode 100644
index 0000000..0a924a2
--- /dev/null
+++ b/networking-odl/devstack/settings
@@ -0,0 +1,72 @@
+# Devstack settings
+
+# Each service you enable has the following meaning:
+# odl-neutron - Add this config flag if Opendaylight controller and OpenStack
+# Controller are on different nodes.
+# odl-server - Add this config flag if Opendaylight controller and OpenStack
+# Controller are on the same node.
+# odl-compute - Add this config flag for OpenStack Compute.
+#
+# odl-lightweight-testing - Add this config flag for testing neutron ODL ML2
+# driver and networking-odl without a real running
+# Opendaylight instance
+#
+# NOTE: odl-server includes odl-neutron.
+#
+# An example of enabling all-in-one ODL is below.
+#enable_service odl-compute odl-server
+
+# This can be overridden in the localrc file
+ODL_MODE=${ODL_MODE:-allinone}
+
+# ODL_MODE is used to configure how devstack works with OpenDaylight. You
+# can configure this three ways:
+#
+# ODL_MODE=allinone
+# Use this mode if you want to run ODL in this devstack instance. Useful
+# for a single node deployment or on the control node of a multi-node
+# devstack environment.
+#
+# ODL_MODE=compute
+# Use this for the compute nodes of a multi-node devstack install.
+#
+# ODL_MODE=externalodl
+# This installs the neutron code for ODL, but does not attempt to
+# manage ODL in devstack. This is used for development environments
+# similar to the allinone case except where you are using bleeding edge ODL
+# which is not yet released, and thus don't want it managed by
+# devstack.
+#
+# ODL_MODE=lightweight-testing
+# Use this for testing neutron ML2 driver plus networking-odl without
+# a running Opendaylight instance.
+#
+# ODL_MODE=manual
+# You're on your own here, and are enabling services outside the scope of
+# the ODL_MODE variable.
+
+case $ODL_MODE in
+ allinone)
+ enable_service odl-server odl-compute
+ ;;
+ externalodl)
+ enable_service odl-neutron odl-compute
+ ;;
+ compute)
+ enable_service odl-compute
+ ;;
+ lightweight-testing)
+ enable_service odl-lightweight-testing
+ ;;
+ manual)
+ echo "Manual mode: Enabling services explicitly."
+ ;;
+esac
+
+
+IS_GATE=$(trueorfalse False IS_GATE)
+if [[ "$IS_GATE" == "True" ]]
+then
+ NETWORKING_ODL_DIR=$DEST/networking-odl
+ source $NETWORKING_ODL_DIR/devstack/devstackgaterc
+fi
diff --git a/networking-odl/devstack/settings.odl b/networking-odl/devstack/settings.odl
new file mode 100644
index 0000000..1ce23a4
--- /dev/null
+++ b/networking-odl/devstack/settings.odl
@@ -0,0 +1,116 @@
+# Add here any global default values that apply for any ODL release
+# -----------------------------------------------------------------
+
+# What release to use. Choices are:
+#
+# carbon-snapshot-0.6.0 (master)
+# boron-snapshot-0.5.0 (stable/boron)
+# beryllium-snapshot-0.4.4 (stable/beryllium)
+# beryllium-snapshot-0.4.3 (stable/beryllium)
+# beryllium-0.4.3-SR3
+# beryllium-0.4.2-SR2
+# beryllium-0.4.1-SR1
+# beryllium-0.4.0
+# lithium-0.3.4-SR4 (SR4)
+# lithium-0.3.3-SR3 (SR3)
+# lithium-0.3.2-SR2 (SR2)
+# lithium-0.3.1-SR1 (SR1)
+# helium-0.2.3-SR3
+
+ODL_RELEASE=${ODL_RELEASE:-boron-snapshot-0.5.0}
+
+# The IP address of ODL. Set this in local.conf.
+ODL_MGR_IP=${ODL_MGR_IP:-$SERVICE_HOST}
+
+# The list of IP addresses used as OVS manager, separated by a comma.
+# In non-clustering cases, this is normally the same as ODL_MGR_IP. However,
+# for HA deployments the southbound portion to ODL is expected to
+# use the ip addresses of the ODL instances instead of a single vip. That
+# enables OVS to simultaneouly connect to more than one ODL instance.
+# Example of expected format: ODL_OVS_MANAGERS=1.1.1.1,2.2.2.2,3.3.3.3
+ODL_OVS_MANAGERS=${ODL_OVS_MANAGERS:-$ODL_MGR_IP}
+
+# The default ODL port for Tomcat to use
+# NOTE: We make this configurable because by default, ODL uses port 8080 for
+# Tomcat (Helium releases) or Jetty (Lithium and later releases), and this
+# conflicts with swift which also uses port 8080.
+ODL_PORT=${ODL_PORT:-8087}
+
+# The ODL endpoint URL
+ODL_ENDPOINT=${ODL_ENDPOINT:-http://${ODL_MGR_IP}:${ODL_PORT}/controller/nb/v2/neutron}
+
+# The ODL username
+ODL_USERNAME=${ODL_USERNAME:-admin}
+
+# The ODL password
+ODL_PASSWORD=${ODL_PASSWORD:-admin}
+
+# use v2 type driver
+# this requires post mitaka
+ODL_V2DRIVER=${ODL_V2DRIVER:-False}
+
+# The OpenDaylight URL PREFIX
+ODL_URL_PREFIX=${ODL_URL_PREFIX:-https://nexus.opendaylight.org}
+
+# OpenDaylight snapshot & release repositories paths
+# Can be overidden in case you host proxy repositories which have a different diretory structure than OpenDaylight's
+ODL_URL_SNAPSHOT_REPOSITORY_PATH=${ODL_URL_SNAPSHOT_REPOSITORY_PATH:-content/repositories/opendaylight.snapshot}
+ODL_URL_RELEASE_REPOSITORY_PATH=${ODL_URL_RELEASE_REPOSITORY_PATH:-content/repositories/opendaylight.release}
+
+# How long (in seconds) to pause after ODL starts to let it complete booting
+ODL_BOOT_WAIT=${ODL_BOOT_WAIT:-600}
+
+# Enable OpenDaylight l3 forwarding
+ODL_L3=${ODL_L3:-False}
+
+# If you need to route the traffic out of the box, set
+# ODL_PROVIDER_MAPPINGS to map br-ex as shown below. Note
+# This used to be accomplished via PUBLIC_BRIDGE, but that
+# is no longer necessary.
+#
+# The physical provider network to device mapping. Use this
+# to instruct ODL to map ports into specific bridges
+# Examples:
+# ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-br-ex:eth2}
+# ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-physnet1:eth1,br-ex:eth2}
+
+# MAC address for next hop gateway at external network
+ODL_L3GW_MAC=${ODL_L3GW_MAC:-''}
+
+# Enable debug logs for odl ovsdb
+ODL_NETVIRT_DEBUG_LOGS=${ODL_NETVIRT_DEBUG_LOGS:-False}
+
+# Karaf logfile information
+ODL_KARAF_LOG_DATE=$(date +%Y-%m-%d-%H%M%S)
+ODL_KARAF_LOG_BASE=${ODL_KARAF_LOG_BASE:-screen-karaf.log}
+ODL_KARAF_LOG_NAME=$ODL_KARAF_LOG_BASE.$ODL_KARAF_LOG_DATE
+
+# The bridge to configure
+OVS_BR=${OVS_BR:-br-int}
+
+# Use the existing ready java env
+ODL_USING_EXISTING_JAVA=${ODL_USING_EXISTING_JAVA:-False}
+
+# Allow the min/max/perm Java memory to be configurable
+ODL_JAVA_MIN_MEM=${ODL_JAVA_MIN_MEM:-256m}
+ODL_JAVA_MAX_MEM=${ODL_JAVA_MAX_MEM:-512m}
+ODL_JAVA_MAX_PERM_MEM=${ODL_JAVA_MAX_PERM_MEM:-512m}
+
+# Interval in test_with_retry calls
+ODL_RETRY_SLEEP_INTERVAL=${ODL_RETRY_SLEEP_INTERVAL:-5}
+
+# Skip installation of distribution provided Open vSwitch
+SKIP_OVS_INSTALL=$(trueorfalse False SKIP_OVS_INSTALL)
+
+# The ODL Restconf URL
+# URI to hostconfigs: empty for default value
+ODL_HOSTCONF_URI=${ODL_HOSTCONF_URI:-}
+
+# Port binding controller
+ODL_PORT_BINDING_CONTROLLER=${ODL_PORT_BINDING_CONTROLLER:-network-topology}
+
+# Snapshot version - allows using a specific version e.g. 0.5.0-20160719.101233-3643
+# latest: check the latest snapshot
+# specific version: the specific version of the snapshot
+# "": odl release
+ODL_SNAPSHOT_VERSION=${ODL_SNAPSHOT_VERSION:-}
diff --git a/networking-odl/devstack/setup_java.sh b/networking-odl/devstack/setup_java.sh
new file mode 100644
index 0000000..2b03cbc
--- /dev/null
+++ b/networking-odl/devstack/setup_java.sh
@@ -0,0 +1,207 @@
+#!/bin/bash
+
+ORACLE_JAVA_URL="http://download.oracle.com/otn-pub/java/jdk"
+ORACLE_JAVA7_URL="${ORACLE_JAVA7_URL:-$ORACLE_JAVA_URL/7u80-b15/jdk-7u80}"
+ORACLE_JAVA7_NAME="jdk1.7.0_80"
+ORACLE_JAVA8_URL="${ORACLE_JAVA8_URL:-$ORACLE_JAVA_URL/8u74-b02/jdk-8u74}"
+ORACLE_JAVA8_NAME="jdk1.8.0_74"
+
+function setup_java {
+ # Java version 8 is the last stable one
+ local VERSION="${1:-8}"
+
+ echo "Setup Java version: $VERSION"
+ if test_java_version "$VERSION" && setup_java_env; then
+ echo "Current Java version is already $VERSION."
+ elif select_java "$VERSION"; then
+ echo "Java version $VERSION has been selected."
+ elif install_openjdk "$VERSION" && select_java "$VERSION"; then
+ echo "OpenJDK version $VERSION has been installed and selected."
+ elif install_other_java "$VERSION" && select_java "$VERSION"; then
+ echo "Some Java version $VERSION has been installed and selected."
+ else
+ echo "ERROR: Unable to setup Java version $VERSION."
+ return 1
+ fi
+
+ return 0
+}
+
+function setup_java_env() {
+ local JAVA_COMMAND="${1:-${JAVA:-java}}"
+
+ JAVA_LINK="$(which $JAVA_COMMAND)"
+ if [[ "$JAVA_LINK" == "" ]]; then
+ return 1
+ fi
+
+ export JAVA="$(readlink -f $JAVA_LINK)"
+ export JAVA_HOME=$(echo $JAVA | sed "s:/bin/java::" | sed "s:/jre::")
+ if [ "$JAVA" != "$(readlink -f $(which java))" ]; then
+ export PATH="$(dirname $JAVA):$PATH"
+ if [ "$JAVA" != "$(readlink -f $(which java))" ]; then
+ echo "Unable to set $JAVA as current."
+ return 1
+ fi
+ fi
+
+ echo "JAVA is: $JAVA"
+ echo "JAVA_HOME is: $JAVA_HOME"
+ echo "Java version is:"
+ $JAVA -version 2>&1
+}
+
+function select_java {
+ local VERSION="$1"
+ local COMMAND
+
+ for COMMAND in $(list_java_commands); do
+ if test_java_version "$VERSION" "$COMMAND"; then
+ if setup_java_env "$COMMAND"; then
+ return 0
+ fi
+ fi
+ done
+
+ echo 'Required java version not found.'
+ return 1
+}
+
+function test_java_version {
+ local EXPECTED_VERSION="'"*' version "1.'$1'.'*'"'"'"
+ local COMMAND="${2:-${JAVA:-java}}"
+ local ACTUAL_VERSION="'"$($COMMAND -version 2>&1 | head -n 1)"'"
+
+ if [[ $ACTUAL_VERSION == $EXPECTED_VERSION ]]; then
+ echo "Found matching java version: $ACTUAL_VERSION"
+ return 0
+ else
+ return 1
+ fi
+}
+
+if is_ubuntu; then
+ # --- Ubuntu -------------------------------------------------------------
+
+ function list_java_commands {
+ update-alternatives --list java
+ }
+
+ function install_openjdk {
+ local REQUIRED_VERSION="$1"
+ apt_get install "openjdk-$REQUIRED_VERSION-jre-headless"
+ }
+
+ function install_other_java {
+ local VERSION="$1"
+ local PPA_REPOSITORY="ppa:webupd8team/java"
+ local JAVA_INSTALLER="oracle-java${VERSION}-installer"
+ local JAVA_SET_DEFAULT="oracle-java${VERSION}-set-default"
+
+ # Accept installer license
+ echo "$JAVA_INSTALLER" shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
+
+ # Remove all existing set-default versions
+ apt_get remove oracle-java*-set-default
+ if apt_get install $JAVA_INSTALLER ; then
+ if apt_get install $JAVA_SET_DEFAULT ; then
+ return 0 # Some PPA was already providing desired packages
+ fi
+ fi
+
+ # Add PPA only when package is not available
+ if apt_get install software-properties-common; then
+ # I pipe this after echo to emulate an user key-press
+ if echo | sudo -E add-apt-repository "$PPA_REPOSITORY"; then
+ if apt_get update; then
+ if apt_get install $JAVA_INSTALLER ; then
+ if apt_get install $JAVA_SET_DEFAULT ; then
+ return 0
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # Something has gone wrong!
+ return 1
+ }
+
+else
+ # --- Red Hat -------------------------------------------------------------
+
+ function list_java_commands {
+ alternatives --display java 2>&1 | grep -v '^[[:space:]]' | awk '/[[:space:]]- priority[[:space:]]/{print $1}'
+ }
+
+ function install_openjdk {
+ local VERSION="$1"
+ yum_install java-1.$VERSION.*-openjdk-headless
+ }
+
+ function install_other_java {
+ local VERSION="$1"
+
+ if [[ "$(uname -m)" == "x86_64" ]]; then
+ local ARCH=linux-x64
+ else
+ local ARCH=linux-i586
+ fi
+
+ if [[ "$VERSION" == "7" ]]; then
+ ORIGIN=$ORACLE_JAVA7_URL
+ TARGET=$ORACLE_JAVA7_NAME
+ elif [[ "$VERSION" == "8" ]]; then
+ ORIGIN=$ORACLE_JAVA8_URL
+ TARGET=$ORACLE_JAVA8_NAME
+ else
+ echo "Unsupported Java version: $VERSION."
+ return 1
+ fi
+
+ local NEW_JAVA="/usr/java/$TARGET/jre/bin/java"
+ if test_java_version "$VERSION" "$NEW_JAVA"; then
+ if sudo alternatives --install /usr/bin/java java "$NEW_JAVA" 200000; then
+ return 0
+ fi
+ fi
+
+ local EXT
+ local WGET_OPTIONS="-c --no-check-certificate --no-cookies"
+ local HEADER="Cookie: oraclelicense=accept-securebackup-cookie"
+
+ for EXT in "rpm" "tar.gz"; do
+ local URL="$ORIGIN-$ARCH.$EXT"
+ local PACKAGE="/tmp/$(basename $URL)"
+
+ if wget $WGET_OPTIONS --header "$HEADER" "$URL" -O "$PACKAGE"; then
+ case "$EXT" in
+ "rpm")
+ sudo rpm -i "$PACKAGE"
+ ;;
+ "tar.gz")
+ sudo mkdir -p /usr/java && sudo tar -C /usr/java -xzf "$PACKAGE"
+ ;;
+ *)
+ echo "Unsupported extension: $EXT"
+ ;;
+ esac
+
+ if test_java_version "$VERSION" "$NEW_JAVA"; then
+ if sudo alternatives --install /usr/bin/java java "$NEW_JAVA" 200000; then
+ return 0
+ fi
+ fi
+
+ echo "Unable to register installed java."
+
+ else
+ echo "Unable to download java archive: $URL"
+ fi
+
+ done
+
+ return 1
+ }
+
+fi