Example: Limiting the Number of E1 Interfaces

This example limits the number of E1 interfaces configured on a Channelized STM1 Intelligent Queuing (IQ) Physical Interface Card (PIC).

For each channelized STM1 interface (cstm1-), the set of corresponding E1 interfaces is selected. The number of those interfaces, as determined by the built-in Extensible Stylesheet Language Transformations (XSLT) count() function, cannot exceed the limit set by the global variable $limit. If there are more E1 interfaces than $limit, a commit error is generated and the commit operation fails.

XSLT Syntax

<?xml version="1.0" standalone="yes"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:junos="http://xml.juniper.net/junos/*/junos"
    xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"
    xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0">
    <xsl:import href="../import/junos.xsl"/>
 
    <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>
</xsl:stylesheet>

SLAX Syntax

version 1.0;
ns junos = "http://xml.juniper.net/junos/*/junos";
ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
import "../import/junos.xsl";
 
param $limit = 16;
match configuration {
    var $interfaces = interfaces;
    for-each ($interfaces/interface[starts-with(name, 'cstm1-')]) {
        var $triple = substring-after(name, 'cstm1-');
        var $e1name = 'e1-' _ $triple;
        var $count = count($interfaces/interface[starts-with(name, $e1name)]);
        if ($count > $limit) {
            <xnm:error> {
                <edit-path> "[edit interfaces]";
                <statement> name;
                <message> {
                    expr "E1 interface limit exceeded on CSTM1 IQ PIC. ";
                    expr $count;
                    expr " E1 interfaces are configured, but only ";
                    expr $limit;
                    expr " are allowed.";
                }
            }
        }
    }
}

Testing the ex-16-e1-limit Script

To test the ex-16-e1-limit script, perform the following steps:

  1. Copy the XSLT or SLAX script from Example: Limiting the Number of E1 Interfaces into a text file, name the file ex-16-e1-limit.xsl or ex-16-e1-limit.slax as appropriate, and copy it to the /var/db/scripts/commit directory on the device.
  2. Select the following configuration stanzas, and press Ctrl+c to copy them to the clipboard. If you are using the SLAX version of the script, change the filename at the [edit system scripts commit file] hierarchy level to ex-16-e1-limit.slax.

    system {scripts {commit {file ex-16-e1-limit.xsl;}}}interfaces {cau4-0/1/0 {partition 1 interface-type ce1;partition 2-18 interface-type e1;}cstm1-0/1/0 {no-partition interface-type cau4;}ce1-0/1/0:1 {clocking internal;e1-options {framing g704;}partition 1 timeslots 1-4 interface-type ds;}ds-0/1/0:1:1 {no-keepalives;dce;encapsulation frame-relay;lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.0/31;}}}e1-0/1/0:2 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.2/31;}}}e1-0/1/0:3 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.4/31;}}}e1-0/1/0:4 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.6/31;}}}e1-0/1/0:5 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.8/31;}}}e1-0/1/0:6 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.10/31;}}}e1-0/1/0:7 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.12/31;}}}e1-0/1/0:8 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.14/31;}}}e1-0/1/0:9 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.16/31;}}}e1-0/1/0:10 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.18/31;}}}e1-0/1/0:11 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.20/31;}}}e1-0/1/0:12 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.22/31;}}}e1-0/1/0:13 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.24/31;}}}e1-0/1/0:14 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.26/31;}}}e1-0/1/0:15 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.28/31;}}}e1-0/1/0:16 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.30/31;}}}e1-0/1/0:17 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.32/31;}}}e1-0/1/0:18 {no-keepalives;per-unit-scheduler;dce;clocking internal;encapsulation frame-relay;e1-options {framing g704;}lmi {lmi-type ansi;}unit 100 {point-to-point;dlci 100;family inet {address 10.0.0.34/31;}}}}
  3. In configuration mode, issue the load merge terminal command to merge the stanzas into your device configuration:

    [edit]user@host# load merge terminal[Type ^D at a new line to end input]... Paste the contents of the clipboard here ...
    1. At the prompt, paste the contents of the clipboard using the mouse and the paste icon.
    2. Press Enter.
    3. Press Ctrl+d.
  4. Issue the commit command. The following output appears:

    [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