If you want to enable Multiprotocol Label Switching (MPLS) on an interface, you must make changes at both the [edit interfaces] and [edit protocols mpls] hierarchy levels. This example shows you how to use commit scripts to decrease the amount of manual configuration.
This example performs two related tasks. If an interface has [family iso] configured but not [family mpls], a configuration change is made (using the <jcs:emit-change> template) to enable MPLS. MPLS is not valid on loopback interfaces (loX), so this script ignores loopback interfaces. Secondly, if the interface is not configured at the [edit protocols mpls] hierarchy level, a change is made to add the interface. Both changes are accompanied by appropriate warning messages.
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:template match="configuration">
<xsl:variable name="mpls" select="protocols/mpls"/>
<xsl:for-each select="interfaces/interface[not(starts-with(name,'lo'))]
/unit[family/iso]">
<xsl:variable name="ifname" select="concat(../name, '.', name)"/>
<xsl:if test="not(family/mpls)">
<xsl:call-template name="jcs:emit-change">
<xsl:with-param name="message">
<xsl:text>Adding 'family mpls' to ISO-enabled interface</xsl:text>
</xsl:with-param>
<xsl:with-param name="content">
<family>
<mpls/>
</family>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:if test="$mpls and not($mpls/interface[name = $ifname])">
<xsl:call-template name="jcs:emit-change">
<xsl:with-param name="message">
<xsl:text>Adding ISO-enabled interface </xsl:text>
<xsl:value-of select="$ifname"/>
<xsl:text> to [protocols mpls]</xsl:text>
</xsl:with-param>
<xsl:with-param name="dot" select="$mpls"/>
<xsl:with-param name="content">
<interface>
<name>
<xsl:value-of select="$ifname"/>
</name>
</interface>
</xsl:with-param>
</xsl:call-template>
</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";
match configuration {
var $mpls = protocols/mpls;
for-each (interfaces/interface[not(starts-with(name, "lo"))]/unit[family/iso]) {
var $ifname = ../name _ '.' _ name;
if (not(family/mpls)) {
call jcs:emit-change() {
with $message = {
expr "Adding 'family mpls' to ISO-enabled interface";
}
with $content = {
<family> {
<mpls>;
}
}
}
}
if ($mpls and not($mpls/interface[name = $ifname])) {
call jcs:emit-change($dot = $mpls) {
with $message = {
expr "Adding ISO-enabled interface ";
expr $ifname;
expr " to [protocols mpls]";
}
with $content = {
<interface> {
<name> $ifname;
}
}
}
}
}
}
To test the example in this section, perform the following steps:
system {
scripts {
commit {
file ex-iso.xsl;
}
}
}
interfaces {
lo0 {
unit 0 {
family iso;
}
}
so-1/2/3 {
unit 0 {
family iso;
}
}
so-1/3/2 {
unit 0 {
family iso;
}
}
}
protocols {
mpls {
enable;
}
}
- [edit]
- user@host# load merge terminal
- [Type ^D at a new line to end input]
- > Paste the contents of the clipboard here<
[edit]
user@host# commit
[edit interfaces interface so-1/2/3 unit 0]
warning: Adding 'family mpls' to ISO-enabled interface
[edit interfaces interface so-1/2/3 unit 0]
warning: Adding ISO-enabled interface so-1/2/3.0 to [protocols mpls]
[edit interfaces interface so-1/3/2 unit 0]
warning: Adding 'family mpls' to ISO-enabled interface
[edit interfaces interface so-1/3/2 unit 0]
warning: Adding ISO-enabled interface so-1/3/2.0 to [protocols mpls]
commit complete
[edit]
user@host# show interfaces
so-1/2/3 {
unit 0 {
family iso;
family mpls;
}
}
so-1/3/2 {
unit 0 {
family iso;
family mpls;
}
}
lo0 {
unit 0 {
family iso;
}
}