Jonathan Hart
Committed by Gerrit Code Review

Added interfaces configuration to allow vRouter to be selective about what

interfaces to use.

Change-Id: I4eb069760df0995d9e831e024ddbc0493bccce0b
...@@ -16,10 +16,16 @@ ...@@ -16,10 +16,16 @@
16 16
17 package org.onosproject.routing.config; 17 package org.onosproject.routing.config;
18 18
19 +import com.fasterxml.jackson.databind.JsonNode;
20 +import com.fasterxml.jackson.databind.node.ArrayNode;
19 import org.onosproject.core.ApplicationId; 21 import org.onosproject.core.ApplicationId;
20 import org.onosproject.net.ConnectPoint; 22 import org.onosproject.net.ConnectPoint;
21 import org.onosproject.net.config.Config; 23 import org.onosproject.net.config.Config;
22 24
25 +import java.util.ArrayList;
26 +import java.util.Collections;
27 +import java.util.List;
28 +
23 /** 29 /**
24 * Routing configuration. 30 * Routing configuration.
25 */ 31 */
...@@ -28,6 +34,7 @@ public class RouterConfig extends Config<ApplicationId> { ...@@ -28,6 +34,7 @@ public class RouterConfig extends Config<ApplicationId> {
28 private static final String CP_CONNECT_POINT = "controlPlaneConnectPoint"; 34 private static final String CP_CONNECT_POINT = "controlPlaneConnectPoint";
29 private static final String OSPF_ENABLED = "ospfEnabled"; 35 private static final String OSPF_ENABLED = "ospfEnabled";
30 private static final String PIM_ENABLED = "pimEnabled"; 36 private static final String PIM_ENABLED = "pimEnabled";
37 + private static final String INTERFACES = "interfaces";
31 38
32 /** 39 /**
33 * Returns the routing control plane connect point. 40 * Returns the routing control plane connect point.
...@@ -55,4 +62,24 @@ public class RouterConfig extends Config<ApplicationId> { ...@@ -55,4 +62,24 @@ public class RouterConfig extends Config<ApplicationId> {
55 public boolean pimEnabled() { 62 public boolean pimEnabled() {
56 return object.path(PIM_ENABLED).asBoolean(false); 63 return object.path(PIM_ENABLED).asBoolean(false);
57 } 64 }
65 +
66 + /**
67 + * Returns the list of interfaces enabled on this router.
68 + *
69 + * @return list of interface names that are enabled, or an empty list if
70 + * all available interfaces should be used
71 + */
72 + public List<String> getInterfaces() {
73 + JsonNode intfNode = object.path(INTERFACES);
74 + if (intfNode.isMissingNode() || !intfNode.isArray()) {
75 + return Collections.emptyList();
76 + }
77 + ArrayNode array = (ArrayNode) intfNode;
78 + List<String> interfaces = new ArrayList<>(array.size());
79 + for (JsonNode intf : array) {
80 + interfaces.add(intf.asText());
81 + }
82 + return interfaces;
83 + }
84 +
58 } 85 }
......
...@@ -50,6 +50,9 @@ import org.onosproject.routing.RoutingService; ...@@ -50,6 +50,9 @@ import org.onosproject.routing.RoutingService;
50 import org.onosproject.routing.config.RouterConfig; 50 import org.onosproject.routing.config.RouterConfig;
51 import org.slf4j.Logger; 51 import org.slf4j.Logger;
52 52
53 +import java.util.Collections;
54 +import java.util.List;
55 +
53 import static org.slf4j.LoggerFactory.getLogger; 56 import static org.slf4j.LoggerFactory.getLogger;
54 57
55 /** 58 /**
...@@ -69,6 +72,7 @@ public class ControlPlaneRedirectManager { ...@@ -69,6 +72,7 @@ public class ControlPlaneRedirectManager {
69 72
70 private ConnectPoint controlPlaneConnectPoint; 73 private ConnectPoint controlPlaneConnectPoint;
71 private boolean ospfEnabled = false; 74 private boolean ospfEnabled = false;
75 + private List<String> interfaces = Collections.emptyList();
72 76
73 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 77 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
74 protected CoreService coreService; 78 protected CoreService coreService;
...@@ -119,6 +123,7 @@ public class ControlPlaneRedirectManager { ...@@ -119,6 +123,7 @@ public class ControlPlaneRedirectManager {
119 123
120 controlPlaneConnectPoint = config.getControlPlaneConnectPoint(); 124 controlPlaneConnectPoint = config.getControlPlaneConnectPoint();
121 ospfEnabled = config.getOspfEnabled(); 125 ospfEnabled = config.getOspfEnabled();
126 + interfaces = config.getInterfaces();
122 127
123 updateDevice(); 128 updateDevice();
124 } 129 }
...@@ -130,6 +135,7 @@ public class ControlPlaneRedirectManager { ...@@ -130,6 +135,7 @@ public class ControlPlaneRedirectManager {
130 135
131 interfaceService.getInterfaces().stream() 136 interfaceService.getInterfaces().stream()
132 .filter(intf -> intf.connectPoint().deviceId().equals(deviceId)) 137 .filter(intf -> intf.connectPoint().deviceId().equals(deviceId))
138 + .filter(intf -> interfaces.isEmpty() || interfaces.contains(intf.name()))
133 .forEach(this::provisionInterface); 139 .forEach(this::provisionInterface);
134 140
135 log.info("Set up interfaces on {}", controlPlaneConnectPoint.deviceId()); 141 log.info("Set up interfaces on {}", controlPlaneConnectPoint.deviceId());
......
...@@ -67,8 +67,10 @@ import org.slf4j.LoggerFactory; ...@@ -67,8 +67,10 @@ import org.slf4j.LoggerFactory;
67 67
68 import java.util.Collection; 68 import java.util.Collection;
69 import java.util.HashMap; 69 import java.util.HashMap;
70 +import java.util.List;
70 import java.util.Map; 71 import java.util.Map;
71 import java.util.Set; 72 import java.util.Set;
73 +import java.util.stream.Collectors;
72 74
73 /** 75 /**
74 * Programs routes to a single OpenFlow switch. 76 * Programs routes to a single OpenFlow switch.
...@@ -108,6 +110,8 @@ public class SingleSwitchFibInstaller { ...@@ -108,6 +110,8 @@ public class SingleSwitchFibInstaller {
108 110
109 private ConnectPoint controlPlaneConnectPoint; 111 private ConnectPoint controlPlaneConnectPoint;
110 112
113 + private List<String> interfaces;
114 +
111 private ApplicationId routerAppId; 115 private ApplicationId routerAppId;
112 116
113 // Reference count for how many times a next hop is used by a route 117 // Reference count for how many times a next hop is used by a route
...@@ -161,15 +165,29 @@ public class SingleSwitchFibInstaller { ...@@ -161,15 +165,29 @@ public class SingleSwitchFibInstaller {
161 log.info("Control Plane Connect Point: {}", controlPlaneConnectPoint); 165 log.info("Control Plane Connect Point: {}", controlPlaneConnectPoint);
162 166
163 deviceId = routerConfig.getControlPlaneConnectPoint().deviceId(); 167 deviceId = routerConfig.getControlPlaneConnectPoint().deviceId();
164 -
165 log.info("Router device ID is {}", deviceId); 168 log.info("Router device ID is {}", deviceId);
166 169
170 + interfaces = routerConfig.getInterfaces();
171 + log.info("Using interfaces: {}", interfaces.isEmpty() ? "all" : interfaces);
172 +
167 updateDevice(); 173 updateDevice();
168 } 174 }
169 175
170 private void updateDevice() { 176 private void updateDevice() {
171 if (deviceId != null && deviceService.isAvailable(deviceId)) { 177 if (deviceId != null && deviceService.isAvailable(deviceId)) {
172 - processIntfFilters(true, interfaceService.getInterfaces()); 178 +
179 + Set<Interface> intfs;
180 + if (interfaces.isEmpty()) {
181 + intfs = interfaceService.getInterfaces();
182 + } else {
183 + // TODO need to fix by making interface names globally unique
184 + intfs = interfaceService.getInterfaces().stream()
185 + .filter(intf -> intf.connectPoint().deviceId().equals(deviceId))
186 + .filter(intf -> interfaces.contains(intf.name()))
187 + .collect(Collectors.toSet());
188 + }
189 +
190 + processIntfFilters(true, intfs);
173 } 191 }
174 } 192 }
175 193
......