Considérations de conception pour les scripts de validation
Une fois que vous avez déjà examiné les données de configuration Junos OS en XML, la création de scripts de validation est assez simple. Cette section fournit des conseils et des modèles courants pour le développement de scripts de validation à l’aide de XSLT.
Le XSLT est un langage interprété, ce qui fait de la performance un facteur important. Pour des performances optimales, réduisez les traversées de nœuds et les tests effectués sur chaque nœud. Si possible, utilisez l’attribut select sur une invocation récursive <xsl:apply-templates> pour limiter la partie de la hiérarchie de documents visitée.
Par exemple, l’attribut suivant select limite les nœuds à évaluer en spécifiant les interfaces SONET/SDH dont la inet famille de protocoles (IPv4) est activée :
<xsl:apply-templates select="interfaces/interface[starts-with(name, 'so-') and unit/family/inet]"/>
L’exemple suivant contient deux <xsl:apply-templates> instructions qui limitent la portée du script aux import instructions configurées au niveau et [edit protocols isis] de la [edit protocols ospf] hiérarchie :
<xsl:template match="configuration"> <xsl:apply-templates select="protocols/ospf/import"/> <xsl:apply-templates select="protocols/isis/import"/> <!-- ... body of template ... --> </xsl:template>
Dans une langue interprétée, faire n’importe quoi plus d’une fois peut affecter les performances. Si le script doit référencer un nœud ou un ensemble de nœuds à plusieurs reprises, créez une variable qui contient l’ensemble de nœuds, puis faites plusieurs références à la variable. Par exemple, la déclaration de variable suivante crée une variable appelée mpls qui se résout au niveau hiérarchique [edit protocols mpls] . Cela permet au script de traverser la /protocols/ hiérarchie pour rechercher le mpls/ nœud une seule fois.
<xsl:variable name="mpls" select="/protocols/mpls"/> <xsl:choose> <xsl:when test="$mpls/path-mtu/allow-fragmentation"> <!-- ... --> </xsl:when> <xsl:when test="$mpls/hop-limit > 40"> <!-- ... --> </xsl:when> </xsl:choose>
Les variables sont également importantes lors de l’utilisation d’instructions <xsl:for-each> , car le nœud de contexte actuel examine chaque nœud sélectionné par l’instruction <xsl:for-each> . Par exemple, le script suivant utilise plusieurs variables pour stocker et se référer aux valeurs lorsque l’instruction <xsl:for-each> évalue les interfaces E1 configurées sur toutes les interfaces STM1 canalisées (cstm1-) :
<xsl:param name="limit" select="16"/>
<xsl:template match="configuration">
<xsl:variable name="interfaces" select="interfaces"/>
<xsl:for-each select="$interfaces/interface[starts-with(name, 'cstm1-')]">
<xsl:variable name="triple" select="substring-after(name, 'cstm1-')"/>
<xsl:variable name="e1name" select="concat('e1-', $triple)"/>
<xsl:variable name="count"
select="count($interfaces/interface[starts-with(name, $e1name)])"/>
<xsl:if test="$count > $limit">
<xnm:error>
<edit-path>[edit interfaces]</edit-path>
<statement><xsl:value-of select="name"/></statement>
<message>
<xsl:text>E1 interface limit exceeded on CSTM1 IQ PIC.
</xsl:text>
<xsl:value-of select="$count"/>
<xsl:text> E1 interfaces are configured, but only
</xsl:text>
<xsl:value-of select="$limit"/>
<xsl:text> are allowed.</xsl:text>
</message>
</xnm:error>
</xsl:if>
</xsl:for-each>
</xsl:template>
Si vous canalisez une interface cstm1-0/1/0 en 17 interfaces E1, le script fait apparaître le message d’erreur suivant lorsque vous envoyez la commit commande. (Pour plus d’informations sur cet exemple, voir Exemple : Limiter le nombre d’interfaces E1.)
[edit] user@host# commit [edit interfaces] 'cstm1-0/1/0' E1 interface limit exceeded on CSTM1 IQ PIC. 17 E1 interfaces are configured, but only 16 are allowed. error: 1 error reported by commit scripts error: commit script failure