diff --git a/xCAT-test/bats/genesis_bmcsetup_users.bats b/xCAT-test/bats/genesis_bmcsetup_users.bats
index c8d1e252f..2b750a570 100644
--- a/xCAT-test/bats/genesis_bmcsetup_users.bats
+++ b/xCAT-test/bats/genesis_bmcsetup_users.bats
@@ -8,13 +8,46 @@ setup()
cat >"$fixture/bin/ipmitool" <<'SH'
#!/bin/sh
printf '%s\n' "$*" >>/run/fixture/calls
-[ "$1" != -d ] || shift 2
+device=0
+if [ "$1" = -d ]; then
+ device=$2
+ shift 2
+fi
case "$1 $2" in
'-V ') echo 'ipmitool version 1.8.19' ;;
- 'mc info')
- printf '%s\n' 'IPMI Version : 2.0' 'Manufacturer ID : 10876' 'Product ID : 2437'
+ 'mc info') cat /run/fixture/mcinfo ;;
+ 'channel info')
+ [ "$3" = "$(cat /run/fixture/channel)" ] || exit 1
+ echo 'Channel Medium Type : 802.3'
+ ;;
+ 'lan print')
+ counter=/run/fixture/queries.$device
+ count=0
+ [ ! -f "$counter" ] || count=$(cat "$counter")
+ count=$((count + 1))
+ echo "$count" >"$counter"
+ if [ -f "/run/fixture/lan.$device.$count" ]; then
+ cat "/run/fixture/lan.$device.$count"
+ else
+ cat "/run/fixture/lan.$device"
+ fi
+ if [ -f /run/fixture/read-error ]; then
+ echo 'LAN read returned an error' >&2
+ exit 1
+ fi
+ ;;
+ 'lan set')
+ case "$4" in
+ ipsrc|ipaddr|netmask|defgw|vlan)
+ counter=/run/fixture/writes.$device.$4
+ count=0
+ [ ! -f "$counter" ] || count=$(cat "$counter")
+ count=$((count + 1))
+ echo "$count" >"$counter"
+ [ "$count" -gt "$(cat /run/fixture/failures)" ] || exit 1
+ ;;
+ esac
;;
- 'channel info') echo 'Channel Medium Type : 802.3' ;;
'channel getaccess') echo 'Fixed Name : No' ;;
'user list') cat /run/fixture/users ;;
'user disable') printf '%s\n' "$3" >>/run/fixture/disabled ;;
@@ -26,10 +59,28 @@ SH
cp /run/fixture/ipmicfg.xml /tmp/ipmicfg.xml
SH
local utility
- for utility in logger modprobe sleep updateflag.awk remoteimmsetup allowcred.awk; do
+ for utility in modprobe updateflag.awk remoteimmsetup allowcred.awk; do
printf '#!/bin/sh\nexit 0\n' >"$fixture/bin/$utility"
done
+ cat >"$fixture/bin/sleep" <<'SH'
+#!/bin/sh
+printf '%s\n' "$*" >>/run/fixture/sleeps
+SH
+ cat >"$fixture/bin/logger" <<'SH'
+#!/bin/sh
+printf '%s\n' "$*" >>/run/fixture/messages
+SH
chmod +x "$fixture/bin/"*
+ printf '%s\n' 'IPMI Version : 2.0' 'Manufacturer ID : 10876' 'Product ID : 2437' >"$fixture/mcinfo"
+ echo 1 >"$fixture/channel"
+ echo 0 >"$fixture/failures"
+ cat >"$fixture/lan.0" <<'LAN'
+IP Address Source : Static Address
+IP Address : 192.0.2.2
+Subnet Mask : 255.255.255.0
+Default Gateway IP : 192.0.2.1
+802.1q VLAN ID : 42
+LAN
cat >"$fixture/ipmicfg.xml" <<'XML'
192.0.2.2
off
@@ -65,3 +116,128 @@ USERS
grep -Fx -- '-d 0 user enable 2' "$fixture/calls"
[ ! -e "$fixture/tmp/ipmicfg.xml" ]
}
+
+lan_calls()
+{
+ grep -E -- '^-d [0-9]+ lan (print|set [0-9]+ (ipsrc|ipaddr|netmask|defgw|vlan))' "$fixture/calls"
+}
+
+@test 'bmcsetup leaves matching LAN settings unchanged' {
+ sed -i 's/off/42/' "$fixture/ipmicfg.xml"
+ run_genesis 0
+ run lan_calls
+ [ "$output" = '-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1' ]
+ [ ! -e "$fixture/tmp/ipmicfg.xml" ]
+}
+
+@test 'bmcsetup rereads each LAN field after a failed write' {
+ sed -i 's/off/42/' "$fixture/ipmicfg.xml"
+ : >"$fixture/lan.0"
+ echo 1 >"$fixture/failures"
+ run_genesis 0
+ run lan_calls
+ [ "$output" = '-d 0 lan print 1
+-d 0 lan set 1 ipsrc static
+-d 0 lan print 1
+-d 0 lan set 1 ipsrc static
+-d 0 lan print 1
+-d 0 lan set 1 ipaddr 192.0.2.2
+-d 0 lan print 1
+-d 0 lan set 1 ipaddr 192.0.2.2
+-d 0 lan print 1
+-d 0 lan set 1 netmask 255.255.255.0
+-d 0 lan print 1
+-d 0 lan set 1 netmask 255.255.255.0
+-d 0 lan print 1
+-d 0 lan set 1 defgw ipaddr 192.0.2.1
+-d 0 lan print 1
+-d 0 lan set 1 defgw ipaddr 192.0.2.1
+-d 0 lan print 1
+-d 0 lan set 1 vlan id 42
+-d 0 lan print 1
+-d 0 lan set 1 vlan id 42' ]
+ run cat "$fixture/sleeps"
+ [ "$output" = '5
+1
+1
+1
+1
+1
+1' ]
+}
+
+@test 'bmcsetup stops retrying when a refreshed LAN value matches' {
+ sed -i 's/off/42/' "$fixture/ipmicfg.xml"
+ : >"$fixture/lan.0.1"
+ echo 99 >"$fixture/failures"
+ run_genesis 0
+ run lan_calls
+ [ "$output" = '-d 0 lan print 1
+-d 0 lan set 1 ipsrc static
+-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1' ]
+}
+
+@test 'bmcsetup retains the LAN write retry limit' {
+ sed -i 's/off/42/' "$fixture/ipmicfg.xml"
+ : >"$fixture/lan.0"
+ echo 99 >"$fixture/failures"
+ run_genesis 0
+ local setting
+ for setting in ipsrc ipaddr netmask defgw vlan; do
+ [ "$(cat "$fixture/writes.0.$setting")" = 16 ]
+ done
+ [ "$(grep -c -- '^-d 0 lan print 1$' "$fixture/calls")" = 80 ]
+ [ "$(grep -cx 1 "$fixture/sleeps")" = 81 ]
+ [ ! -e "$fixture/tmp/ipmicfg.xml" ]
+}
+
+@test 'bmcsetup keeps LAN device indexes and the selected channel' {
+ sed -i 's/off/42/' "$fixture/ipmicfg.xml"
+ cat >>"$fixture/ipmicfg.xml" <<'XML'
+198.51.100.2
+43
+198.51.100.1
+255.255.0.0
+XML
+ : >"$fixture/lan.1"
+ echo 3 >"$fixture/channel"
+ run_genesis 0
+ run lan_calls
+ [ "$output" = '-d 1 lan print 3
+-d 1 lan set 3 ipsrc static
+-d 0 lan print 3
+-d 0 lan print 3
+-d 1 lan print 3
+-d 1 lan set 3 ipaddr 198.51.100.2
+-d 0 lan print 3
+-d 1 lan print 3
+-d 1 lan set 3 netmask 255.255.0.0
+-d 0 lan print 3
+-d 1 lan print 3
+-d 1 lan set 3 defgw ipaddr 198.51.100.1
+-d 0 lan print 3
+-d 1 lan print 3
+-d 1 lan set 3 vlan id 43' ]
+}
+
+@test 'bmcsetup retains usable LAN output when ipmitool reports a read error' {
+ sed -i 's/off/42/' "$fixture/ipmicfg.xml"
+ sed -i 's/IPMI Version : 2.0/IPMI Version : 1.5/' "$fixture/mcinfo"
+ touch "$fixture/read-error"
+ run_genesis 0
+ [ "$(printf '%s\n' "$output" | grep -cx 'LAN read returned an error')" = 5 ]
+ run lan_calls
+ [ "$output" = '-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1
+-d 0 lan print 1' ]
+}