@@ -92,6 +92,19 @@ OCF_RESKEY_nodad_default=false
9292OCF_RESKEY_noprefixroute_default=" false"
9393OCF_RESKEY_preferred_lft_default=" forever"
9494OCF_RESKEY_network_namespace_default=" "
95+ OCF_RESKEY_check_link_status_default=" true"
96+
97+ # RHEL specific defaults
98+ if is_redhat_based; then
99+ get_os_ver
100+ ocf_version_cmp " $VER " " 10.1" 2> /dev/null
101+
102+ case " $? " in
103+ # RHEL < 10.1
104+ 0)
105+ OCF_RESKEY_check_link_status_default=" false" ;;
106+ esac
107+ fi
95108
96109: ${OCF_RESKEY_ip=${OCF_RESKEY_ip_default} }
97110: ${OCF_RESKEY_cidr_netmask=${OCF_RESKEY_cidr_netmask_default} }
@@ -116,6 +129,7 @@ OCF_RESKEY_network_namespace_default=""
116129: ${OCF_RESKEY_noprefixroute=${OCF_RESKEY_noprefixroute_default} }
117130: ${OCF_RESKEY_preferred_lft=${OCF_RESKEY_preferred_lft_default} }
118131: ${OCF_RESKEY_network_namespace=${OCF_RESKEY_network_namespace_default} }
132+ : ${OCF_RESKEY_check_link_status=${OCF_RESKEY_check_link_status_default} }
119133
120134# ######################################################################
121135
@@ -449,6 +463,14 @@ the namespace.
449463<shortdesc lang="en">Network namespace to use</shortdesc>
450464<content type="string" default="${OCF_RESKEY_network_namespace_default} "/>
451465</parameter>
466+
467+ <parameter name="check_link_status">
468+ <longdesc lang="en">
469+ Consider the resource failed if the interface has status DOWN or LOWERLAYERDOWN.
470+ </longdesc>
471+ <shortdesc lang="en">Consider the resource failed if the interface has status DOWN or LOWERLAYERDOWN</shortdesc>
472+ <content type="string" default="${OCF_RESKEY_check_link_status_default} "/>
473+ </parameter>
452474</parameters>
453475
454476<actions>
@@ -581,6 +603,9 @@ ip_init() {
581603 elif [ " $__OCF_ACTION " = stop ]; then
582604 ocf_log warn " [$FINDIF ] failed"
583605 exit $OCF_SUCCESS
606+ elif [ " $__OCF_ACTION " = start ]; then
607+ ocf_exit_reason " [$FINDIF ] failed"
608+ exit $OCF_ERR_INSTALLED
584609 else
585610 ocf_exit_reason " [$FINDIF ] failed"
586611 exit $rc
@@ -1002,6 +1027,12 @@ ip_served() {
10021027 return 0
10031028 fi
10041029
1030+ if ocf_is_true " $OCF_RESKEY_check_link_status " && $IP2UTIL -f $FAMILY addr show $cur_nic | \
1031+ grep -q " [[:space:]]\(DOWN\|LOWERLAYERDOWN\)[[:space:]]" ; then
1032+ echo " down"
1033+ return 0
1034+ fi
1035+
10051036 if [ -z " $IP_CIP " ]; then
10061037 for i in $cur_nic ; do
10071038 # check address label
@@ -1073,6 +1104,11 @@ ip_start() {
10731104 exit $OCF_SUCCESS
10741105 fi
10751106
1107+ if [ " $ip_status " = " down" ]; then
1108+ ocf_exit_reason " IP $OCF_RESKEY_ip available, but device has status $ip_status "
1109+ exit $OCF_ERR_INSTALLED
1110+ fi
1111+
10761112 if [ " $ip_status " = " partial3" ]; then
10771113 ocf_exit_reason " IP $OCF_RESKEY_ip available, but label missing"
10781114 exit $OCF_ERR_GENERIC
@@ -1096,7 +1132,7 @@ ip_start() {
10961132 echo " +$IP_INC_NO " > $IP_CIP_FILE
10971133 fi
10981134
1099- if [ " $ip_status " = " no " ]; then
1135+ if [ " $ip_status " ! = " ok " ]; then
11001136 if ocf_is_true ${OCF_RESKEY_lvs_support} ; then
11011137 for i in ` find_interface $OCF_RESKEY_ip 32` ; do
11021138 case $i in
@@ -1213,6 +1249,7 @@ ip_monitor() {
12131249 # interface health maybe via a daemon like FailSafe etc...
12141250
12151251 local ip_status=` ip_served`
1252+ ocf_log debug " monitor: $ip_status "
12161253 case $ip_status in
12171254 ok)
12181255 run_arp_sender refresh
@@ -1221,6 +1258,9 @@ ip_monitor() {
12211258 no)
12221259 exit $OCF_NOT_RUNNING
12231260 ;;
1261+ down)
1262+ exit $OCF_ERR_INSTALLED
1263+ ;;
12241264 * )
12251265 # Errors on this interface?
12261266 return $OCF_ERR_GENERIC
0 commit comments