blob: 840e50efff5786dc28a5a4139aa276359eeab5ec [file] [log] [blame]
{#
Copyright 2017-present Open Networking Foundation
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.
#}
#!/bin/bash
iptables -L > /dev/null
ip6tables -L > /dev/null
CONTAINER={{ container_name }}
IMAGE={{ docker_image }}
function mac_to_iface {
PARENT_MAC=$1
ifconfig|grep $PARENT_MAC| awk '{print $1}'|grep -v '\.'
}
function encapsulate_stag {
LAN_IFACE=$1
STAG=$2
ifconfig $LAN_IFACE >> /dev/null
if [ "$?" == 0 ]; then
STAG_IFACE=$LAN_IFACE.$STAG
ifconfig $LAN_IFACE up
ifconfig $STAG_IFACE
if [ "$?" == 0 ]; then
echo $STAG_IFACE is already created
else
ifconfig $STAG_IFACE >> /dev/null || ip link add link $LAN_IFACE name $STAG_IFACE type vlan id $STAG
fi
ifconfig $STAG_IFACE up
else
echo There is no $LAN_IFACE. Aborting.
exit -1
fi
}
{% if volumes %}
{% for volume in volumes %}
DEST_DIR=/var/container_volumes/$CONTAINER/{{ volume }}
mkdir -p $DEST_DIR
VOLUME_ARGS="$VOLUME_ARGS -v $DEST_DIR:{{ volume }}"
{% endfor %}
{% endif %}
docker inspect $CONTAINER > /dev/null 2>&1
if [ "$?" == 1 ]
then
docker pull $IMAGE
{% if network_method=="host" %}
docker run -d --name=$CONTAINER --privileged=true --net=host $VOLUME_ARGS $IMAGE
{% elif network_method=="bridged" %}
docker run -d --name=$CONTAINER --privileged=true --net=bridge $VOLUME_ARGS $IMAGE
{% else %}
docker run -d --name=$CONTAINER --privileged=true --net=none $VOLUME_ARGS $IMAGE
{% endif %}
else
docker start $CONTAINER
fi
{% if ports %}
{% for port in ports %}
{% if port.next_hop %}
NEXTHOP_ARG="@{{ port.next_hop }}"
{% else %}
NEXTHOP_ARG=""
{% endif %}
{% if port.c_tag %}
CTAG_ARG="@{{ port.c_tag }}"
{% else %}
CTAG_ARG=""
{% endif %}
{% if port.parent_mac %}
# container-in-VM
SRC_DEV=$( mac_to_iface "{{ port.parent_mac }}" )
CMD="docker exec $CONTAINER ifconfig $SRC_DEV >> /dev/null || pipework $SRC_DEV -i {{ port.device }} $CONTAINER {{ port.ip }}/24$NEXTHOP_ARG {{ port.mac }} $CTAG_ARG"
echo $CMD
eval $CMD
{% else %}
# container-on-metal
IP="{{ port.ip }}"
{% if port.mac %}
MAC="{{ port.mac }}"
{% else %}
MAC=""
{% endif %}
DEVICE="{{ port.device }}"
BRIDGE="{{ port.bridge }}"
{% if port.s_tag %}
# This is intended for lan_network. Assume that BRIDGE is set to br_lan. We
# create a device that strips off the S-TAG.
STAG="{{ port.s_tag }}"
encapsulate_stag $BRIDGE $STAG
SRC_DEV=$STAG_IFACE
{% else %}
# This is for a standard neutron private network. We use a donor VM to setup
# openvswitch for us, and we snoop at its devices and create a tap using the
# same settings.
XOS_NETWORK_ID="{{ port.xos_network_id }}"
INSTANCE_MAC="{{ port.snoop_instance_mac }}"
INSTANCE_ID="{{ port.snoop_instance_id }}"
INSTANCE_TAP=`virsh domiflist $INSTANCE_ID | grep -i $INSTANCE_MAC | awk '{print $1}'`
INSTANCE_TAP=${INSTANCE_TAP:3}
VLAN_ID=`ovs-vsctl show | grep -i -A 1 port.*$INSTANCE_TAP | grep -i tag | awk '{print $2}'`
# One tap for all containers per XOS/neutron network. Included the VLAN_ID in the
# hash, to cover the case where XOS is reinstalled and the XOS network ids
# get reused.
TAP="con`echo ${XOS_NETWORK_ID}_$VLAN_ID|md5sum|awk '{print $1}'`"
TAP=${TAP:0:10}
echo im=$INSTANCE_MAC ii=$INSTANCE_ID it=$INSTANCE_TAP vlan=$VLAN_ID tap=$TAP con=$CONTAINER dev=$DEVICE mac=$MAC
ovs-vsctl show | grep -i $TAP
if [[ $? == 1 ]]; then
echo creating tap
ovs-vsctl add-port $BRIDGE $TAP tag=$VLAN_ID -- set interface $TAP type=internal
else
echo tap exists
fi
SRC_DEV=$TAP
{% endif %}
CMD="docker exec $CONTAINER ifconfig $DEVICE >> /dev/null || pipework $SRC_DEV -i $DEVICE $CONTAINER $IP/24$NEXTHOP_ARG $MAC $CTAG_ARG"
echo $CMD
eval $CMD
{% endif %}
{% endfor %}
{% endif %}
# Attach to container
# (this is only done when using upstart, since upstart expects to be attached
# to a running service)
if [[ "$1" == "ATTACH" ]]; then
docker start -a $CONTAINER
fi