blob: 389f1669c7ab67c49fafa70a2d29866b5fb1f753 [file] [log] [blame]
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.provider.netconf.flow.impl;
import static org.slf4j.LoggerFactory.getLogger;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.AccessList;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.AceType;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.AceEth;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.AceIp;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.AceIpVersion;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.ace.ip.version.AceIpv4;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.ace.ip.version.AceIpv6;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.DestinationPortRange;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.SourcePortRange;
import org.slf4j.Logger;
/**
* Xml Builder to generate the xml according to given ACL model.
*/
public class XmlBuilder {
private final Logger log = getLogger(XmlBuilder.class);
public String buildAclRequestXml(AccessList accessList) {
Document doc = new Document();
Namespace namespaceRpc = Namespace
.getNamespace("urn:ietf:params:xml:ns:netconf:base:1.0");
Namespace accessNamespaceRpc = Namespace
.getNamespace("urn:ietf:params:xml:ns:yang:ietf-acl");
doc.setRootElement(new Element("rpc", namespaceRpc)
.setAttribute("message-id", "101"));
/**
* Access list elements of given ACL model.
*/
Element access = new Element("access-list", accessNamespaceRpc);
access.addContent(new Element("acl-name", accessNamespaceRpc)
.setText(accessList.getAclName()));
// access.addContent(accessEntries);
if (!accessList.getAccessListEntries().isEmpty()
&& accessList.getAccessListEntries() != null) {
for (int accessEntryIntVlu = 0; accessEntryIntVlu < accessList
.getAccessListEntries().size(); accessEntryIntVlu++) {
access.addContent(getAccessEntries(accessEntryIntVlu,
accessList,
accessNamespaceRpc));
}
}
/**
* edit-config operation for given ACL model.
*/
Element editConfig = new Element("edit-config", namespaceRpc);
editConfig.addContent(new Element("target", namespaceRpc)
.addContent(new Element("running", namespaceRpc)));
editConfig.addContent(new Element("config", Namespace
.getNamespace("urn:ietf:params:xml:ns:netconf:base:1.0"))
.addContent(access));
doc.getRootElement().addContent(editConfig);
XMLOutputter xmlOutputter = new XMLOutputter(Format.getPrettyFormat());
String outputString = xmlOutputter.outputString(doc);
return outputString;
}
/**
* access entries operation for given ACL model.
*/
private Element getAccessEntries(int accessEntryIntVlu,
AccessList accessList,
Namespace accessNamespaceRpc) {
/**
* Port Number
*/
int srcPortRangeLower = 0;
int srcPortRangeUpper = 0;
int destPortRangeLower = 0;
int destPortRangeUpper = 0;
String sourceIpAdd = "";
String destinationIpAdd = "";
/*
* checking accessList is null or not
*/
if (accessList != null) {
/*
* checking list entries are empty or null
*/
if (!accessList.getAccessListEntries().isEmpty()
&& accessList.getAccessListEntries() != null) {
AceType aceType = accessList.getAccessListEntries()
.get(accessEntryIntVlu).getMatches().getAceType();
if (aceType instanceof AceIp) {
AceIp aceIp = (AceIp) aceType;
SourcePortRange sourcePortRange = aceIp
.getSourcePortRange();
if (sourcePortRange != null) {
PortNumber lowerPort = sourcePortRange.getLowerPort();
PortNumber upperPort = sourcePortRange.getUpperPort();
if (lowerPort != null) {
srcPortRangeLower = lowerPort.getValue();
}
if (upperPort != null) {
srcPortRangeUpper = upperPort.getValue();
}
}
DestinationPortRange destinationPortRange = aceIp
.getDestinationPortRange();
if (destinationPortRange != null) {
PortNumber lowerPort = destinationPortRange
.getLowerPort();
if (lowerPort != null) {
destPortRangeLower = lowerPort.getValue();
}
PortNumber upperPort = destinationPortRange
.getUpperPort();
if (upperPort != null) {
destPortRangeUpper = upperPort.getValue();
}
}
AceIpVersion aceIpVersion = aceIp.getAceIpVersion();
if (aceIpVersion instanceof AceIpv4) {
AceIpv4 obj = (AceIpv4) aceIpVersion;
destinationIpAdd = obj.getDestinationIpv4Address()
.getValue();
sourceIpAdd = obj.getSourceIpv4Address().getValue();
} else if (aceIpVersion instanceof AceIpv6) {
AceIpv6 obj = (AceIpv6) aceIpVersion;
destinationIpAdd = obj.getDestinationIpv6Address()
.getValue();
sourceIpAdd = obj.getSourceIpv6Address().getValue();
}
} else if (aceType instanceof AceEth) {
log.debug("Need to add execution loging for Ace Type Ethernet");
}
}
}
/**
* Matches elements to define IP address & Port range for given ACL
* model.
*/
Element matchesElement = new Element("matches", accessNamespaceRpc);
if (String.valueOf(srcPortRangeLower) != null
&& !String.valueOf(srcPortRangeLower).isEmpty()) {
matchesElement.addContent(new Element("source-port-range",
accessNamespaceRpc)
.addContent(new Element("lower-port", accessNamespaceRpc)
.setText(String.valueOf(srcPortRangeLower))));
matchesElement.addContent(new Element("source-port-range",
accessNamespaceRpc)
.addContent(new Element("upper-port", accessNamespaceRpc)
.setText(String.valueOf(srcPortRangeUpper))));
matchesElement.addContent(new Element("destination-port-range",
accessNamespaceRpc)
.addContent(new Element("lower-port", accessNamespaceRpc)
.setText(String.valueOf(destPortRangeLower))));
matchesElement.addContent(new Element("destination-port-range",
accessNamespaceRpc)
.addContent(new Element("upper-port", accessNamespaceRpc)
.setText(String.valueOf(destPortRangeUpper))));
}
if (destinationIpAdd != null && !destinationIpAdd.isEmpty()) {
matchesElement.addContent(new Element("destination-ipv4-address",
accessNamespaceRpc)
.setText(destinationIpAdd));
}
if (sourceIpAdd != null && !sourceIpAdd.isEmpty()) {
matchesElement.addContent(new Element("source-ipv4-address",
accessNamespaceRpc)
.setText(sourceIpAdd));
}
/**
* Access entries elements for given ACL model.
*/
Element accessEntries = new Element("access-list-entries",
accessNamespaceRpc);
accessEntries.addContent(new Element("rule-name", accessNamespaceRpc)
.setText(accessList.getAccessListEntries()
.get(accessEntryIntVlu).getRuleName()));
accessEntries.addContent(matchesElement);
accessEntries.addContent(new Element("actions", accessNamespaceRpc)
.addContent(new Element("deny", accessNamespaceRpc)));
return accessEntries;
}
}