创建资源时以及通过管理操作更新资源或其资源组的属性时,RGM 将调用 Validate 方法。在进行创建或更新之前,RGM 将调用 Validate,如果从任何节点上的方法返回失败出口代码都将导致创建或更新操作取消。
仅当群集管理员更改资源或资源组属性时 RGM 才调用 Validate,RGM 设置属性或监视器设置资源属性 Status 和 Status_msg 时 RGM 不执行该调用。
只要 PROBE 方法尝试将数据服务故障转移到新节点,Monitor_check 方法也会明确调用 Validate 方法。
RGM 使用传递给其他方法的其他参数调用 Validate,包括要更新的属性和值。因此,数据服务样例中的此方法必须执行不同的 parse_args() 函数以处理其他参数。
数据服务样例中的 Validate 方法用来检验单个属性 Confdir 扩展属性。此属性指向 DNS 配置目录,这对于能否成功地进行 DNS 操作来说至关重要。
由于在 DNS 运行时不能更改配置目录,所以 Confdir 属性在 RTR 文件中被声明为 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 的值。Validate 执行同样的检查,验证配置目录是否可访问并且是否包含非空文件 named.conf。
如果 Validate 在失败状态下退出,所有属性(而不仅仅是 Confdir)的更新或创建操作都将失败。
由于 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) 以捕获资源组名称,(T) 以捕获 RGM 传递的资源类型。
忽略 r 标志(表示系统定义的属性)g 标志(表示资源组属性)和 c 标志(表示资源创建期间进行了验证)。忽略它们,是因为更新资源时,系统调用该方法验证扩展属性。
u 标记将 UPDATE_PROPERTY shell 变量的值设置为 1 (TRUE)。x 标志捕获要更新的属性名称和值。如果 Confdir 是要更新的属性之一,其值将被放于 shell 变量 CONFDIR 中,并且变量 CONFDIR_FOUND 将被设置为 1 (TRUE)。
在其 MAIN 函数中,Validate 首先将 CONFDIR 变量设置为空字符串,并将 UPDATE_PROPERTY 和 CONFDIR_FOUND 设置为 0。
CONFDIR="" UPDATE_PROPERTY=0 CONFDIR_FOUND=0
Validate 调用 parse_args() 解析由 RGM 传递的参数。
parse_args “$@”
Validate 检查 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
特别地,上述代码检查是否因更新而调用 Validate ($UPDATE_PROPERTY == 1) 以及是否未在命令行中找到该属性 (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
如果通过了最终检查,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 以成功状态退出 (0),系统将用新值创建 Confdir。如果 Validate 以失败状态退出 (1),则不会创建 Confdir 和其他任何属性,并生成指出原因的消息。