當建立資源和管理動作更新資源或資源所在群組的屬性時,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 的值。 然後,它將執行相同的檢查,以確認配置目錄是可存取的,並包含非空的 named.conf 檔案。
如果 Validate 以失敗狀態退出,則所有屬性 (而非僅僅 Confdir) 的更新或建立都將失敗。
RGM 將對 Validate 方法傳送一組與其他回呼方法不同的參數,因此 Validate 需要與其他方法不同的剖析引數之函式。 請參閱 rt_callbacks(1HA) 線上說明手冊,以取得有關傳送至 Validate 與其他回呼方法之參數的詳細資訊。 以下說明了 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 是正更新的屬性之一,其值將置於 CONFDIR shell 變數中,且變數 CONFDIR_FOUND 設定為 1 (TRUE)。
在 Validate 的 MAIN 函式中,Validate 首先將 CONFDIR 變數設定為空字串,並將 UPDATE_PROPERTY 和 CONFDIR_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_FOUND == 1) 上找到 Confdir,則 CONFDIR 的值將來自 parse_args() 函式,而非來自 scha_resource_get ()。
然後 Validate 方法將使用 CONFIG_DIR 的值來驗證目錄是否可存取。 如果目錄是不可存取的,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 將執行最終檢查來驗證 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 與任何其他屬性,並會將一條指示原因的訊息發送至叢集管理員。