Support multiple iSCSI targets and read their addresses from invirt.config 0.0.11
authorQuentin Smith <quentin@mit.edu>
Sat, 4 Dec 2010 04:46:33 +0000 (23:46 -0500)
committerQuentin Smith <quentin@mit.edu>
Sat, 4 Dec 2010 05:16:02 +0000 (00:16 -0500)
debian/changelog
debian/xvm-iscsi-config.config
debian/xvm-iscsi-config.postinst
debian/xvm-iscsi-config.templates

index 558a00e..c420750 100644 (file)
@@ -1,3 +1,10 @@
+xvm-iscsi-config (0.0.11) unstable; urgency=low
+
+  * Support multiple iSCSI targets and read their addresses
+    from invirt.config
+
+ -- Quentin Smith <quentin@mit.edu>  Fri, 03 Dec 2010 21:56:25 -0500
+
 xvm-iscsi-config (0.0.10) unstable; urgency=low
 
   * Added a clean target.
index e3f15bd..9bcfbae 100755 (executable)
@@ -5,9 +5,6 @@ set -e
 # Source debconf library
 . /usr/share/debconf/confmodule
 
-# Get IP address
-db_input high xvm-iscsi-config/address || true
-db_go || true
 # Get username
 db_input high xvm-iscsi-config/username || true
 db_go || true
index 0b7a06e..6182942 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 # postinst script for xvm-iscsi-config
 #
 # see: dh_installdeb(1)
@@ -25,36 +25,68 @@ set -e
 
 #DEBHELPER#
 
+get_current_sessions() {
+    for i in $(cd /sys/class/iscsi_session/ && ls); do
+        echo $(cat /sys/class/iscsi_connection/connection${i#session}:0/persistent_address) \
+$(cat /sys/class/iscsi_host/$(readlink /sys/class/iscsi_session/$i/device | perl -ne '/host\d+/ && print $&')/netdev)
+    done | sort
+}
+
+get_new_sessions() {
+    for i in $(invirt-getconf --ls iscsi.targets); do
+        echo $(invirt-getconf iscsi.targets.$i.ip) $(invirt-getconf iscsi.targets.$i.iface)
+    done | sort
+}
+
 case "$1" in
     configure)
-        db_get xvm-iscsi-config/address
-        ADDRESS="$RET"
         db_get xvm-iscsi-config/username
         USERNAME="$RET"
         db_get xvm-iscsi-config/password
         PASSWORD="$RET"
         db_stop
         
+        OLD_USERNAME=$(invirt-getconf iscsi.username 2>/dev/null)
+        OLD_PASSWORD=$(invirt-getconf iscsi.password 2>/dev/null)
+
         if [ -e /etc/invirt/conf.d/iscsi ]; then
           # invirt.config.run_parts_list excludes backup filenames.
           mv -f /etc/invirt/conf.d/iscsi /etc/invirt/conf.d/iscsi~
         fi
         cat >/etc/invirt/conf.d/iscsi <<EOF
 iscsi:
- address: $ADDRESS
  username: $USERNAME
  password: $PASSWORD
 EOF
+
+        # Attempt to determine whether the iSCSI configuration has changed at all
+        safe=""
+
         if [ -z "$2" ]; then
             invoke-rc.d xvm-iscsi-config restart
             invoke-rc.d open-iscsi restart
-            iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.address):3260 -I eth0 -I eth1
-        elif ! diff /etc/invirt/conf.d/iscsi~ /etc/invirt/conf.d/iscsi >/dev/null; then
-              cat <<EOF
-xvm-iscsi-config: The configuration has changed.  Restart iscsi:
+        elif [[ "$USERNAME" -ne "$OLD_USERNAME" || "$PASSWORD" -ne "$OLD_PASSWORD" ]]; then
+            cat <<EOF
+xvm-iscsi-config: The login credentials have changed.  Restart iscsi:
   /etc/init.d/xvm-iscsi-config restart
   /etc/init.d/open-iscsi restart
-  iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.address):3260 -I eth0 -I eth1
+EOF
+            safe=no
+        fi
+        if ! diff <(get_current_sessions) <(get_new_sessions) >/dev/null; then
+            if [ -z "$safe" ]; then
+                for i in $(invirt-getconf --ls iscsi.targets); do
+                    iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface)
+                    iscsiadm -m node -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface) -l
+                done
+            else
+              for i in $(invirt-getconf --ls iscsi.targets); do
+                  echo "  "iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface)
+                  echo "  "iscsiadm -m node -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface) -l
+              done
+            fi
+            cat <<EOF
+You may want to recreate the LVM nodes:
   lvchange -a ln /dev/xenvg && lvchange -a y /dev/xenvg
 This will leave VMs unable to access their disks, so migrate them first.
 
index 1ffadc6..968dea6 100644 (file)
@@ -1,8 +1,3 @@
-Template: xvm-iscsi-config/address
-Type: string
-Description: iSCSI IP Address
- What is the IP address of the iSCSI shared storage array?
-
 Template: xvm-iscsi-config/username
 Type: string
 Description: iSCSI username