From 94689fae98274aae4222acc86ceae91d1ffbf025 Mon Sep 17 00:00:00 2001
From: "Ruben S. Montero" <rsmontero@opennebula.org>
Date: Sat, 10 Nov 2012 00:36:15 +0100
Subject: [PATCH] bug #1649: Add option LIMIT_TRANSFER_BW to datastores, to
 limit the transfer rate when downloading http/https images.

---
 src/datastore_mad/remotes/downloader.sh | 15 +++++++++++++--
 src/datastore_mad/remotes/fs/cp         |  6 ++++--
 src/datastore_mad/remotes/iscsi/cp      |  6 ++++--
 src/datastore_mad/remotes/libfs.sh      | 11 ++++++++---
 src/datastore_mad/remotes/lvm/cp        |  6 ++++--
 src/datastore_mad/remotes/vmfs/cp       |  6 ++++--
 src/datastore_mad/remotes/vmware/cp     |  6 ++++--
 7 files changed, 41 insertions(+), 15 deletions(-)

diff --git a/src/datastore_mad/remotes/downloader.sh b/src/datastore_mad/remotes/downloader.sh
index 237e632b9b..bca92689b4 100755
--- a/src/datastore_mad/remotes/downloader.sh
+++ b/src/datastore_mad/remotes/downloader.sh
@@ -117,7 +117,7 @@ function unarchive
     fi
 }
 
-TEMP=`getopt -o m:s:n -l md5:,sha1:,nodecomp -- "$@"`
+TEMP=`getopt -o m:s:l:n -l md5:,sha1:,limit:,nodecomp -- "$@"`
 
 if [ $? != 0 ] ; then
     echo "Arguments error"
@@ -142,6 +142,10 @@ while true; do
             export NO_DECOMPRESS="yes"
             shift
             ;;
+        -l|--limit)
+            export LIMIT_RATE="$2"
+            shift 2
+            ;;
         --)
             shift
             break
@@ -163,7 +167,14 @@ http://*|https://*)
     # -k  so it does not check the certificate
     # -L  to follow redirects
     # -sS to hide output except on failure
-    command="curl -sS -k -L $FROM"
+    # --limit_rate to limit the bw
+    curl_args="-sS -k -L $FROM"
+
+    if [ -n "$LIMIT_RATE" ]; then
+        curl_args="--limit-rate $LIMIT_RATE $curl_args"
+    fi
+
+    command="curl $curl_args"
     ;;
 *)
     command="cat $FROM"
diff --git a/src/datastore_mad/remotes/fs/cp b/src/datastore_mad/remotes/fs/cp
index 840ac28fd8..61a2f6bf5e 100755
--- a/src/datastore_mad/remotes/fs/cp
+++ b/src/datastore_mad/remotes/fs/cp
@@ -54,7 +54,8 @@ done < <($XPATH     /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
                     /DS_DRIVER_ACTION_DATA/IMAGE/PATH \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/MD5 \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/SHA1 \
-                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS)
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS \
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/LIMIT_TRANSFER_BW)
 
 BASE_PATH="${XPATH_ELEMENTS[0]}"
 RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}"
@@ -64,6 +65,7 @@ SRC="${XPATH_ELEMENTS[4]}"
 MD5="${XPATH_ELEMENTS[5]}"
 SHA1="${XPATH_ELEMENTS[6]}"
 NO_DECOMPRESS="${XPATH_ELEMENTS[7]}"
+LIMIT_TRANSFER_BW="${XPATH_ELEMENTS[8]}"
 
 mkdir -p "$BASE_PATH"
 
@@ -71,7 +73,7 @@ set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK"
 
 DST=`generate_image_path`
 
-DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$SRC" "$DST"`
+DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$LIMIT_TRANSFER_BW" "$SRC" "$DST"`
 
 COPY_COMMAND="$UTILS_PATH/downloader.sh $DOWNLOADER_ARGS"
 
diff --git a/src/datastore_mad/remotes/iscsi/cp b/src/datastore_mad/remotes/iscsi/cp
index c99b970c16..ed5b02bbd6 100755
--- a/src/datastore_mad/remotes/iscsi/cp
+++ b/src/datastore_mad/remotes/iscsi/cp
@@ -59,7 +59,8 @@ done < <($XPATH     /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
                     /DS_DRIVER_ACTION_DATA/IMAGE/SIZE \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/MD5 \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/SHA1 \
-                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS)
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS \
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/LIMIT_TRANSFER_BW)
 
 BASE_PATH="${XPATH_ELEMENTS[0]}"
 RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}"
@@ -73,6 +74,7 @@ SIZE="${XPATH_ELEMENTS[8]}"
 MD5="${XPATH_ELEMENTS[9]}"
 SHA1="${XPATH_ELEMENTS[10]}"
 NO_DECOMPRESS="${XPATH_ELEMENTS[11]}"
+LIMIT_TRANSFER_BW="${XPATH_ELEMENTS[12]}"
 
 set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK"
 
@@ -95,7 +97,7 @@ REGISTER_CMD=$(cat <<EOF
 EOF
 )
 
-DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$SRC" -`
+DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$LIMIT_TRANSFER_BW" "$SRC" -`
 
 COPY_COMMAND="$UTILS_PATH/downloader.sh $DOWNLOADER_ARGS"
 
diff --git a/src/datastore_mad/remotes/libfs.sh b/src/datastore_mad/remotes/libfs.sh
index 340d808d50..1cacf89dce 100644
--- a/src/datastore_mad/remotes/libfs.sh
+++ b/src/datastore_mad/remotes/libfs.sh
@@ -88,8 +88,9 @@ EOF
 #   @param $1 - MD5 string
 #   @param $2 - SHA1 string
 #   @param $3 - NO_DECOMPRESS
-#   @param $4 - SRC
-#   @param $5 - DST
+#   @param $4 - BW LIMIT
+#   @param $5 - SRC
+#   @param $6 - DST
 #   @return downloader.sh util arguments
 #-------------------------------------------------------------------------------
 function set_downloader_args {
@@ -107,7 +108,11 @@ function set_downloader_args {
 	    HASHES="$HASHES --nodecomp"
 	fi
 
-	echo "$HASHES $4 $5"
+	if [ -n "$4" ]; then
+		HASHES="$HASHES --limit $4"
+	fi
+
+	echo "$HASHES $5 $6"
 }
 
 #-------------------------------------------------------------------------------
diff --git a/src/datastore_mad/remotes/lvm/cp b/src/datastore_mad/remotes/lvm/cp
index 2865f68c39..28d2a533e7 100755
--- a/src/datastore_mad/remotes/lvm/cp
+++ b/src/datastore_mad/remotes/lvm/cp
@@ -58,7 +58,8 @@ done < <($XPATH     /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
                     /DS_DRIVER_ACTION_DATA/IMAGE/SIZE \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/MD5 \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/SHA1 \
-                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS)
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS \
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/LIMIT_TRANSFER_BW)
 
 BASE_PATH="${XPATH_ELEMENTS[0]}"
 RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}"
@@ -71,6 +72,7 @@ SIZE="${XPATH_ELEMENTS[7]}"
 MD5="${XPATH_ELEMENTS[8]}"
 SHA1="${XPATH_ELEMENTS[9]}"
 NO_DECOMPRESS="${XPATH_ELEMENTS[10]}"
+LIMIT_TRANSFER_BW="${XPATH_ELEMENTS[11]}"
 
 set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK"
 
@@ -84,7 +86,7 @@ REGISTER_CMD=$(cat <<EOF
 EOF
 )
 
-DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$SRC" -`
+DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$LIMIT_TRANSFER_BW" "$SRC" -`
 
 COPY_COMMAND="$UTILS_PATH/downloader.sh $DOWNLOADER_ARGS"
 
diff --git a/src/datastore_mad/remotes/vmfs/cp b/src/datastore_mad/remotes/vmfs/cp
index 0d28add4dc..90a8a254be 100755
--- a/src/datastore_mad/remotes/vmfs/cp
+++ b/src/datastore_mad/remotes/vmfs/cp
@@ -62,7 +62,8 @@ done < <($XPATH     /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/MD5 \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/SHA1 \
                     /DS_DRIVER_ACTION_DATA/IMAGE/ID \
-                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS)
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS \
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/LIMIT_TRANSFER_BW)
 
 BASE_PATH="${XPATH_ELEMENTS[0]}"
 DS_ID="${XPATH_ELEMENTS[1]}"
@@ -77,6 +78,7 @@ MD5="${XPATH_ELEMENTS[9]}"
 SHA1="${XPATH_ELEMENTS[10]}"
 IMAGE_ID="${XPATH_ELEMENTS[11]}"
 NO_DECOMPRESS="${XPATH_ELEMENTS[12]}"
+LIMIT_TRANSFER_BW="${XPATH_ELEMENTS[13]}"
 
 FE_DST=`generate_image_path`
 DST_FOLDER=`basename $FE_DST`
@@ -98,7 +100,7 @@ if [ ! -d $TMP_DIR ]; then
     mkdir -p $TMP_DIR
 fi
 
-DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$SRC" "$TMP_DIR/$DST_FOLDER"`
+DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$LIMIT_TRANSFER_BW" "$SRC" "$TMP_DIR/$DST_FOLDER"`
 
 COPY_COMMAND="$UTILS_PATH/downloader.sh $DOWNLOADER_ARGS"
 
diff --git a/src/datastore_mad/remotes/vmware/cp b/src/datastore_mad/remotes/vmware/cp
index f3294c3063..7f22712a75 100755
--- a/src/datastore_mad/remotes/vmware/cp
+++ b/src/datastore_mad/remotes/vmware/cp
@@ -54,7 +54,8 @@ done < <($XPATH     /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
                     /DS_DRIVER_ACTION_DATA/IMAGE/PATH \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/MD5 \
                     /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/SHA1 \
-                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS)
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS \
+                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/LIMIT_TRANSFER_BW)
 
 BASE_PATH="${XPATH_ELEMENTS[0]}"
 RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}"
@@ -64,13 +65,14 @@ SRC="${XPATH_ELEMENTS[4]}"
 MD5="${XPATH_ELEMENTS[5]}"
 SHA1="${XPATH_ELEMENTS[6]}"
 NO_DECOMPRESS="${XPATH_ELEMENTS[7]}"
+LIMIT_TRANSFER_BW="${XPATH_ELEMENTS[8]}"
 
 mkdir -p "$BASE_PATH"
 set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK"
 
 DST=`generate_image_path`
 
-DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$SRC" "$DST"`
+DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$LIMIT_TRANSFER_BW" "$SRC" "$DST"`
 
 COPY_COMMAND="$UTILS_PATH/downloader.sh $DOWNLOADER_ARGS"