Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Funktionsweise der Validate-Methode

RGM ruft die Validate-Methode auf, wenn eine Ressource erstellt wird und wenn die Eigenschaften einer Ressource bzw. deren Gruppe durch einen Verwaltungsbefehl aktualisiert werden. RGM ruft Validate auf, bevor die Erstellung bzw. Aktualisierung angewendet wird. Ein Fehlerbeendigungscode der Methode auf einem Knoten führt zum Abbruch der Erstellung bzw. Aktualisierung.

RGM ruft Validate nur auf, wenn die Ressourcen- oder Ressourcengruppeneigenschaften vom Cluster-Administrator geändert werden, nicht, wenn RGM die Eigenschaften festlegt oder ein Monitor die Ressourceneigenschaften Status und Status_msg festlegt.


Hinweis –

Die Monitor_check-Methode ruft auch die Validate-Methode explizit auf, wenn die PROBE-Methode einen Failover-Versuch des Datendienstes an einen neuen Knoten unternimmt.


Funktionsweise der Validate-Methode

RGM ruft Validate mit zusätzlichen Argumenten zu denjenigen auf, die an andere Methoden übergeben werden, einschließlich der Eigenschaften und Werte, die aktualisiert werden. Deshalb muss diese Methode des Beispieldatendienstes eine andere parse_args()-Funktion zum Verarbeiten von zusätzlichen Argumenten implementieren.

Die Validate-Methode im Beispieldatendienst überprüft eine einzige Eigenschaft, die Confdir-Erweiterungseigenschaft. Diese Eigenschaft zeigt auf das DNS-Konfigurationsverzeichnis, das für einen erfolgreichen DNS-Betrieb entscheidend ist.


Hinweis –

Da das Konfigurationsverzeichnis nicht geändert werden kann, während DNS ausgeführt wird, wird die Confdir-Eigenschaft in der RTR-Datei als TUNABLE = AT_CREATION deklariert. Deshalb wird die Validate-Methode niemals aufgerufen, um die Confdir-Eigenschaft als Ergebnis eines Updates zu prüfen, sondern nur bei Erstellung der Datendienstressource.


Wenn Confdir eine der Eigenschaften darstellt, die von RGM an Validate übergeben werden, ruft die parse_args()-Funktion ihren Wert ab und speichert ihn. Validate prüft, ob auf das Verzeichnis, auf das mit dem neuen Wert von Confdir verwiesen wird, zugegriffen werden kann und ob die Datei named.conf in diesem Verzeichnis existiert und Daten enthält.

Wenn die parse_args()-Funktion den Wert von Confdir nicht von den Befehlszeilenargumenten abrufen kann, die von RGM übergeben werden, versucht Validate weiterhin, die Confdir-Eigenschaft zu validieren. Validate verwendet scha_resource_get(), um den Wert von Confdir aus der statischen Konfiguration abzurufen. Validate führt dieselben Prüfungen aus, um zu prüfen, ob auf das Konfigurationsverzeichnis zugegriffen werden kann und ob es die Datei named.conf enthält, die nicht leer ist.

Wenn Validate mit Fehlschlag beendet wird, schlägt die Aktualisierung bzw. Erstellung aller Eigenschaften fehl, nicht nur diejenige von Confdir.

Analysefunktion der Validate-Methode

Da RGM der Validate-Methode einen anderen Satz Argumente übergibt als die anderen Rückmeldemethoden, benötigt Validate eine andere Funktion für die Analyseargumente als die anderen Methoden. In der Online-Dokumentation zu rt_callbacks(1HA) finden Sie weitere Informationen über die Argumente, die an Validate und die anderen Rückmeldemethoden übergeben werden. Folgendes Codebeispiel zeigt die Validate parse_args()-Funktion.

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

Wie im Falle der parse_args()-Funktion für andere Methoden, bietet diese Funktion das Flag (R) zum Erfassen des Ressourcennamens, (G) zum Erfassen des Ressourcengruppennamens und (T) zum Erfassen des Ressourcentyps, der von RGM übergeben wird.

Das r-Flag (das auf eine systemdefinierte Eigenschaft verweist), das g-Flag (das auf eine Ressourcengruppeneigenschaft verweist) und das c-Flag (das angibt, ob die Validierung während der Ressourcenerstellung stattfindet) werden ignoriert. Sie werden ignoriert, weil diese Methode zum Validieren einer Erweiterungseigenschaft aufgerufen wird, wenn die Ressource aktualisiert wird.

Das u-Flag stellt den Wert der UPDATE_PROPERTY-Shell-Variablen auf 1 (TRUE) ein. Das x-Flag erfasst die Namen und Werte der Eigenschaften, die aktualisiert werden. Wenn es sich bei Confdir um eine der aktualisierten Eigenschaften handelt, wird ihr Wert in die CONFDIR-Shell-Variable eingefügt und die Variable CONFDIR_FOUND auf 1 (TRUE) gesetzt.

Validieren von Confdir

In ihrer MAIN-Funktion setzt Validate die CONFDIR-Variable auf die leere Zeichenkette und UPDATE_PROPERTY und CONFDIR_FOUND auf 0.

CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Validate ruft parse_args() auf, um die Argumente zu analysieren, die von RGM übergeben werden.

parse_args “$@”

Validate prüft, ob Validate als Ergebnis einer Eigenschaftenaktualisierung aufgerufen wird. Validate prüft auch, ob die Confdir-Erweiterungseigenschaft in der Befehlszeile angegeben wurde. Validate prüft, ob die Confdir-Eigenschaft einen Wert enthält. Ist dies nicht der Fall, wird sie mit einem Fehlerstatus und einer Fehlermeldung beendet.

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

Hinweis –

Der oben stehende Code prüft insbesondere, ob Validate als Ergebnis einer Aktualisierung aufgerufen wird ($UPDATE_PROPERTY == 1) und ob die Eigenschaft auch nicht in der Befehlszeile angegeben ist ( CONFDIR_FOUND == 0). In diesem Fall ruft der Code den bereits vorhandenen Wert von Confdir unter Verwendung von scha_resource_get() ab. Wenn Confdir in der Befehlszeile gefunden wird (CONFDIR_FOUND == 1), stammt der Wert von CONFDIR von der parse_args()-Funktion, nicht von scha_resource_get().


Die Validate-Methode verwendet den Wert von CONFDIR, um zu prüfen, ob auf das Verzeichnis zugegriffen werden kann. Ist dies nicht der Fall, protokolliert Validate eine Fehlermeldung und wird mit einem Fehlerstatus beendet.

# 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

Vor dem Validieren der Aktualisierung der Confdir-Eigenschaft führt Validate eine letzte Prüfung durch, um festzustellen, ob die named.conf-Datei vorhanden ist. Ist die Datei nicht vorhanden, protokolliert die Methode eine Fehlermeldung und wird mit einem Fehlerstatus beendet.

# 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

Wenn die endgültige Prüfung vorüber ist, protokolliert Validate eine Meldung, die einen Erfolg ausweist und wird mit einem Erfolgsstatus beendet.

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

Wenn Validate mit Erfolg (0) beendet wird, wird Confdir mit dem neuen Wert erstellt. Wenn Validate mit einem Fehler beendet wird (1), werden weder Confdir noch andere Eigenschaften erstellt und es wird eine Meldung, die den Grund angibt, generiert.