Guide du développeur de services de données Sun Cluster pour SE Solaris

Fonctionnement de la méthode Validate

Le RGM appelle la méthode de Validation lorsqu'un groupe est créé et lorsqu'une opération de l'administrateur met à jour les propriétés de la ressource ou du groupe qui la contient. Le RGM appelle Validation avant la création ou la mise à jour, et un code de sortie avec échec issu de la méthode sur un noeud entraîne l'annulation de la création ou de la mise à jour.

Le RGM n'appelle Validate que si l'administrateur du cluster modifie les propriétés de la ressource ou du groupe de ressources, et non lorsque le RGM définit des propriétés ou qu'un détecteur définit les propriétés de ressource Status ou Status_msg.


Remarque –

la méthode Monitor_check appelle aussi explicitement la méthode Validate à chaque fois que la méthode PROBE tente de basculer le service de données sur un nouveau noeud.


Actions de la méthode Validate

Le RGM appelle Validate avec des arguments supplémentaires par rapport à ceux passés à d'autres méthodes, et notamment avec les propriétés et valeurs qui sont mises à jour. Par conséquent, cette méthode du service de données modèle doit mettre en oeuvre une fonction parse_args() différente pour gérer les arguments supplémentaires.

La méthode Validate vérifie une seule propriété, la propriété d'extension Confdir. Cette propriété pointe vers le répertoire de configuration DNS, essentiel pour un bon fonctionnement du DNS.


Remarque –

le répertoire de configuration ne pouvant pas être modifié lorsque le DNS fonctionne, la propriété Confdir est déclarée TUNABLE = AT_CREATION dans le fichier RTR. La méthode Validate n'est donc jamais appelée pour vérifier la propriété Confdir après une mise à jour, mais seulement lors de la création de la ressource du service de données.


Si Confdir est l'une des propriétés que le RGM passe à Validate, la fonction parse_args() récupère et enregistre sa valeur. Validate vérifie que le répertoire désigné par la nouvelle valeur de Confdir est accessible et qu'il existe bien dans ce répertoire un fichier named.conf qui contient des données.

Si la fonction parse_args() ne peut récupérer la valeur de Confdir à partir des arguments de ligne de commande que lui transmet le RGM, Validate essaie malgré tout de valider la propriété Confdir. Validate utilise scha_resource_get() pour obtenir la valeur de Confdir à partir de la configuration statique. Validate effectue les mêmes contrôles pour vérifier que le répertoire de configuration est accessible et contient un fichier named.conf non vide.

Si Validate se ferme en affichant un état d'échec, la mise à jour ou la création de toutes les propriétés, et pas seulement de Confdir, échoue.

Fonction d'analyse de la méthode Validation

Le RGM passant à la méthode Validate une série d'arguments différente de celle transmise aux autres méthodes de rappel, Validate requiert une fonction d'analyse des arguments différente de celle des autres méthodes. Reportez-vous à la page de manuel rt_callbacks(1HA) pour obtenir plus d'informations sur les arguments passés à Validate et aux autres méthodes de rappel. L'exemple de code suivant illustre la fonction parse_args() de Validate .

#########################################################################
# Analyse les arguments de Validate.
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Nom de la ressource DNS.
                  RESOURCE_NAME=$OPTARG
                  ;;
         G)
                  # Nom du groupe de ressources dans lequel la 
                  # ressource est configurée.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
         T)
                  # Nom du type de ressource.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
         r)
                  # La méthode n'accède à aucune propriété 
                  # définie au niveau système, d'où l'opération ineffective
                  ;;
         g)
                  # La méthode n'accède à aucune propriété de
                  # groupe de ressources, d'où l'opération ineffective
                  ;;
         c)
                  # Indique que la méthode Validate est appelée lors
                  # de la création de la ressource, l'indicateur est donc ineffectif.
                  ;;
         u)
                  # Indique la mise à jour d'une propriété lorsque la
                  # ressource existe déjà. Si la mise à jour concerne la 
                  # propriété Confdir, alors Confdir doit apparaître dans les
                  # arguments de ligne de commande. Sinon, la méthode doit
                  # spécifiquement le rechercher avec scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Liste de propriétés d'extension. Séparer les paires propriété
                  # et valeur en utilisant "=" comme séparateur.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # Si la propriété d'extension Confdir est trouvée sur la ligne
                  # de commande, enregistrer sa valeur.
                  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
}

Comme la fonction parse_args() pour d'autres méthodes, cette fonction fournit un indicateur (R) pour capturer le nom de la ressource, ( G) pour capturer le nom du groupe de ressources et (T) pour capturer le type de la ressource qui est passée par le RGM.

L'indicateur r (qui indique une propriété définie par le système), l'indicateur g (qui indique une propriété de groupe de ressource) et l'indicateur c (qui indique que la validation est effectuée pendant la création de la ressource) sont ignorés, car cette méthode est appelée pour valider une propriété d'extension lorsque la ressource est mise à jour.

L'indicateur u définit la variable de shell UPDATE_PROPERTY à 1 (TRUE). L'indicateur x capture les noms et valeurs des propriétés qui sont mises à jour. Si Confdir est l'une des propriétés mises à jour, sa valeur est placée dans la variable de shell CONFDIR et la variable CONFDIR_FOUND est définie sur 1 (TRUE).

Validation de Confdir

Dans sa fonction MAIN, Validate définit d'abord la variable CONFDIR sur la chaîne vide et UPDATE_PROPERTY et CONFDIR_FOUND sur 0.

CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Validate appelle parse_args() pour analyser les arguments passés par le RGM.

parse_args “$@”

Validate vérifie si Validate est appelée en conséquence d'une mise à jour des propriétés. Validate vérifie également si la propriété d'extension Confdir était sur la ligne de commande. Validate s'assure que la propriété Confdir a une valeur et, dans le cas contraire, se termine avec un état d'échec et un message d'erreur.

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

# Vérifie que la propriété Confdir a une valeur. Sinon, c'est un échec
# et la fonction se termine avec l'état 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate method for resource "$RESOURCE_NAME " failed"
         exit 1
fi

Remarque –

spécifiquement, le code précédent vérifie si Validate est appelée en conséquence d'une mise à jour ($UPDATE_PROPERTY == 1) et si la propriété n'a pas été trouvée sur la ligne de commande ( CONFDIR_FOUND == 0). Dans ce cas, le code récupère la valeur existante de Confdir en utilisant scha_resource_get(). Si Confdir est présent sur la ligne de commande (CONFDIR_FOUND == 1), la valeur de CONFDIR est obtenue par la fonction parse_args(), non par scha_resource_get().


La méthode Validate utilise la valeur de CONFDIR pour vérifier que le répertoire est accessible. Si le répertoire n'est pas accessible, Validate consigne un message d'erreur et se termine avec un état d'erreur.

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

Avant de valider la mise à jour de la propriété Rép_conf, Validation effectue un contrôle final pour vérifier si le fichier named.conf est présent. Si le fichier n'est pas présent, la méthode consigne un message d'erreur et se termine avec un état d'erreur.

# Vérifier si le fichier named.conf est présent dans le répertoire Confdir 
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 la vérification finale réussit, Validate consigne un message indiquant le succès et se termine avec un état de succès.

# Consigner un message indiquant que la méthode Validate a réussi.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate method for resource "$RESOURCE_NAME \
   " completed successfully"

exit 0

État de Validation à la fermeture

Si Validate se termine avec succès (0), Confdir est créé avec la nouvelle valeur. Si Validate se termine avec un échec (1), Confdir et les autres propriétés éventuelles ne sont pas créées et un message en indiquant la cause est généré.