Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

header-navigation
keyboard_arrow_up
close
keyboard_arrow_left
Automation Scripting User Guide
Table of Contents Expand all
list Table of Contents
file_download PDF
{ "lLangCode": "en", "lName": "English", "lCountryCode": "us", "transcode": "en_US" }
English
keyboard_arrow_right

Design Considerations for Commit Scripts

date_range 13-Feb-21

After you have some experience looking at Junos OS configuration data in XML, creating commit scripts is fairly straightforward. This section provides some advice and common patterns for developing commit scripts using XSLT.

XSLT is an interpreted language, making performance an important consideration. For best performance, minimize node traversals and testing performed on each node. When possible, use the select attribute on a recursive <xsl:apply-templates> invocation to limit the portion of the document hierarchy being visited.

For example, the following select attribute limits the nodes to be evaluated by specifying SONET/SDH interfaces that have the inet (IPv4) protocol family enabled:

content_copy zoom_out_map
<xsl:apply-templates select="interfaces/interface[starts-with(name, 'so-') and unit/family/inet]"/>

The following example contains two <xsl:apply-templates> instructions that limit the scope of the script to the import statements configured at the [edit protocols ospf] and [edit protocols isis] hierarchy levels:

content_copy zoom_out_map
<xsl:template match="configuration">
    <xsl:apply-templates select="protocols/ospf/import"/>
    <xsl:apply-templates select="protocols/isis/import"/>
    <!-- ... body of template ... -->
</xsl:template>

In an interpreted language, doing anything more than once can affect performance. If the script needs to reference a node or node set repeatedly, make a variable that holds the node set, and then make multiple references to the variable. For example, the following variable declaration creates a variable called mpls that resolves to the [edit protocols mpls] hierarchy level. This allows the script to traverse the /protocols/ hierarchy searching for the mpls/ node only once.

content_copy zoom_out_map
<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 &gt; 40">
        <!-- ... -->
    </xsl:when>
</xsl:choose>

Variables are also important when using <xsl:for-each> instructions, because the current context node examines each node selected by the <xsl:for-each> instruction. For example, the following script uses multiple variables to store and refer to values as the <xsl:for-each> instruction evaluates the E1 interfaces that are configured on all channelized STM1 (cstm1-) interfaces:

content_copy zoom_out_map
<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>

If you channelize a cstm1-0/1/0 interface into 17 E1 interfaces, the script causes the following error message to appear when you issue the commit command. (For more information about this example, see Example: Limit the Number of E1 Interfaces.)

content_copy zoom_out_map
[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
footer-navigation