mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-21 14:50:08 +03:00
* 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:
parent
a414e4d536
commit
75dcfd601f
@ -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++]}"
|
||||
}
|
||||
|
@ -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//\'/'}
|
||||
R=${R//\"/"}
|
||||
R=${R//\&/&}
|
||||
R=${R//\</<}
|
||||
R=${R//\>/>}
|
||||
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"
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user