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

F #1769: Set missing DISK hot-attach attributes

This commit is contained in:
Vlastimil Holer 2018-02-26 12:24:24 +01:00 committed by Ruben S. Montero
parent c0d0819172
commit bd3cac1781
4 changed files with 122 additions and 43 deletions

View File

@ -476,6 +476,18 @@ EOF`
fi
}
# Escape characters which could be interpreted as XML markup
function xml_esc
{
R=${1//\'/'}
R=${R//\"/"}
R=${R//\&/&}
R=${R//\</&lt;}
R=${R//\>/&gt;}
echo "${R}"
}
# TODO -> Use a dynamically loaded scripts directory. Not removing this due
#  to iSCSI addon: https://github.com/OpenNebula/addon-iscsi
@ -675,6 +687,14 @@ function get_source_xml {
# * POOL_NAME
# * SIZE
# * DISK_TARGET
# * DISK_IO
# * ORDER
# * TOTAL_BYTES_SEC
# * READ_BYTES_SEC
# * WRITE_BYTES_SEC
# * TOTAL_IOPS_SEC
# * READ_IOPS_SEC
# * WRITE_IOPS_SEC
# * TYPE_SOURCE: libvirt xml source name. $TYPE_SOURCE=$SOURCE => file=/my/path
# * SOURCE: disk source, can be path, ceph pool/image, device...
# * TYPE_XML
@ -717,7 +737,15 @@ function get_disk_information {
$DISK_XPATH/DISK_TYPE \
$DISK_XPATH/POOL_NAME \
$DISK_XPATH/SIZE \
$DISK_XPATH/TARGET)
$DISK_XPATH/TARGET \
$DISK_XPATH/IO \
$DISK_XPATH/ORDER \
$DISK_XPATH/TOTAL_BYTES_SEC \
$DISK_XPATH/READ_BYTES_SEC \
$DISK_XPATH/WRITE_BYTES_SEC \
$DISK_XPATH/TOTAL_IOPS_SEC \
$DISK_XPATH/READ_IOPS_SEC \
$DISK_XPATH/WRITE_IOPS_SEC)
VMID="${XPATH_ELEMENTS[j++]}"
DRIVER="${XPATH_ELEMENTS[j++]:-$DEFAULT_TYPE}"
@ -739,8 +767,17 @@ function get_disk_information {
POOL_NAME="${XPATH_ELEMENTS[j++]}"
SIZE="${XPATH_ELEMENTS[j++]}"
DISK_TARGET="${XPATH_ELEMENTS[j++]}"
DISK_IO="${XPATH_ELEMENTS[j++]}"
ORDER="${XPATH_ELEMENTS[j++]}"
TOTAL_BYTES_SEC="${XPATH_ELEMENTS[j++]}"
READ_BYTES_SEC="${XPATH_ELEMENTS[j++]}"
WRITE_BYTES_SEC="${XPATH_ELEMENTS[j++]}"
TOTAL_IOPS_SEC="${XPATH_ELEMENTS[j++]}"
READ_IOPS_SEC="${XPATH_ELEMENTS[j++]}"
WRITE_IOPS_SEC="${XPATH_ELEMENTS[j++]}"
TYPE=$(echo "$TYPE"|tr A-Z a-z)
READONLY=$(echo "$READONLY"|tr A-Z a-z)
NAME="$SOURCE"

View File

@ -27,37 +27,81 @@ TARGET="$3"
TARGET_INDEX="$4"
DRV_ACTION="$5"
ATTACH_FILE="$SOURCE.attach"
get_disk_information "ATTACH='YES'"
[ -z "$CACHE" ] && [ -n "$DEFAULT_ATTACH_CACHE" ] && \
CACHE="$DEFAULT_ATTACH_CACHE"
[ -n "$CACHE" ] && CACHE="cache='$CACHE'"
# defaults
CACHE=${CACHE:-${DEFAULT_ATTACH_CACHE}}
CACHE=${CACHE:-default} # https://github.com/OpenNebula/one/blob/c0d081917224f1d467582b8d8ac052a48040ec00/src/vmm/LibVirtDriverKVM.cc#L459
DISCARD=${DISCARD:-${DEFAULT_ATTACH_DISCARD}}
DISK_IO=${DISK_IO:-${DEFAULT_ATTACH_IO}}
TOTAL_BYTES_SEC=${TOTAL_BYTES_SEC:-${DEFAULT_ATTACH_TOTAL_BYTES_SEC}}
READ_BYTES_SEC=${READ_BYTES_SEC:-${DEFAULT_ATTACH_READ_BYTES_SEC}}
WRITE_BYTES_SEC=${WRITE_BYTES_SEC:-${DEFAULT_ATTACH_WRITE_BYTES_SEC}}
TOTAL_IOPS_SEC=${TOTAL_IOPS_SEC:-${DEFAULT_ATTACH_TOTAL_IOPS_SEC}}
READ_IOPS_SEC=${READ_IOPS_SEC:-${DEFAULT_ATTACH_READ_IOPS_SEC}}
WRITE_IOPS_SEC=${WRITE_IOPS_SEC:-${DEFAULT_ATTACH_WRITE_IOPS_SEC}}
[ -z "$DISCARD" ] && [ -n "$DEFAULT_ATTACH_DISCARD" ] && \
DISCARD="$DEFAULT_ATTACH_DISCARD"
[ -n "$DISCARD" ] && DISCARD="discard='$DISCARD'"
# disk XML
XML=''
if [ "$READONLY" = "YES" ]; then
READONLY="<readonly/>"
else
READONLY=""
XML+="<disk type='$(xml_esc "${TYPE_XML}")' device='$(xml_esc "${DEVICE}")'>"
XML+=" <driver name='qemu' type='$(xml_esc "${DRIVER}")'"
[ -n "${CACHE}" ] && XML+=" cache='$(xml_esc "${CACHE}")'"
[ -n "${DISK_IO}" ] && XML+=" io='$(xml_esc "${DISK_IO}")'"
[ -n "${DISCARD}" ] && XML+=" discard='$(xml_esc "${DISCARD}")'"
XML+=" />"
XML+=" <source ${TYPE_SOURCE}='$(xml_esc "${SOURCE}")' ${SOURCE_ARGS}>"
XML+=" ${SOURCE_HOST}"
XML+=" </source>"
[ -n "${AUTH}" ] && XML+=" ${AUTH}"
XML+=" <target dev='$(xml_esc "${TARGET}")'/>"
[ -n "${ORDER}" ] && XML+=" <boot order='$(xml_esc "${ORDER}")'/>"
[ "${READONLY}" = 'yes' ] && XML+=" <readonly/>"
if [ -n "${TOTAL_BYTES_SEC}${READ_BYTES_SEC}${WRITE_BYTES_SEC}" ] || \
[ -n "${TOTAL_IOPS_SEC}${READ_IOPS_SEC}${WRITE_IOPS_SEC}" ];
then
XML+=" <iotune>"
[ -n "${TOTAL_BYTES_SEC}" ] && \
XML+=" <total_bytes_sec>$(xml_esc "${TOTAL_BYTES_SEC}")</total_bytes_sec>"
[ -n "${READ_BYTES_SEC}" ] && \
XML+=" <read_bytes_sec>$(xml_esc "${READ_BYTES_SEC}")</read_bytes_sec>"
[ -n "${WRITE_BYTES_SEC}" ] && \
XML+=" <write_bytes_sec>$(xml_esc "${WRITE_BYTES_SEC}")</write_bytes_sec>"
[ -n "${TOTAL_IOPS_SEC}" ] && \
XML+=" <total_iops_sec>$(xml_esc "${TOTAL_IOPS_SEC}")</total_iops_sec>"
[ -n "${READ_IOPS_SEC}" ] && \
XML+=" <read_iops_sec>$(xml_esc "${READ_IOPS_SEC}")</read_iops_sec>"
[ -n "${WRITE_IOPS_SEC}" ] && \
XML+=" <write_iops_sec>$(xml_esc "${WRITE_IOPS_SEC}")</write_iops_sec>"
XML+=" </iotune>"
fi
cat <<EOF > $ATTACH_FILE
<disk type='$TYPE_XML' device='$DEVICE'>
<driver name='qemu' type='$DRIVER' $CACHE $DISCARD/>
<source $TYPE_SOURCE='$SOURCE' $SOURCE_ARGS>
$SOURCE_HOST
</source>
$AUTH
<target dev='$TARGET'/>
$READONLY
</disk>
if [ -z "${DISK_TARGET##sd*}" ]; then
CTRL_TARGET=$(( $(LC_CTYPE=C printf '%d' "'${DISK_TARGET##sd}") - 97 ))
if [ ${CTRL_TARGET} -ge 0 ] && [ ${CTRL_TARGET} -lt 256 ]; then
XML+=" <address type='drive' controller='0' bus='0' target='${CTRL_TARGET}' unit='0'/>"
fi
fi
XML+=" </disk>"
# device attach
ATTACH_CMD=$(cat <<EOF
virsh --connect $LIBVIRT_URI attach-device $DOMAIN <(
cat <<EOT
${XML}
EOT
)
EOF
)
exec_and_log "virsh --connect $LIBVIRT_URI attach-device $DOMAIN $ATTACH_FILE" \
"Could not attach $SOURCE ($TARGET) to $DOMAIN"
rm -f "$ATTACH_FILE"
multiline_exec_and_log "${ATTACH_CMD}" \
"Could not attach ${SOURCE} (${TARGET}) to ${DOMAIN}"

View File

@ -24,22 +24,8 @@ DOMAIN=$1
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}"
}
MODEL=${MODEL:-${DEFAULT_ATTACH_NIC_MODEL}}
FILTER=${FILTER:-${DEFAULT_ATTACH_NIC_FILTER}}
# interface XML
DEVICE=''

View File

@ -46,6 +46,18 @@ export SHUTDOWN_TIMEOUT=300
# is "unmap" (or "on").
#DEFAULT_ATTACH_DISCARD=unmap
# The default DISK I/O policy for new attached disks.
#DEFAULT_ATTACH_IO=
# These parameters set the default DISK I/O throttling attributes
# for the new attached disk in case they aren't set.
#DEFAULT_ATTACH_TOTAL_BYTES_SEC=
#DEFAULT_ATTACH_READ_BYTES_SEC=
#DEFAULT_ATTACH_WRITE_BYTES_SEC=
#DEFAULT_ATTACH_TOTAL_IOPS_SEC=
#DEFAULT_ATTACH_READ_IOPS_SEC=
#DEFAULT_ATTACH_WRITE_IOPS_SEC=
# This parameters will set the default NIC model and filter for
# the hot-attached interfaces.
#DEFAULT_ATTACH_NIC_MODEL=virtio