1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

B #4821: No traffic shaping in attached NICs (#356)

* B #4821: Hot-attached KVM NIC with more supported libvirt interface options

* B #4821: Generate KVM libvirt filter even without IP

* B #4821: Escape libvirt interface XML parameters

* Revert "B #4821: Generate KVM libvirt filter even without IP"

This reverts commit 29ef66dc1eb3c1aaa550cb6961e49ad8a6e92f14.

* B #4821: Support VROUTER_IP in attach_nic filter
This commit is contained in:
Vlastimil Holer 2017-06-27 19:24:15 +02:00 committed by Javi Fontan
parent a414e4d536
commit 75dcfd601f
3 changed files with 165 additions and 20 deletions

View File

@ -832,3 +832,86 @@ function get_disk_information {
esac
}
# This function extracts information about a NIC. The first parameter
# is a string with the filter for NICs, for example, to get the interface
# that's going to be attached, use:
#
# get_nic_information "ATTACH=YES"
#
# To get an specific interface ID use:
#
# get_nic_information "NIC_ID=$NIC_ID"
#
# The variables set are as follows:
#
# * VMID
# * NIC_ID
# * BRIDGE
# * VN_MAD
# * MAC
# * NIC_TARGET
# * SCRIPT
# * MODEL
# * IP
# * FILTER
# * VROUTER_IP
# * INBOUND_AVG_BW
# * INBOUND_PEAK_BW
# * INBOUND_PEAK_KB
# * OUTBOUND_AVG_BW
# * OUTBOUND_PEAK_BW
# * OUTBOUND_PEAK_KB
# * ORDER
function get_nic_information {
FILTER="$1"
DRIVER_PATH=$(dirname $0)
XPATH="${DRIVER_PATH}/../../datastore/xpath.rb"
CMD="$XPATH --stdin"
unset i j XPATH_ELEMENTS
NIC_XPATH="/VMM_DRIVER_ACTION_DATA/VM/TEMPLATE/NIC[$FILTER]"
while IFS= read -r -d '' element; do
XPATH_ELEMENTS[i++]="$element"
done < <($CMD /VMM_DRIVER_ACTION_DATA/VM/ID \
$NIC_XPATH/NIC_ID \
$NIC_XPATH/BRIDGE \
$NIC_XPATH/VN_MAD \
$NIC_XPATH/MAC \
$NIC_XPATH/TARGET \
$NIC_XPATH/SCRIPT \
$NIC_XPATH/MODEL \
$NIC_XPATH/IP \
$NIC_XPATH/FILTER \
$NIC_XPATH/VROUTER_IP \
$NIC_XPATH/INBOUND_AVG_BW \
$NIC_XPATH/INBOUND_PEAK_BW \
$NIC_XPATH/INBOUND_PEAK_KB \
$NIC_XPATH/OUTBOUND_AVG_BW \
$NIC_XPATH/OUTBOUND_PEAK_BW \
$NIC_XPATH/OUTBOUND_PEAK_KB \
$NIC_XPATH/ORDER)
VMID="${XPATH_ELEMENTS[j++]}"
NIC_ID="${XPATH_ELEMENTS[j++]}"
BRIDGE="${XPATH_ELEMENTS[j++]}"
VN_MAD="${XPATH_ELEMENTS[j++]}"
MAC="${XPATH_ELEMENTS[j++]}"
NIC_TARGET="${XPATH_ELEMENTS[j++]}"
SCRIPT="${XPATH_ELEMENTS[j++]}"
MODEL="${XPATH_ELEMENTS[j++]}"
IP="${XPATH_ELEMENTS[j++]}"
FILTER="${XPATH_ELEMENTS[j++]}"
VROUTER_IP="${XPATH_ELEMENTS[j++]}"
INBOUND_AVG_BW="${XPATH_ELEMENTS[j++]}"
INBOUND_PEAK_BW="${XPATH_ELEMENTS[j++]}"
INBOUND_PEAK_KB="${XPATH_ELEMENTS[j++]}"
OUTBOUND_AVG_BW="${XPATH_ELEMENTS[j++]}"
OUTBOUND_PEAK_BW="${XPATH_ELEMENTS[j++]}"
OUTBOUND_PEAK_KB="${XPATH_ELEMENTS[j++]}"
ORDER="${XPATH_ELEMENTS[j++]}"
}

View File

@ -20,31 +20,88 @@ source $(dirname $0)/kvmrc
source $(dirname $0)/../../scripts_common.sh
DOMAIN=$1
MAC=$2
BRIDGE=$3
THE_MODEL=$4
NET_DRV=$5
TARGET=$6
if [ "$THE_MODEL" != "-" ]; then
MODEL="<model type='$THE_MODEL'/>"
get_nic_information "ATTACH='YES'"
# defaults
[ -z "${MODEL}" ] && [ -n "${DEFAULT_ATTACH_NIC_MODEL}" ] && \
MODEL="${DEFAULT_ATTACH_NIC_MODEL}"
[ -z "${FILTER}" ] && [ -n "${DEFAULT_ATTACH_NIC_FILTER}" ] && \
FILTER="${DEFAULT_ATTACH_NIC_FILTER}"
# functions
function xml_esc
{
R=${1//\'/&apos;}
R=${R//\"/&quot;}
R=${R//\&/&amp;}
R=${R//\</&lt;}
R=${R//\>/&gt;}
echo "${R}"
}
# interface XML
DEVICE=''
if [ -z "${BRIDGE}" ]; then
DEVICE+="<interface type='ethernet'>"
else
DEVICE+="<interface type='bridge'>"
[ "${VN_MAD}" = 'ovswitch' ] && DEVICE+=" <virtualport type='openvswitch'/>"
DEVICE+=" <source bridge='$(xml_esc "${BRIDGE}")'/>"
fi
if [ "$NET_DRV" = "ovswitch" ]; then
VIRTUALPORT="<virtualport type='openvswitch'/>"
[ -n "${MAC}" ] && DEVICE+=" <mac address='$(xml_esc "${MAC}")'/>"
[ -n "${NIC_TARGET}" ] && DEVICE+=" <target dev='$(xml_esc "${NIC_TARGET}")'/>"
[ -n "${ORDER}" ] && DEVICE+=" <boot order='$(xml_esc "${ORDER}")'/>"
[ -n "${SCRIPT}" ] && DEVICE+=" <script path='$(xml_esc "${SCRIPT}")'/>"
[ -n "${MODEL}" ] && DEVICE+=" <model type='$(xml_esc "${MODEL}")'/>"
if [ -n "${IP}" ] && [ -n "${FILTER}" ]; then
DEVICE+=" <filterref filter='$(xml_esc "${FILTER}")'>"
DEVICE+=" <parameter name='IP' value='$(xml_esc "${IP}")'/>"
[ -n "${VROUTER_IP}" ] && DEVICE+=" <parameter name='IP' value='$(xml_esc "${VROUTER_IP}")'/>"
DEVICE+=" </filterref>"
fi
DEVICE=$(cat <<EOF
<interface type='bridge'>
<source bridge='$BRIDGE'/>
<mac address='$MAC'/>
<target dev='$TARGET'/>
$MODEL
$VIRTUALPORT
</interface>
EOF
)
if [ -n "${INBOUND_AVG_BW}${INBOUND_PEAK_BW}${INBOUND_PEAK_KB}" ] || \
[ -n "${OUTBOUND_AVG_BW}${OUTBOUND_PEAK_BW}${OUTBOUND_PEAK_KB}" ];
then
DEVICE+=" <bandwidth>"
if [ -n "${INBOUND_AVG_BW}${INBOUND_PEAK_BW}${INBOUND_PEAK_KB}" ]; then
DEVICE+=" <inbound"
[ -n "${INBOUND_AVG_BW}" ] && \
DEVICE+=" average='$(xml_esc "${INBOUND_AVG_BW}")'"
[ -n "${INBOUND_PEAK_BW}" ] && \
DEVICE+=" peak='$(xml_esc "${INBOUND_PEAK_BW}")'"
[ -n "${INBOUND_PEAK_KB}" ] && \
DEVICE+=" burst='$(xml_esc "${INBOUND_PEAK_KB}")'"
DEVICE+=" />"
fi
if [ -n "${OUTBOUND_AVG_BW}${OUTBOUND_PEAK_BW}${OUTBOUND_PEAK_KB}" ]; then
DEVICE+=" <outbound"
[ -n "${OUTBOUND_AVG_BW}" ] && \
DEVICE+=" average='$(xml_esc "${OUTBOUND_AVG_BW}")'"
[ -n "${OUTBOUND_PEAK_BW}" ] && \
DEVICE+=" peak='$(xml_esc "${OUTBOUND_PEAK_BW}")'"
[ -n "${OUTBOUND_PEAK_KB}" ] && \
DEVICE+=" burst='$(xml_esc "${OUTBOUND_PEAK_KB}")'"
DEVICE+=" />"
fi
DEVICE+=" </bandwidth>"
fi
DEVICE+=" </interface>"
# device attach
ATTACH_CMD=$(cat <<EOF
virsh --connect $LIBVIRT_URI attach-device $DOMAIN <(
cat <<EOT
@ -55,4 +112,4 @@ EOF
)
multiline_exec_and_log "$ATTACH_CMD" \
"Could not attach $SOURCE ($TARGET) to $DOMAIN"
"Could not attach NIC ${NIC_ID} ($MAC) to $DOMAIN"

View File

@ -45,3 +45,8 @@ export SHUTDOWN_TIMEOUT=300
# default value is "ignore" (or its synonym "off"), and the other valid value
# is "unmap" (or "on").
#DEFAULT_ATTACH_DISCARD=unmap
# This parameters will set the default NIC model and filter for
# the hot-attached interfaces.
#DEFAULT_ATTACH_NIC_MODEL=virtio
#DEFAULT_ATTACH_NIC_FILTER=clean-traffic