# IPaddr2v4

# Note: This test case uses two NICs(eth0, eth1) and
# 	a IPv4 address prefix (192.168.144.0/24).
#	Adjust them according to your environment at VARIABLE section if needed.

CONFIG
	Agent IPaddr2
	AgentRoot /usr/lib/ocf/resource.d/heartbeat
	HangTimeout 20

VARIABLE
	OCFT_target_ip=192.168.144.2
	OCFT_target_nic=eth0
	OCFT_target_prefix=24
	OCFT_target_netaddr=192.168.144.1/$OCFT_target_prefix
	OCFT_target_brd=192.168.144.255
	OCFT_wrong_ip=192.168.120.1
	OCFT_force_nic=eth1
	OCFT_force_prefix=16
	OCFT_force_prefix2=28
	OCFT_force_brd=192.168.255.255

SETUP-AGENT
	ip addr add $OCFT_target_netaddr dev $OCFT_target_nic brd $OCFT_target_brd

CLEANUP-AGENT
	ip addr del $OCFT_target_netaddr dev $OCFT_target_nic

CASE-BLOCK required_args
	Env OCF_RESKEY_ip=$OCFT_target_ip
	Env OCFT_check_ip=$OCFT_target_ip
	Env OCFT_check_prefix=$OCFT_target_prefix
	Env OCFT_check_nic=$OCFT_target_nic

CASE-BLOCK check_ip_assigned
	Bash ip -4 -o addr show $OCFT_check_nic | grep -w $OCFT_check_ip/$OCFT_check_prefix >/dev/null # checking if the IPv4 address was assigned correctly

CASE-BLOCK check_ip_removed
	Bash ! ip -4 -o addr show $OCFT_check_nic | grep -w $OCFT_check_ip/$OCFT_check_prefix >/dev/null # checking if the IPv4 address was removed correctly

CASE-BLOCK base_ip_assigned
	Bash ip addr add $OCFT_target_netaddr dev $OCFT_target_nic brd $OCFT_target_brd

CASE-BLOCK base_ip_removed
	Bash ip addr del $OCFT_target_netaddr dev $OCFT_target_nic

CASE-BLOCK default_status
	AgentRun stop

CASE-BLOCK prepare
	Include required_args
	Include default_status

# CASE No.0
#
CASE "normal start"
	Include prepare
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned

# CASE No.1
#
CASE "normal stop"
	Include prepare
	AgentRun start
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

# CASE No.2
#
CASE "double start"
	Include prepare
	AgentRun start
	AgentRun start OCF_SUCCESS

# CASE No.3
#
CASE "double stop"
	Include prepare
	AgentRun stop OCF_SUCCESS

# CASE No.4
#
CASE "monitor with running"
	Include prepare
	AgentRun start
	AgentRun monitor OCF_SUCCESS

# CASE No.5
#
CASE "monitor with not running"
	Include prepare
	AgentRun monitor OCF_NOT_RUNNING

# CASE No.6
# Note: this result is different from IPaddr2 in 3.9.3.
#  IPaddr2 succeeds if the ip matched based on the netmask of the subnet
#  or fails if it did not match to any.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 was using a wrong subnet mask (constant of 32) in this case.
#
CASE "params with nic, no cidr_netmask"
	Include prepare
	Env OCF_RESKEY_nic=$OCFT_target_nic
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

# CASE No.7
#
CASE "params with nic, cidr_netmask"
	Include prepare
	Env OCF_RESKEY_nic=$OCFT_target_nic
	Env OCF_RESKEY_cidr_netmask=$OCFT_target_prefix
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

# CASE No.8
#
CASE "error params with wrong ip"
	Include prepare
	Env OCF_RESKEY_ip=$OCFT_wrong_ip
	AgentRun start OCF_ERR_GENERIC

# CASE No.9
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 fails when it could not determine the correct subnet mask.
# When it could not get base ip, it becomes the error.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 was using a wrong subnet mask (constant of 32) in this case.
#
CASE "params with force nic"
	Include prepare
	Env OCF_RESKEY_nic=$OCFT_force_nic
	Env OCFT_check_nic=$OCFT_force_nic
	AgentRun start OCF_ERR_GENERIC
	Include check_ip_removed
	Unenv OCF_RESKEY_nic

# CASE No.10
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 fails when it could not determine the broadcast.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 succeeded but it's considered ambiguous.
#
CASE "params with force cidr_netmask (base netmask > assigned netmask)"
	Include prepare
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix
	Env OCFT_check_prefix=$OCFT_force_prefix
	AgentRun start OCF_ERR_GENERIC
	Include check_ip_removed

# CASE No.11
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 succeeds but the broadcast is not set.
# This is because findif.sh can not calculate a broadcast from a netmask.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 succeeded with using a calculated broadcast.
#
CASE "force to use the specified nic and cidr_netmask"
	Include prepare
	Env OCF_RESKEY_nic=$OCFT_force_nic
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix
	Env OCFT_check_nic=$OCFT_force_nic
	Env OCFT_check_prefix=$OCFT_force_prefix
	AgentRun start OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed
	Unenv OCF_RESKEY_cidr_netmask


# CASE No.12
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 fails when it could not determine the correct subnet mask.
# When it could not get base ip, it becomes the error.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 was using a wrong subnet mask (constant of 32) in this case.
#
CASE "error params with wrong ip and nic (not exist base_ip)"
	Include prepare
	Include base_ip_removed
	Env OCF_RESKEY_nic=$OCFT_target_nic
	Env OCFT_check_nic=$OCFT_target_nic
	AgentRun start OCF_ERR_GENERIC
	Include check_ip_removed
	Include base_ip_assigned

# CASE No.13
#
CASE "params with cidr_netmask"
	Include prepare
	Env OCF_RESKEY_cidr_netmask=$OCFT_target_prefix
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

# CASE No.14
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 does not override the broadcast by cidr_netmask.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 overrode the broadcast calculated by cidr_netmask.
#
CASE "params with force cidr_netmask (base netmask < assigned netmask)"
	Include prepare
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix2
	Env OCFT_check_prefix=$OCFT_force_prefix2
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

# CASE No.15
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 fails when it could not determine the broadcast.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 succeeded but it's considered ambiguous.
#
CASE "error params with wrong ip and cidr_netmask (not exist base_ip)"
	Include prepare
	Include base_ip_removed
	Env OCF_RESKEY_cidr_netmask=$OCFT_target_prefix
	AgentRun start OCF_ERR_GENERIC
	Include base_ip_assigned

# CASE No.16
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 succeeds but the broadcast is not set.
# This is because findif.sh can not calculate a broadcast from a netmask.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 succeeded with using a calculated broadcast.
#
CASE "force to use the specified nic and cidr_netmask"
	Include prepare
	Env OCF_RESKEY_nic=$OCFT_force_nic
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix2
	Env OCFT_check_prefix=$OCFT_force_prefix2
	Env OCFT_check_nic=$OCFT_force_nic
	AgentRun start OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

# CASE No.17
# Note: this result is different from IPaddr2 in 3.9.3.
# IPaddr2 succeeds but the broadcast is not set.
# This is because findif.sh can not calculate a broadcast from a netmask.
# Recommended to always specify both nic, cidr_netmask, and broadcast when you needed.
# IPaddr2 in 3.9.3 succeeded with using a calculated broadcast.
#
CASE "force to use the specified nic and cidr_netmask (not exist base_ip)"
	Include prepare
	Include base_ip_removed
	Env OCF_RESKEY_nic=$OCFT_force_nic
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix2
	Env OCFT_check_prefix=$OCFT_force_prefix2
	Env OCFT_check_nic=$OCFT_force_nic
	AgentRun start OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Unenv OCF_RESKEY_nic
	Unenv OCF_RESKEY_cidr_netmask
	Include base_ip_assigned

# CASE No.18
#
CASE "params with broadcast, no nic, no cidr_netmask"
	Include prepare
	Env OCF_RESKEY_broadcast=$OCFT_force_brd
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

# CASE No.19
#
CASE "params with broadcast, no nic, no cidr_netmask"
	Include prepare
	Include base_ip_removed
	Env OCF_RESKEY_broadcast=$OCFT_force_brd
	AgentRun start OCF_ERR_GENERIC
	Include base_ip_assigned

# CASE No.20
#
CASE "force to use the specified nic and cidr_netmask"
	Include prepare
	Env OCF_RESKEY_nic=$OCFT_force_nic
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix
	Env OCF_RESKEY_broadcast=$OCFT_force_brd
	Env OCFT_check_nic=$OCFT_force_nic
	Env OCFT_check_prefix=$OCFT_force_prefix
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed
	Unenv OCF_RESKEY_cidr_netmask

# CASE No.21
#
CASE "force to use the specified nic and cidr_netmask"
	Include prepare
	Include base_ip_removed
	Env OCF_RESKEY_nic=$OCFT_force_nic
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix2
	Env OCF_RESKEY_broadcast=$OCFT_target_brd
	Env OCFT_check_nic=$OCFT_force_nic
	Env OCFT_check_prefix=$OCFT_force_prefix2
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed
	Include base_ip_assigned

