Blame SOURCES/aliyun-vpc-move-ip-2-fixes.patch

b4b3ce
From db3df55a6f7097e1da7d77eb361e9e7560f13353 Mon Sep 17 00:00:00 2001
b4b3ce
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
b4b3ce
Date: Tue, 24 Jul 2018 13:57:08 +0200
b4b3ce
Subject: [PATCH] aliyun-vpc-move-ip: fixes
b4b3ce
b4b3ce
---
b4b3ce
 doc/man/Makefile.am          |   1 +
b4b3ce
 heartbeat/Makefile.am        |   1 +
b4b3ce
 heartbeat/aliyun-vpc-move-ip | 336 ++++++++++++++++++++++++-------------------
b4b3ce
 3 files changed, 189 insertions(+), 149 deletions(-)
b4b3ce
 mode change 100644 => 100755 heartbeat/aliyun-vpc-move-ip
b4b3ce
b4b3ce
diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am
b4b3ce
index 3ac0569de..fc9a67161 100644
b4b3ce
--- a/doc/man/Makefile.am
b4b3ce
+++ b/doc/man/Makefile.am
b4b3ce
@@ -93,6 +93,7 @@ man_MANS	       = ocf_heartbeat_AoEtarget.7 \
b4b3ce
                           ocf_heartbeat_WinPopup.7 \
b4b3ce
                           ocf_heartbeat_Xen.7 \
b4b3ce
                           ocf_heartbeat_Xinetd.7 \
b4b3ce
+                          ocf_heartbeat_aliyun-vpc-move-ip.7 \
b4b3ce
                           ocf_heartbeat_anything.7 \
b4b3ce
                           ocf_heartbeat_apache.7 \
b4b3ce
                           ocf_heartbeat_asterisk.7 \
b4b3ce
diff --git a/heartbeat/Makefile.am b/heartbeat/Makefile.am
b4b3ce
index d4750bf09..6adc6bc3c 100644
b4b3ce
--- a/heartbeat/Makefile.am
b4b3ce
+++ b/heartbeat/Makefile.am
b4b3ce
@@ -90,6 +90,7 @@ ocf_SCRIPTS	     =  AoEtarget		\
b4b3ce
 			Xen			\
b4b3ce
 			Xinetd			\
b4b3ce
 			ZFS			\
b4b3ce
+			aliyun-vpc-move-ip	\
b4b3ce
 			anything		\
b4b3ce
 			apache			\
b4b3ce
 			asterisk		\
b4b3ce
diff --git a/heartbeat/aliyun-vpc-move-ip b/heartbeat/aliyun-vpc-move-ip
b4b3ce
old mode 100644
b4b3ce
new mode 100755
b4b3ce
index bc97822a8..108feb247
b4b3ce
--- a/heartbeat/aliyun-vpc-move-ip
b4b3ce
+++ b/heartbeat/aliyun-vpc-move-ip
b4b3ce
@@ -1,30 +1,19 @@
b4b3ce
-#!/bin/bash
b4b3ce
+#!/bin/sh
b4b3ce
 #
b4b3ce
 # OCF resource agent to move an IP address within a VPC in the Aliyun
b4b3ce
 # Based on code of Markus Guertler (GitHub AWS-VPC-move-IP)
b4b3ce
 # Based on code of Adam Gandelman (GitHub ec2-resource-agents/elasticip)
b4b3ce
 #
b4b3ce
 
b4b3ce
-###############################################################################
b4b3ce
-# For testing purposes delete OCF_ROOT after testing
b4b3ce
-OCF_ROOT=/usr/lib/ocf/
b4b3ce
-#
b4b3ce
-# INIT
b4b3ce
-#: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
b4b3ce
-#if [ -f ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs ]; then
b4b3ce
-#  . ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
b4b3ce
-#fi
b4b3ce
-
b4b3ce
 #######################################################################
b4b3ce
 # Initialization:
b4b3ce
-
b4b3ce
-: ${OCF_FUNCTIONS=${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs}
b4b3ce
-. ${OCF_FUNCTIONS}
b4b3ce
-: ${__OCF_ACTION=$1}
b4b3ce
-export HOME=/root
b4b3ce
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
b4b3ce
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
b4b3ce
 #######################################################################
b4b3ce
 
b4b3ce
- 
b4b3ce
+# aliyuncli doesnt work without HOME parameter
b4b3ce
+export HOME="/root"
b4b3ce
+
b4b3ce
 USAGE="usage: $0 {start|stop|status|meta-data}";
b4b3ce
 ###############################################################################
b4b3ce
 
b4b3ce
@@ -36,8 +25,96 @@ USAGE="usage: $0 {start|stop|status|meta-data}";
b4b3ce
 ###############################################################################
b4b3ce
 
b4b3ce
 
b4b3ce
-metadata() {
b4b3ce
-cat <
b4b3ce
+
b4b3ce
+ip_get_and_configure() {
b4b3ce
+	ocf_log debug "function: ip_get_and_configure"
b4b3ce
+
b4b3ce
+	ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
+
b4b3ce
+	if [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; then
b4b3ce
+		if [ -n "$ROUTE_TO_INSTANCE" ]; then
b4b3ce
+			ip_drop
b4b3ce
+		fi
b4b3ce
+
b4b3ce
+		cmd="aliyuncli vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
b4b3ce
+		ocf_log debug "executing command: $cmd"
b4b3ce
+		$cmd
b4b3ce
+		rc=$?
b4b3ce
+		while [ $rc -ne 0 ]; do
b4b3ce
+			sleep 1
b4b3ce
+			cmd="aliyuncli vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
b4b3ce
+			ocf_log debug "executing command: $cmd"
b4b3ce
+			$cmd
b4b3ce
+			rc=$?
b4b3ce
+		done
b4b3ce
+		wait_for_started
b4b3ce
+	fi
b4b3ce
+
b4b3ce
+
b4b3ce
+	# Reconfigure the local ip address
b4b3ce
+	ip addr add "${OCF_RESKEY_address}/32" dev $OCF_RESKEY_interface
b4b3ce
+	rc=$?
b4b3ce
+	if [ $rc -ne 0 ]; then
b4b3ce
+		ocf_log err "command failed, rc: $rc"
b4b3ce
+		return $OCF_ERR_GENERIC
b4b3ce
+	fi
b4b3ce
+
b4b3ce
+	ocf_log debug "IP added"
b4b3ce
+
b4b3ce
+	return $OCF_SUCCESS
b4b3ce
+}
b4b3ce
+
b4b3ce
+ip_drop() {
b4b3ce
+	ocf_log debug "function: ip_drop"
b4b3ce
+	cmd="ip addr delete ${OCF_RESKEY_address}/32 dev $OCF_RESKEY_interface"
b4b3ce
+	ocf_log debug "executing command: $cmd"
b4b3ce
+	$cmd
b4b3ce
+	rc=$?
b4b3ce
+	if [ $rc -ne 0 ] && [ $rc -ne 2 ]; then
b4b3ce
+		ocf_log err "command failed, rc $rc"
b4b3ce
+		return $OCF_ERR_GENERIC
b4b3ce
+	fi
b4b3ce
+
b4b3ce
+	cmd="aliyuncli vpc DeleteRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ROUTE_TO_INSTANCE --output text"
b4b3ce
+	ocf_log debug "executing command: $cmd"
b4b3ce
+	$cmd
b4b3ce
+	if [ $? -ne 0 ]; then
b4b3ce
+		ocf_log err "command failed, rc: $rc"
b4b3ce
+		return $OCF_ERR_GENERIC
b4b3ce
+	fi
b4b3ce
+	wait_for_deleted
b4b3ce
+
b4b3ce
+	ocf_log debug "IP dropped"
b4b3ce
+
b4b3ce
+	return $OCF_SUCCESS
b4b3ce
+}
b4b3ce
+
b4b3ce
+wait_for_started() {
b4b3ce
+	cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
+	ocf_log debug "executing command: $cmd"
b4b3ce
+	ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
+
b4b3ce
+	while [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; do
b4b3ce
+		sleep 3
b4b3ce
+		cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
+		ocf_log debug "executing command: $cmd"
b4b3ce
+		ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
+	done
b4b3ce
+}
b4b3ce
+
b4b3ce
+wait_for_deleted() {
b4b3ce
+	ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
+
b4b3ce
+	 while [ ! -z "$ROUTE_TO_INSTANCE" ]; do
b4b3ce
+		sleep 1
b4b3ce
+		cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
+		ocf_log debug "executing command: $cmd"
b4b3ce
+		ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
+	 done
b4b3ce
+}
b4b3ce
+
b4b3ce
+ecs_ip_metadata() {
b4b3ce
+	cat <
b4b3ce
 
b4b3ce
 
b4b3ce
 <resource-agent name="vpc-move-ip">
b4b3ce
@@ -74,8 +151,8 @@ Name of the network interfacen, i.e. eth0
b4b3ce
 Valid Aliyun CLI profile name
b4b3ce
 </longdesc>
b4b3ce
 <shortdesc lang="en">profile name</shortdesc>
b4b3ce
-<content type="string" default="default" /> 
b4b3ce
-</parameter> 
b4b3ce
+<content type="string" default="default" />
b4b3ce
+</parameter>
b4b3ce
 </parameters>
b4b3ce
 <actions>
b4b3ce
 <action name="start" timeout="180" />
b4b3ce
@@ -88,171 +165,132 @@ Valid Aliyun CLI profile name
b4b3ce
 END
b4b3ce
 }
b4b3ce
 
b4b3ce
-debugger() {
b4b3ce
-	ocf_log info "DEBUG: $1"
b4b3ce
-}
b4b3ce
-
b4b3ce
 ecs_ip_validate() {
b4b3ce
-	debugger "function: validate"
b4b3ce
-	
b4b3ce
+	ocf_log debug "function: validate"
b4b3ce
+
b4b3ce
 	# IP address
b4b3ce
-	[[ -z "$OCF_RESKEY_address" ]] && ocf_log error "IP address parameter not set $OCF_RESKEY_ADDRESS!" && exit $OCF_ERR_CONFIGURED
b4b3ce
-	
b4b3ce
+	if [ -z "$OCF_RESKEY_address" ]; then
b4b3ce
+		ocf_log err "IP address parameter not set $OCF_RESKEY_ADDRESS!"
b4b3ce
+		exit $OCF_ERR_CONFIGURED
b4b3ce
+	fi
b4b3ce
+
b4b3ce
 	# Network Interface
b4b3ce
-	[[ -z "$OCF_RESKEY_interface" ]] && ocf_log error "Network interface parameter not set $OCF_RESKEY_INTERFACE!" && exit $OCF_ERR_CONFIGURED
b4b3ce
-	
b4b3ce
+	if [ -z "$OCF_RESKEY_interface" ]; then
b4b3ce
+		ocf_log err "Network interface parameter not set $OCF_RESKEY_INTERFACE!"
b4b3ce
+		exit $OCF_ERR_CONFIGURED
b4b3ce
+	fi
b4b3ce
+
b4b3ce
 	# Routing Table
b4b3ce
-	[[ -z "$OCF_RESKEY_routing_table" ]] && ocf_log error "Routing table parameter not set $OCF_RESKEY_ROUTING_TABLE!" && exit $OCF_ERR_CONFIGURED
b4b3ce
-	
b4b3ce
-	ECS_INSTANCE_ID="$(curl -s http://100.100.100.200/latest/meta-data/instance-id)"
b4b3ce
+	if [ -z "$OCF_RESKEY_routing_table" ]; then
b4b3ce
+		ocf_log err "Routing table parameter not set $OCF_RESKEY_ROUTING_TABLE!"
b4b3ce
+		exit $OCF_ERR_CONFIGURED
b4b3ce
+	fi
b4b3ce
 
b4b3ce
 	if [ -z "${ECS_INSTANCE_ID}" ]; then
b4b3ce
 		ocf_exit_reason "Instance ID not found. Is this a ECS instance?"
b4b3ce
 		return $OCF_ERR_GENERIC
b4b3ce
 	fi
b4b3ce
-	
b4b3ce
-	return $OCF_SUCCESS
b4b3ce
-}
b4b3ce
 
b4b3ce
-ecs_ip_monitor() {
b4b3ce
-	ecs_ip_validate
b4b3ce
-	debugger "function: ecsip_monitor: check routing table"
b4b3ce
-	cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
-	debugger "executing command: $cmd"
b4b3ce
-	ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
-	if [ -z "$ROUTE_TO_INSTANCE" ]; then 
b4b3ce
-		ROUTE_TO_INSTANCE="<unknown>"
b4b3ce
-	fi
b4b3ce
-	
b4b3ce
-	[[ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]] && debugger "not routed to this instance ($ECS_INSTANCE_ID) but to instance $ROUTE_TO_INSTANCE" && return $OCF_NOT_RUNNING 
b4b3ce
-	cmd="ping -W 1 -c 1 $OCF_RESKEY_address"
b4b3ce
-	debugger "executing command: $cmd"
b4b3ce
-	$cmd > /dev/null
b4b3ce
-	[[ $? -gt 0 ]]  && debugger "IP $OCF_RESKEY_address not locally reachable via ping on this system" && return $OCF_NOT_RUNNING
b4b3ce
-	debugger "routed in VPC and locally reachable"
b4b3ce
-	return $OCF_SUCCESS	
b4b3ce
-}
b4b3ce
-
b4b3ce
-
b4b3ce
-ecs_ip_drop() {
b4b3ce
-	debugger "function: ecsip_drop"
b4b3ce
-	cmd="ip addr delete ${OCF_RESKEY_address}/32 dev $OCF_RESKEY_interface"
b4b3ce
-	debugger "executing command: $cmd"
b4b3ce
-	$cmd
b4b3ce
-	rc=$?
b4b3ce
-	[[ $rc -gt 2 ]] && debugger "command failed, rc $rc" && return $OCF_ERR_GENERIC
b4b3ce
-	debugger "command succeeded"
b4b3ce
 	return $OCF_SUCCESS
b4b3ce
 }
b4b3ce
 
b4b3ce
-wait_for_deleted() {
b4b3ce
-  while [ ! -z "$ROUTE_TO_INSTANCE" ]; do
b4b3ce
-		sleep 1
b4b3ce
-		cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
-		debugger "executing command: $cmd"
b4b3ce
-		ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
-  done
b4b3ce
-	sleep 5
b4b3ce
-}
b4b3ce
+ecs_ip_start() {
b4b3ce
+	ocf_log info "ECS: Moving IP address $OCF_RESKEY_address to this host by adjusting routing table $OCF_RESKEY_routing_table"
b4b3ce
 
b4b3ce
-wait_for_started() {
b4b3ce
-	cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
-	debugger "executing command: $cmd"
b4b3ce
-	ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
-		
b4b3ce
-  while [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; do
b4b3ce
-		sleep 1
b4b3ce
-		cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
-		debugger "executing command: $cmd"
b4b3ce
-		ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
-  done
b4b3ce
-	sleep 5
b4b3ce
-}
b4b3ce
+	ecs_ip_monitor
b4b3ce
+	if [ $? = $OCF_SUCCESS ]; then
b4b3ce
+		ocf_log info "ECS: $OCF_RESKEY_address already started"
b4b3ce
+		return $OCF_SUCCESS
b4b3ce
+	fi
b4b3ce
 
b4b3ce
-ecs_ip_get_and_configure() {
b4b3ce
-	debugger "function: ecsip_get_and_configure"
b4b3ce
-  
b4b3ce
- if [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; then 
b4b3ce
- 
b4b3ce
-     if [ $ROUTE_TO_INSTANCE != "<unknown>" ]; then
b4b3ce
-      # Adjusting the routing table
b4b3ce
-        cmd="aliyuncli  vpc DeleteRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ROUTE_TO_INSTANCE --output text"
b4b3ce
-        debugger "executing command: $cmd"
b4b3ce
-        $cmd
b4b3ce
-        rc=$?
b4b3ce
-        [[ $rc != 0 ]] && debugger "command failed, rc: $rc" && return $OCF_ERR_GENERIC
b4b3ce
-        #wait_for_deleted
b4b3ce
-        sleep 3
b4b3ce
-      fi
b4b3ce
-      
b4b3ce
-      cmd="aliyuncli  vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
b4b3ce
-      debugger "executing command: $cmd"
b4b3ce
-      $cmd
b4b3ce
-      rc=$?
b4b3ce
-      #[[ $rc != 0 ]] && debugger "command failed, rc: $rc" && return $OCF_ERR_GENERIC
b4b3ce
-		  while [ $rc != 0 ]; do
b4b3ce
-				sleep 2
b4b3ce
-				cmd="aliyuncli  vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
b4b3ce
-				debugger "executing command: $cmd"
b4b3ce
-				$cmd
b4b3ce
-				rc=$?
b4b3ce
-			done
b4b3ce
-      wait_for_started
b4b3ce
+	ocf_log info "ECS: Adjusting routing table and locally configuring IP address"
b4b3ce
+	ip_get_and_configure
b4b3ce
+	rc=$?
b4b3ce
+	if [ $rc -ne 0 ]; then
b4b3ce
+		ocf_log err "Received $rc from 'aliyun cli'"
b4b3ce
+		return $OCF_ERR_GENERIC
b4b3ce
 	fi
b4b3ce
-  
b4b3ce
-  
b4b3ce
-	# Reconfigure the local ip address
b4b3ce
-	ecs_ip_drop
b4b3ce
-	ip addr add "${OCF_RESKEY_address}/32" dev $OCF_RESKEY_interface
b4b3ce
+
b4b3ce
+	ecs_ip_monitor
b4b3ce
 	rc=$?
b4b3ce
-	[[ $rc != 0 ]] && debugger "command failed, rc: $rc" && return $OCF_ERR_GENERIC
b4b3ce
-	debugger "-success"
b4b3ce
+	if [ $rc -ne $OCF_SUCCESS ]; then
b4b3ce
+		ocf_log err "IP address couldn't be configured on this host (IP: $OCF_RESKEY_address, Interface: $OCF_RESKEY_interface)"
b4b3ce
+		return $rc
b4b3ce
+	fi
b4b3ce
+
b4b3ce
 	return $OCF_SUCCESS
b4b3ce
 }
b4b3ce
 
b4b3ce
 ecs_ip_stop() {
b4b3ce
 	ocf_log info "ECS: Bringing down IP address $OCF_RESKEY_address"
b4b3ce
-	ecs_ip_validate 
b4b3ce
+
b4b3ce
 	ecs_ip_monitor
b4b3ce
-	[[ $? == $OCF_NOT_RUNNING ]] && ocf_log info "ECS: Address $OCF_RESKEY_address already down" && return $OCF_SUCCESS
b4b3ce
-	ecs_ip_drop
b4b3ce
-	[[ $? != $OCF_SUCCESS ]] && return $OCF_ERR_GENERIC
b4b3ce
+	if [ $? = $OCF_NOT_RUNNING ]; then
b4b3ce
+		ocf_log info "ECS: Address $OCF_RESKEY_address already down"
b4b3ce
+		return $OCF_SUCCESS
b4b3ce
+	fi
b4b3ce
+
b4b3ce
+	ip_drop
b4b3ce
+	if [ $? -ne $OCF_SUCCESS ]; then
b4b3ce
+		ocf_log err "ECS: Couldn't drop IP address $OCF_RESKEY_address on interface $OCF_RESKEY_interface."
b4b3ce
+		return $OCF_ERR_GENERIC
b4b3ce
+	fi
b4b3ce
+
b4b3ce
 	ecs_ip_monitor
b4b3ce
-	[[ $? == $OCF_NOT_RUNNING ]] && ocf_log info "ECS: Successfully brought down $OCF_RESKEY_address" && return $OCF_SUCCESS
b4b3ce
-	ocf_log error "ECS: Couldn't bring down IP address $OCF_RESKEY_address on interface $OCF_RESKEY_interface." 
b4b3ce
+	if [ $? = $OCF_NOT_RUNNING ]; then
b4b3ce
+		ocf_log info "ECS: Successfully brought down $OCF_RESKEY_address"
b4b3ce
+		return $OCF_SUCCESS
b4b3ce
+	fi
b4b3ce
+
b4b3ce
+	ocf_log err "ECS: Couldn't bring down IP address $OCF_RESKEY_address on interface $OCF_RESKEY_interface."
b4b3ce
 	return $OCF_ERR_GENERIC
b4b3ce
 }
b4b3ce
 
b4b3ce
-ecs_ip_start() {
b4b3ce
-	ocf_log info "ECS: Moving IP address $OCF_RESKEY_address to this host by adjusting routing table $OCF_RESKEY_routing_table"
b4b3ce
-	ecs_ip_validate
b4b3ce
-	ecs_ip_monitor
b4b3ce
-	[[ $? == $OCF_SUCCESS ]] && ocf_log info "ECS: $OCF_RESKEY_address already started" && return $OCF_SUCCESS
b4b3ce
-	ocf_log info "ECS: Adjusting routing table and locally configuring IP address"
b4b3ce
-	ecs_ip_get_and_configure 
b4b3ce
-	[[ $? != 0 ]] && ocf_log error "Received $? from 'aliyun cli'" && return $OCF_ERR_GENERIC
b4b3ce
-  return $OCF_SUCCESS
b4b3ce
-	ecs_ip_monitor
b4b3ce
-	[[ $? == $OCF_SUCCESS ]] &&  return $?
b4b3ce
-	ocf_log error "ECS: IP address couldn't be configured on this host (IP: $OCF_RESKEY_address, Interface: $OCF_RESKEY_interface)"
b4b3ce
-	return $OCF_ERR_GENERIC
b4b3ce
+ecs_ip_monitor() {
b4b3ce
+	ocf_log debug "function: ecsip_monitor: check routing table"
b4b3ce
+	cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
b4b3ce
+	ocf_log debug "executing command: $cmd"
b4b3ce
+
b4b3ce
+	ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
b4b3ce
+
b4b3ce
+	if [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; then
b4b3ce
+		ocf_log debug "not routed to this instance ($ECS_INSTANCE_ID) but to instance $ROUTE_TO_INSTANCE"
b4b3ce
+		return $OCF_NOT_RUNNING
b4b3ce
+	fi
b4b3ce
+
b4b3ce
+	cmd="ping -W 1 -c 1 $OCF_RESKEY_address"
b4b3ce
+	ocf_log debug "executing command: $cmd"
b4b3ce
+	$cmd > /dev/null
b4b3ce
+	if [ $? -ne 0 ]; then
b4b3ce
+		ocf_log debug "IP $OCF_RESKEY_address not locally reachable via ping on this system"
b4b3ce
+		return $OCF_NOT_RUNNING
b4b3ce
+	fi
b4b3ce
+	ocf_log debug "routed in VPC and locally reachable"
b4b3ce
+	return $OCF_SUCCESS
b4b3ce
 }
b4b3ce
 
b4b3ce
+
b4b3ce
 ###############################################################################
b4b3ce
 #
b4b3ce
 # MAIN
b4b3ce
 #
b4b3ce
 ###############################################################################
b4b3ce
 
b4b3ce
-case $__OCF_ACTION in 
b4b3ce
-	meta-data) metadata
b4b3ce
+case $__OCF_ACTION in
b4b3ce
+	meta-data) ecs_ip_metadata
b4b3ce
 		   exit $OCF_SUCCESS;;
b4b3ce
-	monitor)
b4b3ce
-		ecs_ip_monitor;;
b4b3ce
-	stop)
b4b3ce
-		ecs_ip_stop;;
b4b3ce
 	validate-all) ecs_ip_validate;;
b4b3ce
+esac
b4b3ce
+
b4b3ce
+ECS_INSTANCE_ID="$(curl -s http://100.100.100.200/latest/meta-data/instance-id)"
b4b3ce
+
b4b3ce
+case $__OCF_ACTION in
b4b3ce
 	start)
b4b3ce
+		ecs_ip_validate
b4b3ce
 		ecs_ip_start;;
b4b3ce
+	stop)
b4b3ce
+		ecs_ip_stop;;
b4b3ce
+	monitor)
b4b3ce
+		ecs_ip_monitor;;
b4b3ce
 	*)	exit $OCF_ERR_UNIMPLEMENTED;;
b4b3ce
-esac
b4b3ce
\ No newline at end of file
b4b3ce
+esac