diff --git a/src/mad/sh/scripts_common.sh b/src/mad/sh/scripts_common.sh
index 1d60a017e3..2b5e6a8112 100644
--- a/src/mad/sh/scripts_common.sh
+++ b/src/mad/sh/scripts_common.sh
@@ -612,3 +612,194 @@ function get_source_xml {
echo "$SOURCE_HOST"
}
+
+# This function extracts information about a disk. The first parameter
+# is a string with the filter for disks, for example, to get the disk
+# that's going to be attached use:
+#
+# get_disk_information "ATTACH=YES"
+#
+# To get an specific disk ID use:
+#
+# get_disk_information "DISK_ID=$DISK_ID"
+#
+# The variables set are as follows:
+#
+# * VMID
+# * DRIVER
+# * TYPE
+# * READONLY
+# * CACHE
+# * DISCARD
+# * IMG_SRC
+# * DISK_ID
+# * CLONE
+# * CEPH_HOST
+# * CEPH_SECRET
+# * CEPH_USER
+# * ISCSI_HOST
+# * ISCSI_USAGE
+# * ISCSI_USER
+# * ISCSI_IQN
+# * DISK_TYPE
+# * POOL_NAME
+# * SIZE
+# * DISK_TARGET
+# * TYPE_SOURCE: libvirt xml source name. $TYPE_SOURCE=$SOURCE => file=/my/path
+# * SOURCE: disk source, can be path, ceph pool/image, device...
+# * TYPE_XML
+# * DEVICE
+# * SOURCE_ARGS: ex. protocol='rbd'
+# * SOURCE_HOST
+# * AUTH: auth xml for libvirt
+#
+# This function was originaly in attach_disk action
+
+function get_disk_information {
+ FILTER="$1"
+
+ DRIVER_PATH=$(dirname $0)
+ XPATH="${DRIVER_PATH}/../../datastore/xpath.rb"
+ CMD="$XPATH -b $DRV_ACTION"
+
+ unset i j XPATH_ELEMENTS
+
+ DISK_XPATH="/VMM_DRIVER_ACTION_DATA/VM/TEMPLATE/DISK[$FILTER]"
+
+ while IFS= read -r -d '' element; do
+ XPATH_ELEMENTS[i++]="$element"
+ done < <($CMD /VMM_DRIVER_ACTION_DATA/VM/ID \
+ $DISK_XPATH/DRIVER \
+ $DISK_XPATH/TYPE \
+ $DISK_XPATH/READONLY \
+ $DISK_XPATH/CACHE \
+ $DISK_XPATH/DISCARD \
+ $DISK_XPATH/SOURCE \
+ $DISK_XPATH/DISK_ID \
+ $DISK_XPATH/CLONE \
+ $DISK_XPATH/CEPH_HOST \
+ $DISK_XPATH/CEPH_SECRET \
+ $DISK_XPATH/CEPH_USER \
+ $DISK_XPATH/ISCSI_HOST \
+ $DISK_XPATH/ISCSI_USAGE \
+ $DISK_XPATH/ISCSI_USER \
+ $DISK_XPATH/ISCSI_IQN \
+ $DISK_XPATH/DISK_TYPE \
+ $DISK_XPATH/POOL_NAME \
+ $DISK_XPATH/SIZE \
+ $DISK_XPATH/TARGET)
+
+ VMID="${XPATH_ELEMENTS[j++]}"
+ DRIVER="${XPATH_ELEMENTS[j++]:-$DEFAULT_TYPE}"
+ TYPE="${XPATH_ELEMENTS[j++]}"
+ READONLY="${XPATH_ELEMENTS[j++]}"
+ CACHE="${XPATH_ELEMENTS[j++]}"
+ DISCARD="${XPATH_ELEMENTS[j++]}"
+ IMG_SRC="${XPATH_ELEMENTS[j++]}"
+ DISK_ID="${XPATH_ELEMENTS[j++]}"
+ CLONE="${XPATH_ELEMENTS[j++]}"
+ CEPH_HOST="${XPATH_ELEMENTS[j++]}"
+ CEPH_SECRET="${XPATH_ELEMENTS[j++]}"
+ CEPH_USER="${XPATH_ELEMENTS[j++]}"
+ ISCSI_HOST="${XPATH_ELEMENTS[j++]}"
+ ISCSI_USAGE="${XPATH_ELEMENTS[j++]}"
+ ISCSI_USER="${XPATH_ELEMENTS[j++]}"
+ ISCSI_IQN="${XPATH_ELEMENTS[j++]}"
+ DISK_TYPE="${XPATH_ELEMENTS[j++]}"
+ POOL_NAME="${XPATH_ELEMENTS[j++]}"
+ SIZE="${XPATH_ELEMENTS[j++]}"
+ DISK_TARGET="${XPATH_ELEMENTS[j++]}"
+
+ TYPE=$(echo "$TYPE"|tr A-Z a-z)
+
+ NAME="$SOURCE"
+
+ case "$TYPE" in
+ block)
+ TYPE_SOURCE="dev"
+ TYPE_XML="block"
+ DEVICE="disk"
+ ;;
+ iscsi)
+ TYPE_SOURCE="name"
+ TYPE_XML="network"
+ DEVICE="disk"
+
+ if [ -n "$ISCSI_IQN" ]; then
+ SOURCE="${ISCSI_IQN}"
+ else
+ SOURCE="${IMG_SRC}"
+ fi
+
+ SOURCE_ARGS="protocol='iscsi'"
+ SOURCE_HOST=$(get_source_xml $ISCSI_HOST)
+
+ if [ -n "$ISCSI_USAGE" -a -n "$ISCSI_USER" ]; then
+ AUTH="\
+ \
+ "
+ fi
+ ;;
+ cdrom)
+ TYPE_SOURCE="file"
+ TYPE_XML="file"
+ DEVICE="cdrom"
+ ;;
+ rbd*)
+ TYPE_SOURCE="protocol"
+ TYPE_XML="network"
+ SOURCE="rbd"
+
+ if [ "$TYPE" = "rbd_cdrom" ]; then
+ DEVICE="cdrom"
+ else
+ DEVICE="disk"
+ fi
+
+ if [ "$CLONE" = "YES" ]; then
+ SOURCE="${IMG_SRC}-${VMID}-${DISK_ID}"
+ else
+ SOURCE="${IMG_SRC}"
+ fi
+
+ SOURCE_ARGS="protocol='rbd'"
+ SOURCE_HOST=$(get_source_xml $CEPH_HOST)
+
+ if [ -n "$CEPH_USER" -a -n "$CEPH_SECRET" ]; then
+ AUTH="\
+ \
+ "
+ fi
+ ;;
+ *)
+ #NOTE: This includes TYPE=FS and TYPE=SWAP
+ case "$DISK_TYPE" in
+ RBD)
+ TYPE_SOURCE="name"
+ TYPE_XML="network"
+ DEVICE="disk"
+
+ SOURCE="${POOL_NAME}/one-sys-${VMID}-${DISK_ID}"
+
+ NAME="${RBD_SOURCE}"
+ SOURCE_ARGS="protocol='rbd'"
+
+ SOURCE_HOST=$(get_source_xml $CEPH_HOST)
+
+ if [ -n "$CEPH_USER" -a -n "$CEPH_SECRET" ]; then
+ AUTH="\
+ \
+ "
+ fi
+ ;;
+ *)
+ TYPE_SOURCE="file"
+ TYPE_XML="file"
+ DEVICE="disk"
+ ;;
+ esac
+
+ ;;
+ esac
+}
+
diff --git a/src/vmm_mad/remotes/kvm/attach_disk b/src/vmm_mad/remotes/kvm/attach_disk
index 17efdb1373..53694f0f74 100755
--- a/src/vmm_mad/remotes/kvm/attach_disk
+++ b/src/vmm_mad/remotes/kvm/attach_disk
@@ -19,8 +19,6 @@
source $(dirname $0)/kvmrc
source $(dirname $0)/../../scripts_common.sh
-DRIVER_PATH=$(dirname $0)
-
DEFAULT_TYPE="raw"
DOMAIN="$1"
@@ -31,140 +29,7 @@ DRV_ACTION="$5"
ATTACH_FILE="$SOURCE.attach"
-XPATH="${DRIVER_PATH}/../../datastore/xpath.rb -b $DRV_ACTION"
-
-unset i j XPATH_ELEMENTS
-
-DISK_XPATH="/VMM_DRIVER_ACTION_DATA/VM/TEMPLATE/DISK[ATTACH='YES']"
-
-while IFS= read -r -d '' element; do
- XPATH_ELEMENTS[i++]="$element"
-done < <($XPATH /VMM_DRIVER_ACTION_DATA/VM/ID \
- $DISK_XPATH/DRIVER \
- $DISK_XPATH/TYPE \
- $DISK_XPATH/READONLY \
- $DISK_XPATH/CACHE \
- $DISK_XPATH/DISCARD \
- $DISK_XPATH/SOURCE \
- $DISK_XPATH/DISK_ID \
- $DISK_XPATH/CLONE \
- $DISK_XPATH/CEPH_HOST \
- $DISK_XPATH/CEPH_SECRET \
- $DISK_XPATH/CEPH_USER \
- $DISK_XPATH/ISCSI_HOST \
- $DISK_XPATH/ISCSI_USAGE \
- $DISK_XPATH/ISCSI_USER \
- $DISK_XPATH/ISCSI_IQN \
- $DISK_XPATH/DISK_TYPE \
- $DISK_XPATH/POOL_NAME)
-
-VMID="${XPATH_ELEMENTS[j++]}"
-DRIVER="${XPATH_ELEMENTS[j++]:-$DEFAULT_TYPE}"
-TYPE="${XPATH_ELEMENTS[j++]}"
-READONLY="${XPATH_ELEMENTS[j++]}"
-CACHE="${XPATH_ELEMENTS[j++]}"
-DISCARD="${XPATH_ELEMENTS[j++]}"
-IMG_SRC="${XPATH_ELEMENTS[j++]}"
-DISK_ID="${XPATH_ELEMENTS[j++]}"
-CLONE="${XPATH_ELEMENTS[j++]}"
-CEPH_HOST="${XPATH_ELEMENTS[j++]}"
-CEPH_SECRET="${XPATH_ELEMENTS[j++]}"
-CEPH_USER="${XPATH_ELEMENTS[j++]}"
-ISCSI_HOST="${XPATH_ELEMENTS[j++]}"
-ISCSI_USAGE="${XPATH_ELEMENTS[j++]}"
-ISCSI_USER="${XPATH_ELEMENTS[j++]}"
-ISCSI_IQN="${XPATH_ELEMENTS[j++]}"
-DISK_TYPE="${XPATH_ELEMENTS[j++]}"
-POOL_NAME="${XPATH_ELEMENTS[j++]}"
-
-TYPE=$(echo "$TYPE"|tr A-Z a-z)
-
-case "$TYPE" in
-block)
- TYPE_SOURCE="dev"
- TYPE_XML="block"
- DEVICE="disk"
- ;;
-iscsi)
- TYPE_SOURCE="protocol"
- TYPE_XML="network"
- SOURCE="iscsi"
- DEVICE="disk"
-
- if [ -n "$ISCSI_IQN" ]; then
- SOURCE_ARGS="name='${ISCSI_IQN}'"
- else
- SOURCE_ARGS="name='${IMG_SRC}'"
- fi
-
- SOURCE_HOST=$(get_source_xml $ISCSI_HOST)
-
- if [ -n "$ISCSI_USAGE" -a -n "$ISCSI_USER" ]; then
- AUTH="\
- \
- "
- fi
- ;;
-cdrom)
- TYPE_SOURCE="file"
- TYPE_XML="file"
- DEVICE="cdrom"
- ;;
-rbd*)
- TYPE_SOURCE="protocol"
- TYPE_XML="network"
- SOURCE="rbd"
-
- if [ "$TYPE" = "rbd_cdrom" ]; then
- DEVICE="cdrom"
- else
- DEVICE="disk"
- fi
-
- if [ "$CLONE" = "YES" ]; then
- SOURCE_ARGS="name='${IMG_SRC}-${VMID}-${DISK_ID}'"
- else
- SOURCE_ARGS="name='${IMG_SRC}'"
- fi
-
- SOURCE_HOST=$(get_source_xml $CEPH_HOST)
-
- if [ -n "$CEPH_USER" -a -n "$CEPH_SECRET" ]; then
- AUTH="\
- \
- "
- fi
- ;;
-*)
- #NOTE: This includes TYPE=FS and TYPE=SWAP
- case "$DISK_TYPE" in
- RBD)
- TYPE_SOURCE="protocol"
- TYPE_XML="network"
- SOURCE="rbd"
- DEVICE="disk"
-
- RBD_SOURCE="${POOL_NAME}/one-sys-${VMID}-${DISK_ID}"
-
- SOURCE_ARGS="name='${RBD_SOURCE}'"
-
- SOURCE_HOST=$(get_source_xml $CEPH_HOST)
-
- if [ -n "$CEPH_USER" -a -n "$CEPH_SECRET" ]; then
- AUTH="\
- \
- "
- fi
- ;;
- *)
- TYPE_SOURCE="file"
- TYPE_XML="file"
- DEVICE="disk"
- ;;
- esac
-
- ;;
-esac
+get_disk_information "ATTACH='YES'"
[ -z "$CACHE" ] && [ -n "$DEFAULT_ATTACH_CACHE" ] && \
CACHE="$DEFAULT_ATTACH_CACHE"