xenapi: /boot/guest should point to local SR

Fixes bug 1037516

This patch creates a directory os-guest-kernels inside the local SR, and
sets up /boot/guest to be a symlink to that directory. This way
OpenStack won't pollute Dom0's filesystem.

Change-Id: If8dfe24355bd782a401fed0f2c4b423efd9c11ba
diff --git a/tools/xen/test_functions.sh b/tools/xen/test_functions.sh
index 6817ec3..62393ca 100755
--- a/tools/xen/test_functions.sh
+++ b/tools/xen/test_functions.sh
@@ -23,15 +23,27 @@
 
     LIST_OF_ACTIONS=$(mktemp)
     truncate -s 0 $LIST_OF_ACTIONS
+
+    XE_RESPONSE=$(mktemp)
+    truncate -s 0 $XE_RESPONSE
+
+    XE_CALLS=$(mktemp)
+    truncate -s 0 $XE_CALLS
 }
 
 # Teardown
 function after_each_test {
     rm -f $LIST_OF_DIRECTORIES
     rm -f $LIST_OF_ACTIONS
+    rm -f $XE_RESPONSE
+    rm -f $XE_CALLS
 }
 
 # Helpers
+function setup_xe_response {
+    echo "$1" > $XE_RESPONSE
+}
+
 function given_directory_exists {
     echo "$1" >> $LIST_OF_DIRECTORIES
 }
@@ -44,6 +56,30 @@
     [ "$?" != "0" ] || exit 1
 }
 
+function assert_xe_min {
+    grep -qe "^--minimal\$" $XE_CALLS
+}
+
+function assert_xe_param {
+    grep -qe "^$1\$" $XE_CALLS
+}
+
+function mock_out {
+    local FNNAME="$1"
+    local OUTPUT="$2"
+
+    . <(cat << EOF
+function $FNNAME {
+    echo "$OUTPUT"
+}
+EOF
+)
+}
+
+function assert_symlink {
+    grep -qe "^ln -s $2 $1\$" $LIST_OF_ACTIONS
+}
+
 # Tests
 function test_plugin_directory_on_xenserver {
     given_directory_exists "/etc/xapi.d/plugins/"
@@ -80,9 +116,26 @@
 }
 
 function test_create_directory_for_kernels {
-    (. mocks && create_directory_for_kernels)
+    (
+        . mocks
+        mock_out get_local_sr uuid1
+        create_directory_for_kernels
+    )
 
-    assert_directory_exists "/boot/guest"
+    assert_directory_exists "/var/run/sr-mount/uuid1/os-guest-kernels"
+    assert_symlink "/boot/guest" "/var/run/sr-mount/uuid1/os-guest-kernels"
+}
+
+function test_create_directory_for_kernels_existing_dir {
+    (
+        . mocks
+        given_directory_exists "/boot/guest"
+        create_directory_for_kernels
+    )
+
+    diff -u $LIST_OF_ACTIONS - << EOF
+[ -d /boot/guest ]
+EOF
 }
 
 function test_extract_remote_zipball {
@@ -107,6 +160,23 @@
     rm -rf $tmpdir
 }
 
+function test_get_local_sr {
+    setup_xe_response "uuid123"
+
+    local RESULT=$(. mocks && get_local_sr)
+
+    [ "$RESULT" == "uuid123" ]
+
+    assert_xe_min
+    assert_xe_param "sr-list" "name-label=Local storage"
+}
+
+function test_get_local_sr_path {
+    local RESULT=$(mock_out get_local_sr "uuid1" && get_local_sr_path)
+
+    [ "/var/run/sr-mount/uuid1" == "$RESULT" ]
+}
+
 # Test runner
 [ "$1" = "" ] && {
     grep -e "^function *test_" $0 | cut -d" " -f2