0b7a8645de
The main problem this commit is resolving is that with openvswitch, the ports were not get cleaned up, and after restart (hard restart or even with soft restart lxc.service gets time-out) containers couldn't start properly, due to existing port on the bridges. Change-Id: I707dbfc6878095f7593abe3fca3a5e5b310063e5 Depends-On: https://review.opendev.org/c/openstack/openstack-ansible/+/837742
71 lines
1.9 KiB
Bash
71 lines
1.9 KiB
Bash
#!/usr/bin/env bash
|
|
# Copyright 2016, Rackspace US, 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.
|
|
set -e
|
|
|
|
# Execution example: lxc-veth-wiring.sh testing VETHTEST eth1 br-mgmt
|
|
|
|
# CLI variables
|
|
CONTAINER_NAME="${1}"
|
|
export CPID=$(lxc-info -Hpn ${CONTAINER_NAME});
|
|
VETH="${2}"
|
|
INTERFACE="${3}"
|
|
BRIDGE="${4}"
|
|
VETH_PEER="$(openssl rand -hex 4)"
|
|
BRIDGE_TYPE="${5}"
|
|
|
|
# PID of running container
|
|
PID="$(lxc-info -pHn ${CONTAINER_NAME})"
|
|
|
|
# Exit 0 means no change, exit 3 is changed, any other exit is fail.
|
|
EXIT_CODE=0
|
|
|
|
function ns_cmd {
|
|
nsenter --mount=/proc/$CPID/ns/mnt \
|
|
--net=/proc/$CPID/ns/net \
|
|
--pid=/proc/$CPID/ns/pid \
|
|
--uts=/proc/$CPID/ns/uts \
|
|
--ipc=/proc/$CPID/ns/ipc -- $@
|
|
}
|
|
|
|
if ! ip a l "${VETH}";then
|
|
ip link add name "${VETH}" type veth peer name "${VETH_PEER}"
|
|
EXIT_CODE=3
|
|
fi
|
|
|
|
ip link set dev "${VETH}" up
|
|
|
|
if ip a l "${VETH_PEER}";then
|
|
ip link set dev "${VETH_PEER}" up
|
|
ip link set dev "${VETH_PEER}" netns "${PID}" name "${INTERFACE}"
|
|
EXIT=3
|
|
fi
|
|
|
|
if [ "${BRIDGE}" != "openvswitch" ]; then
|
|
if ! brctl show "${BRIDGE}" | grep -q "${VETH}"; then
|
|
brctl addif "${BRIDGE}" "${VETH}"
|
|
EXIT_CODE=3
|
|
fi
|
|
fi
|
|
|
|
ns_cmd ip link set dev "${INTERFACE}" down || true
|
|
ns_cmd systemctl restart systemd-networkd
|
|
|
|
# Sleep for 2s to avoid more than 5 restarts of systemd-networkd in
|
|
# 10s. Otherwise the systemd service restart limit will be reached
|
|
# and the service will fail to restart.
|
|
sleep 2
|
|
|
|
exit ${EXIT_CODE}
|