aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java')
-rw-r--r--framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java52
1 files changed, 51 insertions, 1 deletions
diff --git a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java
index f82cdbf2..0439d038 100644
--- a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java
+++ b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java
@@ -29,6 +29,7 @@ import org.onlab.packet.VlanId;
import org.onosproject.incubator.net.config.basics.ConfigException;
import org.onosproject.incubator.net.config.basics.InterfaceConfig;
import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.intf.InterfaceAdminService;
import org.onosproject.incubator.net.intf.InterfaceService;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.config.NetworkConfigEvent;
@@ -50,7 +51,8 @@ import static java.util.stream.Collectors.toSet;
*/
@Service
@Component(immediate = true)
-public class InterfaceManager implements InterfaceService {
+public class InterfaceManager implements InterfaceService,
+ InterfaceAdminService {
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -153,6 +155,54 @@ public class InterfaceManager implements InterfaceService {
interfaces.remove(port);
}
+ @Override
+ public void add(Interface intf) {
+ if (interfaces.containsKey(intf.connectPoint())) {
+ boolean conflict = interfaces.get(intf.connectPoint()).stream()
+ .filter(i -> i.connectPoint().equals(intf.connectPoint()))
+ .filter(i -> i.mac().equals(intf.mac()))
+ .filter(i -> i.vlan().equals(intf.vlan()))
+ .findAny().isPresent();
+
+ if (conflict) {
+ log.error("Can't add interface because it conflicts with existing config");
+ return;
+ }
+ }
+
+ InterfaceConfig config =
+ configService.addConfig(intf.connectPoint(), CONFIG_CLASS);
+
+ config.addInterface(intf);
+
+ configService.applyConfig(intf.connectPoint(), CONFIG_CLASS, config.node());
+ }
+
+ @Override
+ public void remove(ConnectPoint connectPoint, VlanId vlanId) {
+ Optional<Interface> intf = interfaces.get(connectPoint).stream()
+ .filter(i -> i.vlan().equals(vlanId))
+ .findAny();
+
+ if (!intf.isPresent()) {
+ log.error("Can't find interface {}/{} to remove", connectPoint, vlanId);
+ return;
+ }
+
+ InterfaceConfig config = configService.addConfig(intf.get().connectPoint(), CONFIG_CLASS);
+ config.removeInterface(intf.get());
+
+ try {
+ if (config.getInterfaces().isEmpty()) {
+ configService.removeConfig(connectPoint, CONFIG_CLASS);
+ } else {
+ configService.applyConfig(intf.get().connectPoint(), CONFIG_CLASS, config.node());
+ }
+ } catch (ConfigException e) {
+ log.error("Error reading interfaces JSON", e);
+ }
+ }
+
/**
* Listener for network config events.
*/