Guide des développeurs pour les services de données Sun Cluster 3.1 10/03

Méthode de Validation

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.

Il n'appelle Validation que lorsque les propriétés de la ressource ou du groupe sont modifiées par une opération de l'administrateur, et non lorsque le RGM définit des propriétés, ou lorsqu'un détecteur définit les propriétés de ressource Statut et msg_statut.


Remarque :

la méthode de Contrôle_détecteur appelle aussi explicitement la méthode de Validation lorsque la méthode de SONDE tente de basculer le service de données sur un autre noeud.


Présentation de Validation

Le RGM appelle Validation avec des arguments différents de ceux transmis aux autres méthodes, y compris les propriétés et valeurs mises à jour. C'est la raison pour laquelle cette méthode du service de données modèle doit mettre en oeuvre une fonction parse_args() pour gérer les autres arguments.

La méthode de Validation vérifie une seule propriété, la propriété d'extension Rép_conf. 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 tourne, la propriété Rép_conf est déclarée RÉGLABLE = À_LA_CRÉATION dans le fichier RTR. C'est pourquoi la méthode de Validation n'est jamais appelée pour vérifier la propriété Rép_conf à la suite d'une mise à jour, mais uniquement à la création de la ressource du service de données.


Si Rép_conf est l'une des propriétés transmises par le RGM à Validation, la fonction parse_args() récupère et enregistre sa valeur. Validation vérifie alors si le répertoire vers lequel pointe la nouvelle valeur de Confdir est accessible et si le fichier named.conf existe dans ce répertoire et contient certaines données.

Si la fonction parse_args() ne peut pas récupérer la valeur de Rép_conf à partir des arguments de ligne de commande transmis par le RGM, Validation tente néanmoins de valider la propriété Rép_conf. Validation utilise scha_resource_get() pour obtenir la valeur de Confdir à partir de la configuration statique. Ensuite, elle effectue les mêmes contrôles afin de s'assurer que le répertoire de configuration est accessible et contient un fichier named.conf qui ne soit pas vierge.

Si Validation 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 Rép_conf, échoue.

Fonction d'analyse de la méthode de Validation

Le RGM transmet à la méthode de Validation un ensemble de paramètres différent de celui des autres méthodes de rappel, de telle manière que Validation a besoin d'une autre fonction d'analyse des arguments que les autres méthodes. Reportez-vous à la page de manuel rt_callbacks(1HA) pour de plus amples informations sur les paramètres transmis à Validation et aux autres méthodes de rappel. L'exemple suivant montre la fonction Validation parse_args().


#########################################################################
# Analyser les arguments Validation
#
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
                  NOM_RESSOURCE=$OPTARG
                  ;;
         G)
                  # Nom du groupe dans lequel est configurée
                  # la ressource.
                  NOM_GROUPE_RESSOURCE=$OPTARG
                  ;;
         T)
                  # Nom du type de ressource.
                  NOM_TYPE_RESSOURCE=$OPTARG
                  ;;
         r)
                  # La méthode n'accède pas à des propriétés définies
                  # par le système. Aucune action.
                  ;;
         g)
                  # La méthode n'accède pas à des propriétés du groupe de
                  # ressources. Aucune action.
                  ;;
         c)
                  # Indique que la méthode de Validation est appelée lors
                  # de la création de la ressource. Indicateur sans action.
                  ;;
         u)
                  # Indique la mise à jour d'une propriété quand la
                  # ressource existe déjà. Si la mise à jour est adressée
                  # à la propriété Rép_conf, alors Rép_conf doit apparaître dans
                  # les arguments de ligne de commande. Dans le cas contraire,
                  # la méthode doit le rechercher à l'aide de scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Liste des propriétés d'extension. Séparer les couples propriété et
                  # valeur en utilisant "=" comme séparateur.
                  PROPRIÉTÉ=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # Si la propriété d'extension se trouve sur la ligne de
                  # commande, noter sa valeur.
                  if [ $PROPERTY == "Confdir" ]; then
                           RÉP_CONF=$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() des autres méthodes, cette fonction propose 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 ressource transmis par le RGM.

Les indicateurs r (propriété définie par le système), g (propriété du groupe de ressources) et c (validation à la création de la ressource) sont ignorés parce que cette méthode est appelée pour valider une propriété d'extension lors de la mise à jour de la ressource.

L'indicateur u définit la variable de shell UPDATE_PROPERTY à 1 (TRUE). Le témoin x capture les noms et les valeurs des propriétés mises à jour. Si Rép_conf 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 réglée sur 1 (TRUE).

Validation de Rép_conf

Dans sa fonction MAIN, Validate attribue d'abord une chaîne vide à la variable CONFDIR et une valeur 0 à UPDATE_PROPERTY et à CONFDIR_FOUND.


CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Validation appelle ensuite parse_args() pour analyser les arguments transmis par le RGM.


parse_args “$@”

Validation vérifie alors si Validation est appelée à la suite d'une mise à jour des propriétés et si la propriété d'extension Rép_conf se trouvait sur la ligne de commande. Validation vérifie alors si la propriété Rép_conf a une valeur et, si ce n'est pas le cas, elle se ferme en affichant un état d'échec et émet un message d'erreur.


if ( (( $UPDATE_PROPERTY == 1 )) &&  (( CONFDIR_FOUND == 0 )) ); then
         info_config=`scha_resource_get -O Extension -R $RESOURCE_NAME \
            -G $RESOURCEGROUP_NAME Confdir`
         CONFDIR=`echo $config_info | awk '{print $2}'`
fi

# Vérifier que la propriété Rép_conf possède une valeur. Dans le cas contraire, il y a échec
# et sortie 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 :

le code précédent vérifie tout spécialement si Validation est appelée à la suite d'une mise à jour ($UPDATE_PROPERTY == 1 ) et si la propriété n'a pas été trouvée dans la ligne de commande (CONFDIR_FOUND == 0), auquel cas il récupère la valeur existante de Rép_conf à l'aide de scha_resource_get (). Si Rép_conf a été trouvé dans la ligne de commande ( CONFDIR_FOUND == 1), la valeur de RÉP_CONF provient de la fonction parse_args(), et non de scha_resource_get().


La méthode de Validation utilise alors la valeur de RÉP_CONF pour vérifier si le répertoire est accessible. Si ce n'est pas le cas, Validation consigne un message d'erreur et se ferme en affichant un état d'échec.


# 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 ce n'est pas le cas, la méthode enregistre un message d'erreur et se ferme en affichant un état d'échec.


# Vérifier si le fichier named.conf est présent dans le répertoire Rép_conf
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 le dernier contrôle réussit, Validation consigne un message indiquant une réussite et se ferme avec un état de réussite.


# Consigner un message indiquant que la méthode de Validation 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 Validation se ferme avec succès (0) Rép_conf est créé avec la nouvelle valeur. Si Validation se ferme avec un échec (1), Rép_conf et les autres propriétés ne sont pas créées et un message indiquant la raison de cet échec est envoyé à l'administrateur du cluster.