Committed by
Gerrit Code Review
Add optional "name" parameter in interface configuration.
Interfaces can now be added and deleted by name. Interfaces without names cannot be updated or deleted. Change-Id: Icb2188b1c9abf3017724f751a93457920a53ba03
Showing
8 changed files
with
150 additions
and
53 deletions
| ... | @@ -17,6 +17,7 @@ | ... | @@ -17,6 +17,7 @@ |
| 17 | package org.onosproject.cli.net; | 17 | package org.onosproject.cli.net; |
| 18 | 18 | ||
| 19 | import com.google.common.collect.Sets; | 19 | import com.google.common.collect.Sets; |
| 20 | +import org.apache.karaf.shell.commands.Argument; | ||
| 20 | import org.apache.karaf.shell.commands.Command; | 21 | import org.apache.karaf.shell.commands.Command; |
| 21 | import org.apache.karaf.shell.commands.Option; | 22 | import org.apache.karaf.shell.commands.Option; |
| 22 | import org.onlab.packet.MacAddress; | 23 | import org.onlab.packet.MacAddress; |
| ... | @@ -36,11 +37,15 @@ import java.util.Set; | ... | @@ -36,11 +37,15 @@ import java.util.Set; |
| 36 | description = "Adds a new configured interface") | 37 | description = "Adds a new configured interface") |
| 37 | public class InterfaceAddCommand extends AbstractShellCommand { | 38 | public class InterfaceAddCommand extends AbstractShellCommand { |
| 38 | 39 | ||
| 39 | - @Option(name = "-c", aliases = "--connectPoint", | 40 | + @Argument(index = 0, name = "port", |
| 40 | description = "Device port that the interface is associated with", | 41 | description = "Device port that the interface is associated with", |
| 41 | required = true, multiValued = false) | 42 | required = true, multiValued = false) |
| 42 | private String connectPoint = null; | 43 | private String connectPoint = null; |
| 43 | 44 | ||
| 45 | + @Argument(index = 1, name = "name", description = "Interface name", | ||
| 46 | + required = true, multiValued = false) | ||
| 47 | + private String name = null; | ||
| 48 | + | ||
| 44 | @Option(name = "-m", aliases = "--mac", | 49 | @Option(name = "-m", aliases = "--mac", |
| 45 | description = "MAC address of the interface", | 50 | description = "MAC address of the interface", |
| 46 | required = false, multiValued = false) | 51 | required = false, multiValued = false) |
| ... | @@ -72,10 +77,13 @@ public class InterfaceAddCommand extends AbstractShellCommand { | ... | @@ -72,10 +77,13 @@ public class InterfaceAddCommand extends AbstractShellCommand { |
| 72 | 77 | ||
| 73 | VlanId vlanId = vlan == null ? VlanId.NONE : VlanId.vlanId(Short.parseShort(vlan)); | 78 | VlanId vlanId = vlan == null ? VlanId.NONE : VlanId.vlanId(Short.parseShort(vlan)); |
| 74 | 79 | ||
| 75 | - Interface intf = new Interface(ConnectPoint.deviceConnectPoint(connectPoint), | 80 | + Interface intf = new Interface(name, |
| 81 | + ConnectPoint.deviceConnectPoint(connectPoint), | ||
| 76 | ipAddresses, macAddr, vlanId); | 82 | ipAddresses, macAddr, vlanId); |
| 77 | 83 | ||
| 78 | interfaceService.add(intf); | 84 | interfaceService.add(intf); |
| 85 | + | ||
| 86 | + print("Interface added"); | ||
| 79 | } | 87 | } |
| 80 | 88 | ||
| 81 | } | 89 | } | ... | ... |
| ... | @@ -18,7 +18,6 @@ package org.onosproject.cli.net; | ... | @@ -18,7 +18,6 @@ package org.onosproject.cli.net; |
| 18 | 18 | ||
| 19 | import org.apache.karaf.shell.commands.Argument; | 19 | import org.apache.karaf.shell.commands.Argument; |
| 20 | import org.apache.karaf.shell.commands.Command; | 20 | import org.apache.karaf.shell.commands.Command; |
| 21 | -import org.onlab.packet.VlanId; | ||
| 22 | import org.onosproject.cli.AbstractShellCommand; | 21 | import org.onosproject.cli.AbstractShellCommand; |
| 23 | import org.onosproject.incubator.net.intf.InterfaceAdminService; | 22 | import org.onosproject.incubator.net.intf.InterfaceAdminService; |
| 24 | import org.onosproject.net.ConnectPoint; | 23 | import org.onosproject.net.ConnectPoint; |
| ... | @@ -35,17 +34,23 @@ public class InterfaceRemoveCommand extends AbstractShellCommand { | ... | @@ -35,17 +34,23 @@ public class InterfaceRemoveCommand extends AbstractShellCommand { |
| 35 | required = true, multiValued = false) | 34 | required = true, multiValued = false) |
| 36 | private String connectPoint = null; | 35 | private String connectPoint = null; |
| 37 | 36 | ||
| 38 | - @Argument(index = 1, name = "vlan", | 37 | + @Argument(index = 1, name = "name", |
| 39 | - description = "Interface vlan", | 38 | + description = "Interface name", |
| 40 | required = true, multiValued = false) | 39 | required = true, multiValued = false) |
| 41 | - private String vlan = null; | 40 | + private String name = null; |
| 42 | 41 | ||
| 43 | @Override | 42 | @Override |
| 44 | protected void execute() { | 43 | protected void execute() { |
| 45 | InterfaceAdminService interfaceService = get(InterfaceAdminService.class); | 44 | InterfaceAdminService interfaceService = get(InterfaceAdminService.class); |
| 46 | 45 | ||
| 47 | - interfaceService.remove(ConnectPoint.deviceConnectPoint(connectPoint), | 46 | + boolean success = interfaceService.remove( |
| 48 | - VlanId.vlanId(Short.parseShort(vlan))); | 47 | + ConnectPoint.deviceConnectPoint(connectPoint), name); |
| 48 | + | ||
| 49 | + if (success) { | ||
| 50 | + print("Interface removed"); | ||
| 51 | + } else { | ||
| 52 | + print("Unable to remove interface"); | ||
| 53 | + } | ||
| 49 | } | 54 | } |
| 50 | 55 | ||
| 51 | } | 56 | } | ... | ... |
| ... | @@ -35,6 +35,9 @@ public class InterfacesListCommand extends AbstractShellCommand { | ... | @@ -35,6 +35,9 @@ public class InterfacesListCommand extends AbstractShellCommand { |
| 35 | private static final String FORMAT = | 35 | private static final String FORMAT = |
| 36 | "port=%s/%s, ips=%s, mac=%s, vlan=%s"; | 36 | "port=%s/%s, ips=%s, mac=%s, vlan=%s"; |
| 37 | 37 | ||
| 38 | + private static final String NAME_FORMAT = | ||
| 39 | + "%s: port=%s/%s, ips=%s, mac=%s, vlan=%s"; | ||
| 40 | + | ||
| 38 | @Override | 41 | @Override |
| 39 | protected void execute() { | 42 | protected void execute() { |
| 40 | InterfaceService interfaceService = get(InterfaceService.class); | 43 | InterfaceService interfaceService = get(InterfaceService.class); |
| ... | @@ -44,8 +47,14 @@ public class InterfacesListCommand extends AbstractShellCommand { | ... | @@ -44,8 +47,14 @@ public class InterfacesListCommand extends AbstractShellCommand { |
| 44 | Collections.sort(interfaces, Comparators.INTERFACES_COMPARATOR); | 47 | Collections.sort(interfaces, Comparators.INTERFACES_COMPARATOR); |
| 45 | 48 | ||
| 46 | for (Interface intf : interfaces) { | 49 | for (Interface intf : interfaces) { |
| 47 | - print(FORMAT, intf.connectPoint().deviceId(), intf.connectPoint().port(), | 50 | + if (intf.name().equals(Interface.NO_INTERFACE_NAME)) { |
| 48 | - intf.ipAddresses(), intf.mac(), intf.vlan()); | 51 | + print(FORMAT, intf.connectPoint().deviceId(), intf.connectPoint().port(), |
| 52 | + intf.ipAddresses(), intf.mac(), intf.vlan()); | ||
| 53 | + } else { | ||
| 54 | + print(NAME_FORMAT, intf.name(), intf.connectPoint().deviceId(), | ||
| 55 | + intf.connectPoint().port(), intf.ipAddresses(), | ||
| 56 | + intf.mac(), intf.vlan()); | ||
| 57 | + } | ||
| 49 | } | 58 | } |
| 50 | } | 59 | } |
| 51 | 60 | ... | ... |
| ... | @@ -358,15 +358,16 @@ | ... | @@ -358,15 +358,16 @@ |
| 358 | </command> | 358 | </command> |
| 359 | <command> | 359 | <command> |
| 360 | <action class="org.onosproject.cli.net.InterfaceAddCommand"/> | 360 | <action class="org.onosproject.cli.net.InterfaceAddCommand"/> |
| 361 | - <optional-completers> | 361 | + <completers> |
| 362 | - <entry key="-c" value-ref="connectPointCompleter"/> | 362 | + <ref component-id="connectPointCompleter" /> |
| 363 | - <entry key="--connectPoint" value-ref="connectPointCompleter"/> | 363 | + <ref component-id="placeholderCompleter" /> |
| 364 | - </optional-completers> | 364 | + </completers> |
| 365 | </command> | 365 | </command> |
| 366 | <command> | 366 | <command> |
| 367 | <action class="org.onosproject.cli.net.InterfaceRemoveCommand"/> | 367 | <action class="org.onosproject.cli.net.InterfaceRemoveCommand"/> |
| 368 | <completers> | 368 | <completers> |
| 369 | <ref component-id="connectPointCompleter"/> | 369 | <ref component-id="connectPointCompleter"/> |
| 370 | + <ref component-id="placeholderCompleter" /> | ||
| 370 | </completers> | 371 | </completers> |
| 371 | </command> | 372 | </command> |
| 372 | <command> | 373 | <command> |
| ... | @@ -505,4 +506,6 @@ | ... | @@ -505,4 +506,6 @@ |
| 505 | <bean id="upDownCompleter" class="org.onosproject.cli.UpDownCompleter"/> | 506 | <bean id="upDownCompleter" class="org.onosproject.cli.UpDownCompleter"/> |
| 506 | <bean id="encapTypeCompleter" class="org.onosproject.cli.net.EncapTypeCompleter"/> | 507 | <bean id="encapTypeCompleter" class="org.onosproject.cli.net.EncapTypeCompleter"/> |
| 507 | 508 | ||
| 509 | + <bean id="placeholderCompleter" class="org.onosproject.cli.PlaceholderCompleter"/> | ||
| 510 | + | ||
| 508 | </blueprint> | 511 | </blueprint> | ... | ... |
| ... | @@ -28,6 +28,7 @@ import org.onosproject.net.ConnectPoint; | ... | @@ -28,6 +28,7 @@ import org.onosproject.net.ConnectPoint; |
| 28 | import org.onosproject.net.config.Config; | 28 | import org.onosproject.net.config.Config; |
| 29 | import org.onosproject.net.host.InterfaceIpAddress; | 29 | import org.onosproject.net.host.InterfaceIpAddress; |
| 30 | 30 | ||
| 31 | +import java.util.Iterator; | ||
| 31 | import java.util.Set; | 32 | import java.util.Set; |
| 32 | 33 | ||
| 33 | /** | 34 | /** |
| ... | @@ -35,6 +36,7 @@ import java.util.Set; | ... | @@ -35,6 +36,7 @@ import java.util.Set; |
| 35 | */ | 36 | */ |
| 36 | @Beta | 37 | @Beta |
| 37 | public class InterfaceConfig extends Config<ConnectPoint> { | 38 | public class InterfaceConfig extends Config<ConnectPoint> { |
| 39 | + public static final String NAME = "name"; | ||
| 38 | public static final String IPS = "ips"; | 40 | public static final String IPS = "ips"; |
| 39 | public static final String MAC = "mac"; | 41 | public static final String MAC = "mac"; |
| 40 | public static final String VLAN = "vlan"; | 42 | public static final String VLAN = "vlan"; |
| ... | @@ -52,6 +54,8 @@ public class InterfaceConfig extends Config<ConnectPoint> { | ... | @@ -52,6 +54,8 @@ public class InterfaceConfig extends Config<ConnectPoint> { |
| 52 | 54 | ||
| 53 | try { | 55 | try { |
| 54 | for (JsonNode intfNode : array) { | 56 | for (JsonNode intfNode : array) { |
| 57 | + String name = intfNode.path(NAME).asText(null); | ||
| 58 | + | ||
| 55 | Set<InterfaceIpAddress> ips = getIps(intfNode); | 59 | Set<InterfaceIpAddress> ips = getIps(intfNode); |
| 56 | 60 | ||
| 57 | String mac = intfNode.path(MAC).asText(); | 61 | String mac = intfNode.path(MAC).asText(); |
| ... | @@ -59,7 +63,7 @@ public class InterfaceConfig extends Config<ConnectPoint> { | ... | @@ -59,7 +63,7 @@ public class InterfaceConfig extends Config<ConnectPoint> { |
| 59 | 63 | ||
| 60 | VlanId vlan = getVlan(intfNode); | 64 | VlanId vlan = getVlan(intfNode); |
| 61 | 65 | ||
| 62 | - interfaces.add(new Interface(subject, ips, macAddr, vlan)); | 66 | + interfaces.add(new Interface(name, subject, ips, macAddr, vlan)); |
| 63 | } | 67 | } |
| 64 | } catch (IllegalArgumentException e) { | 68 | } catch (IllegalArgumentException e) { |
| 65 | throw new ConfigException(CONFIG_VALUE_ERROR, e); | 69 | throw new ConfigException(CONFIG_VALUE_ERROR, e); |
| ... | @@ -76,6 +80,8 @@ public class InterfaceConfig extends Config<ConnectPoint> { | ... | @@ -76,6 +80,8 @@ public class InterfaceConfig extends Config<ConnectPoint> { |
| 76 | public void addInterface(Interface intf) { | 80 | public void addInterface(Interface intf) { |
| 77 | ObjectNode intfNode = array.addObject(); | 81 | ObjectNode intfNode = array.addObject(); |
| 78 | 82 | ||
| 83 | + intfNode.put(NAME, intf.name()); | ||
| 84 | + | ||
| 79 | if (intf.mac() != null) { | 85 | if (intf.mac() != null) { |
| 80 | intfNode.put(MAC, intf.mac().toString()); | 86 | intfNode.put(MAC, intf.mac().toString()); |
| 81 | } | 87 | } |
| ... | @@ -92,12 +98,14 @@ public class InterfaceConfig extends Config<ConnectPoint> { | ... | @@ -92,12 +98,14 @@ public class InterfaceConfig extends Config<ConnectPoint> { |
| 92 | /** | 98 | /** |
| 93 | * Removes an interface from the config. | 99 | * Removes an interface from the config. |
| 94 | * | 100 | * |
| 95 | - * @param intf interface to remove | 101 | + * @param name name of the interface to remove |
| 96 | */ | 102 | */ |
| 97 | - public void removeInterface(Interface intf) { | 103 | + public void removeInterface(String name) { |
| 98 | - for (int i = 0; i < array.size(); i++) { | 104 | + Iterator<JsonNode> it = array.iterator(); |
| 99 | - if (intf.vlan().equals(getVlan(node))) { | 105 | + while (it.hasNext()) { |
| 100 | - array.remove(i); | 106 | + JsonNode node = it.next(); |
| 107 | + if (node.path(NAME).asText().equals(name)) { | ||
| 108 | + it.remove(); | ||
| 101 | break; | 109 | break; |
| 102 | } | 110 | } |
| 103 | } | 111 | } | ... | ... |
| ... | @@ -30,11 +30,13 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -30,11 +30,13 @@ import static com.google.common.base.Preconditions.checkNotNull; |
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | * An Interface maps network configuration information (such as addresses and | 32 | * An Interface maps network configuration information (such as addresses and |
| 33 | - * vlans) to a port in the network. This is considered a L2/L3 network | 33 | + * vlans) to a port in the network. |
| 34 | - * interface. | ||
| 35 | */ | 34 | */ |
| 36 | @Beta | 35 | @Beta |
| 37 | public class Interface { | 36 | public class Interface { |
| 37 | + public static final String NO_INTERFACE_NAME = ""; | ||
| 38 | + | ||
| 39 | + private final String name; | ||
| 38 | private final ConnectPoint connectPoint; | 40 | private final ConnectPoint connectPoint; |
| 39 | private final Set<InterfaceIpAddress> ipAddresses; | 41 | private final Set<InterfaceIpAddress> ipAddresses; |
| 40 | private final MacAddress macAddress; | 42 | private final MacAddress macAddress; |
| ... | @@ -43,14 +45,16 @@ public class Interface { | ... | @@ -43,14 +45,16 @@ public class Interface { |
| 43 | /** | 45 | /** |
| 44 | * Creates new Interface with the provided configuration. | 46 | * Creates new Interface with the provided configuration. |
| 45 | * | 47 | * |
| 48 | + * @param name name of the interface | ||
| 46 | * @param connectPoint the connect point this interface maps to | 49 | * @param connectPoint the connect point this interface maps to |
| 47 | * @param ipAddresses Set of IP addresses | 50 | * @param ipAddresses Set of IP addresses |
| 48 | * @param macAddress MAC address | 51 | * @param macAddress MAC address |
| 49 | * @param vlan VLAN ID | 52 | * @param vlan VLAN ID |
| 50 | */ | 53 | */ |
| 51 | - public Interface(ConnectPoint connectPoint, | 54 | + public Interface(String name, ConnectPoint connectPoint, |
| 52 | Set<InterfaceIpAddress> ipAddresses, | 55 | Set<InterfaceIpAddress> ipAddresses, |
| 53 | MacAddress macAddress, VlanId vlan) { | 56 | MacAddress macAddress, VlanId vlan) { |
| 57 | + this.name = name == null ? NO_INTERFACE_NAME : name; | ||
| 54 | this.connectPoint = checkNotNull(connectPoint); | 58 | this.connectPoint = checkNotNull(connectPoint); |
| 55 | this.ipAddresses = ipAddresses == null ? Sets.newHashSet() : ipAddresses; | 59 | this.ipAddresses = ipAddresses == null ? Sets.newHashSet() : ipAddresses; |
| 56 | this.macAddress = macAddress == null ? MacAddress.NONE : macAddress; | 60 | this.macAddress = macAddress == null ? MacAddress.NONE : macAddress; |
| ... | @@ -58,6 +62,29 @@ public class Interface { | ... | @@ -58,6 +62,29 @@ public class Interface { |
| 58 | } | 62 | } |
| 59 | 63 | ||
| 60 | /** | 64 | /** |
| 65 | + * Creates new Interface with the provided configuration. | ||
| 66 | + * | ||
| 67 | + * @param connectPoint the connect point this interface maps to | ||
| 68 | + * @param ipAddresses Set of IP addresses | ||
| 69 | + * @param macAddress MAC address | ||
| 70 | + * @param vlan VLAN ID | ||
| 71 | + */ | ||
| 72 | + public Interface(ConnectPoint connectPoint, | ||
| 73 | + Set<InterfaceIpAddress> ipAddresses, | ||
| 74 | + MacAddress macAddress, VlanId vlan) { | ||
| 75 | + this(NO_INTERFACE_NAME, connectPoint, ipAddresses, macAddress, vlan); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + /** | ||
| 79 | + * Retrieves the name of the interface. | ||
| 80 | + * | ||
| 81 | + * @return name | ||
| 82 | + */ | ||
| 83 | + public String name() { | ||
| 84 | + return name; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + /** | ||
| 61 | * Retrieves the connection point that this interface maps to. | 88 | * Retrieves the connection point that this interface maps to. |
| 62 | * | 89 | * |
| 63 | * @return the connection point | 90 | * @return the connection point |
| ... | @@ -101,7 +128,8 @@ public class Interface { | ... | @@ -101,7 +128,8 @@ public class Interface { |
| 101 | 128 | ||
| 102 | Interface otherInterface = (Interface) other; | 129 | Interface otherInterface = (Interface) other; |
| 103 | 130 | ||
| 104 | - return Objects.equals(connectPoint, otherInterface.connectPoint) && | 131 | + return Objects.equals(name, otherInterface.name) && |
| 132 | + Objects.equals(connectPoint, otherInterface.connectPoint) && | ||
| 105 | Objects.equals(ipAddresses, otherInterface.ipAddresses) && | 133 | Objects.equals(ipAddresses, otherInterface.ipAddresses) && |
| 106 | Objects.equals(macAddress, otherInterface.macAddress) && | 134 | Objects.equals(macAddress, otherInterface.macAddress) && |
| 107 | Objects.equals(vlan, otherInterface.vlan); | 135 | Objects.equals(vlan, otherInterface.vlan); |
| ... | @@ -109,12 +137,13 @@ public class Interface { | ... | @@ -109,12 +137,13 @@ public class Interface { |
| 109 | 137 | ||
| 110 | @Override | 138 | @Override |
| 111 | public int hashCode() { | 139 | public int hashCode() { |
| 112 | - return Objects.hash(connectPoint, ipAddresses, macAddress, vlan); | 140 | + return Objects.hash(connectPoint, name, ipAddresses, macAddress, vlan); |
| 113 | } | 141 | } |
| 114 | 142 | ||
| 115 | @Override | 143 | @Override |
| 116 | public String toString() { | 144 | public String toString() { |
| 117 | return MoreObjects.toStringHelper(getClass()) | 145 | return MoreObjects.toStringHelper(getClass()) |
| 146 | + .add("name", name) | ||
| 118 | .add("connectPoint", connectPoint) | 147 | .add("connectPoint", connectPoint) |
| 119 | .add("ipAddresses", ipAddresses) | 148 | .add("ipAddresses", ipAddresses) |
| 120 | .add("macAddress", macAddress) | 149 | .add("macAddress", macAddress) | ... | ... |
| ... | @@ -16,13 +16,13 @@ | ... | @@ -16,13 +16,13 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.incubator.net.intf; | 17 | package org.onosproject.incubator.net.intf; |
| 18 | 18 | ||
| 19 | -import org.onlab.packet.VlanId; | ||
| 20 | import org.onosproject.net.ConnectPoint; | 19 | import org.onosproject.net.ConnectPoint; |
| 21 | 20 | ||
| 22 | /** | 21 | /** |
| 23 | * Provides a means to modify the interfaces configuration. | 22 | * Provides a means to modify the interfaces configuration. |
| 24 | */ | 23 | */ |
| 25 | public interface InterfaceAdminService { | 24 | public interface InterfaceAdminService { |
| 25 | + | ||
| 26 | /** | 26 | /** |
| 27 | * Adds a new interface configuration to the system. | 27 | * Adds a new interface configuration to the system. |
| 28 | * | 28 | * |
| ... | @@ -34,7 +34,7 @@ public interface InterfaceAdminService { | ... | @@ -34,7 +34,7 @@ public interface InterfaceAdminService { |
| 34 | * Removes an interface configuration from the system. | 34 | * Removes an interface configuration from the system. |
| 35 | * | 35 | * |
| 36 | * @param connectPoint connect point of the interface | 36 | * @param connectPoint connect point of the interface |
| 37 | - * @param vlanId vlan id | 37 | + * @param name name of the interface |
| 38 | */ | 38 | */ |
| 39 | - void remove(ConnectPoint connectPoint, VlanId vlanId); | 39 | + boolean remove(ConnectPoint connectPoint, String name); |
| 40 | } | 40 | } | ... | ... |
| ... | @@ -18,6 +18,7 @@ package org.onosproject.incubator.net.intf.impl; | ... | @@ -18,6 +18,7 @@ package org.onosproject.incubator.net.intf.impl; |
| 18 | 18 | ||
| 19 | import com.google.common.collect.ImmutableSet; | 19 | import com.google.common.collect.ImmutableSet; |
| 20 | import com.google.common.collect.Maps; | 20 | import com.google.common.collect.Maps; |
| 21 | +import com.google.common.collect.Sets; | ||
| 21 | import org.apache.felix.scr.annotations.Activate; | 22 | import org.apache.felix.scr.annotations.Activate; |
| 22 | import org.apache.felix.scr.annotations.Component; | 23 | import org.apache.felix.scr.annotations.Component; |
| 23 | import org.apache.felix.scr.annotations.Deactivate; | 24 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -39,9 +40,11 @@ import org.slf4j.Logger; | ... | @@ -39,9 +40,11 @@ import org.slf4j.Logger; |
| 39 | import org.slf4j.LoggerFactory; | 40 | import org.slf4j.LoggerFactory; |
| 40 | 41 | ||
| 41 | import java.util.Collections; | 42 | import java.util.Collections; |
| 43 | +import java.util.Iterator; | ||
| 42 | import java.util.Map; | 44 | import java.util.Map; |
| 43 | import java.util.Optional; | 45 | import java.util.Optional; |
| 44 | import java.util.Set; | 46 | import java.util.Set; |
| 47 | +import java.util.concurrent.atomic.AtomicBoolean; | ||
| 45 | 48 | ||
| 46 | import static java.util.stream.Collectors.collectingAndThen; | 49 | import static java.util.stream.Collectors.collectingAndThen; |
| 47 | import static java.util.stream.Collectors.toSet; | 50 | import static java.util.stream.Collectors.toSet; |
| ... | @@ -145,7 +148,7 @@ public class InterfaceManager implements InterfaceService, | ... | @@ -145,7 +148,7 @@ public class InterfaceManager implements InterfaceService, |
| 145 | 148 | ||
| 146 | private void updateInterfaces(InterfaceConfig intfConfig) { | 149 | private void updateInterfaces(InterfaceConfig intfConfig) { |
| 147 | try { | 150 | try { |
| 148 | - interfaces.put(intfConfig.subject(), intfConfig.getInterfaces()); | 151 | + interfaces.put(intfConfig.subject(), Sets.newHashSet(intfConfig.getInterfaces())); |
| 149 | } catch (ConfigException e) { | 152 | } catch (ConfigException e) { |
| 150 | log.error("Error in interface config", e); | 153 | log.error("Error in interface config", e); |
| 151 | } | 154 | } |
| ... | @@ -157,18 +160,7 @@ public class InterfaceManager implements InterfaceService, | ... | @@ -157,18 +160,7 @@ public class InterfaceManager implements InterfaceService, |
| 157 | 160 | ||
| 158 | @Override | 161 | @Override |
| 159 | public void add(Interface intf) { | 162 | public void add(Interface intf) { |
| 160 | - if (interfaces.containsKey(intf.connectPoint())) { | 163 | + addInternal(intf); |
| 161 | - boolean conflict = interfaces.get(intf.connectPoint()).stream() | ||
| 162 | - .filter(i -> i.connectPoint().equals(intf.connectPoint())) | ||
| 163 | - .filter(i -> i.mac().equals(intf.mac())) | ||
| 164 | - .filter(i -> i.vlan().equals(intf.vlan())) | ||
| 165 | - .findAny().isPresent(); | ||
| 166 | - | ||
| 167 | - if (conflict) { | ||
| 168 | - log.error("Can't add interface because it conflicts with existing config"); | ||
| 169 | - return; | ||
| 170 | - } | ||
| 171 | - } | ||
| 172 | 164 | ||
| 173 | InterfaceConfig config = | 165 | InterfaceConfig config = |
| 174 | configService.addConfig(intf.connectPoint(), CONFIG_CLASS); | 166 | configService.addConfig(intf.connectPoint(), CONFIG_CLASS); |
| ... | @@ -178,29 +170,72 @@ public class InterfaceManager implements InterfaceService, | ... | @@ -178,29 +170,72 @@ public class InterfaceManager implements InterfaceService, |
| 178 | configService.applyConfig(intf.connectPoint(), CONFIG_CLASS, config.node()); | 170 | configService.applyConfig(intf.connectPoint(), CONFIG_CLASS, config.node()); |
| 179 | } | 171 | } |
| 180 | 172 | ||
| 173 | + private void addInternal(Interface intf) { | ||
| 174 | + interfaces.compute(intf.connectPoint(), (cp, current) -> { | ||
| 175 | + if (current == null) { | ||
| 176 | + return Sets.newHashSet(intf); | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + Iterator<Interface> it = current.iterator(); | ||
| 180 | + while (it.hasNext()) { | ||
| 181 | + Interface i = it.next(); | ||
| 182 | + if (i.name().equals(intf.name())) { | ||
| 183 | + it.remove(); | ||
| 184 | + break; | ||
| 185 | + } | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + current.add(intf); | ||
| 189 | + return current; | ||
| 190 | + }); | ||
| 191 | + } | ||
| 192 | + | ||
| 181 | @Override | 193 | @Override |
| 182 | - public void remove(ConnectPoint connectPoint, VlanId vlanId) { | 194 | + public boolean remove(ConnectPoint connectPoint, String name) { |
| 183 | - Optional<Interface> intf = interfaces.get(connectPoint).stream() | 195 | + boolean success = removeInternal(name, connectPoint); |
| 184 | - .filter(i -> i.vlan().equals(vlanId)) | ||
| 185 | - .findAny(); | ||
| 186 | - | ||
| 187 | - if (!intf.isPresent()) { | ||
| 188 | - log.error("Can't find interface {}/{} to remove", connectPoint, vlanId); | ||
| 189 | - return; | ||
| 190 | - } | ||
| 191 | 196 | ||
| 192 | - InterfaceConfig config = configService.addConfig(intf.get().connectPoint(), CONFIG_CLASS); | 197 | + InterfaceConfig config = configService.addConfig(connectPoint, CONFIG_CLASS); |
| 193 | - config.removeInterface(intf.get()); | 198 | + config.removeInterface(name); |
| 194 | 199 | ||
| 195 | try { | 200 | try { |
| 196 | if (config.getInterfaces().isEmpty()) { | 201 | if (config.getInterfaces().isEmpty()) { |
| 197 | configService.removeConfig(connectPoint, CONFIG_CLASS); | 202 | configService.removeConfig(connectPoint, CONFIG_CLASS); |
| 198 | } else { | 203 | } else { |
| 199 | - configService.applyConfig(intf.get().connectPoint(), CONFIG_CLASS, config.node()); | 204 | + configService.applyConfig(connectPoint, CONFIG_CLASS, config.node()); |
| 200 | } | 205 | } |
| 201 | } catch (ConfigException e) { | 206 | } catch (ConfigException e) { |
| 202 | log.error("Error reading interfaces JSON", e); | 207 | log.error("Error reading interfaces JSON", e); |
| 203 | } | 208 | } |
| 209 | + | ||
| 210 | + return success; | ||
| 211 | + } | ||
| 212 | + | ||
| 213 | + public boolean removeInternal(String name, ConnectPoint connectPoint) { | ||
| 214 | + AtomicBoolean removed = new AtomicBoolean(false); | ||
| 215 | + | ||
| 216 | + interfaces.compute(connectPoint, (cp, current) -> { | ||
| 217 | + if (current == null) { | ||
| 218 | + return null; | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + Iterator<Interface> it = current.iterator(); | ||
| 222 | + while (it.hasNext()) { | ||
| 223 | + Interface i = it.next(); | ||
| 224 | + if (i.name().equals(name)) { | ||
| 225 | + it.remove(); | ||
| 226 | + removed.set(true); | ||
| 227 | + break; | ||
| 228 | + } | ||
| 229 | + } | ||
| 230 | + | ||
| 231 | + if (current.isEmpty()) { | ||
| 232 | + return null; | ||
| 233 | + } else { | ||
| 234 | + return current; | ||
| 235 | + } | ||
| 236 | + }); | ||
| 237 | + | ||
| 238 | + return removed.get(); | ||
| 204 | } | 239 | } |
| 205 | 240 | ||
| 206 | /** | 241 | /** | ... | ... |
-
Please register or login to post a comment