# IPv6addr

# Note: This test case uses two NICs(eth0, eth1) and
# 	a IPv6 address prefix (2001:db8::/32, RFC3849).
#	Adjust them according to your environment at VARIABLE section if needed.

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

VARIABLE
	OCFT_target_ipv6addr=2001:db8:1234::2
	OCFT_target_nic=eth0
	OCFT_target_prefix=64
	OCFT_target_netaddr=2001:db8:1234::1/$OCFT_target_prefix
	OCFT_target_linklocal=fe80::2
	OCFT_wrong_ipv6addr=2001:db8:5678::2
	OCFT_force_nic=eth1
	OCFT_force_prefix=80

SETUP-AGENT
	ip addr add $OCFT_target_netaddr dev $OCFT_target_nic

CLEANUP-AGENT
	ip addr del $OCFT_target_netaddr dev $OCFT_target_nic

CASE-BLOCK required_args
	Env OCF_RESKEY_ipv6addr=$OCFT_target_ipv6addr
	Env OCFT_check_ipv6addr=$OCFT_target_ipv6addr
	Env OCFT_check_prefix=$OCFT_target_prefix
	Env OCFT_check_nic=$OCFT_target_nic

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

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

CASE-BLOCK default_status
	AgentRun stop

CASE-BLOCK prepare
	Include required_args
	Include default_status


CASE "normal start"
	Include prepare
	AgentRun start OCF_SUCCESS
	Include check_ip_assigned

CASE "normal stop"
	Include prepare
	AgentRun start
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed

CASE "double start"
	Include prepare
	AgentRun start
	AgentRun start OCF_SUCCESS

CASE "double stop"
	Include prepare
	AgentRun stop OCF_SUCCESS

CASE "monitor with running"
	Include prepare
	AgentRun start
	AgentRun monitor OCF_SUCCESS

CASE "monitor with not running"
	Include prepare
	AgentRun monitor OCF_NOT_RUNNING

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 "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 "normal usage for a link-local IPv6 address"
	Include prepare
	Env OCF_RESKEY_ipv6addr=$OCFT_target_linklocal
	Env OCFT_check_ipv6addr=$OCFT_target_linklocal
	# nic is mandatory for a link-local address
	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 "error start for a link-local IPv6 address when no nic"
	Include prepare
	Env OCF_RESKEY_ipv6addr=$OCFT_target_linklocal
	# nic is mandatory for a link-local address
	Unenv OCF_RESKEY_nic
	AgentRun start OCF_ERR_GENERIC
	Include check_ip_removed

CASE "error params with wrong ipv6addr"
	Include prepare
	Env OCF_RESKEY_ipv6addr=$OCFT_wrong_ipv6addr
	AgentRun start OCF_ERR_GENERIC

# Note: this result is different from IPaddr2/findif
#  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 and cidr_netmask when you needed.
CASE "error params with wrong cidr_netmask"
	Include prepare
	Env OCF_RESKEY_cidr_netmask=$OCFT_force_prefix
	AgentRun start OCF_ERR_GENERIC

# Note: this result is different from IPaddr2/findif
#  IPaddr2 succeeds but it uses /32 as a guessed cidr_netmask which
#  does not seem to be expected.
# Recommended to always specify both nic and cidr_netmask when you needed.
CASE "error params with wrong nic"
	Include prepare
	Env OCF_RESKEY_nic=$OCFT_force_nic
	AgentRun start OCF_ERR_GENERIC

# Note: This use case is now valid. It was not allowed until v3.9.2.
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
	Include check_ip_assigned
	AgentRun monitor OCF_SUCCESS
	AgentRun stop OCF_SUCCESS
	Include check_ip_removed
