Example: Limit 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
Procedure
Step-by-Step Procedure
To download, enable, and test the script:
Copy the 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.
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; } } } }
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 ...
At the prompt, paste the contents of the clipboard by using the mouse and the paste icon.
Press Enter.
Press Ctrl+d.
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