Sun Cluster: Guía del desarrollador de los servicios de datos del sistema operativo Solaris

Funcionamiento del método Validate

RGM llama al método Validate cuando se crea un recurso y cuando una acción administrativa actualiza las propiedades del recurso o el grupo que lo contiene. RGM invoca Validate antes de que se apliquen la creación o la actualización y un código de salida fallido del método en cualquier nodo provoque la cancelación de la creación o actualización.

RGM sólo llama a Validate cuando el administrador del clúster modifica las propiedades del recurso o grupo de recurso, y no cuando RGM establece las propiedades o el supervisor configura las propiedades de recursos Status y Status_msg.


Nota –

El método Monitor_check también llama de forma explícita a Validate cada vez que el método PROBE intenta realizar una recuperación ante fallos del servicio de datos en un nuevo nodo.


Comportamiento del método Validate

RGM llama a Validate con argumentos adicionales a aquéllos transferidos a otros métodos, incluidos los valores y las propiedades que se están actualizando. Por lo tanto, este método del servicio de datos de ejemplo debe implementar una función parse_args() diferente para administrar los argumentos adicionales.

El método Validate del servicio de datos de ejemplo verifica una única propiedad, la propiedad de extensión Confdir. Esta propiedad señala al directorio de configuración de DNS, que es fundamental para una operación satisfactoria del DNS.


Nota –

Dado que no se puede modificar el directorio de configuración mientras DNS está en ejecución, la propiedad Confdir se declara en el archivo RTR como TUNABLE = AT_CREATION . Por lo tanto, el método Validate nunca se invoca para verificar la propiedad Confdir como resultado de una actualización, sino sólo cuando se crea el recurso del servicio de datos.


Si Confdir es una de las propiedades que RGM pasa a Validate, la función parse_args() recupera y guarda su valor. Validate comprueba que el directorio al que Confdir señala está accesible y que el archivo named.conf existe en ese directorio y contiene datos.

Si la función parse_args() no puede recuperar el valor de Confdir desde los argumentos de línea de comandos transferidos por RGM, Validate intentará aún validar la propiedad Confdir. Validate utiliza scha_resource_get() para obtener el valor de Confdir desde la configuración estática. Validate realiza las mismas comprobaciones para verificar que el directorio de configuración está accesible y contiene un archivo named.conf no vacío.

Si Validate sale con un fallo, fallarán la actualización o la creación de todas las propiedades, no sólo de Confdir.

Función de análisis del método Validate

Como el método pasa al método Validate un conjunto de argumentos diferentes al de los otros métodos de rellamada, Validate require una función distinta para analizar los argumentos. Consulte la página de comando man rt_callbacks(1HA) para obtener más información sobre los argumentos que se pasan a Validate y a los otros métodos de rellamada. El siguiente código de ejemplo muestra la función parse_args() de Validate .

#########################################################################
# 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
}

Al igual que la función parse_args() de los otros métodos, esta función proporciona los indicadores (R) para capturar el nombre del recurso, ( G) para capturar el nombre del grupo de recursos y (T) para capturar el tipo de recurso transferido por RGM.

Se omitirán los indicadores r (que distingue una propiedad definida por el sistema), g (que distingue una propiedad del grupo de recursos) y c (que señala que se está produciendo la validación durante la creación del recurso). Se omiten porque se está llamando a este método para validar la propiedad de extensión durante la actualización del recurso.

El indicador u establece el valor de la variable del shell UPDATE_PROPERTY en 1 (TRUE). El indicador x captura el nombre y los valores de las propiedades que se están actualizando. Si Confdir es una de las propiedades que se están actualizando, su valor se incluye en la variables de shell CONFDIR y la variable CONFDIR_FOUND se establece en 1 (TRUE).

Validación de Confdir

En la función MAIN, Validate establece en primer lugar la variable CONFDIR en una cadena vacía, y UPDATE_PROPERTY y CONFDIR_FOUND en 0.

CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Validate llama a parse_args() para analizar los argumentos transferidos por RGM.

parse_args “$@”

Validate comprueba si se está llamando al método Validate como resultado de la actualización de las propiedades. Validate también comprueba si la propiedad de extensión Confdir se encuentra en la línea de comandos. Validate verifica que la propiedad Confdir tiene un valor y, en caso de no ser así, sale con un estado de fallo y un mensaje de error.

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

Nota –

En concreto, el código anterior comprueba si se está llamando a Validate como resultado de la actualización ($UPDATE_PROPERTY == 1) y si la propiedad no se encuentra en la línea de comandos ( CONFDIR_FOUND == 0). En ese caso, el código recupera el valor existente de Confdir mediante scha_resource_get(). Si Confdir se encuentra en la línea de comandos (CONFDIR_FOUND == 1), el valor de CONFDIR proviene de la función parse_args() y no de scha_resource_get().


El método Validate utiliza el valor de CONFDIRpara comprobar que se puede acceder al directorio. De lo contrario, Validate registra un mensaje de error y sale con un estado de error.

# 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

Antes de validar la actualización de la propiedad Confdir, Validate realiza una comprobación final para verificar si se encuentra el archivo named.conf. Si no lo está, el método registra un mensaje de error y sale con un estado de error.

# 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

Si se supera la comprobación final, Validate registra un mensaje satisfactorio y sale con un estado de éxito.

# 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

Estado de salida de Validate

Si Validate sale con éxito (0), se crea Confdir con el valor nuevo. Si, por el contrario, Validate sale con fallos (1), no se crean Confdir ni las demás propiedades y se genera un mensaje en el que se indica el motivo.