Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

Navigation

Example: Limiting the Number of E1 Interfaces

This commit script example limits the number of E1 interfaces configured on a Channelized STM1 Intelligent Queuing (IQ) PIC to avoid contention issues with per-unit-schedulers.

Requirements

This example uses a device running Junos OS with a Channelized STM1 Intelligent Queuing (IQ) PIC.

Overview and Commit Script

The following script ensures that there are no more than 16 E1 interfaces configured on a channelized STM1 IQ interface. 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 parameter limit. If there are more E1 interfaces than limit, a commit error is generated, and the commit operation fails.

The example script is shown in both XSLT and SLAX syntax:

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.";
                }
            }
        }
    }
}

Configuration

Step-by-Step Procedure

To download, enable, and test the script:

  1. Copy the XSLT or SLAX script into a text file, name the file e1-limit.xsl or e1-limit.slax as appropriate, and copy it to the /var/db/scripts/commit/ directory on the device.
  2. Select the following test 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 e1-limit.slax.

    system {scripts {commit {file 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 by using the mouse and the paste icon.
    2. Press Enter.
    3. Press Ctrl+d.
  4. Issue the commit command to commit the configuration.

    user@host# commit

Verification

Verifying the Commit Script Execution

Purpose

Verify that the script behaves as expected.

Action

Review the output of the commit command. The sample configuration stanzas channelize a cstm1-0/1/0 interface into 17 E1 interfaces, so the script generates an error, and the commit operation fails. The following output appears after issuing a commit command:

[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

Published: 2013-07-26

Supported Platforms

Published: 2013-07-26