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//\<}
+ 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+=" "
+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