diff --git a/src/mad/sh/scripts_common.sh b/src/mad/sh/scripts_common.sh index 7333493b72..a09e8ca160 100644 --- a/src/mad/sh/scripts_common.sh +++ b/src/mad/sh/scripts_common.sh @@ -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//\/>} + + 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" diff --git a/src/vmm_mad/remotes/kvm/attach_disk b/src/vmm_mad/remotes/kvm/attach_disk index 37c3e2a554..2aacea9e8e 100755 --- a/src/vmm_mad/remotes/kvm/attach_disk +++ b/src/vmm_mad/remotes/kvm/attach_disk @@ -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="" -else - READONLY="" +XML+="" + +XML+=" " +XML+=" ${SOURCE_HOST}" +XML+=" " + +[ -n "${AUTH}" ] && XML+=" ${AUTH}" + +XML+=" " +[ -n "${ORDER}" ] && XML+=" " +[ "${READONLY}" = 'yes' ] && XML+=" " + +if [ -n "${TOTAL_BYTES_SEC}${READ_BYTES_SEC}${WRITE_BYTES_SEC}" ] || \ + [ -n "${TOTAL_IOPS_SEC}${READ_IOPS_SEC}${WRITE_IOPS_SEC}" ]; +then + XML+=" " + + [ -n "${TOTAL_BYTES_SEC}" ] && \ + XML+=" $(xml_esc "${TOTAL_BYTES_SEC}")" + [ -n "${READ_BYTES_SEC}" ] && \ + XML+=" $(xml_esc "${READ_BYTES_SEC}")" + [ -n "${WRITE_BYTES_SEC}" ] && \ + XML+=" $(xml_esc "${WRITE_BYTES_SEC}")" + + [ -n "${TOTAL_IOPS_SEC}" ] && \ + XML+=" $(xml_esc "${TOTAL_IOPS_SEC}")" + [ -n "${READ_IOPS_SEC}" ] && \ + XML+=" $(xml_esc "${READ_IOPS_SEC}")" + [ -n "${WRITE_IOPS_SEC}" ] && \ + XML+=" $(xml_esc "${WRITE_IOPS_SEC}")" + + XML+=" " fi -cat < $ATTACH_FILE - - - - $SOURCE_HOST - - $AUTH - - $READONLY - +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+="
" + fi +fi + +XML+=" " + +# device attach +ATTACH_CMD=$(cat </>} - echo "${R}" -} +MODEL=${MODEL:-${DEFAULT_ATTACH_NIC_MODEL}} +FILTER=${FILTER:-${DEFAULT_ATTACH_NIC_FILTER}} # interface XML DEVICE='' diff --git a/src/vmm_mad/remotes/kvm/kvmrc b/src/vmm_mad/remotes/kvm/kvmrc index 17e80c295f..082a18a227 100644 --- a/src/vmm_mad/remotes/kvm/kvmrc +++ b/src/vmm_mad/remotes/kvm/kvmrc @@ -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