Committed by
Gerrit Code Review
Improve SegmentRoutingAppConfig
- Separate host and subnet suppression - Use port instead of interface to specify which SR should ignore Change-Id: Ie6491950cddf0860924565f081504b4f4d788179
Showing
6 changed files
with
200 additions
and
93 deletions
| ... | @@ -473,7 +473,7 @@ public class RoutingRulePopulator { | ... | @@ -473,7 +473,7 @@ public class RoutingRulePopulator { |
| 473 | for (Port port : srManager.deviceService.getPorts(deviceId)) { | 473 | for (Port port : srManager.deviceService.getPorts(deviceId)) { |
| 474 | ConnectPoint cp = new ConnectPoint(deviceId, port.number()); | 474 | ConnectPoint cp = new ConnectPoint(deviceId, port.number()); |
| 475 | // TODO: Handles dynamic port events when we are ready for dynamic config | 475 | // TODO: Handles dynamic port events when we are ready for dynamic config |
| 476 | - if (!srManager.deviceConfiguration.excludedPorts().contains(cp) && | 476 | + if (!srManager.deviceConfiguration.suppressSubnet().contains(cp) && |
| 477 | port.isEnabled()) { | 477 | port.isEnabled()) { |
| 478 | Ip4Prefix portSubnet = config.getPortSubnet(deviceId, port.number()); | 478 | Ip4Prefix portSubnet = config.getPortSubnet(deviceId, port.number()); |
| 479 | VlanId assignedVlan = (portSubnet == null) | 479 | VlanId assignedVlan = (portSubnet == null) | ... | ... |
| ... | @@ -991,7 +991,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { | ... | @@ -991,7 +991,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { |
| 991 | Set<IpAddress> ips = event.subject().ipAddresses(); | 991 | Set<IpAddress> ips = event.subject().ipAddresses(); |
| 992 | log.info("Host {}/{} is added at {}:{}", mac, vlanId, deviceId, port); | 992 | log.info("Host {}/{} is added at {}:{}", mac, vlanId, deviceId, port); |
| 993 | 993 | ||
| 994 | - if (!deviceConfiguration.excludedPorts() | 994 | + if (!deviceConfiguration.suppressHost() |
| 995 | .contains(new ConnectPoint(deviceId, port))) { | 995 | .contains(new ConnectPoint(deviceId, port))) { |
| 996 | // Populate bridging table entry | 996 | // Populate bridging table entry |
| 997 | log.debug("Populate L2 table entry for host {} at {}:{}", | 997 | log.debug("Populate L2 table entry for host {} at {}:{}", |
| ... | @@ -1020,7 +1020,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { | ... | @@ -1020,7 +1020,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { |
| 1020 | Set<IpAddress> ips = event.subject().ipAddresses(); | 1020 | Set<IpAddress> ips = event.subject().ipAddresses(); |
| 1021 | log.debug("Host {}/{} is removed from {}:{}", mac, vlanId, deviceId, port); | 1021 | log.debug("Host {}/{} is removed from {}:{}", mac, vlanId, deviceId, port); |
| 1022 | 1022 | ||
| 1023 | - if (!deviceConfiguration.excludedPorts() | 1023 | + if (!deviceConfiguration.suppressHost() |
| 1024 | .contains(new ConnectPoint(deviceId, port))) { | 1024 | .contains(new ConnectPoint(deviceId, port))) { |
| 1025 | // Revoke bridging table entry | 1025 | // Revoke bridging table entry |
| 1026 | ForwardingObjective.Builder fob = | 1026 | ForwardingObjective.Builder fob = |
| ... | @@ -1051,7 +1051,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { | ... | @@ -1051,7 +1051,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { |
| 1051 | log.debug("Host {}/{} is moved from {}:{} to {}:{}", | 1051 | log.debug("Host {}/{} is moved from {}:{} to {}:{}", |
| 1052 | mac, vlanId, prevDeviceId, prevPort, newDeviceId, newPort); | 1052 | mac, vlanId, prevDeviceId, prevPort, newDeviceId, newPort); |
| 1053 | 1053 | ||
| 1054 | - if (!deviceConfiguration.excludedPorts() | 1054 | + if (!deviceConfiguration.suppressHost() |
| 1055 | .contains(new ConnectPoint(prevDeviceId, prevPort))) { | 1055 | .contains(new ConnectPoint(prevDeviceId, prevPort))) { |
| 1056 | // Revoke previous bridging table entry | 1056 | // Revoke previous bridging table entry |
| 1057 | ForwardingObjective.Builder prevFob = | 1057 | ForwardingObjective.Builder prevFob = |
| ... | @@ -1069,7 +1069,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { | ... | @@ -1069,7 +1069,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { |
| 1069 | }); | 1069 | }); |
| 1070 | } | 1070 | } |
| 1071 | 1071 | ||
| 1072 | - if (!deviceConfiguration.excludedPorts() | 1072 | + if (!deviceConfiguration.suppressHost() |
| 1073 | .contains(new ConnectPoint(newDeviceId, newPort))) { | 1073 | .contains(new ConnectPoint(newDeviceId, newPort))) { |
| 1074 | // Populate new bridging table entry | 1074 | // Populate new bridging table entry |
| 1075 | ForwardingObjective.Builder newFob = | 1075 | ForwardingObjective.Builder newFob = |
| ... | @@ -1099,7 +1099,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { | ... | @@ -1099,7 +1099,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { |
| 1099 | Set<IpAddress> newIps = event.subject().ipAddresses(); | 1099 | Set<IpAddress> newIps = event.subject().ipAddresses(); |
| 1100 | log.debug("Host {}/{} is updated", mac, vlanId); | 1100 | log.debug("Host {}/{} is updated", mac, vlanId); |
| 1101 | 1101 | ||
| 1102 | - if (!deviceConfiguration.excludedPorts() | 1102 | + if (!deviceConfiguration.suppressHost() |
| 1103 | .contains(new ConnectPoint(prevDeviceId, prevPort))) { | 1103 | .contains(new ConnectPoint(prevDeviceId, prevPort))) { |
| 1104 | // Revoke previous IP table entry | 1104 | // Revoke previous IP table entry |
| 1105 | prevIps.forEach(ip -> { | 1105 | prevIps.forEach(ip -> { |
| ... | @@ -1110,7 +1110,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { | ... | @@ -1110,7 +1110,7 @@ public class SegmentRoutingManager implements SegmentRoutingService { |
| 1110 | }); | 1110 | }); |
| 1111 | } | 1111 | } |
| 1112 | 1112 | ||
| 1113 | - if (!deviceConfiguration.excludedPorts() | 1113 | + if (!deviceConfiguration.suppressHost() |
| 1114 | .contains(new ConnectPoint(newDeviceId, newPort))) { | 1114 | .contains(new ConnectPoint(newDeviceId, newPort))) { |
| 1115 | // Populate new IP table entry | 1115 | // Populate new IP table entry |
| 1116 | newIps.forEach(ip -> { | 1116 | newIps.forEach(ip -> { | ... | ... |
| ... | @@ -18,7 +18,6 @@ package org.onosproject.segmentrouting.config; | ... | @@ -18,7 +18,6 @@ package org.onosproject.segmentrouting.config; |
| 18 | import com.google.common.collect.HashMultimap; | 18 | import com.google.common.collect.HashMultimap; |
| 19 | import com.google.common.collect.ImmutableSet; | 19 | import com.google.common.collect.ImmutableSet; |
| 20 | import com.google.common.collect.SetMultimap; | 20 | import com.google.common.collect.SetMultimap; |
| 21 | -import com.google.common.collect.Sets; | ||
| 22 | import org.onlab.packet.Ip4Address; | 21 | import org.onlab.packet.Ip4Address; |
| 23 | import org.onlab.packet.Ip4Prefix; | 22 | import org.onlab.packet.Ip4Prefix; |
| 24 | import org.onlab.packet.IpPrefix; | 23 | import org.onlab.packet.IpPrefix; |
| ... | @@ -30,6 +29,7 @@ import org.onosproject.incubator.net.config.basics.InterfaceConfig; | ... | @@ -30,6 +29,7 @@ import org.onosproject.incubator.net.config.basics.InterfaceConfig; |
| 30 | import org.onosproject.incubator.net.intf.Interface; | 29 | import org.onosproject.incubator.net.intf.Interface; |
| 31 | import org.onosproject.net.ConnectPoint; | 30 | import org.onosproject.net.ConnectPoint; |
| 32 | import org.onosproject.net.config.NetworkConfigRegistry; | 31 | import org.onosproject.net.config.NetworkConfigRegistry; |
| 32 | +import org.onosproject.net.config.NetworkConfigService; | ||
| 33 | import org.onosproject.net.host.InterfaceIpAddress; | 33 | import org.onosproject.net.host.InterfaceIpAddress; |
| 34 | import org.onosproject.net.DeviceId; | 34 | import org.onosproject.net.DeviceId; |
| 35 | import org.onosproject.net.PortNumber; | 35 | import org.onosproject.net.PortNumber; |
| ... | @@ -57,7 +57,8 @@ public class DeviceConfiguration implements DeviceProperties { | ... | @@ -57,7 +57,8 @@ public class DeviceConfiguration implements DeviceProperties { |
| 57 | private final List<Integer> allSegmentIds = new ArrayList<>(); | 57 | private final List<Integer> allSegmentIds = new ArrayList<>(); |
| 58 | private final Map<DeviceId, SegmentRouterInfo> deviceConfigMap = new ConcurrentHashMap<>(); | 58 | private final Map<DeviceId, SegmentRouterInfo> deviceConfigMap = new ConcurrentHashMap<>(); |
| 59 | private final Map<VlanId, List<ConnectPoint>> xConnects = new ConcurrentHashMap<>(); | 59 | private final Map<VlanId, List<ConnectPoint>> xConnects = new ConcurrentHashMap<>(); |
| 60 | - private final Set<ConnectPoint> excludedPorts = Sets.newConcurrentHashSet(); | 60 | + private ApplicationId appId; |
| 61 | + private NetworkConfigService cfgService; | ||
| 61 | private SegmentRoutingAppConfig appConfig; | 62 | private SegmentRoutingAppConfig appConfig; |
| 62 | 63 | ||
| 63 | private class SegmentRouterInfo { | 64 | private class SegmentRouterInfo { |
| ... | @@ -85,6 +86,9 @@ public class DeviceConfiguration implements DeviceProperties { | ... | @@ -85,6 +86,9 @@ public class DeviceConfiguration implements DeviceProperties { |
| 85 | */ | 86 | */ |
| 86 | public DeviceConfiguration(ApplicationId appId, | 87 | public DeviceConfiguration(ApplicationId appId, |
| 87 | NetworkConfigRegistry cfgService) { | 88 | NetworkConfigRegistry cfgService) { |
| 89 | + this.appId = appId; | ||
| 90 | + this.cfgService = cfgService; | ||
| 91 | + | ||
| 88 | // Read config from device subject, excluding gatewayIps and subnets. | 92 | // Read config from device subject, excluding gatewayIps and subnets. |
| 89 | Set<DeviceId> deviceSubjects = | 93 | Set<DeviceId> deviceSubjects = |
| 90 | cfgService.getSubjects(DeviceId.class, SegmentRoutingDeviceConfig.class); | 94 | cfgService.getSubjects(DeviceId.class, SegmentRoutingDeviceConfig.class); |
| ... | @@ -103,15 +107,18 @@ public class DeviceConfiguration implements DeviceProperties { | ... | @@ -103,15 +107,18 @@ public class DeviceConfiguration implements DeviceProperties { |
| 103 | allSegmentIds.add(info.nodeSid); | 107 | allSegmentIds.add(info.nodeSid); |
| 104 | }); | 108 | }); |
| 105 | 109 | ||
| 106 | - // Read excluded port names from config | 110 | + // Read SegmentRoutingAppConfig |
| 107 | appConfig = cfgService.getConfig(appId, SegmentRoutingAppConfig.class); | 111 | appConfig = cfgService.getConfig(appId, SegmentRoutingAppConfig.class); |
| 108 | - Set<String> excludePorts = (appConfig != null) ? | ||
| 109 | - appConfig.excludePorts() : ImmutableSet.of(); | ||
| 110 | 112 | ||
| 111 | // Read gatewayIps and subnets from port subject. | 113 | // Read gatewayIps and subnets from port subject. |
| 112 | Set<ConnectPoint> portSubjects = | 114 | Set<ConnectPoint> portSubjects = |
| 113 | cfgService.getSubjects(ConnectPoint.class, InterfaceConfig.class); | 115 | cfgService.getSubjects(ConnectPoint.class, InterfaceConfig.class); |
| 114 | portSubjects.forEach(subject -> { | 116 | portSubjects.forEach(subject -> { |
| 117 | + // Do not process excluded ports | ||
| 118 | + if (suppressSubnet().contains(subject)) { | ||
| 119 | + return; | ||
| 120 | + } | ||
| 121 | + | ||
| 115 | InterfaceConfig config = | 122 | InterfaceConfig config = |
| 116 | cfgService.getConfig(subject, InterfaceConfig.class); | 123 | cfgService.getConfig(subject, InterfaceConfig.class); |
| 117 | Set<Interface> networkInterfaces; | 124 | Set<Interface> networkInterfaces; |
| ... | @@ -122,12 +129,6 @@ public class DeviceConfiguration implements DeviceProperties { | ... | @@ -122,12 +129,6 @@ public class DeviceConfiguration implements DeviceProperties { |
| 122 | return; | 129 | return; |
| 123 | } | 130 | } |
| 124 | networkInterfaces.forEach(networkInterface -> { | 131 | networkInterfaces.forEach(networkInterface -> { |
| 125 | - // Do not process excluded ports | ||
| 126 | - if (excludePorts.contains(networkInterface.name())) { | ||
| 127 | - excludedPorts.add(subject); | ||
| 128 | - return; | ||
| 129 | - } | ||
| 130 | - | ||
| 131 | VlanId vlanId = networkInterface.vlan(); | 132 | VlanId vlanId = networkInterface.vlan(); |
| 132 | ConnectPoint connectPoint = networkInterface.connectPoint(); | 133 | ConnectPoint connectPoint = networkInterface.connectPoint(); |
| 133 | DeviceId dpid = connectPoint.deviceId(); | 134 | DeviceId dpid = connectPoint.deviceId(); |
| ... | @@ -366,7 +367,7 @@ public class DeviceConfiguration implements DeviceProperties { | ... | @@ -366,7 +367,7 @@ public class DeviceConfiguration implements DeviceProperties { |
| 366 | 367 | ||
| 367 | ImmutableSet.Builder<Ip4Prefix> builder = ImmutableSet.builder(); | 368 | ImmutableSet.Builder<Ip4Prefix> builder = ImmutableSet.builder(); |
| 368 | builder.addAll(srinfo.subnets.values()); | 369 | builder.addAll(srinfo.subnets.values()); |
| 369 | - if (deviceId.equals(appConfig.vRouterId())) { | 370 | + if (appConfig != null && deviceId.equals(appConfig.vRouterId())) { |
| 370 | builder.add(Ip4Prefix.valueOf("0.0.0.0/0")); | 371 | builder.add(Ip4Prefix.valueOf("0.0.0.0/0")); |
| 371 | } | 372 | } |
| 372 | return builder.build(); | 373 | return builder.build(); |
| ... | @@ -491,12 +492,11 @@ public class DeviceConfiguration implements DeviceProperties { | ... | @@ -491,12 +492,11 @@ public class DeviceConfiguration implements DeviceProperties { |
| 491 | return srinfo != null && srinfo.adjacencySids.containsKey(sid); | 492 | return srinfo != null && srinfo.adjacencySids.containsKey(sid); |
| 492 | } | 493 | } |
| 493 | 494 | ||
| 494 | - /** | 495 | + public Set<ConnectPoint> suppressSubnet() { |
| 495 | - * Returns a set of excluded ports. | 496 | + return (appConfig != null) ? appConfig.suppressSubnet() : ImmutableSet.of(); |
| 496 | - * | 497 | + } |
| 497 | - * @return excluded ports | 498 | + |
| 498 | - */ | 499 | + public Set<ConnectPoint> suppressHost() { |
| 499 | - public Set<ConnectPoint> excludedPorts() { | 500 | + return (appConfig != null) ? appConfig.suppressHost() : ImmutableSet.of(); |
| 500 | - return excludedPorts; | ||
| 501 | } | 501 | } |
| 502 | } | 502 | } | ... | ... |
apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/SegmentRoutingAppConfig.java
| ... | @@ -21,8 +21,11 @@ import com.fasterxml.jackson.databind.node.ArrayNode; | ... | @@ -21,8 +21,11 @@ import com.fasterxml.jackson.databind.node.ArrayNode; |
| 21 | import com.google.common.collect.ImmutableSet; | 21 | import com.google.common.collect.ImmutableSet; |
| 22 | import org.onlab.packet.MacAddress; | 22 | import org.onlab.packet.MacAddress; |
| 23 | import org.onosproject.core.ApplicationId; | 23 | import org.onosproject.core.ApplicationId; |
| 24 | +import org.onosproject.net.ConnectPoint; | ||
| 24 | import org.onosproject.net.DeviceId; | 25 | import org.onosproject.net.DeviceId; |
| 25 | import org.onosproject.net.config.Config; | 26 | import org.onosproject.net.config.Config; |
| 27 | + | ||
| 28 | +import java.util.Optional; | ||
| 26 | import java.util.Set; | 29 | import java.util.Set; |
| 27 | 30 | ||
| 28 | import static com.google.common.base.MoreObjects.toStringHelper; | 31 | import static com.google.common.base.MoreObjects.toStringHelper; |
| ... | @@ -33,23 +36,25 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -33,23 +36,25 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
| 33 | public class SegmentRoutingAppConfig extends Config<ApplicationId> { | 36 | public class SegmentRoutingAppConfig extends Config<ApplicationId> { |
| 34 | private static final String VROUTER_MACS = "vRouterMacs"; | 37 | private static final String VROUTER_MACS = "vRouterMacs"; |
| 35 | private static final String VROUTER_ID = "vRouterId"; | 38 | private static final String VROUTER_ID = "vRouterId"; |
| 36 | - private static final String EXCLUDE_PORTS = "excludePorts"; | 39 | + private static final String SUPPRESS_SUBNET = "suppressSubnet"; |
| 40 | + private static final String SUPPRESS_HOST = "suppressHost"; | ||
| 37 | 41 | ||
| 38 | @Override | 42 | @Override |
| 39 | public boolean isValid() { | 43 | public boolean isValid() { |
| 40 | - return hasOnlyFields(VROUTER_MACS, VROUTER_ID, EXCLUDE_PORTS) && | 44 | + return hasOnlyFields(VROUTER_MACS, VROUTER_ID, SUPPRESS_SUBNET, SUPPRESS_HOST) && |
| 41 | vRouterMacs() != null && vRouterId() != null && | 45 | vRouterMacs() != null && vRouterId() != null && |
| 42 | - excludePorts() != null; | 46 | + suppressSubnet() != null && suppressHost() != null; |
| 43 | } | 47 | } |
| 44 | 48 | ||
| 45 | /** | 49 | /** |
| 46 | * Gets vRouters from the config. | 50 | * Gets vRouters from the config. |
| 47 | * | 51 | * |
| 48 | - * @return a set of vRouter MAC addresses | 52 | + * @return Set of vRouter MAC addresses, empty is not specified, |
| 53 | + * or null if not valid | ||
| 49 | */ | 54 | */ |
| 50 | public Set<MacAddress> vRouterMacs() { | 55 | public Set<MacAddress> vRouterMacs() { |
| 51 | if (!object.has(VROUTER_MACS)) { | 56 | if (!object.has(VROUTER_MACS)) { |
| 52 | - return null; | 57 | + return ImmutableSet.of(); |
| 53 | } | 58 | } |
| 54 | 59 | ||
| 55 | ImmutableSet.Builder<MacAddress> builder = ImmutableSet.builder(); | 60 | ImmutableSet.Builder<MacAddress> builder = ImmutableSet.builder(); |
| ... | @@ -96,15 +101,16 @@ public class SegmentRoutingAppConfig extends Config<ApplicationId> { | ... | @@ -96,15 +101,16 @@ public class SegmentRoutingAppConfig extends Config<ApplicationId> { |
| 96 | /** | 101 | /** |
| 97 | * Gets vRouter device ID. | 102 | * Gets vRouter device ID. |
| 98 | * | 103 | * |
| 99 | - * @return vRouter device ID, or null if not valid | 104 | + * @return Optional vRouter device ID, |
| 105 | + * empty is not specified or null if not valid | ||
| 100 | */ | 106 | */ |
| 101 | - public DeviceId vRouterId() { | 107 | + public Optional<DeviceId> vRouterId() { |
| 102 | if (!object.has(VROUTER_ID)) { | 108 | if (!object.has(VROUTER_ID)) { |
| 103 | - return null; | 109 | + return Optional.empty(); |
| 104 | } | 110 | } |
| 105 | 111 | ||
| 106 | try { | 112 | try { |
| 107 | - return DeviceId.deviceId(object.path(VROUTER_ID).asText()); | 113 | + return Optional.of(DeviceId.deviceId(object.path(VROUTER_ID).asText())); |
| 108 | } catch (IllegalArgumentException e) { | 114 | } catch (IllegalArgumentException e) { |
| 109 | return null; | 115 | return null; |
| 110 | } | 116 | } |
| ... | @@ -126,42 +132,95 @@ public class SegmentRoutingAppConfig extends Config<ApplicationId> { | ... | @@ -126,42 +132,95 @@ public class SegmentRoutingAppConfig extends Config<ApplicationId> { |
| 126 | } | 132 | } |
| 127 | 133 | ||
| 128 | /** | 134 | /** |
| 129 | - * Gets names of ports that are ignored by SegmentRouting. | 135 | + * Gets names of ports to which SegmentRouting does not push subnet rules. |
| 130 | * | 136 | * |
| 131 | - * @return set of port names | 137 | + * @return Set of port names, empty if not specified, or null |
| 138 | + * if not valid | ||
| 132 | */ | 139 | */ |
| 133 | - public Set<String> excludePorts() { | 140 | + public Set<ConnectPoint> suppressSubnet() { |
| 134 | - if (!object.has(EXCLUDE_PORTS)) { | 141 | + if (!object.has(SUPPRESS_SUBNET)) { |
| 135 | - return null; | 142 | + return ImmutableSet.of(); |
| 136 | } | 143 | } |
| 137 | 144 | ||
| 138 | - ImmutableSet.Builder<String> builder = ImmutableSet.builder(); | 145 | + ImmutableSet.Builder<ConnectPoint> builder = ImmutableSet.builder(); |
| 139 | - ArrayNode arrayNode = (ArrayNode) object.path(EXCLUDE_PORTS); | 146 | + ArrayNode arrayNode = (ArrayNode) object.path(SUPPRESS_SUBNET); |
| 140 | for (JsonNode jsonNode : arrayNode) { | 147 | for (JsonNode jsonNode : arrayNode) { |
| 141 | String portName = jsonNode.asText(null); | 148 | String portName = jsonNode.asText(null); |
| 142 | if (portName == null) { | 149 | if (portName == null) { |
| 143 | return null; | 150 | return null; |
| 144 | } | 151 | } |
| 145 | - builder.add(portName); | 152 | + try { |
| 153 | + builder.add(ConnectPoint.deviceConnectPoint(portName)); | ||
| 154 | + } catch (IllegalArgumentException e) { | ||
| 155 | + return null; | ||
| 156 | + } | ||
| 157 | + } | ||
| 158 | + return builder.build(); | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + /** | ||
| 162 | + * Sets names of ports to which SegmentRouting does not push subnet rules. | ||
| 163 | + * | ||
| 164 | + * @param suppressSubnet names of ports to which SegmentRouting does not push | ||
| 165 | + * subnet rules | ||
| 166 | + * @return this {@link SegmentRoutingAppConfig} | ||
| 167 | + */ | ||
| 168 | + public SegmentRoutingAppConfig setSuppressSubnet(Set<ConnectPoint> suppressSubnet) { | ||
| 169 | + if (suppressSubnet == null) { | ||
| 170 | + object.remove(SUPPRESS_SUBNET); | ||
| 171 | + } else { | ||
| 172 | + ArrayNode arrayNode = mapper.createArrayNode(); | ||
| 173 | + suppressSubnet.forEach(connectPoint -> { | ||
| 174 | + arrayNode.add(connectPoint.deviceId() + "/" + connectPoint.port()); | ||
| 175 | + }); | ||
| 176 | + object.set(SUPPRESS_SUBNET, arrayNode); | ||
| 177 | + } | ||
| 178 | + return this; | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + /** | ||
| 182 | + * Gets names of ports to which SegmentRouting does not push host rules. | ||
| 183 | + * | ||
| 184 | + * @return Set of port names, empty if not specified, or null | ||
| 185 | + * if not valid | ||
| 186 | + */ | ||
| 187 | + public Set<ConnectPoint> suppressHost() { | ||
| 188 | + if (!object.has(SUPPRESS_HOST)) { | ||
| 189 | + return ImmutableSet.of(); | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | + ImmutableSet.Builder<ConnectPoint> builder = ImmutableSet.builder(); | ||
| 193 | + ArrayNode arrayNode = (ArrayNode) object.path(SUPPRESS_HOST); | ||
| 194 | + for (JsonNode jsonNode : arrayNode) { | ||
| 195 | + String portName = jsonNode.asText(null); | ||
| 196 | + if (portName == null) { | ||
| 197 | + return null; | ||
| 198 | + } | ||
| 199 | + try { | ||
| 200 | + builder.add(ConnectPoint.deviceConnectPoint(portName)); | ||
| 201 | + } catch (IllegalArgumentException e) { | ||
| 202 | + return null; | ||
| 203 | + } | ||
| 146 | } | 204 | } |
| 147 | return builder.build(); | 205 | return builder.build(); |
| 148 | } | 206 | } |
| 149 | 207 | ||
| 150 | /** | 208 | /** |
| 151 | - * Sets names of ports that are ignored by SegmentRouting. | 209 | + * Sets names of ports to which SegmentRouting does not push host rules. |
| 152 | * | 210 | * |
| 153 | - * @param excludePorts names of ports that are ignored by SegmentRouting | 211 | + * @param suppressHost names of ports to which SegmentRouting does not push |
| 212 | + * host rules | ||
| 154 | * @return this {@link SegmentRoutingAppConfig} | 213 | * @return this {@link SegmentRoutingAppConfig} |
| 155 | */ | 214 | */ |
| 156 | - public SegmentRoutingAppConfig setExcludePorts(Set<String> excludePorts) { | 215 | + public SegmentRoutingAppConfig setSuppressHost(Set<ConnectPoint> suppressHost) { |
| 157 | - if (excludePorts == null) { | 216 | + if (suppressHost == null) { |
| 158 | - object.remove(EXCLUDE_PORTS); | 217 | + object.remove(SUPPRESS_HOST); |
| 159 | } else { | 218 | } else { |
| 160 | ArrayNode arrayNode = mapper.createArrayNode(); | 219 | ArrayNode arrayNode = mapper.createArrayNode(); |
| 161 | - excludePorts.forEach(portName -> { | 220 | + suppressHost.forEach(connectPoint -> { |
| 162 | - arrayNode.add(portName); | 221 | + arrayNode.add(connectPoint.deviceId() + "/" + connectPoint.port()); |
| 163 | }); | 222 | }); |
| 164 | - object.set(EXCLUDE_PORTS, arrayNode); | 223 | + object.set(SUPPRESS_HOST, arrayNode); |
| 165 | } | 224 | } |
| 166 | return this; | 225 | return this; |
| 167 | } | 226 | } |
| ... | @@ -170,7 +229,9 @@ public class SegmentRoutingAppConfig extends Config<ApplicationId> { | ... | @@ -170,7 +229,9 @@ public class SegmentRoutingAppConfig extends Config<ApplicationId> { |
| 170 | public String toString() { | 229 | public String toString() { |
| 171 | return toStringHelper(this) | 230 | return toStringHelper(this) |
| 172 | .add("vRouterMacs", vRouterMacs()) | 231 | .add("vRouterMacs", vRouterMacs()) |
| 173 | - .add("excludePorts", excludePorts()) | 232 | + .add("vRouterId", vRouterId()) |
| 233 | + .add("suppressSubnet", suppressSubnet()) | ||
| 234 | + .add("suppressHost", suppressHost()) | ||
| 174 | .toString(); | 235 | .toString(); |
| 175 | } | 236 | } |
| 176 | } | 237 | } | ... | ... |
| ... | @@ -24,16 +24,17 @@ import org.junit.Test; | ... | @@ -24,16 +24,17 @@ import org.junit.Test; |
| 24 | import org.onlab.packet.MacAddress; | 24 | import org.onlab.packet.MacAddress; |
| 25 | import org.onosproject.core.ApplicationId; | 25 | import org.onosproject.core.ApplicationId; |
| 26 | import org.onosproject.TestApplicationId; | 26 | import org.onosproject.TestApplicationId; |
| 27 | +import org.onosproject.net.ConnectPoint; | ||
| 27 | import org.onosproject.net.DeviceId; | 28 | import org.onosproject.net.DeviceId; |
| 28 | import org.onosproject.net.config.Config; | 29 | import org.onosproject.net.config.Config; |
| 29 | import org.onosproject.net.config.ConfigApplyDelegate; | 30 | import org.onosproject.net.config.ConfigApplyDelegate; |
| 30 | import org.onosproject.segmentrouting.SegmentRoutingManager; | 31 | import org.onosproject.segmentrouting.SegmentRoutingManager; |
| 32 | + | ||
| 33 | +import java.util.Optional; | ||
| 31 | import java.util.Set; | 34 | import java.util.Set; |
| 32 | 35 | ||
| 33 | import static org.hamcrest.Matchers.is; | 36 | import static org.hamcrest.Matchers.is; |
| 34 | -import static org.junit.Assert.assertThat; | 37 | +import static org.junit.Assert.*; |
| 35 | -import static org.junit.Assert.assertTrue; | ||
| 36 | -import static org.junit.Assert.assertFalse; | ||
| 37 | 38 | ||
| 38 | /** | 39 | /** |
| 39 | * Tests for class {@link SegmentRoutingAppConfig}. | 40 | * Tests for class {@link SegmentRoutingAppConfig}. |
| ... | @@ -50,25 +51,29 @@ public class SegmentRoutingAppConfigTest { | ... | @@ -50,25 +51,29 @@ public class SegmentRoutingAppConfigTest { |
| 50 | " \"00:00:00:00:00:02\"" + | 51 | " \"00:00:00:00:00:02\"" + |
| 51 | "]," + | 52 | "]," + |
| 52 | "\"vRouterId\" : \"of:1\"," + | 53 | "\"vRouterId\" : \"of:1\"," + |
| 53 | - "\"excludePorts\" : [" + | 54 | + "\"suppressSubnet\" : [" + |
| 54 | - " \"port1\"," + | 55 | + " \"of:1/1\"," + |
| 55 | - " \"port2\"" + | 56 | + " \"of:1/2\"" + |
| 57 | + "]," + | ||
| 58 | + "\"suppressHost\" : [" + | ||
| 59 | + " \"of:1/1\"," + | ||
| 60 | + " \"of:1/2\"" + | ||
| 56 | "]}"; | 61 | "]}"; |
| 57 | private static final String INVALID_JSON_STRING = "{" + | 62 | private static final String INVALID_JSON_STRING = "{" + |
| 58 | "\"vRouterMacs\" : [" + | 63 | "\"vRouterMacs\" : [" + |
| 59 | " \"00:00:00:00:00:01\"," + | 64 | " \"00:00:00:00:00:01\"," + |
| 60 | " \"00:00:00:00:00:02\"" + | 65 | " \"00:00:00:00:00:02\"" + |
| 61 | "]," + | 66 | "]," + |
| 62 | - "\"excludePorts\" : [" + | 67 | + "\"suppressSubnet\" : [" + |
| 63 | - " \"port1\"," + | 68 | + " \"of:1/1\"," + |
| 64 | - " \"port2\"" + | 69 | + " \"wrongport\"" + |
| 65 | "]}"; | 70 | "]}"; |
| 66 | private static final MacAddress ROUTER_MAC_1 = MacAddress.valueOf("00:00:00:00:00:01"); | 71 | private static final MacAddress ROUTER_MAC_1 = MacAddress.valueOf("00:00:00:00:00:01"); |
| 67 | private static final MacAddress ROUTER_MAC_2 = MacAddress.valueOf("00:00:00:00:00:02"); | 72 | private static final MacAddress ROUTER_MAC_2 = MacAddress.valueOf("00:00:00:00:00:02"); |
| 68 | private static final MacAddress ROUTER_MAC_3 = MacAddress.valueOf("00:00:00:00:00:03"); | 73 | private static final MacAddress ROUTER_MAC_3 = MacAddress.valueOf("00:00:00:00:00:03"); |
| 69 | - private static final String PORT_NAME_1 = "port1"; | 74 | + private static final ConnectPoint PORT_1 = ConnectPoint.deviceConnectPoint("of:1/1"); |
| 70 | - private static final String PORT_NAME_2 = "port2"; | 75 | + private static final ConnectPoint PORT_2 = ConnectPoint.deviceConnectPoint("of:1/2"); |
| 71 | - private static final String PORT_NAME_3 = "port3"; | 76 | + private static final ConnectPoint PORT_3 = ConnectPoint.deviceConnectPoint("of:1/3"); |
| 72 | private static final DeviceId VROUTER_ID_1 = DeviceId.deviceId("of:1"); | 77 | private static final DeviceId VROUTER_ID_1 = DeviceId.deviceId("of:1"); |
| 73 | private static final DeviceId VROUTER_ID_2 = DeviceId.deviceId("of:2"); | 78 | private static final DeviceId VROUTER_ID_2 = DeviceId.deviceId("of:2"); |
| 74 | 79 | ||
| ... | @@ -109,11 +114,12 @@ public class SegmentRoutingAppConfigTest { | ... | @@ -109,11 +114,12 @@ public class SegmentRoutingAppConfigTest { |
| 109 | * @throws Exception | 114 | * @throws Exception |
| 110 | */ | 115 | */ |
| 111 | @Test | 116 | @Test |
| 112 | - public void testVRouters() throws Exception { | 117 | + public void testVRouterMacs() throws Exception { |
| 113 | - Set<MacAddress> vRouters = config.vRouterMacs(); | 118 | + Set<MacAddress> vRouterMacs = config.vRouterMacs(); |
| 114 | - assertThat(vRouters.size(), is(2)); | 119 | + assertNotNull("vRouterMacs should not be null", vRouterMacs); |
| 115 | - assertTrue(vRouters.contains(ROUTER_MAC_1)); | 120 | + assertThat(vRouterMacs.size(), is(2)); |
| 116 | - assertTrue(vRouters.contains(ROUTER_MAC_2)); | 121 | + assertTrue(vRouterMacs.contains(ROUTER_MAC_1)); |
| 122 | + assertTrue(vRouterMacs.contains(ROUTER_MAC_2)); | ||
| 117 | } | 123 | } |
| 118 | 124 | ||
| 119 | /** | 125 | /** |
| ... | @@ -122,14 +128,14 @@ public class SegmentRoutingAppConfigTest { | ... | @@ -122,14 +128,14 @@ public class SegmentRoutingAppConfigTest { |
| 122 | * @throws Exception | 128 | * @throws Exception |
| 123 | */ | 129 | */ |
| 124 | @Test | 130 | @Test |
| 125 | - public void testSetVRouters() throws Exception { | 131 | + public void testSetVRouterMacs() throws Exception { |
| 126 | ImmutableSet.Builder<MacAddress> builder = ImmutableSet.builder(); | 132 | ImmutableSet.Builder<MacAddress> builder = ImmutableSet.builder(); |
| 127 | builder.add(ROUTER_MAC_3); | 133 | builder.add(ROUTER_MAC_3); |
| 128 | config.setVRouterMacs(builder.build()); | 134 | config.setVRouterMacs(builder.build()); |
| 129 | 135 | ||
| 130 | - Set<MacAddress> macs = config.vRouterMacs(); | 136 | + Set<MacAddress> vRouterMacs = config.vRouterMacs(); |
| 131 | - assertThat(macs.size(), is(1)); | 137 | + assertThat(vRouterMacs.size(), is(1)); |
| 132 | - assertTrue(macs.contains(ROUTER_MAC_3)); | 138 | + assertTrue(vRouterMacs.contains(ROUTER_MAC_3)); |
| 133 | } | 139 | } |
| 134 | 140 | ||
| 135 | /** | 141 | /** |
| ... | @@ -139,7 +145,9 @@ public class SegmentRoutingAppConfigTest { | ... | @@ -139,7 +145,9 @@ public class SegmentRoutingAppConfigTest { |
| 139 | */ | 145 | */ |
| 140 | @Test | 146 | @Test |
| 141 | public void testVRouterId() throws Exception { | 147 | public void testVRouterId() throws Exception { |
| 142 | - assertThat(config.vRouterId(), is(VROUTER_ID_1)); | 148 | + Optional<DeviceId> vRouterId = config.vRouterId(); |
| 149 | + assertTrue(vRouterId.isPresent()); | ||
| 150 | + assertThat(vRouterId.get(), is(VROUTER_ID_1)); | ||
| 143 | } | 151 | } |
| 144 | 152 | ||
| 145 | /** | 153 | /** |
| ... | @@ -150,36 +158,72 @@ public class SegmentRoutingAppConfigTest { | ... | @@ -150,36 +158,72 @@ public class SegmentRoutingAppConfigTest { |
| 150 | @Test | 158 | @Test |
| 151 | public void testSetVRouterId() throws Exception { | 159 | public void testSetVRouterId() throws Exception { |
| 152 | config.setVRouterId(VROUTER_ID_2); | 160 | config.setVRouterId(VROUTER_ID_2); |
| 153 | - assertThat(config.vRouterId(), is(VROUTER_ID_2)); | 161 | + |
| 162 | + Optional<DeviceId> vRouterId = config.vRouterId(); | ||
| 163 | + assertTrue(vRouterId.isPresent()); | ||
| 164 | + assertThat(vRouterId.get(), is(VROUTER_ID_2)); | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + /** | ||
| 168 | + * Tests suppressSubnet getter. | ||
| 169 | + * | ||
| 170 | + * @throws Exception | ||
| 171 | + */ | ||
| 172 | + @Test | ||
| 173 | + public void testSuppressSubnet() throws Exception { | ||
| 174 | + Set<ConnectPoint> suppressSubnet = config.suppressSubnet(); | ||
| 175 | + assertNotNull("suppressSubnet should not be null", suppressSubnet); | ||
| 176 | + assertThat(suppressSubnet.size(), is(2)); | ||
| 177 | + assertTrue(suppressSubnet.contains(PORT_1)); | ||
| 178 | + assertTrue(suppressSubnet.contains(PORT_2)); | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + /** | ||
| 182 | + * Tests suppressSubnet setter. | ||
| 183 | + * | ||
| 184 | + * @throws Exception | ||
| 185 | + */ | ||
| 186 | + @Test | ||
| 187 | + public void testSetSuppressSubnet() throws Exception { | ||
| 188 | + ImmutableSet.Builder<ConnectPoint> builder = ImmutableSet.builder(); | ||
| 189 | + builder.add(PORT_3); | ||
| 190 | + config.setSuppressSubnet(builder.build()); | ||
| 191 | + | ||
| 192 | + Set<ConnectPoint> suppressSubnet = config.suppressSubnet(); | ||
| 193 | + assertNotNull("suppressSubnet should not be null", suppressSubnet); | ||
| 194 | + assertThat(suppressSubnet.size(), is(1)); | ||
| 195 | + assertTrue(suppressSubnet.contains(PORT_3)); | ||
| 154 | } | 196 | } |
| 155 | 197 | ||
| 156 | /** | 198 | /** |
| 157 | - * Tests excludePort getter. | 199 | + * Tests suppressHost getter. |
| 158 | * | 200 | * |
| 159 | * @throws Exception | 201 | * @throws Exception |
| 160 | */ | 202 | */ |
| 161 | @Test | 203 | @Test |
| 162 | - public void testExcludePorts() throws Exception { | 204 | + public void testSuppressHost() throws Exception { |
| 163 | - Set<String> excludePorts = config.excludePorts(); | 205 | + Set<ConnectPoint> suppressHost = config.suppressHost(); |
| 164 | - assertThat(excludePorts.size(), is(2)); | 206 | + assertNotNull("suppressHost should not be null", suppressHost); |
| 165 | - assertTrue(excludePorts.contains(PORT_NAME_1)); | 207 | + assertThat(suppressHost.size(), is(2)); |
| 166 | - assertTrue(excludePorts.contains(PORT_NAME_2)); | 208 | + assertTrue(suppressHost.contains(PORT_1)); |
| 209 | + assertTrue(suppressHost.contains(PORT_2)); | ||
| 167 | } | 210 | } |
| 168 | 211 | ||
| 169 | /** | 212 | /** |
| 170 | - * Tests excludePort setter. | 213 | + * Tests suppressHost setter. |
| 171 | * | 214 | * |
| 172 | * @throws Exception | 215 | * @throws Exception |
| 173 | */ | 216 | */ |
| 174 | @Test | 217 | @Test |
| 175 | - public void testSetExcludePorts() throws Exception { | 218 | + public void testSetSuppressHost() throws Exception { |
| 176 | - ImmutableSet.Builder<String> builder = ImmutableSet.builder(); | 219 | + ImmutableSet.Builder<ConnectPoint> builder = ImmutableSet.builder(); |
| 177 | - builder.add(PORT_NAME_3); | 220 | + builder.add(PORT_3); |
| 178 | - config.setExcludePorts(builder.build()); | 221 | + config.setSuppressHost(builder.build()); |
| 179 | - | 222 | + |
| 180 | - Set<String> excludePorts = config.excludePorts(); | 223 | + Set<ConnectPoint> suppressHost = config.suppressHost(); |
| 181 | - assertThat(excludePorts.size(), is(1)); | 224 | + assertNotNull("suppressHost should not be null", suppressHost); |
| 182 | - assertTrue(excludePorts.contains(PORT_NAME_3)); | 225 | + assertThat(suppressHost.size(), is(1)); |
| 226 | + assertTrue(suppressHost.contains(PORT_3)); | ||
| 183 | } | 227 | } |
| 184 | 228 | ||
| 185 | private class MockDelegate implements ConfigApplyDelegate { | 229 | private class MockDelegate implements ConfigApplyDelegate { | ... | ... |
| ... | @@ -35,7 +35,6 @@ | ... | @@ -35,7 +35,6 @@ |
| 35 | "of:0000000000000002/5" : { | 35 | "of:0000000000000002/5" : { |
| 36 | "interfaces" : [ | 36 | "interfaces" : [ |
| 37 | { | 37 | { |
| 38 | - "name" : "2/5/1", | ||
| 39 | "ips" : [ "100.0.0.0/24" ], | 38 | "ips" : [ "100.0.0.0/24" ], |
| 40 | "vlan" : "-1" | 39 | "vlan" : "-1" |
| 41 | } | 40 | } |
| ... | @@ -123,8 +122,11 @@ | ... | @@ -123,8 +122,11 @@ |
| 123 | "00:00:00:aa:00:02" | 122 | "00:00:00:aa:00:02" |
| 124 | ], | 123 | ], |
| 125 | "vRouterId" : "of:0000000000000002", | 124 | "vRouterId" : "of:0000000000000002", |
| 126 | - "excludePorts" : [ | 125 | + "suppressSubnet" : [ |
| 127 | - "2/5/1" | 126 | + "of:0000000000000002/5" |
| 127 | + ], | ||
| 128 | + "suppressHost" : [ | ||
| 129 | + "of:0000000000000002/5" | ||
| 128 | ] | 130 | ] |
| 129 | } | 131 | } |
| 130 | } | 132 | } | ... | ... |
-
Please register or login to post a comment