org.onosproject.drivers.cisco.XmlParserCisco.java Source code

Java tutorial

Introduction

Here is the source code for org.onosproject.drivers.cisco.XmlParserCisco.java

Source

/*
 * 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;
    }
}