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

Método Validate

RGM invoca el 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 invoca Validate sólo cuando se cambian las propiedades del recurso o del grupo mediante una acción administrativa, no cuando RGM establece propiedades ni cuando un supervisor establece las propiedades de recurso Status y Status_msg.


Nota –

El método Monitor_check invoca también explícitamente el método Validate cuando el método PROBE intenta realizar una operación de recuperación de fallos del servicio de datos a otro nodo.


Información general de Validate

RGM invoca Validate con argumentos adicionales a los que se pasan a otros métodos, incluidos las propiedades y los valores que se están actualizando. Por tanto, este método en el servicio de datos de ejemplo debe implementar una función parse_args() diferente para manejar argumentos adicionales.

El método Validate del servicio de datos de ejemplo verifica una única propiedad, la propiedad de extensión Confdir. Esta propiedad apunta 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 tanto, el método Validate no se invoca nunca para verificar la propiedad Confdir tras una actualización; sólo se invoca durante la creación del recurso de 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. Después, Validate verifica que el directorio al que señala el nuevo valor de Confdir esté accesible y que el archivo named.conf exista en el directorio y contenga datos.

Si la función parse_args() no puede recuperar el valor de Confdir desde los argumentos de línea de órdenes que pasa RGM, Validate seguirá intentando validar la propiedad Confdir. Validate utiliza scha_resource_get() para obtener el valor de Confdir desde la configuración estática. Después realiza las mismas comprobaciones para comprobar que el directorio de configuración esté accesible y contenga un archivo named.conf que no esté 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

RGM pasa al método Validate un conjunto diferente de parámetros que los otros métodos de rellamada, por lo que Validate necesita una función para analizar argumentos diferente de la de los demás métodos. Consulte la página de comando man rt_callbacks(1HA) para obtener más información sobre los parámetros que se pasan a Validate y los demás métodos de rellamada. A continuación se muestra la función parse_args() de Validate.


#########################################################################
# Analizar argumentos de Validate.
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Nombre del recurso de DNS.
                  RESOURCE_NAME=$OPTARG
                  ;;
         G)
                  # Nombre del grupo de recursos en el que se ha configurado
                  # el recurso.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
         T)
                  # Nombre del tipo de recurso.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
         r)
                  # El método no está accediendo a ninguna propiedad
                  # definida por el sistema, por lo que no tiene ninguna
                  # operación
                  ;;
         g)
                  # El método no está accediendo a ninguna propiedad de
                  # grupo de recursos, por lo que no tiene ninguna operación
                  ;;
         c)
                  # Indica que se está invocando el método Validate mientras
                  # se crea el recurso, por lo que el indicador no tiene ninguna
                  # operación
                  ;;
         u)
                  # Indica la actualización de una propiedad cuando el recurso
                  # ya existe. Si la actualización es de la propiedad Confdir,
                  # ésta debería aparecer en los argumentos de la línea de
                  # órdenes. En caso contrario, el método debe buscarlo
                  # específicamente con scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Lista de propiedades de extensión. Separar los pares de
                  # propiedad y valor con "=" como separador.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # Si la propiedad de extensión Confdir se encuentra en la
                  # línea de órdenes, anotar su valor.
                  if [ $PROPERTY == "Confdir" ]; then
                           CONFDIR=$VAL
                           CONFDIR_FOUND=1
                  fi
                  ;;
         *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$SYSLOG_TAG] \
                  "ERROR: Option $OPTARG desconocida"
                  exit 1
                  ;;
         esac
   done
}

Al igual que con la función parse_args() para otros métodos, esta función proporciona un indicador (R) para capturar el nombre de recurso, (G) para capturar el nombre de grupo de recurso y (T) para capturar el tipo de recurso que ha pasado RGM.

Los indicadores r (que indica una propiedad definida por el sistema), g (que indica una propiedad de grupo de recursos) y c (que indica que la validación se produce durante la creación del recurso) se ignoran porque este método se invoca para validar una propiedad de extensión cuando el recurso se está actualizando.

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

Validación de Confdir

En su función MAIN, Validate establece primero la variable CONFDIR en la secuencia vacía y UPDATE_PROPERTY y CONFDIR_FOUND en 0.


CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Después, Validate invoca parse_args() para analizar los argumentos que pasa RGM.


parse_args “$@”

Validate comprueba entonces si se está invocando Validate por una actualización de propiedades y si la propiedad de extensión Confdir estaba en la línea de órdenes Validate verifica si la propiedad Confdir tiene un valor y, en caso contrario, 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

# Verificar que la propiedad Confdir tiene un valor. En caso contrario,
# hay un fallo y sale con estado 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Método de validar el recurso "$RESOURCE_NAME " no satisfactorio"
         exit 1
fi


Nota –

Específicamente, el código anterior comprueba si una actualización ($UPDATE_PROPERTY == 1) está invocando Validate y si la propiedad no se ha encontrado en la línea de órdenes (CONFDIR_FOUND == 0), en cuyo caso recupera el valor existente de Confdir con scha_resource_get(). Si se encontró Confdir en la línea de órdenes (CONFDIR_FOUND == 1), el valor de CONFDIR proviene de la función parse_args(), no de scha_resource_get().


El método Validate usa el valor de CONFDIR para verificar que el directorio es accesible. Si no lo fuera, Validate registraría un mensaje de error y cerraría con un estado de error.


# Comprobar si $CONFDIR es accesible.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directorio $CONFDIR falta o no está montado"
   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. En caso de que no se encuentre, el método registra un mensaje de error y sale con un estado de error.


# Comprobar que el archivo named.conf esté presente en el directorio Confdir
if [ ! -s $CONFDIR/named.conf ]; then
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} El archivo $CONFDIR/named.conf falta o está vacío"
         exit 1
fi

Si se supera la comprobación final, Validate registra un mensaje que indica que la operación ha sido satisfactoria y sale con estado satisfactorio.


# Registrar un mensaje que indique que el método Validate ha sido satisfactorio.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Método de validar para el recurso "$RESOURCE_NAME \
   " se ha completado satisfactoriamente"

exit 0

Estado de salida de Validate

Si Validate sale con éxito (0), se crea Confdir con el nuevo valor. Si Validate sale con fallo (1), no se crea Confdir ni ninguna otra propiedad y se envía un mensaje al administrador del clúster.