Sun Cluster 数据服务开发者指南(适用于 Solaris OS)

Validate 方法

创建资源时以及通过管理操作更新资源或其资源组的特性时,RGM 将调用 Validate 方法。 在进行创建或更新之前,RGM 将调用 Validate,任何节点上该方法返回失败出口代码都将导致创建或更新操作取消。

仅当通过管理操作更改资源或组特性时(而不是在 RGM 设置特性时或监视器设置资源特性 StatusStatus_msg 时),RGM 才调用 Validate


注意:

PROBE 方法试图将数据服务故障切换到新节点时,Monitor_check 方法还显式调用 Validate 方法。


Validate 概述

RGM 通过不同于传送到其它方法的变量的附加变量(包括所更新的特性和值)调用 Validate。 因此,在数据服务样例中此方法必须实现一个不同的 parse_args() 函数以处理附加变量。

数据服务样例中的 Validate 方法用来检验单个特性 Confdir 扩展特性。 此特性指向 DNS 配置目录,这对于能否成功地进行 DNS 操作来说至关重要。


注意:

因为在 DNS 运行时无法更改配置目录,RTR 文件中 Confdir 特性被声明为 TUNABLE = AT_CREATION。 因此,进行更新后将永远不会调用 Validate 方法来检验 Confdir 特性,仅当创建数据服务资源时才会调用。


如果 Confdir 是 RGM 传送到 Validate 的特性之一,则 parse_args() 函数将进行检索并保存其值。 然后 Validate 将检验通过 Confdir 的新值所指向的目录是否可以存取,并检验在该目录中 named.conf 文件是否存在并包含有数据。

如果 parse_args() 函数无法从 RGM 传送的命令行变量中检索到 Confdir 的值,Validate 仍将尝试验证 Confdir 特性。 Validate 使用 scha_resource_get() 从静态配置中获取 Confdir 的值。 然后它将执行相同的检查操作,以检验该配置目录是否可以存取并包含非空的 named.conf 文件。

如果 Validate 在失败状态下退出,所有特性(而不仅仅是 Confdir)的更新或创建操作都将失败。

Validate 方法分析函数

RGM 将向 Validate 方法传送一组与其它回叫方法不同的参数,因此 Validate 需要使用与其它方法的函数不同的函数来分析变量。 有关传送到 Validate 以及其它回叫方法的参数的详细信息,请参阅 rt_callbacks(1HA) 手册页。 以下内容说明了 Validate parse_args() 函数。


#########################################################################
# Parse Validate arguments.
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Name of the DNS resource.
                  RESOURCE_NAME=$OPTARG
                  ;;
         G)
                  # Name of the resource group in which the resource is
                  # configured.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
         T)
                  # Name of the resource type.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
         r)
                  # The method is not accessing any system defined
                  # properties so this is a no-op
                  ;;
         g)
                  # The method is not accessing any resource group
                  # properties, so this is a no-op
                  ;;
         c)
                  # Indicates the Validate method is being called while
                  # creating the resource, so this flag is a no-op.
                  ;;
         u)
                  # Indicates the updating of a property when the
                  # resource already exists. If the update is to the
                  # Confdir property then Confdir should appear in the 
                  # command-line arguments. If it does not, the method must 
                  # look for it specifically using scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Extension property list. Separate the property and 
                  # value pairs using "=" as the separator.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # If the Confdir extension property is found on the 
                  # command line, note its value. 
                  if [ $PROPERTY == "Confdir" ]; then
                           CONFDIR=$VAL
                           CONFDIR_FOUND=1
                  fi
                  ;;
         *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$SYSLOG_TAG] \
                  "ERROR: Option $OPTARG unknown"
                  exit 1
                  ;;
         esac
   done
}

与其它方法的 parse_args() 函数一样,此函数将提供一个用于捕获资源名称的标记 (R)、用于捕获资源组名称的标记 (G) 和用于捕获 RGM 所传送的资源类型的标记 (T)。

将忽略 r 标记(用于表示系统定义的特性)、g 标记(用于表示资源组特性)和 c 标记(用于表示在创建资源时已进行了检验),因为当更新资源时将调用此方法来验证扩展特性。

u 标记将 UPDATE_PROPERTY shell 变量的值设置为 1 (TRUE)。 x 标记捕获所更新的特性的名称和值。 如果 Confdir 是所更新的特性之一,则其值将放置在 CONFDIR shell 变量中,且变量 CONFDIR_FOUND 将设置为 1 (TRUE)。

验证 Confdir

MAIN 函数中,Validate 首先将 CONFDIR 变量设置成空字符串,并将 UPDATE_PROPERTYCONFDIR_FOUND 设置成 0。


CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

然后,Validate 将调用 parse_args() 分析 RGM 传送的变量。


parse_args “$@”

Validate 随后将检查特性更新后是否调用了 Validate,并检查 Confdir 扩展特性是否位于命令行上。 接下来,Validate 将检验 Confdir 特性是否具有值,如果没有,将在失败状态下退出并记录一条错误消息。


if ( (( $UPDATE_PROPERTY == 1 )) &&  (( CONFDIR_FOUND == 0 )) ); then
         config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
            -G $RESOURCEGROUP_NAME Confdir`
         CONFDIR=`echo $config_info | awk '{print $2}'`
fi

# Verify that the Confdir property has a value. If not there is a failure
# and exit with status 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate method for resource "$RESOURCE_NAME " failed"
         exit 1
fi


注意:

具体地说,上述代码将检查更新后 ($UPDATE_PROPERTY == 1) 是否调用了 Validate,并检查该特性是否位于命令行上,如果在命令行上 (CONFDIR_FOUND == 0),它将使用 scha_resource_get() 检索 Confdir 的现有值。 如果发现 Confdir 位于命令行上 (CONFDIR_FOUND == 1),则 CONFDIR 的值由 parse_args() 函数确定,而不是由 scha_resource_get() 确定。


然后,Validate 方法将使用 CONFDIR 的值检验该目录是否可以存取。 如果不可以存取,Validate 将记录一条错误消息并在错误状态下退出。


# Check if $CONFDIR is accessible.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFDIR missing or not mounted"
   exit 1
fi

在验证 Confdir 特性的更新之前,Validate 将执行 final 检查来检验 named.conf 文件是否存在。 如果不存在,该方法将记录一条错误消息并在错误状态下退出。


# Check that the named.conf file is present in the Confdir directory
if [ ! -s $CONFDIR/named.conf ]; then
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} File $CONFDIR/named.conf is missing or empty"
         exit 1
fi

如果该 final 检查通过,Validate 将记录一条表明检查成功的消息并在成功状态下退出。


# Log a message indicating that the Validate method was successful.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate method for resource "$RESOURCE_NAME \
   " completed successfully"

exit 0

Validate 退出状态

如果 Validate 在成功 (0) 状态下退出,则使用新值创建 Confdir。 如果 Validate 在失败 (1) 状态下退出,将不会创建 Confdir 和其它任何特性并记录一条消息,说明发送至群集管理员的原因。