blob: 9ab9c55e0e23d50f13f9e10c3c6e20b791d7f3e8 [file] [log] [blame]
Andreas Papazois1ed54cf2016-05-04 16:22:40 +03001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.drivers.cisco;
18
19import com.google.common.collect.Lists;
20import org.apache.commons.configuration.HierarchicalConfiguration;
21import org.onlab.packet.VlanId;
22import org.onosproject.net.device.DefaultDeviceInterfaceDescription;
23import org.onosproject.net.device.DeviceInterfaceDescription;
24
25import java.util.Arrays;
26import java.util.List;
27
28/**
29 * Parser for Netconf XML configurations and replies from Cisco devices.
30 */
31public final class XmlParserCisco {
32
33 private static final String TRUNK_MODE_KEY =
34 "ConfigIf-Configuration.switchport.mode.trunk";
35 private static final String ACCESS_KEY =
36 "ConfigIf-Configuration.switchport.access.vlan.VLANIDVLANPortAccessMode";
37 private static final String TRUNK_VLAN_KEY =
38 "ConfigIf-Configuration.switchport.trunk.allowed.vlan.VLANIDsAllowedVLANsPortTrunkingMode";
39 private static final String RATE_LIMIT_KEY =
40 "ConfigIf-Configuration.srr-queue.bandwidth.limit.EnterBandwidthLimitInterfaceAsPercentage";
41 private static final short NO_LIMIT = -1;
42
43 private XmlParserCisco() {
44 // Not to be called.
45 }
46
47 /**
48 * Parses device configuration and returns the descriptions of the device
49 * interfaces.
50 *
51 * @param cfg an hierarchical configuration
52 * @return list of interface descriptions for the device
53 */
54
55 public static List<DeviceInterfaceDescription> getInterfacesFromConfig(
56 HierarchicalConfiguration cfg) {
57 List<DeviceInterfaceDescription> intfs = Lists.newArrayList();
58 List<HierarchicalConfiguration> subtrees =
59 cfg.configurationsAt("data.xml-config-data.Device-Configuration.interface");
60 for (HierarchicalConfiguration intfConfig :subtrees) {
61 String intfName = getInterfaceName(intfConfig);
62 DeviceInterfaceDescription.Mode intfMode = getInterfaceMode(intfConfig);
63 List<VlanId> intfVlans = getInterfaceVlans(intfConfig, intfMode);
64 short intfLimit = getInterfaceLimit(intfConfig);
65 boolean intfLimited = (intfLimit == NO_LIMIT ? false : true);
66 DeviceInterfaceDescription intf =
67 new DefaultDeviceInterfaceDescription(intfName,
68 intfMode,
69 intfVlans,
70 intfLimited,
71 intfLimit);
72 intfs.add(intf);
73 }
74 return intfs;
75 }
76
77 private static String getInterfaceName(HierarchicalConfiguration intfConfig) {
78 return intfConfig.getString("Param");
79 }
80
81 private static DeviceInterfaceDescription.Mode
82 getInterfaceMode(HierarchicalConfiguration intfConfig) {
83 if (intfConfig.containsKey(TRUNK_MODE_KEY)) {
84 return DeviceInterfaceDescription.Mode.TRUNK;
85 } else if (intfConfig.containsKey(ACCESS_KEY)) {
86 return DeviceInterfaceDescription.Mode.ACCESS;
87 } else {
88 return DeviceInterfaceDescription.Mode.NORMAL;
89 }
90 }
91
92 private static List<VlanId> getInterfaceVlans(
93 HierarchicalConfiguration intfConfig,
94 DeviceInterfaceDescription.Mode mode) {
95 List<VlanId> vlans = Lists.newArrayList();
96 if (mode == DeviceInterfaceDescription.Mode.ACCESS) {
97 vlans.add(getVlanForAccess(intfConfig));
98 } else if (mode == DeviceInterfaceDescription.Mode.TRUNK) {
99 vlans.addAll(getVlansForTrunk(intfConfig));
100 }
101 return vlans;
102 }
103
104 private static VlanId getVlanForAccess(HierarchicalConfiguration intfConfig) {
105 if (intfConfig.containsKey(ACCESS_KEY)) {
106 return VlanId.vlanId(intfConfig.getString(ACCESS_KEY));
107 }
108 return null;
109 }
110
111 private static List<VlanId> getVlansForTrunk(HierarchicalConfiguration intfConfig) {
112 if (intfConfig.containsKey(TRUNK_VLAN_KEY)) {
113 return parseVlans(intfConfig.getStringArray(TRUNK_VLAN_KEY));
114 }
115 return null;
116 }
117
118 private static List<VlanId> parseVlans(String[] vlansString) {
119 List<VlanId> vlans = Lists.newArrayList();
120 List<String> items = Arrays.asList(vlansString);
121 for (String item: items) {
122 int index = item.indexOf("-");
123 if (index == -1) {
124 // Not a range o values
125 vlans.add(VlanId.vlanId(item));
126 } else {
127 // A range of values separated with "-"
128 short lowerVlan = Short.parseShort(item.substring(0, index));
129 short higherVlan = Short.parseShort(item.substring(index + 1));
130 for (short i = lowerVlan; i <= higherVlan; i++) {
131 vlans.add(VlanId.vlanId(i));
132 }
133 }
134 }
135 return vlans;
136 }
137
138 private static short getInterfaceLimit(HierarchicalConfiguration intfConfig) {
139 if (intfConfig.containsKey(RATE_LIMIT_KEY)) {
140 return intfConfig.getShort(RATE_LIMIT_KEY);
141 }
142 return NO_LIMIT;
143 }
144}