blob: 9ab9c55e0e23d50f13f9e10c3c6e20b791d7f3e8 [file] [log] [blame]
/*
* Copyright 2016-present 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.drivers.cisco;
import com.google.common.collect.Lists;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.onlab.packet.VlanId;
import org.onosproject.net.device.DefaultDeviceInterfaceDescription;
import org.onosproject.net.device.DeviceInterfaceDescription;
import java.util.Arrays;
import java.util.List;
/**
* Parser for Netconf XML configurations and replies from Cisco devices.
*/
public final class XmlParserCisco {
private static final String TRUNK_MODE_KEY =
"ConfigIf-Configuration.switchport.mode.trunk";
private static final String ACCESS_KEY =
"ConfigIf-Configuration.switchport.access.vlan.VLANIDVLANPortAccessMode";
private static final String TRUNK_VLAN_KEY =
"ConfigIf-Configuration.switchport.trunk.allowed.vlan.VLANIDsAllowedVLANsPortTrunkingMode";
private static final String RATE_LIMIT_KEY =
"ConfigIf-Configuration.srr-queue.bandwidth.limit.EnterBandwidthLimitInterfaceAsPercentage";
private static final short NO_LIMIT = -1;
private XmlParserCisco() {
// Not to be called.
}
/**
* Parses device configuration and returns the descriptions of the device
* interfaces.
*
* @param cfg an hierarchical configuration
* @return list of interface descriptions for the device
*/
public static List<DeviceInterfaceDescription> getInterfacesFromConfig(
HierarchicalConfiguration cfg) {
List<DeviceInterfaceDescription> intfs = Lists.newArrayList();
List<HierarchicalConfiguration> subtrees =
cfg.configurationsAt("data.xml-config-data.Device-Configuration.interface");
for (HierarchicalConfiguration intfConfig :subtrees) {
String intfName = getInterfaceName(intfConfig);
DeviceInterfaceDescription.Mode intfMode = getInterfaceMode(intfConfig);
List<VlanId> intfVlans = getInterfaceVlans(intfConfig, intfMode);
short intfLimit = getInterfaceLimit(intfConfig);
boolean intfLimited = (intfLimit == NO_LIMIT ? false : true);
DeviceInterfaceDescription intf =
new DefaultDeviceInterfaceDescription(intfName,
intfMode,
intfVlans,
intfLimited,
intfLimit);
intfs.add(intf);
}
return intfs;
}
private static String getInterfaceName(HierarchicalConfiguration intfConfig) {
return intfConfig.getString("Param");
}
private static DeviceInterfaceDescription.Mode
getInterfaceMode(HierarchicalConfiguration intfConfig) {
if (intfConfig.containsKey(TRUNK_MODE_KEY)) {
return DeviceInterfaceDescription.Mode.TRUNK;
} else if (intfConfig.containsKey(ACCESS_KEY)) {
return DeviceInterfaceDescription.Mode.ACCESS;
} else {
return DeviceInterfaceDescription.Mode.NORMAL;
}
}
private static List<VlanId> getInterfaceVlans(
HierarchicalConfiguration intfConfig,
DeviceInterfaceDescription.Mode mode) {
List<VlanId> vlans = Lists.newArrayList();
if (mode == DeviceInterfaceDescription.Mode.ACCESS) {
vlans.add(getVlanForAccess(intfConfig));
} else if (mode == DeviceInterfaceDescription.Mode.TRUNK) {
vlans.addAll(getVlansForTrunk(intfConfig));
}
return vlans;
}
private static VlanId getVlanForAccess(HierarchicalConfiguration intfConfig) {
if (intfConfig.containsKey(ACCESS_KEY)) {
return VlanId.vlanId(intfConfig.getString(ACCESS_KEY));
}
return null;
}
private static List<VlanId> getVlansForTrunk(HierarchicalConfiguration intfConfig) {
if (intfConfig.containsKey(TRUNK_VLAN_KEY)) {
return parseVlans(intfConfig.getStringArray(TRUNK_VLAN_KEY));
}
return null;
}
private static List<VlanId> parseVlans(String[] vlansString) {
List<VlanId> vlans = Lists.newArrayList();
List<String> items = Arrays.asList(vlansString);
for (String item: items) {
int index = item.indexOf("-");
if (index == -1) {
// Not a range o values
vlans.add(VlanId.vlanId(item));
} else {
// A range of values separated with "-"
short lowerVlan = Short.parseShort(item.substring(0, index));
short higherVlan = Short.parseShort(item.substring(index + 1));
for (short i = lowerVlan; i <= higherVlan; i++) {
vlans.add(VlanId.vlanId(i));
}
}
}
return vlans;
}
private static short getInterfaceLimit(HierarchicalConfiguration intfConfig) {
if (intfConfig.containsKey(RATE_LIMIT_KEY)) {
return intfConfig.getShort(RATE_LIMIT_KEY);
}
return NO_LIMIT;
}
}