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}
|