From 3a75594da3ec793b47074ef143a97ecfe3836480 Mon Sep 17 00:00:00 2001
From: xiaodongwang <xiaodongwang@huawei.com>
Date: Tue, 26 Aug 2014 15:15:54 -0700
Subject: [PATCH] add support to sort disk by path

Change-Id: I9d5bab1f16364e6cb53cf3cb74a3b24c70705d75
---
 .../snippets/kickstart_pre_partition_disks    | 81 ++++++++++++++++---
 1 file changed, 68 insertions(+), 13 deletions(-)

diff --git a/cobbler/snippets/kickstart_pre_partition_disks b/cobbler/snippets/kickstart_pre_partition_disks
index dd4fdd1..e857bc5 100644
--- a/cobbler/snippets/kickstart_pre_partition_disks
+++ b/cobbler/snippets/kickstart_pre_partition_disks
@@ -7,31 +7,86 @@
 #set $vgname = $hostname.split('.')[0]
 #end if
 
+declare -A disk_mapping
+set \$(ls -l /dev/disk/by-path | awk '{print \$9; print \$11}')
+let disk_mapping_nums=\$#/2
+let disk_mapping_offset=0
+echo "disk_mapping_nums: \$disk_mapping_nums" > /tmp/log
+echo "disk_mapping_offset: \$disk_mapping_offset" >> /tmp/log
+echo "disk_mapping: $*" >> /tmp/log
+while [ \$disk_mapping_offset -lt \$disk_mapping_nums ];
+do
+    let found_disk_type=0
+#if $getVar('disk_type_only','') != ""
+    if expr match "\$1" ".*-${disk_type_only}-.*"; then
+        let found_disk_type=1
+    fi
+#else
+    let found_disk_type=1
+#end if
+    if [ \$found_disk_type -gt 0 ]; then
+        disk_name=\$(basename \$2)
+        disk_mapping[\$disk_name]=\$1
+    fi
+    let disk_mapping_offset=\$disk_mapping_offset+1 
+    shift 2
+done
+for key in \${!disk_mapping[@]}; do
+    echo "\$key => \${disk_mapping[\$key]}" >> /tmp/log
+done
+
+declare -A disks
 set \$(list-harddrives)
 let disk_nums=\$#/2
 let disk_offset=0
 let found_disk_offset=0
 while [ \$disk_offset -lt \$disk_nums ];
 do
-#if $getVar('partitions_only','') != ""
 let found_disk=0
+if [[ x"\${disk_mapping[\$1]}" == x"" ]]; then
+    echo "ignore disk \$1 since it is not in disk_mapping" >> /tmp/log
+else
+#if $getVar('partitions_only','') != ""
     #for $partition_only in $partitions_only.split(',')
-if expr match "\$1" "$partition_only"; then
-    disks[found_disk_offset]=\$1
-    let found_disk=1
-fi
+    if expr match "\$1" "$partition_only"; then
+        disks[\$found_disk_offset]=\$1
+        let found_disk=1
+    else
+        echo "disk \$1 does not match $partition_only" >> /tmp/log
+    fi
     #end for
+#else
+    let found_disk=1
+#end if
+fi
 if [ \$found_disk -gt 0 ]; then
+    echo "add disk \$1 in partitioning list" >> /tmp/log
+    disks[\$found_disk_offset]=/dev/disk/by-path/\${disk_mapping[\$1]}
     let found_disk_offset=\$found_disk_offset+1
 fi
-#else
-    disks[found_disk_offset]=\$1
-    let found_disk_offset=\$found_disk_offset+1
-#end if
 let disk_offset=\$disk_offset+1
 shift 2
 done
-let disk_nums=\$found_disk_offset
+echo "disks \${disks[@]}" >> /tmp/log
+#if $getVar('sort_disks', '') != "" 
+sorted_disks=(\$(printf '%s\n' \${disks[@]} | sort))
+#else
+sorted_disks=(\${disks[@]})
+#end if
+echo "sorted disks \${sorted_disks[@]}" >> /tmp/log
+
+#if $getVar('start_from_disk', '') != ""
+set \${sorted_disks[@]}
+sorted_disks=(\${@:$start_from_disk})
+echo "sorted disks begin from the $start_from_disk: \${sorted_disks[@]}" >> /tmp/log
+#end if
+
+#if $getVar('disk_num', '') != ""
+set \${sorted_disks[@]}
+sorted_disks=(\${@:1:$disk_num})
+echo "sorted disks for $disk_num disks: \${sorted_disks[@]}" >> /tmp/log
+#end if
+let disk_nums=\${#sorted_disks[@]}
 
 echo "clearpart --all --initlabel" > /tmp/part-include
 
@@ -41,8 +96,8 @@ echo "ignoredisk --only-use=$partitions_only" >> /tmp/part-include
     #end if
 #end if
 
-echo "part /boot --fstype ext3 --size=100 --ondisk=\${disks[0]}  --asprimary" >> /tmp/part-include
-echo "part swap --recommended --maxsize=128000 --ondisk=\${disks[0]}" >> /tmp/part-include
+echo "part /boot --fstype ext3 --size=500 --ondisk=\${sorted_disks[0]}  --asprimary" >> /tmp/part-include
+echo "part swap --recommended --maxsize=128000 --ondisk=\${sorted_disks[0]}" >> /tmp/part-include
 
 vggroup=''
 let disk_offset=0
@@ -50,7 +105,7 @@ while [ \$disk_offset -lt \$disk_nums ];
 do
 let pv_id=\$disk_offset+1
 partname="pv.0\$pv_id"
-echo "part \$partname --size=1 --grow --ondisk=\${disks[\$disk_offset]}" >> /tmp/part-include
+echo "part \$partname --size=1 --grow --ondisk=\${sorted_disks[\$disk_offset]}" >> /tmp/part-include
 vggroup="\$vggroup \$partname"
 let disk_offset=\$disk_offset+1;
 done