From fca084bf9a8c07ec6f5a0137c7513f92603d91ab Mon Sep 17 00:00:00 2001 From: hiroki Date: Sat, 2 Jun 2018 08:29:42 -0700 Subject: [PATCH] Add device config change request using NetCfg Change-Id: I01ae9caf298e606333ea31b2b480d744a2815c76 --- .../odtn/config/TerminalDeviceConfig.java | 112 ++++++++++++++++++ .../onosproject/odtn/config/package-info.java | 19 +++ .../odtn/utils/tapi/DcsBasedTapiNepRef.java | 36 ------ .../odtn/utils/tapi/DcsBasedTapiNodeRef.java | 34 ------ .../tapi/DcsBasedTapiObjectRefFactory.java | 66 +++++++++++ .../utils/tapi/TapiConnectionHandler.java | 4 + .../odtn/utils/tapi/TapiNepRef.java | 2 +- .../odtn/utils/tapi/TapiNodeRef.java | 4 +- .../odtn-terminal-device-config.json | 17 +++ .../impl/ServiceApplicationComponent.java | 79 +++++++----- .../DcsBasedTapiConnectionManager.java | 73 ++++++++++-- .../internal/DcsBasedTapiDataProducer.java | 7 +- .../internal/DeviceConfigEventEmitter.java | 63 ++++++++++ .../DcsBasedTapiDataProducerTest.java | 30 +++-- 14 files changed, 416 insertions(+), 130 deletions(-) create mode 100644 apps/odtn/api/src/main/java/org/onosproject/odtn/config/TerminalDeviceConfig.java create mode 100644 apps/odtn/api/src/main/java/org/onosproject/odtn/config/package-info.java delete mode 100644 apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java delete mode 100644 apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java create mode 100644 apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java create mode 100644 apps/odtn/api/src/test/resources/odtn-terminal-device-config.json create mode 100644 apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DeviceConfigEventEmitter.java diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/config/TerminalDeviceConfig.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/config/TerminalDeviceConfig.java new file mode 100644 index 0000000000..5cc5301158 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/config/TerminalDeviceConfig.java @@ -0,0 +1,112 @@ +/* + * Copyright 2018-present Open Networking Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.odtn.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.config.BaseConfig; +import org.onosproject.odtn.utils.tapi.TapiNepRef; + +import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT; +import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OdtnPortType.LINE; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class TerminalDeviceConfig extends BaseConfig { + + protected final Logger log = LoggerFactory.getLogger(getClass()); + + /** + * {@value #CONFIG_KEY} : a netcfg ConfigKey for {@link TerminalDeviceConfig}. + */ + public static final String CONFIG_KEY = "odtn-terminal-device"; + + private static final String CLIENT_PORT = "client"; + private static final String ENABLE = "enable"; + + /** + * Create a TerminalDeviceConfig for ODTN. + */ + public TerminalDeviceConfig() { + super(); + } + + /** + * Create a TerminalDeviceConfig for ODTN. + * + * @param cp ConnectPoint + */ + public TerminalDeviceConfig(ConnectPoint cp) { + ObjectMapper mapper = new ObjectMapper(); + init(cp, CONFIG_KEY, mapper.createObjectNode(), mapper, null); + } + + @Override + public boolean isValid() { + return isConnectPoint(CLIENT_PORT, FieldPresence.MANDATORY) && + isBoolean(ENABLE, FieldPresence.MANDATORY); + } + + public ConnectPoint clientCp() { + String cp = get(CLIENT_PORT, ""); + return ConnectPoint.deviceConnectPoint(cp); + } + + public TerminalDeviceConfig clientCp(ConnectPoint cp) { + String val = String.format("%s/%d", cp.deviceId(), cp.port().toLong()); + setOrClear(CLIENT_PORT, val); + return this; + } + + public Boolean isEnabled() { + return get(ENABLE, false); + } + + public TerminalDeviceConfig enable() { + setOrClear(ENABLE, true); + return this; + } + + public TerminalDeviceConfig disable() { + setOrClear(ENABLE, false); + return this; + } + + /** + * Factory method in order to emit NetCfg event from onos inner call. + * + * @param line side NodeEdgePoint of connection + * @param client side NodeEdgePoint of connection + * @return Config object for NetCfg + */ + public static TerminalDeviceConfig create(TapiNepRef line, TapiNepRef client) { + + if (line.getPortType() != LINE) { + throw new IllegalArgumentException("Argument line must be a LINE type."); + } + if (client.getPortType() != CLIENT) { + throw new IllegalArgumentException("Argument client must be a CLIENT type."); + } + + TerminalDeviceConfig self = new TerminalDeviceConfig(line.getConnectPoint()); + self.clientCp(client.getConnectPoint()); + self.enable(); + return self; + } +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/config/package-info.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/config/package-info.java new file mode 100644 index 0000000000..8db93f989b --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/config/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2018-present Open Networking Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Package to place ODTN NetCfg Config classes. + */ +package org.onosproject.odtn.config; diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java deleted file mode 100644 index e5fcf2df6e..0000000000 --- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2018-present Open Networking Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.onosproject.odtn.utils.tapi; - -import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.OwnedNodeEdgePoint; -import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node; -import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology; - -/** - * TAPI Nep reference class which has a factory method using DCS modelObject. - */ -public final class DcsBasedTapiNepRef extends TapiNepRef { - - private DcsBasedTapiNepRef(Topology topology, Node node, OwnedNodeEdgePoint nep) { - super(topology.uuid().toString(), node.uuid().toString(), nep.uuid().toString()); - } - - public static DcsBasedTapiNepRef create(Topology topology, Node node, OwnedNodeEdgePoint nep) { - return new DcsBasedTapiNepRef(topology, node, nep); - } - -} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java deleted file mode 100644 index b6260a760a..0000000000 --- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2018-present Open Networking Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.onosproject.odtn.utils.tapi; - -import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node; -import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology; - -/** - * TAPI Node reference class which has a factory method using DCS modelObject. - */ -public final class DcsBasedTapiNodeRef extends TapiNodeRef { - - private DcsBasedTapiNodeRef(Topology topology, Node node) { - super(topology.uuid().toString(), node.uuid().toString()); - } - - public static DcsBasedTapiNodeRef create(Topology topology, Node node) { - return new DcsBasedTapiNodeRef(topology, node); - } -} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java new file mode 100644 index 0000000000..e1d1889588 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java @@ -0,0 +1,66 @@ +/* + * Copyright 2018-present Open Networking Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.odtn.utils.tapi; + +import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.ConnectionEndPoint; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.OwnedNodeEdgePoint; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology; + +/** + * Util class to create TapiXXXRef class instances using classes auto-generated by onos-yang-tool compiler. + */ +public final class DcsBasedTapiObjectRefFactory { + + private DcsBasedTapiObjectRefFactory() { + } + + /** + * Factory method to create {@link TapiNodeRef}. + * + * @param topology ModelObject context/topology + * @param node ModelObject context/topology/node + * @return node reference instance + */ + public static TapiNodeRef create(Topology topology, Node node) { + return TapiNodeRef.create(topology.uuid().toString(), node.uuid().toString()); + } + + /** + * Factory method to create {@link TapiNepRef}. + * + * @param topology ModelObject context/topology + * @param node ModelObject context/topology/node + * @param nep ModelObject context/topology/node/ownedNodeEdgePoint + * @return nep reference instance + */ + public static TapiNepRef create(Topology topology, Node node, OwnedNodeEdgePoint nep) { + return TapiNepRef.create(topology.uuid().toString(), node.uuid().toString(), nep.uuid().toString()); + } + + /** + * Factory method to create {@link TapiCepRef}. + * + * @param cep ModelObject context/connection/connectionEndPoint + * @return cep reference instance + */ + public static TapiCepRef create(ConnectionEndPoint cep) { + return TapiCepRef.create(cep.topologyId().toString(), cep.nodeId().toString(), + cep.ownedNodeEdgePointId().toString(), cep.connectionEndPointId().toString()); + } + +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java index b3d6f3e8e9..6e3b729411 100644 --- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java @@ -100,6 +100,10 @@ public final class TapiConnectionHandler extends TapiObjectHandler getCeps() { + return obj.connectionEndPoint(); + } + public List getLowerConnections() { try { diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java index af4d299c70..95b3e05157 100644 --- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java @@ -42,7 +42,7 @@ import static org.slf4j.LoggerFactory.getLogger; * TAPI reference class should be used in ODTN ServiceApplication * in order to make independent ServiceApplication implementation from DCS. */ -public class TapiNepRef { +public final class TapiNepRef { protected final Logger log = getLogger(getClass()); diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java index 8db20054b6..71cd256ff7 100644 --- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java @@ -34,7 +34,7 @@ import static org.slf4j.LoggerFactory.getLogger; * TAPI reference class should be used in ODTN ServiceApplication * in order to make independent ServiceApplication implementation from DCS. */ -public class TapiNodeRef { +public final class TapiNodeRef { protected final Logger log = getLogger(getClass()); @@ -42,7 +42,7 @@ public class TapiNodeRef { private final UUID nodeId; private DeviceId deviceId; - TapiNodeRef(String topologyId, String nodeId) { + private TapiNodeRef(String topologyId, String nodeId) { this.topologyId = UUID.fromString(topologyId); this.nodeId = UUID.fromString(nodeId); } diff --git a/apps/odtn/api/src/test/resources/odtn-terminal-device-config.json b/apps/odtn/api/src/test/resources/odtn-terminal-device-config.json new file mode 100644 index 0000000000..3a44751433 --- /dev/null +++ b/apps/odtn/api/src/test/resources/odtn-terminal-device-config.json @@ -0,0 +1,17 @@ +{ + "ports" : { + "netconf:127.0.0.1:11001/42" : { + "odtn-terminal-device" : { + "client" : "netconf:127.0.0.1:11001/41", + "enable" : true + } + }, + "netconf:127.0.0.1:11002/42" : { + "odtn-terminal-device" : { + "client" : "netconf:127.0.0.1:11002/41", + "enable" : true + } + } + } +} + diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java index 48057c89b9..a663cc8cac 100644 --- a/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java +++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java @@ -25,11 +25,13 @@ import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.onosproject.net.ConnectPoint; import org.onosproject.net.Link; +import org.onosproject.net.config.ConfigFactory; import org.onosproject.net.config.NetworkConfigEvent; import org.onosproject.net.config.NetworkConfigListener; +import org.onosproject.net.config.NetworkConfigRegistry; import org.onosproject.net.config.NetworkConfigService; -import org.onosproject.net.config.NetworkConfigStoreDelegate; import org.onosproject.net.device.DeviceEvent; import org.onosproject.net.device.DeviceListener; import org.onosproject.net.device.DeviceService; @@ -38,15 +40,14 @@ import org.onosproject.net.link.LinkListener; import org.onosproject.net.link.LinkService; import org.onosproject.odtn.TapiResolver; import org.onosproject.odtn.TapiTopologyManager; +import org.onosproject.odtn.config.TerminalDeviceConfig; import org.onosproject.odtn.internal.DcsBasedTapiCommonRpc; import org.onosproject.odtn.internal.DcsBasedTapiConnectivityRpc; import org.onosproject.odtn.internal.DcsBasedTapiDataProducer; import org.onosproject.odtn.internal.TapiDataProducer; -import org.onosproject.store.AbstractStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - // DCS / onos-yang-tools import org.onosproject.config.DynamicConfigEvent; import org.onosproject.config.DynamicConfigListener; @@ -55,6 +56,10 @@ import org.onosproject.yang.model.RpcRegistry; import static org.onosproject.config.DynamicConfigEvent.Type.NODE_ADDED; import static org.onosproject.config.DynamicConfigEvent.Type.NODE_DELETED; +import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED; +import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_REMOVED; +import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED; +import static org.onosproject.net.config.basics.SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY; /** * OSGi Component for ODTN Service application. @@ -76,6 +81,9 @@ public class ServiceApplicationComponent { @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected NetworkConfigService netcfgService; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected NetworkConfigRegistry netcfgRegistry; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected RpcRegistry rpcRegistry; @@ -93,12 +101,21 @@ public class ServiceApplicationComponent { private final LinkListener linkListener = new InternalLinkListener(); private final NetworkConfigListener netcfgListener = new InternalNetCfgListener(); private TapiDataProducer dataProvider = new DcsBasedTapiDataProducer(); - private InternalNetCfgManager netcfgStore = new InternalNetCfgManager(); // Rpc Service for TAPI Connectivity private final DcsBasedTapiConnectivityRpc rpcTapiConnectivity = new DcsBasedTapiConnectivityRpc(); private final DcsBasedTapiCommonRpc rpcTapiCommon = new DcsBasedTapiCommonRpc(); + // FIXME create factory and register for all behaviours + private final ConfigFactory factory = + new ConfigFactory(CONNECT_POINT_SUBJECT_FACTORY, + TerminalDeviceConfig.class, TerminalDeviceConfig.CONFIG_KEY) { + @Override + public TerminalDeviceConfig createConfig() { + return new TerminalDeviceConfig(); + } + }; + @Activate protected void activate() { @@ -107,8 +124,10 @@ public class ServiceApplicationComponent { deviceService.addListener(deviceListener); linkService.addListener(linkListener); netcfgService.addListener(netcfgListener); + netcfgRegistry.registerConfigFactory(factory); rpcRegistry.registerRpcService(rpcTapiConnectivity); rpcRegistry.registerRpcService(rpcTapiCommon); + rpcTapiConnectivity.init(); rpcTapiCommon.init(); } @@ -119,6 +138,7 @@ public class ServiceApplicationComponent { log.info("Stopped"); rpcRegistry.unregisterRpcService(rpcTapiCommon); rpcRegistry.unregisterRpcService(rpcTapiConnectivity); + netcfgRegistry.unregisterConfigFactory(factory); netcfgService.removeListener(netcfgListener); linkService.removeListener(linkListener); deviceService.removeListener(deviceListener); @@ -139,8 +159,8 @@ public class ServiceApplicationComponent { @Override public void event(DeviceEvent event) { - netcfgStore.post(event); - + log.info("Device event type: {}", event.type()); + log.info("Device event subject: {}", event.subject()); switch (event.type()) { case DEVICE_ADDED: tapiTopologyManager.addDevice(event.subject()); @@ -195,31 +215,41 @@ public class ServiceApplicationComponent { */ private class InternalNetCfgListener implements NetworkConfigListener { + /** + * Check if the netcfg event should be further processed. + * + * @param event config event + * @return true if event is supported; false otherwise + */ + @Override + public boolean isRelevant(NetworkConfigEvent event) { + + if (event.type() == CONFIG_ADDED || event.type() == CONFIG_UPDATED) { + if (event.config().orElse(null) instanceof TerminalDeviceConfig) { + return true; + } + } + if (event.type() == CONFIG_REMOVED) { + if (event.prevConfig().orElse(null) instanceof TerminalDeviceConfig) { + return true; + } + } + return false; + } + /** * Process an Event from the NetCfg Service. * - * @param event link event + * @param event event */ @Override public void event(NetworkConfigEvent event) { -// Object config = event.subject(); - log.info("config: {}", event.subject()); + log.info("type: {}", event.type()); + log.info("subject: {}", event.subject()); } } - private class InternalNetCfgManager - extends AbstractStore { - - public void post(Object obj) { - log.info("Post netcfg event : {}", obj); - NetworkConfigEvent.Type type = NetworkConfigEvent.Type.CONFIG_UPDATED; - notifyDelegate(new NetworkConfigEvent(type, obj, obj.getClass())); - } - - } - - /** * Representation of internal listener, listening for dynamic config event. */ @@ -273,7 +303,6 @@ public class ServiceApplicationComponent { // } } - // /** // * Process the event that a node has been added to the DCS. // * @@ -298,14 +327,13 @@ public class ServiceApplicationComponent { // NodeKey dataNodeKey = node.key(); // SchemaId schemaId = dataNodeKey.schemaId(); - // Consolidate events + // Consolidate events // if (!schemaId.namespace().contains("tapi")) { // return; // } // log.info("namespace {}", schemaId.namespace()); // } - // /** // * Process the event that a node has been deleted from the DCS. // * @@ -317,7 +345,4 @@ public class ServiceApplicationComponent { } - - - } diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java index 6ddb662c28..b5855067c9 100644 --- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java +++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java @@ -17,15 +17,22 @@ package org.onosproject.odtn.internal; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import org.onosproject.config.FailedException; -import org.onosproject.net.device.DeviceService; +import org.onosproject.net.config.NetworkConfigService; +import org.onosproject.odtn.TapiResolver; +import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery; +import org.onosproject.odtn.utils.tapi.DcsBasedTapiObjectRefFactory; +import org.onosproject.odtn.utils.tapi.TapiCepPair; import org.onosproject.odtn.utils.tapi.TapiConnection; import org.onosproject.odtn.utils.tapi.TapiNepPair; import org.onosproject.odtn.utils.tapi.TapiCepRefHandler; import org.onosproject.odtn.utils.tapi.TapiConnectionHandler; +import org.onosproject.odtn.utils.tapi.TapiNepRef; import org.onosproject.odtn.utils.tapi.TapiRouteHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,13 +42,15 @@ import static org.onlab.osgi.DefaultServiceDirectory.getService; /** * DCS-dependent Tapi connection manager implementation. */ -public class DcsBasedTapiConnectionManager implements TapiConnectionManager { +public final class DcsBasedTapiConnectionManager implements TapiConnectionManager { private final Logger log = LoggerFactory.getLogger(getClass()); protected TapiPathComputer connectionController; - private DeviceService deviceService; + private TapiResolver resolver; + private NetworkConfigService netcfgService; private List connectionManagerList = new ArrayList<>(); + private TapiConnection connection = null; private TapiConnectionHandler connectionHandler = TapiConnectionHandler.create(); private Operation op = null; @@ -51,10 +60,14 @@ public class DcsBasedTapiConnectionManager implements TapiConnectionManager { DELETE } + private DcsBasedTapiConnectionManager() { + } + public static DcsBasedTapiConnectionManager create() { DcsBasedTapiConnectionManager self = new DcsBasedTapiConnectionManager(); self.connectionController = DefaultTapiPathComputer.create(); - self.deviceService = getService(DeviceService.class); + self.resolver = getService(TapiResolver.class); + self.netcfgService = getService(NetworkConfigService.class); return self; } @@ -72,22 +85,20 @@ public class DcsBasedTapiConnectionManager implements TapiConnectionManager { @Override public void deleteConnection(TapiConnectionHandler connectionHandler) { - // read target to be deleted - this.connectionHandler = connectionHandler; - this.connectionHandler.read(); - log.info("model: {}", connectionHandler.getModelObject()); - deleteConnectionRecursively(connectionHandler); } @Override public void apply() { connectionManagerList.forEach(DcsBasedTapiConnectionManager::apply); + switch (op) { case CREATE: + notifyDeviceConfigChange(true); connectionHandler.add(); break; case DELETE: + notifyDeviceConfigChange(false); connectionHandler.remove(); break; default: @@ -95,6 +106,37 @@ public class DcsBasedTapiConnectionManager implements TapiConnectionManager { } } + /** + * Emit NetworkConfig event with parameters for device config, + * to notify configuration change to device drivers. + */ + private void notifyDeviceConfigChange(boolean enable) { + if (!this.connection.getCeps().isSameNode()) { + return; + } + + TapiNepRef left = this.connection.getCeps().left().getNepRef(); + TapiNepRef right = this.connection.getCeps().right().getNepRef(); + + // update with latest data in DCS + left = resolver.getNepRef(left); + right = resolver.getNepRef(right); + + AtomicReference line = new AtomicReference<>(); + AtomicReference client = new AtomicReference<>(); + Arrays.asList(left, right).forEach(nep -> { + if (nep.getPortType() == OdtnDeviceDescriptionDiscovery.OdtnPortType.LINE) { + line.set(nep); + } + if (nep.getPortType() == OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT) { + client.set(nep); + } + }); + + DeviceConfigEventEmitter eventEmitter = DeviceConfigEventEmitter.create(); + eventEmitter.emit(line.get(), client.get(), enable); + } + /** * Generate TAPI connection and its under connections recursively * and add them to creation queue. @@ -104,6 +146,7 @@ public class DcsBasedTapiConnectionManager implements TapiConnectionManager { private void createConnectionRecursively(TapiConnection connection) { op = Operation.CREATE; connectionManagerList.clear(); + this.connection = connection; TapiRouteHandler routeBuilder = TapiRouteHandler.create(); @@ -136,6 +179,16 @@ public class DcsBasedTapiConnectionManager implements TapiConnectionManager { op = Operation.DELETE; connectionManagerList.clear(); + // read target to be deleted + connectionHandler.read(); + log.info("model: {}", connectionHandler.getModelObject()); + + this.connection = TapiConnection.create( + TapiCepPair.create( + DcsBasedTapiObjectRefFactory.create(connectionHandler.getCeps().get(0)), + DcsBasedTapiObjectRefFactory.create(connectionHandler.getCeps().get(1))) + ); + this.connectionHandler = connectionHandler; this.connectionHandler.getLowerConnections().forEach(lowerConnectionHandler -> { delegateConnectionDeletion(lowerConnectionHandler); @@ -157,7 +210,7 @@ public class DcsBasedTapiConnectionManager implements TapiConnectionManager { /** * Delegate lower-connection deletion to other corresponding TapiConnectionManager of each Nodes. * - * @param connectionHandler connectionHandler of connection to be deleted + * @param connectionHandler connectionHandler of connection to be deleted */ private void delegateConnectionDeletion(TapiConnectionHandler connectionHandler) { log.info("model: {}", connectionHandler.getModelObject()); diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java index 726d002a05..4adc3d2bbc 100644 --- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java +++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java @@ -27,8 +27,7 @@ import org.onosproject.config.DynamicConfigService; import org.onosproject.config.Filter; import org.onosproject.net.ConnectPoint; import org.onosproject.net.DeviceId; -import org.onosproject.odtn.utils.tapi.DcsBasedTapiNepRef; -import org.onosproject.odtn.utils.tapi.DcsBasedTapiNodeRef; +import org.onosproject.odtn.utils.tapi.DcsBasedTapiObjectRefFactory; import org.onosproject.odtn.utils.tapi.TapiNepRef; import org.onosproject.odtn.utils.tapi.TapiNodeRef; import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext; @@ -122,7 +121,7 @@ public class DcsBasedTapiDataProducer implements TapiDataProducer { } return topology.node().stream() .map(node -> { - DcsBasedTapiNodeRef nodeRef = DcsBasedTapiNodeRef.create(topology, node); + TapiNodeRef nodeRef = DcsBasedTapiObjectRefFactory.create(topology, node); if (node.name() != null) { String deviceId = node.name().stream() .filter(kv -> kv.valueName().equals(DEVICE_ID)) @@ -155,7 +154,7 @@ public class DcsBasedTapiDataProducer implements TapiDataProducer { } return node.ownedNodeEdgePoint().stream() .map(nep -> { - TapiNepRef nepRef = DcsBasedTapiNepRef.create(topology, node, nep); + TapiNepRef nepRef = DcsBasedTapiObjectRefFactory.create(topology, node, nep); if (nep.name() != null) { Map kvs = new HashMap<>(); nep.name().forEach(kv -> kvs.put(kv.valueName(), kv.value())); diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DeviceConfigEventEmitter.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DeviceConfigEventEmitter.java new file mode 100644 index 0000000000..32121aec2f --- /dev/null +++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DeviceConfigEventEmitter.java @@ -0,0 +1,63 @@ +/* + * Copyright 2018-present Open Networking Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.odtn.internal; + +import org.onosproject.net.config.NetworkConfigService; +import org.onosproject.odtn.config.TerminalDeviceConfig; +import org.onosproject.odtn.utils.tapi.TapiNepRef; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.onlab.osgi.DefaultServiceDirectory.getService; + +public final class DeviceConfigEventEmitter { + + private final Logger log = LoggerFactory.getLogger(getClass()); + + private NetworkConfigService netcfgService; + + private DeviceConfigEventEmitter() { + } + + public static DeviceConfigEventEmitter create() { + DeviceConfigEventEmitter self = new DeviceConfigEventEmitter(); + self.netcfgService = getService(NetworkConfigService.class); + return self; + } + + /** + * Emit NetworkConfig event with parameters for device config. + * + * @param line side NodeEdgePoint of connection + * @param client side NodeEdgePoint of connection + * @param enable or disable + */ + public void emit(TapiNepRef line, TapiNepRef client, boolean enable) { + + // FIXME Config class should be implemented as behaviour to support + // multi device types. + TerminalDeviceConfig cfg = TerminalDeviceConfig.create(line, client); + if (enable) { + cfg.enable(); + } else { + cfg.disable(); + } + netcfgService.applyConfig(line.getConnectPoint(), TerminalDeviceConfig.class, cfg.node()); + } + +} diff --git a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java index e616b214d0..bfc45c72bf 100644 --- a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java +++ b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java @@ -25,8 +25,7 @@ import org.junit.Test; import org.onosproject.net.ConnectPoint; import org.onosproject.net.DeviceId; import org.onosproject.net.PortNumber; -import org.onosproject.odtn.utils.tapi.DcsBasedTapiNepRef; -import org.onosproject.odtn.utils.tapi.DcsBasedTapiNodeRef; +import org.onosproject.odtn.utils.tapi.DcsBasedTapiObjectRefFactory; import org.onosproject.odtn.utils.tapi.TapiNepHandler; import org.onosproject.odtn.utils.tapi.TapiNepRef; import org.onosproject.odtn.utils.tapi.TapiNodeHandler; @@ -139,16 +138,16 @@ public class DcsBasedTapiDataProducerTest { node2.addToOwnedNodeEdgePoint(nep22); List expectNodes = Arrays.asList( - DcsBasedTapiNodeRef.create(topology, node1).setDeviceId(did1), - DcsBasedTapiNodeRef.create(topology, node2).setDeviceId(did2) + DcsBasedTapiObjectRefFactory.create(topology, node1).setDeviceId(did1), + DcsBasedTapiObjectRefFactory.create(topology, node2).setDeviceId(did2) ); List expectNeps = Arrays.asList( - DcsBasedTapiNepRef.create(topology, node1, nep11).setConnectPoint(cp11) + DcsBasedTapiObjectRefFactory.create(topology, node1, nep11).setConnectPoint(cp11) .setSipId(sip11.uuid().toString()), - DcsBasedTapiNepRef.create(topology, node1, nep12).setConnectPoint(cp12), - DcsBasedTapiNepRef.create(topology, node2, nep21).setConnectPoint(cp21) + DcsBasedTapiObjectRefFactory.create(topology, node1, nep12).setConnectPoint(cp12), + DcsBasedTapiObjectRefFactory.create(topology, node2, nep21).setConnectPoint(cp21) .setSipId(sip21.uuid().toString()), - DcsBasedTapiNepRef.create(topology, node2, nep22).setConnectPoint(cp22) + DcsBasedTapiObjectRefFactory.create(topology, node2, nep22).setConnectPoint(cp22) ); mockResolver.addNodeRefList(expectNodes); @@ -174,13 +173,13 @@ public class DcsBasedTapiDataProducerTest { node2.addToOwnedNodeEdgePoint(nep22); List expectNodes = Arrays.asList( - DcsBasedTapiNodeRef.create(topology, node1).setDeviceId(did1), - DcsBasedTapiNodeRef.create(topology, node2).setDeviceId(did2) + DcsBasedTapiObjectRefFactory.create(topology, node1).setDeviceId(did1), + DcsBasedTapiObjectRefFactory.create(topology, node2).setDeviceId(did2) ); List expectNeps = Arrays.asList( - DcsBasedTapiNepRef.create(topology, node1, nep11).setConnectPoint(cp11), - DcsBasedTapiNepRef.create(topology, node2, nep21).setConnectPoint(cp21), - DcsBasedTapiNepRef.create(topology, node2, nep22).setConnectPoint(cp22) + DcsBasedTapiObjectRefFactory.create(topology, node1, nep11).setConnectPoint(cp11), + DcsBasedTapiObjectRefFactory.create(topology, node2, nep21).setConnectPoint(cp21), + DcsBasedTapiObjectRefFactory.create(topology, node2, nep22).setConnectPoint(cp22) ); mockResolver.addNodeRefList(expectNodes); @@ -203,8 +202,8 @@ public class DcsBasedTapiDataProducerTest { topology.addToNode(node2); List expectNodes = Arrays.asList( - DcsBasedTapiNodeRef.create(topology, node1).setDeviceId(did1), - DcsBasedTapiNodeRef.create(topology, node2).setDeviceId(did2) + DcsBasedTapiObjectRefFactory.create(topology, node1).setDeviceId(did1), + DcsBasedTapiObjectRefFactory.create(topology, node2).setDeviceId(did2) ); List expectNeps = Collections.emptyList(); @@ -237,5 +236,4 @@ public class DcsBasedTapiDataProducerTest { verify(mockResolver); } - } \ No newline at end of file