This example uses a macro to automatically expand a simple interface configuration by generating a transient change that assigns a default encapsulation type, configures multiple routing protocols on the interface, and applies multiple configuration groups. The JUNOS management process (mgd) inspects the configuration, looking for apply-macro params statements included at the [edit interfaces interface-name] hierarchy level.
When the script finds an apply-macro params statement, the script does the following:
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="top" select="."/>
<xsl:for-each select="interfaces/interface/apply-macro[name = 'params']">
<xsl:variable name="description"
select="data[name = 'description']/value"/>
<xsl:variable name="inet-address"
select="data[name = 'inet-address']/value"/>
<xsl:variable name="encapsulation"
select="data[name = 'encapsulation']/value"/>
<xsl:variable name="isis-level-1"
select="data[name = 'isis-level-1']/value"/>
<xsl:variable name="isis-level-1-metric"
select="data[name = 'isis-level-1-metric']/value"/>
<xsl:variable name="isis-level-2"
select="data[name = 'isis-level-2']/value"/>
<xsl:variable name="isis-level-2-metric"
select="data[name = 'isis-level-2-metric']/value"/>
<xsl:variable name="ifname" select="concat(../name, '.0')"/>
<transient-change>
<interfaces>
<interface>
<name><xsl:value-of select="../name"/></name>
<apply-groups>
<name>interface-details</name>
</apply-groups>
<xsl:if test="$description">
<description>
<xsl:value-of select="$description"/>
</description>
</xsl:if>
<encapsulation>
<xsl:choose>
<xsl:when test="string-length($encapsulation) > 0">
<xsl:value-of select="$encapsulation"/>
</xsl:when>
<xsl:otherwise>cisco-hdlc</xsl:otherwise>
</xsl:choose>
</encapsulation>
<unit>
<name>0</name>
<xsl:if test="string-length($inet-address) > 0">
<family>
<inet>
<address>
<xsl:value-of select="$inet-address"/>
</address>
</inet>
</family>
</xsl:if>
</unit>
</interface>
</interfaces>
<protocols>
<rsvp>
<interface>
<name><xsl:value-of select="$ifname"/></name>
</interface>
</rsvp>
<isis>
<interface>
<name><xsl:value-of select="$ifname"/></name>
<xsl:if test="$isis-level-1 or $isis-level-1-metric">
<level>
<name>1</name>
<xsl:if test="$isis-level-1">
<xsl:element name="{$isis-level-1}"/>
</xsl:if>
<xsl:if test="$isis-level-1-metric">
<metric>
<xsl:value-of select="$isis-level-1-metric"/>
</metric>
</xsl:if>
</level>
</xsl:if>
<xsl:if test="$isis-level-2 or $isis-level-2-metric">
<level>
<name>2</name>
<xsl:if test="$isis-level-2">
<xsl:element name="{$isis-level-2}"/>
</xsl:if>
<xsl:if test="$isis-level-2-metric">
<metric>
<xsl:value-of select="$isis-level-2-metric"/>
</metric>
</xsl:if>
</level>
</xsl:if>
</interface>
</isis>
<ldp>
<interface>
<name><xsl:value-of select="$ifname"/></name>
</interface>
</ldp>
</protocols>
</transient-change>
</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 $top = .;
for-each (interfaces/interface/apply-macro[name = 'params']) {
var $description = data[name = 'description']/value;
var $inet-address = data[name = 'inet-address']/value;
var $encapsulation = data[name = 'encapsulation']/value;
var $isis-level-1 = data[name = 'isis-level-1']/value;
var $isis-level-1-metric = data[name = 'isis-level-1-metric']/value;
var $isis-level-2 = data[name = 'isis-level-2']/value;
var $isis-level-2-metric = data[name = 'isis-level-2-metric']/value;
var $ifname = ../name _ '.0';
<transient-change> {
<interfaces> {
<interface> {
<name> ../name;
<apply-groups> {
<name> "interface-details";
}
if ($description) {
<description> $description;
}
<encapsulation> {
if (string-length($encapsulation) > 0) {
expr $encapsulation;
} else {
expr "cisco-hdlc";
}
}
<unit> {
<name> "0";
if (string-length($inet-address) > 0) {
<family> {
<inet> {
<address> $inet-address;
}
}
}
}
}
}
<protocols> {
<rsvp> {
<interface> {
<name> $ifname;
}
}
<isis> {
<interface> {
<name> $ifname;
if ($isis-level-1 or $isis-level-1-metric) {
<level> {
<name> "1";
if ($isis-level-1) {
<xsl:element name="{$isis-level-1}">;
}
if ($isis-level-1-metric) {
<metric> $isis-level-1-metric;
}
}
}
if ($isis-level-2 or $isis-level-2-metric) {
<level> {
<name> "2";
if ($isis-level-2) {
<xsl:element name="{$isis-level-2}">;
}
if ($isis-level-2-metric) {
<metric> $isis-level-2-metric;
}
}
}
}
}
<ldp> {
<interface> {
<name> $ifname;
}
}
}
}
}
}