[ODTN] Add read/create/delete ConnectivityService RPC
- RPC: get service interface point
- RPC: get connectivity service list
- RPC: get connectivity service detail
- RPC: create connectivity service
- RPC: delete connectivity service
- Filter method of TAPI resolver for both Node / NEP
- Change condition for sip to odtn-port-type
- Use odtn-port-type in path-computation mock
- Create CEP at topology discovery
- Add sample path calculator
- Add connection-id based path selection
Change-Id: I2f08aacb3dd14b6b3c59a64a349e50abb495f70b
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiResolver.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiResolver.java
similarity index 71%
rename from apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiResolver.java
rename to apps/odtn/service/src/main/java/org/onosproject/odtn/TapiResolver.java
index 5311cd9..2c2f271 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiResolver.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiResolver.java
@@ -14,9 +14,10 @@
* limitations under the License.
*/
-package org.onosproject.odtn.internal;
+package org.onosproject.odtn;
import java.util.List;
+import java.util.Map;
import java.util.NoSuchElementException;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.ElementId;
@@ -70,13 +71,39 @@
TapiNodeRef getNodeRef(ElementId deviceId);
/**
+ * Resolve TAPI node with Node unique keys.
+ *
+ * @param nodeRef Node reference object which has node unique keys.
+ * @return TapiNodeRef
+ * @throws NoSuchElementException if target not found
+ */
+ TapiNodeRef getNodeRef(TapiNodeRef nodeRef);
+
+ /**
* Get all NodeRefs.
*
- * @return List<TapiNodeRef>
+ * @return List of all NodeRefs
*/
List<TapiNodeRef> getNodeRefs();
/**
+ * Apply filter and get filtered NodeRefs.
+ *
+ * @param filter key value map for filter
+ * @return List of filtered NodeRefs, which matches all of {@code filter}
+ */
+ List<TapiNodeRef> getNodeRefs(Map<String, String> filter);
+
+ /**
+ * Resolve TAPI nep with Nep unique keys.
+ *
+ * @param nepRef Nep reference object which has Nep unique keys.
+ * @return TapiNepRef
+ * @throws NoSuchElementException if target not found
+ */
+ TapiNepRef getNepRef(TapiNepRef nepRef);
+
+ /**
* Resolve TAPI nep associated with ConnectPoint.
*
* @param cp search key
@@ -97,11 +124,19 @@
/**
* Get all NepRefs.
*
- * @return List<TapiNepRef>
+ * @return List of all NepRefs
*/
List<TapiNepRef> getNepRefs();
/**
+ * Apply filter and get filtered NepRefs.
+ *
+ * @param filter key value map for filter
+ * @return List of filtered NepRefs, which matches all of {@code filter}
+ */
+ List<TapiNepRef> getNepRefs(Map<String, String> filter);
+
+ /**
* Inform the cache is already got dirty and let it update cache.
* The cache update process is conducted when next resolve request
* (hasXXX or getXXX) comes.
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiTopologyManager.java
similarity index 95%
rename from apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java
rename to apps/odtn/service/src/main/java/org/onosproject/odtn/TapiTopologyManager.java
index 1be4ed5..bea4a20 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiTopologyManager.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.onosproject.odtn.internal;
+package org.onosproject.odtn;
import org.onosproject.net.Device;
import org.onosproject.net.Link;
@@ -27,36 +27,42 @@
/**
* DEVICE_ADDED event handler.
+ *
* @param device device to be added
*/
void addDevice(Device device);
/**
* DEVICE_REMOVED event handler.
+ *
* @param device device to be removed
*/
void removeDevice(Device device);
/**
* LINK_ADDED event handler.
+ *
* @param link link to be added
*/
void addLink(Link link);
/**
* LINK_REMOVED event handler.
+ *
* @param link link to be removed
*/
void removeLink(Link link);
/**
* PORT_ADDED event handler.
+ *
* @param port port to be added
*/
void addPort(Port port);
/**
* PORT_REMOVED event handler.
+ *
* @param port port to be removed
*/
void removePort(Port port);
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 2a92137..48057c8 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
@@ -20,68 +20,41 @@
package org.onosproject.odtn.impl;
-import java.util.List;
-
import org.apache.felix.scr.annotations.Activate;
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.config.DynamicConfigEvent;
-import org.onosproject.config.DynamicConfigListener;
-import org.onosproject.config.DynamicConfigService;
-import org.onosproject.config.FailedException;
-import org.onosproject.config.Filter;
import org.onosproject.net.Link;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
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;
import org.onosproject.net.link.LinkEvent;
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.internal.DcsBasedTapiCommonRpc;
+import org.onosproject.odtn.internal.DcsBasedTapiConnectivityRpc;
import org.onosproject.odtn.internal.DcsBasedTapiDataProducer;
import org.onosproject.odtn.internal.TapiDataProducer;
-import org.onosproject.odtn.internal.TapiResolver;
-import org.onosproject.odtn.internal.TapiTopologyManager;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.TapiCommonService;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.DefaultGetServiceInterfacePointListOutput;
-import org.onosproject.yang.model.NodeKey;
-import org.onosproject.yang.model.SchemaId;
+import org.onosproject.store.AbstractStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.TapiConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.
- tapiconnectivity.createconnectivityservice.CreateConnectivityServiceInput;
-
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.
- tapiconnectivity.createconnectivityservice.createconnectivityserviceinput.EndPoint;
-
-
-
-// onos-yang-tools
-import org.onosproject.yang.model.DataNode;
-
-import org.onosproject.yang.model.ResourceData;
-import org.onosproject.yang.model.DefaultResourceData;
-import org.onosproject.yang.model.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
-import org.onosproject.yang.model.ModelConverter;
-
-import org.onosproject.yang.model.ResourceId;
-
+// DCS / onos-yang-tools
+import org.onosproject.config.DynamicConfigEvent;
+import org.onosproject.config.DynamicConfigListener;
+import org.onosproject.config.DynamicConfigService;
import org.onosproject.yang.model.RpcRegistry;
-import org.onosproject.yang.model.RpcService;
-import org.onosproject.yang.model.RpcInput;
-import org.onosproject.yang.model.RpcOutput;
-import org.onosproject.yang.model.SchemaContextProvider;
-import org.onosproject.yang.runtime.YangRuntimeService;
import static org.onosproject.config.DynamicConfigEvent.Type.NODE_ADDED;
import static org.onosproject.config.DynamicConfigEvent.Type.NODE_DELETED;
-import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
/**
* OSGi Component for ODTN Service application.
@@ -104,18 +77,9 @@
protected NetworkConfigService netcfgService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected YangRuntimeService yangRuntime;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected SchemaContextProvider schemaContextProvider;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected RpcRegistry rpcRegistry;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected ModelConverter modelConverter;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected TapiTopologyManager tapiTopologyManager;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -127,14 +91,13 @@
private DeviceListener deviceListener = new InternalDeviceListener();
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 RpcService rpcTapiConnectivity =
- new TapiConnectivityRpc();
-
- private final RpcService rpcTapiCommon =
- new TapiCommonRpc();
+ private final DcsBasedTapiConnectivityRpc rpcTapiConnectivity = new DcsBasedTapiConnectivityRpc();
+ private final DcsBasedTapiCommonRpc rpcTapiCommon = new DcsBasedTapiCommonRpc();
@Activate
@@ -143,8 +106,11 @@
dynConfigService.addListener(dynamicConfigServiceListener);
deviceService.addListener(deviceListener);
linkService.addListener(linkListener);
+ netcfgService.addListener(netcfgListener);
rpcRegistry.registerRpcService(rpcTapiConnectivity);
rpcRegistry.registerRpcService(rpcTapiCommon);
+ rpcTapiConnectivity.init();
+ rpcTapiCommon.init();
}
@@ -153,6 +119,7 @@
log.info("Stopped");
rpcRegistry.unregisterRpcService(rpcTapiCommon);
rpcRegistry.unregisterRpcService(rpcTapiConnectivity);
+ netcfgService.removeListener(netcfgListener);
linkService.removeListener(linkListener);
deviceService.removeListener(deviceListener);
dynConfigService.removeListener(dynamicConfigServiceListener);
@@ -172,6 +139,8 @@
@Override
public void event(DeviceEvent event) {
+ netcfgStore.post(event);
+
switch (event.type()) {
case DEVICE_ADDED:
tapiTopologyManager.addDevice(event.subject());
@@ -222,6 +191,36 @@
}
/**
+ * Representation of internal listener, listening for netcfg event.
+ */
+ private class InternalNetCfgListener implements NetworkConfigListener {
+
+ /**
+ * Process an Event from the NetCfg Service.
+ *
+ * @param event link event
+ */
+ @Override
+ public void event(NetworkConfigEvent event) {
+// Object config = event.subject();
+ log.info("config: {}", event.subject());
+ log.info("type: {}", event.type());
+ }
+ }
+
+ private class InternalNetCfgManager
+ extends AbstractStore<NetworkConfigEvent, NetworkConfigStoreDelegate> {
+
+ 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.
*/
private class InternalDynamicConfigListener implements DynamicConfigListener {
@@ -251,237 +250,74 @@
@Override
public void event(DynamicConfigEvent event) {
resolver.makeDirty();
-
- ResourceId rsId = event.subject();
- DataNode node;
- try {
- Filter filter = Filter.builder().addCriteria(rsId).build();
- node = dynConfigService.readNode(rsId, filter);
- } catch (FailedException e) {
- node = null;
- }
- switch (event.type()) {
- case NODE_ADDED:
- onDcsNodeAdded(rsId, node);
- break;
-
- case NODE_DELETED:
- onDcsNodeDeleted(node);
- break;
-
- default:
- log.warn("Unknown Event", event.type());
- break;
- }
+// ResourceId rsId = event.subject();
+// DataNode node;
+// try {
+// Filter filter = Filter.builder().addCriteria(rsId).build();
+// node = dynConfigService.readNode(rsId, filter);
+// } catch (FailedException e) {
+// node = null;
+// }
+// switch (event.type()) {
+// case NODE_ADDED:
+// onDcsNodeAdded(rsId, node);
+// break;
+//
+// case NODE_DELETED:
+// onDcsNodeDeleted(node);
+// break;
+//
+// default:
+// log.warn("Unknown Event", event.type());
+// break;
+// }
}
- /**
- * Process the event that a node has been added to the DCS.
- *
- * @param rsId ResourceId of the added node
- * @param node added node. Access the key and value
- */
- private void onDcsNodeAdded(ResourceId rsId, DataNode node) {
-
- switch (node.type()) {
- case SINGLE_INSTANCE_NODE:
- break;
- case MULTI_INSTANCE_NODE:
- break;
- case SINGLE_INSTANCE_LEAF_VALUE_NODE:
- break;
- case MULTI_INSTANCE_LEAF_VALUE_NODE:
- break;
- default:
- break;
- }
-
- NodeKey dataNodeKey = node.key();
- SchemaId schemaId = dataNodeKey.schemaId();
+// /**
+// * Process the event that a node has been added to the DCS.
+// *
+// * @param rsId ResourceId of the added node
+// * @param node added node. Access the key and value
+// */
+// private void onDcsNodeAdded(ResourceId rsId, DataNode node) {
+//
+// switch (node.type()) {
+// case SINGLE_INSTANCE_NODE:
+// break;
+// case MULTI_INSTANCE_NODE:
+// break;
+// case SINGLE_INSTANCE_LEAF_VALUE_NODE:
+// break;
+// case MULTI_INSTANCE_LEAF_VALUE_NODE:
+// break;
+// default:
+// break;
+// }
+//
+// NodeKey dataNodeKey = node.key();
+// SchemaId schemaId = dataNodeKey.schemaId();
// 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.
- *
- * @param dataNode data node
- */
- private void onDcsNodeDeleted(DataNode dataNode) {
- // TODO: Implement release logic
- }
+// /**
+// * Process the event that a node has been deleted from the DCS.
+// *
+// * @param dataNode data node
+// */
+// private void onDcsNodeDeleted(DataNode dataNode) {
+// // TODO: Implement release logic
+// }
}
- private class TapiConnectivityRpc implements TapiConnectivityService {
- /**
- * Service interface of createConnectivityService.
- *
- * @param inputVar input of service interface createConnectivityService
- * @return rpcOutput output of service interface createConnectivityService
- */
- @Override
- public RpcOutput createConnectivityService(RpcInput inputVar) {
-
- DataNode data = inputVar.data();
- ResourceId rid = inputVar.id();
-
- log.info("RpcInput Data {}", data);
- log.info("RpcInput ResourceId {}", rid);
-
- for (ModelObject mo : getModelObjects(data, rid)) {
- if (mo instanceof CreateConnectivityServiceInput) {
- CreateConnectivityServiceInput i = (CreateConnectivityServiceInput) mo;
- log.info("i {}", i);
- List<EndPoint> epl = i.endPoint();
- for (EndPoint ep : epl) {
- log.info("ep {}", ep);
- }
- }
- }
-
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
- }
-
-
- /**
- * Service interface of deleteConnectivityService.
- *
- * @param inputVar input of service interface deleteConnectivityService
- * @return rpcOutput output of service interface deleteConnectivityService
- */
- @Override
- public RpcOutput deleteConnectivityService(RpcInput inputVar) {
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
- }
-
-
- /**
- * Service interface of getConnectionDetails.
- *
- * @param inputVar input of service interface getConnectionDetails
- * @return rpcOutput output of service interface getConnectionDetails
- */
- @Override
- public RpcOutput getConnectionDetails(RpcInput inputVar) {
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
- }
-
- /**
- * Service interface of getConnectivityServiceList.
- *
- * @param inputVar input of service interface getConnectivityServiceList
- * @return rpcOutput output of service interface getConnectivityServiceList
- */
- @Override
- public RpcOutput getConnectivityServiceList(RpcInput inputVar) {
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
- }
-
- /**
- * Service interface of getConnectivityServiceDetails.
- *
- * @param inputVar input of service interface getConnectivityServiceDetails
- * @return rpcOutput output of service interface getConnectivityServiceDetails
- */
- @Override
- public RpcOutput getConnectivityServiceDetails(RpcInput inputVar) {
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
- }
-
-
- /**
- * Service interface of updateConnectivityService.
- *
- * @param inputVar input of service interface updateConnectivityService
- * @return rpcOutput output of service interface updateConnectivityService
- */
- @Override
- public RpcOutput updateConnectivityService(RpcInput inputVar) {
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
- }
-
-
- private ResourceData createResourceData(DataNode dataNode, ResourceId resId) {
- return DefaultResourceData.builder()
- .addDataNode(dataNode)
- .resourceId(resId)
- .build();
- }
-
- /**
- * Returns model objects of the store.
- *
- * @param dataNode data node from store
- * @param resId parent resource id
- * @return model objects
- */
- private List<ModelObject> getModelObjects(DataNode dataNode, ResourceId resId) {
- ResourceData data = createResourceData(dataNode, resId);
- ModelObjectData modelData = modelConverter.createModel(data);
- return modelData.modelObjects();
- }
-
-
- }
-
-
- private class TapiCommonRpc implements TapiCommonService {
-
- /**
- * Service interface of getServiceInterfacePointDetails.
- *
- * @param rpcInput input of service interface getServiceInterfacePointDetails
- * @return rpcOutput output of service interface getServiceInterfacePointDetails
- */
- @Override
- public RpcOutput getServiceInterfacePointDetails(RpcInput rpcInput) {
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
- }
-
- /**
- * Service interface of getServiceInterfacePointList.
- *
- * @param rpcInput input of service interface getServiceInterfacePointList
- * @return rpcOutput output of service interface getServiceInterfacePointList
- */
- @Override
- public RpcOutput getServiceInterfacePointList(RpcInput rpcInput) {
-
- DataNode data = rpcInput.data();
- ResourceId rid = rpcInput.id();
-
- log.info("RpcInput Data {}", data);
- log.info("RpcInput ResourceId {}", rid);
-
- DefaultGetServiceInterfacePointListOutput node = new DefaultGetServiceInterfacePointListOutput();
- DataNode dnode = toDataNode(node);
-
- return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, dnode);
- }
-
- /**
- * Service interface of updateServiceInterfacePoint.
-q *
- * @param rpcInput input of service interface updateServiceInterfacePoint
- * @return rpcOutput output of service interface updateServiceInterfacePoint
- */
- @Override
- public RpcOutput updateServiceInterfacePoint(RpcInput rpcInput) {
- return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
- }
- }
}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java
new file mode 100644
index 0000000..315e10c
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java
@@ -0,0 +1,100 @@
+/*
+ * 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.config.DynamicConfigService;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.utils.tapi.TapiGetSipListOutputHandler;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.TapiCommonService;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.RpcInput;
+import org.onosproject.yang.model.RpcOutput;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+
+/**
+ * DCS-dependent tapi-common yang RPCs implementation.
+ */
+public class DcsBasedTapiCommonRpc implements TapiCommonService {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ protected DynamicConfigService dcs;
+ protected ModelConverter modelConverter;
+ protected TapiResolver resolver;
+
+ public void init() {
+ dcs = getService(DynamicConfigService.class);
+ modelConverter = getService(ModelConverter.class);
+ resolver = getService(TapiResolver.class);
+ }
+
+ /**
+ * Service interface of getServiceInterfacePointDetails.
+ *
+ * @param rpcInput input of service interface getServiceInterfacePointDetails
+ * @return rpcOutput output of service interface getServiceInterfacePointDetails
+ */
+ @Override
+ public RpcOutput getServiceInterfacePointDetails(RpcInput rpcInput) {
+ log.error("Not implemented");
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+
+ /**
+ * Service interface of getServiceInterfacePointList.
+ *
+ * @param rpcInput input of service interface getServiceInterfacePointList
+ * @return rpcOutput output of service interface getServiceInterfacePointList
+ */
+ @Override
+ public RpcOutput getServiceInterfacePointList(RpcInput rpcInput) {
+
+ try {
+ TapiGetSipListOutputHandler output = TapiGetSipListOutputHandler.create();
+
+ resolver.getNepRefs().stream()
+ .filter(nepRef -> nepRef.getSipId() != null)
+ .forEach(nepRef -> {
+ output.addSip(Uuid.fromString(nepRef.getSipId()));
+ });
+
+ return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+ } catch (Throwable e) {
+ log.error("Error:", e);
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+
+ }
+
+ /**
+ * Service interface of updateServiceInterfacePoint.
+ *
+ * @param rpcInput input of service interface updateServiceInterfacePoint
+ * @return rpcOutput output of service interface updateServiceInterfacePoint
+ */
+ @Override
+ public RpcOutput updateServiceInterfacePoint(RpcInput rpcInput) {
+ log.error("Not implemented");
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+}
+
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
new file mode 100644
index 0000000..6ddb662
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java
@@ -0,0 +1,174 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+import org.onosproject.config.FailedException;
+import org.onosproject.net.device.DeviceService;
+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.TapiRouteHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+
+/**
+ * DCS-dependent Tapi connection manager implementation.
+ */
+public class DcsBasedTapiConnectionManager implements TapiConnectionManager {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ protected TapiPathComputer connectionController;
+ private DeviceService deviceService;
+
+ private List<DcsBasedTapiConnectionManager> connectionManagerList = new ArrayList<>();
+ private TapiConnectionHandler connectionHandler = TapiConnectionHandler.create();
+ private Operation op = null;
+
+
+ enum Operation {
+ CREATE,
+ DELETE
+ }
+
+ public static DcsBasedTapiConnectionManager create() {
+ DcsBasedTapiConnectionManager self = new DcsBasedTapiConnectionManager();
+ self.connectionController = DefaultTapiPathComputer.create();
+ self.deviceService = getService(DeviceService.class);
+ return self;
+ }
+
+ @Override
+ public TapiConnectionHandler createConnection(TapiNepPair neps) {
+
+ // Calculate route
+ TapiConnection connection = connectionController.pathCompute(neps);
+ log.info("Calculated path: {}", connection);
+
+ createConnectionRecursively(connection);
+ return connectionHandler;
+ }
+
+ @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:
+ connectionHandler.add();
+ break;
+ case DELETE:
+ connectionHandler.remove();
+ break;
+ default:
+ throw new FailedException("Unknown operation type.");
+ }
+ }
+
+ /**
+ * Generate TAPI connection and its under connections recursively
+ * and add them to creation queue.
+ *
+ * @param connection connection to be created
+ */
+ private void createConnectionRecursively(TapiConnection connection) {
+ op = Operation.CREATE;
+ connectionManagerList.clear();
+
+ TapiRouteHandler routeBuilder = TapiRouteHandler.create();
+
+ // Create under connection, and set them into routeBuilder
+ connection.getLowerConnections().forEach(lowerConnection -> {
+ delegateConnectionCreation(lowerConnection);
+ routeBuilder.addCep(lowerConnection.getCeps().left());
+ routeBuilder.addCep(lowerConnection.getCeps().right());
+ });
+
+ connectionHandler.addRoute(routeBuilder.getModelObject());
+
+ connectionHandler.addCep(TapiCepRefHandler.create()
+ .setCep(connection.getCeps().left()).getModelObject());
+ connectionHandler.addCep(TapiCepRefHandler.create()
+ .setCep(connection.getCeps().right()).getModelObject());
+
+ connectionManagerList.forEach(manager ->
+ connectionHandler.addLowerConnection(manager.getConnectionHandler().getModelObject()));
+
+ }
+
+ /**
+ * Generate TAPI connection and its under connections recursively
+ * and add them to deletion queue.
+ *
+ * @param connectionHandler connectionHandler of connection to be deleted
+ */
+ private void deleteConnectionRecursively(TapiConnectionHandler connectionHandler) {
+ op = Operation.DELETE;
+ connectionManagerList.clear();
+
+ this.connectionHandler = connectionHandler;
+ this.connectionHandler.getLowerConnections().forEach(lowerConnectionHandler -> {
+ delegateConnectionDeletion(lowerConnectionHandler);
+ });
+ }
+
+ /**
+ * Delegate lower-connection creation to other corresponding TapiConnectionManager of each Nodes.
+ *
+ * @param connection connection to be created
+ */
+ private void delegateConnectionCreation(TapiConnection connection) {
+ log.info("ceps: {}", connection.getCeps());
+ DcsBasedTapiConnectionManager manager = DcsBasedTapiConnectionManager.create();
+ manager.createConnectionRecursively(connection);
+ connectionManagerList.add(manager);
+ }
+
+ /**
+ * Delegate lower-connection deletion to other corresponding TapiConnectionManager of each Nodes.
+ *
+ * @param connectionHandler connectionHandler of connection to be deleted
+ */
+ private void delegateConnectionDeletion(TapiConnectionHandler connectionHandler) {
+ log.info("model: {}", connectionHandler.getModelObject());
+ DcsBasedTapiConnectionManager manager = DcsBasedTapiConnectionManager.create();
+ manager.deleteConnectionRecursively(connectionHandler);
+ connectionManagerList.add(manager);
+ }
+
+
+ public TapiConnectionHandler getConnectionHandler() {
+ return connectionHandler;
+ }
+
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java
new file mode 100644
index 0000000..2598781
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java
@@ -0,0 +1,244 @@
+/*
+ * 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 java.util.List;
+import java.util.stream.Collectors;
+import org.onosproject.config.DynamicConfigService;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+import org.onosproject.odtn.utils.tapi.TapiConnectionHandler;
+import org.onosproject.odtn.utils.tapi.TapiConnectivityServiceHandler;
+import org.onosproject.odtn.utils.tapi.TapiContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiCreateConnectivityInputHandler;
+import org.onosproject.odtn.utils.tapi.TapiCreateConnectivityOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiDeleteConnectivityInputHandler;
+import org.onosproject.odtn.utils.tapi.TapiDeleteConnectivityOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiGetConnectivityDetailsInputHandler;
+import org.onosproject.odtn.utils.tapi.TapiGetConnectivityDetailsOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiGetConnectivityListOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiNepRef;
+import org.onosproject.odtn.utils.tapi.TapiObjectHandler;
+import org.onosproject.odtn.utils.tapi.TapiSepHandler;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.TapiConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.RpcInput;
+import org.onosproject.yang.model.RpcOutput;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+
+
+/**
+ * DCS-dependent tapi-connectivity yang RPCs implementation.
+ */
+public class DcsBasedTapiConnectivityRpc implements TapiConnectivityService {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ protected DynamicConfigService dcs;
+ protected ModelConverter modelConverter;
+ protected TapiResolver resolver;
+
+ public void init() {
+ dcs = getService(DynamicConfigService.class);
+ modelConverter = getService(ModelConverter.class);
+ resolver = getService(TapiResolver.class);
+ }
+
+ /**
+ * Service interface of createConnectivityService.
+ *
+ * @param inputVar input of service interface createConnectivityService
+ * @return output of service interface createConnectivityService
+ */
+ @Override
+ public RpcOutput createConnectivityService(RpcInput inputVar) {
+
+ try {
+ TapiCreateConnectivityInputHandler input = new TapiCreateConnectivityInputHandler();
+ input.setRpcInput(inputVar);
+ // TODO validation check
+ log.info("input SIPs: {}", input.getSips());
+
+ List<TapiNepRef> nepRefs = input.getSips().stream()
+ .map(sipId -> resolver.getNepRef(sipId))
+ .collect(Collectors.toList());
+ // for test
+// Map<String, String> filter = new HashMap<>();
+// filter.put(ODTN_PORT_TYPE, OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT.value());
+// List<TapiNepRef> nepRefs = resolver.getNepRefs(filter);
+
+ // setup connections
+ TapiNepPair neps = TapiNepPair.create(nepRefs.get(0), nepRefs.get(1));
+ DcsBasedTapiConnectionManager connectionManager = DcsBasedTapiConnectionManager.create();
+ connectionManager.createConnection(neps);
+
+ // setup connectivity service
+ TapiConnectivityServiceHandler connectivityServiceHandler = TapiConnectivityServiceHandler.create();
+ connectivityServiceHandler.addConnection(connectionManager.getConnectionHandler().getModelObject().uuid());
+ neps.stream()
+ .map(nepRef -> TapiSepHandler.create().setSip(nepRef.getSipId()))
+ .forEach(sepBuilder -> {
+ connectivityServiceHandler.addSep(sepBuilder.getModelObject());
+ });
+
+ // build
+ connectionManager.apply();
+ connectivityServiceHandler.add();
+
+ // output
+ TapiCreateConnectivityOutputHandler output = TapiCreateConnectivityOutputHandler.create()
+ .addService(connectivityServiceHandler.getModelObject());
+ return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+
+ } catch (Throwable e) {
+ log.error("Error:", e);
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+
+ }
+
+
+ /**
+ * Service interface of deleteConnectivityService.
+ *
+ * @param inputVar input of service interface deleteConnectivityService
+ * @return output of service interface deleteConnectivityService
+ */
+ @Override
+ public RpcOutput deleteConnectivityService(RpcInput inputVar) {
+
+ try {
+ TapiDeleteConnectivityInputHandler input = new TapiDeleteConnectivityInputHandler();
+ input.setRpcInput(inputVar);
+ log.info("input serviceId: {}", input.getId());
+
+ TapiConnectivityServiceHandler serviceHandler = TapiConnectivityServiceHandler.create();
+ serviceHandler.setId(input.getId());
+
+ DefaultConnectivityService service = serviceHandler.read();
+
+ service.connection().stream().forEach(connection -> {
+ TapiConnectionHandler connectionHandler = TapiConnectionHandler.create();
+ connectionHandler.setId(Uuid.fromString(connection.connectionId().toString()));
+ DcsBasedTapiConnectionManager manager = DcsBasedTapiConnectionManager.create();
+ manager.deleteConnection(connectionHandler);
+ manager.apply();
+ });
+ serviceHandler.remove();
+
+ TapiDeleteConnectivityOutputHandler output = TapiDeleteConnectivityOutputHandler.create()
+ .addService(serviceHandler.getModelObject());
+
+ return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+ } catch (Throwable e) {
+ log.error("Error:", e);
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+ }
+
+ /**
+ * Service interface of updateConnectivityService.
+ *
+ * @param inputVar input of service interface updateConnectivityService
+ * @return output of service interface updateConnectivityService
+ */
+ @Override
+ public RpcOutput updateConnectivityService(RpcInput inputVar) {
+ log.error("Not implemented");
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+
+ }
+
+ /**
+ * Service interface of getConnectivityServiceList.
+ *
+ * @param inputVar input of service interface getConnectivityServiceList
+ * @return output of service interface getConnectivityServiceList
+ */
+ @Override
+ public RpcOutput getConnectivityServiceList(RpcInput inputVar) {
+
+ try {
+ TapiGetConnectivityListOutputHandler output = TapiGetConnectivityListOutputHandler.create();
+ log.info("get list called");
+
+ TapiContextHandler handler = TapiContextHandler.create();
+ handler.read();
+ log.info("model : {}", handler.getModelObject());
+ log.info("conserv : {}", handler.getConnectivityServices());
+
+ handler.getConnectivityServices().stream()
+ .map(TapiObjectHandler::getModelObject)
+ .forEach(output::addService);
+
+ return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+
+ } catch (Throwable e) {
+ log.error("Error:", e);
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+ }
+
+
+ /**
+ * Service interface of getConnectivityServiceDetails.
+ *
+ * @param inputVar input of service interface getConnectivityServiceDetails
+ * @return output of service interface getConnectivityServiceDetails
+ */
+ @Override
+ public RpcOutput getConnectivityServiceDetails(RpcInput inputVar) {
+
+ try {
+ TapiGetConnectivityDetailsInputHandler input = new TapiGetConnectivityDetailsInputHandler();
+ input.setRpcInput(inputVar);
+ log.info("input serviceId: {}", input.getId());
+
+ TapiConnectivityServiceHandler handler = TapiConnectivityServiceHandler.create();
+ handler.setId(input.getId());
+ handler.read();
+
+ TapiGetConnectivityDetailsOutputHandler output = TapiGetConnectivityDetailsOutputHandler.create()
+ .addService(handler.getModelObject());
+
+ return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+
+ } catch (Throwable e) {
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+
+ }
+
+ /**
+ * Service interface of getConnectionDetails.
+ *
+ * @param inputVar input of service interface getConnectionDetails
+ * @return output of service interface getConnectionDetails
+ */
+ @Override
+ public RpcOutput getConnectionDetails(RpcInput inputVar) {
+ log.error("Not implemented");
+ return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+ }
+
+}
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 5f6b96c..726d002 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
@@ -15,9 +15,12 @@
*/
package org.onosproject.odtn.internal;
+
import com.google.common.annotations.VisibleForTesting;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
import org.onosproject.config.DynamicConfigService;
@@ -30,14 +33,13 @@
import org.onosproject.odtn.utils.tapi.TapiNodeRef;
import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
-import org.onosproject.yang.model.Augmentable;
import org.onosproject.yang.model.DataNode;
import org.onosproject.yang.model.DefaultModelObjectData;
import org.onosproject.yang.model.DefaultResourceData;
import org.onosproject.yang.model.ModelConverter;
-import org.onosproject.yang.model.ModelObject;
import org.onosproject.yang.model.ModelObjectData;
import org.onosproject.yang.model.ModelObjectId;
import org.onosproject.yang.model.ResourceData;
@@ -45,13 +47,19 @@
import org.slf4j.Logger;
import static org.onlab.osgi.DefaultServiceDirectory.getService;
-import static org.onosproject.odtn.utils.tapi.TapiInstanceBuilder.DEVICE_ID;
-import static org.onosproject.odtn.utils.tapi.TapiInstanceBuilder.ONOS_CP;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ONOS_CP;
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.CONNECTION_ID;
import static org.slf4j.LoggerFactory.getLogger;
+/**
+ * DCS-dependent Tapi Data producer implementation.
+ */
public class DcsBasedTapiDataProducer implements TapiDataProducer {
private final Logger log = getLogger(getClass());
+
protected DynamicConfigService dcs;
protected ModelConverter modelConverter;
@@ -63,17 +71,28 @@
@Override
public void updateCacheRequest(DefaultTapiResolver resolver) {
- ModelObject context = readContextModelObject();
- updateCache(resolver, context);
+ updateCache(resolver, readContextModelObject());
}
+ /**
+ * Update resolver's cache with Tapi context modelObject.
+ *
+ * @param resolver TapiResolver
+ * @param context Context ModelObject which has all data nodes of Tapi DataTree in Dcs store
+ */
@VisibleForTesting
- protected void updateCache(DefaultTapiResolver resolver, ModelObject context) {
+ protected void updateCache(DefaultTapiResolver resolver, DefaultContext context) {
updateNodes(resolver, getNodes(context));
updateNeps(resolver, getNeps(context));
}
- private ModelObject readContextModelObject() {
+ /**
+ * Get Tapi context modelObject from Dcs.
+ *
+ * @return Tapi context modelObject in Dcs store
+ */
+ // FIXME update this method using TapiContextHandler
+ private DefaultContext readContextModelObject() {
// read DataNode from DCS
ModelObjectId mid = ModelObjectId.builder().addChild(DefaultContext.class).build();
DataNode node = dcs.readNode(getResourceId(mid), Filter.builder().build());
@@ -82,15 +101,20 @@
ResourceData data = DefaultResourceData.builder().addDataNode(node)
.resourceId(ResourceId.builder().build()).build();
ModelObjectData modelData = modelConverter.createModel(data);
- ModelObject context = modelData.modelObjects().get(0);
+ DefaultContext context = (DefaultContext) modelData.modelObjects().get(0);
return context;
}
- private List<TapiNodeRef> getNodes(ModelObject context) {
- Augmentable augmentedContext = (Augmentable) context;
+ /**
+ * Extract Tapi Nodes from context modelObject and convert them to NodeRefs.
+ *
+ * @param context
+ * @return List of NodeRef
+ */
+ private List<TapiNodeRef> getNodes(DefaultContext context) {
DefaultAugmentedTapiCommonContext topologyContext
- = augmentedContext.augmentation(DefaultAugmentedTapiCommonContext.class);
+ = context.augmentation(DefaultAugmentedTapiCommonContext.class);
Topology topology = topologyContext.topology().get(0);
if (topology.node() == null) {
@@ -98,19 +122,27 @@
}
return topology.node().stream()
.map(node -> {
- String deviceId = node.name().stream()
- .filter(kv -> kv.valueName().equals(DEVICE_ID))
- .findFirst().map(Name::value).get();
- return DcsBasedTapiNodeRef.create(topology, node)
- .setDeviceId(DeviceId.deviceId(deviceId));
+ DcsBasedTapiNodeRef nodeRef = DcsBasedTapiNodeRef.create(topology, node);
+ if (node.name() != null) {
+ String deviceId = node.name().stream()
+ .filter(kv -> kv.valueName().equals(DEVICE_ID))
+ .findFirst().map(Name::value).get();
+ nodeRef.setDeviceId(DeviceId.deviceId(deviceId));
+ }
+ return nodeRef;
})
.collect(Collectors.toList());
}
- private List<TapiNepRef> getNeps(ModelObject context) {
- Augmentable augmentedContext = (Augmentable) context;
+ /**
+ * Extract Tapi Neps from context modelObject and convert them to NepRefs.
+ *
+ * @param context
+ * @return List of TapiNepRef
+ */
+ private List<TapiNepRef> getNeps(DefaultContext context) {
DefaultAugmentedTapiCommonContext topologyContext
- = augmentedContext.augmentation(DefaultAugmentedTapiCommonContext.class);
+ = context.augmentation(DefaultAugmentedTapiCommonContext.class);
Topology topology = topologyContext.topology().get(0);
if (topology.node() == null) {
@@ -118,22 +150,41 @@
}
List<TapiNepRef> ret = topology.node().stream()
.flatMap(node -> {
- if (node.ownedNodeEdgePoint() == null) {
- return null;
- }
- return node.ownedNodeEdgePoint().stream()
+ if (node.ownedNodeEdgePoint() == null) {
+ return null;
+ }
+ return node.ownedNodeEdgePoint().stream()
.map(nep -> {
- String onosConnectPoint = nep.name().stream()
- .filter(kv -> kv.valueName().equals(ONOS_CP))
- .findFirst().map(Name::value).get();
- TapiNepRef nepRef = DcsBasedTapiNepRef.create(topology, node, nep)
- .setConnectPoint(ConnectPoint.fromString(onosConnectPoint));
+ TapiNepRef nepRef = DcsBasedTapiNepRef.create(topology, node, nep);
+ if (nep.name() != null) {
+ Map<String, String> kvs = new HashMap<>();
+ nep.name().forEach(kv -> kvs.put(kv.valueName(), kv.value()));
+
+ String onosConnectPoint = kvs.getOrDefault(ONOS_CP, null);
+ String portType = kvs.getOrDefault(ODTN_PORT_TYPE, null);
+ String connectionId = kvs.getOrDefault(CONNECTION_ID, null);
+ nepRef.setConnectPoint(ConnectPoint.fromString(onosConnectPoint))
+ .setPortType(portType)
+ .setConnectionId(connectionId);
+ }
if (nep.mappedServiceInterfacePoint() != null) {
nep.mappedServiceInterfacePoint().stream()
.forEach(sip -> {
nepRef.setSipId(sip.serviceInterfacePointId().toString());
});
}
+
+ DefaultAugmentedTapiTopologyOwnedNodeEdgePoint augmentNep =
+ nep.augmentation(DefaultAugmentedTapiTopologyOwnedNodeEdgePoint.class);
+ try {
+ if (augmentNep.connectionEndPoint() != null) {
+ List<String> cepIds = augmentNep.connectionEndPoint().stream()
+ .map(cep -> cep.uuid().toString()).collect(Collectors.toList());
+ nepRef.setCepIds(cepIds);
+ }
+ } catch (NullPointerException e) {
+ log.warn("Augmented ownedNodeEdgePoint is not found.");
+ }
return nepRef;
});
}
@@ -141,16 +192,26 @@
return ret;
}
+ /**
+ * Update resolver's NodeRef list.
+ *
+ * @param resolver TapiResolver
+ * @param nodes List of NodeRef for update
+ */
private void updateNodes(DefaultTapiResolver resolver, List<TapiNodeRef> nodes) {
resolver.addNodeRefList(nodes);
}
+ /**
+ * Update resolver's NepRef list.
+ *
+ * @param resolver TapiResolver
+ * @param neps List of NepRef for update
+ */
private void updateNeps(DefaultTapiResolver resolver, List<TapiNepRef> neps) {
resolver.addNepRefList(neps);
}
-
-
private ResourceId getResourceId(ModelObjectId modelId) {
ModelObjectData data = DefaultModelObjectData.builder()
.identifier(modelId)
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
index 1ab7f12..b28c769 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
@@ -36,14 +36,17 @@
import org.onosproject.net.Link;
import org.onosproject.net.Port;
-import org.onosproject.odtn.utils.tapi.TapiLinkBuilder;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.TapiTopologyManager;
+import org.onosproject.odtn.utils.tapi.TapiLinkHandler;
+import org.onosproject.odtn.utils.tapi.TapiCepHandler;
import org.onosproject.odtn.utils.tapi.TapiNepRef;
import org.onosproject.odtn.utils.tapi.TapiNodeRef;
-import org.onosproject.odtn.utils.tapi.TapiContextBuilder;
-import org.onosproject.odtn.utils.tapi.TapiNepBuilder;
-import org.onosproject.odtn.utils.tapi.TapiNodeBuilder;
-import org.onosproject.odtn.utils.tapi.TapiSipBuilder;
-import org.onosproject.odtn.utils.tapi.TapiTopologyBuilder;
+import org.onosproject.odtn.utils.tapi.TapiContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiNepHandler;
+import org.onosproject.odtn.utils.tapi.TapiNodeHandler;
+import org.onosproject.odtn.utils.tapi.TapiSipHandler;
+import org.onosproject.odtn.utils.tapi.TapiTopologyHandler;
import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
@@ -55,7 +58,7 @@
import static org.slf4j.LoggerFactory.getLogger;
/**
- * OSGi Component for ODTN Tapi manager application.
+ * OSGi Component for ODTN TAPI topology manager application.
*/
@Component(immediate = true)
@Service
@@ -72,8 +75,8 @@
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected TapiResolver tapiResolver;
- private DefaultContext context = new DefaultContext();
- private DefaultTopology topology = new DefaultTopology();
+ private DefaultContext context;
+ private DefaultTopology topology;
@Activate
public void activate() {
@@ -95,9 +98,9 @@
if (tapiResolver.hasNodeRef(deviceId)) {
return;
}
- TapiNodeBuilder.builder()
+ TapiNodeHandler.create()
.setTopologyUuid(topology.uuid())
- .setDeviceId(deviceId).build();
+ .setDeviceId(deviceId).add();
}
@Override
@@ -115,10 +118,10 @@
TapiNepRef srcNepRef = tapiResolver.getNepRef(link.src());
TapiNepRef dstNepRef = tapiResolver.getNepRef(link.dst());
- TapiLinkBuilder.builder()
+ TapiLinkHandler.create()
.setTopologyUuid(topology.uuid())
.addNep(srcNepRef)
- .addNep(dstNepRef).build();
+ .addNep(dstNepRef).add();
}
@Override
@@ -139,19 +142,27 @@
String nodeId = nodeRef.getNodeId();
// nep
- TapiNepBuilder nepBuilder = TapiNepBuilder.builder()
- .setConnectPoint(cp)
+ TapiNepHandler nepBuilder = TapiNepHandler.create()
+ .setPort(port)
.setTopologyUuid(topology.uuid())
.setNodeUuid(Uuid.fromString(nodeId));
- // sip
- if (TapiSipBuilder.isSip(cp)) {
+ // cep
+ TapiCepHandler cepBuilder = TapiCepHandler.create()
+ .setTopologyUuid(topology.uuid())
+ .setNodeUuid(Uuid.fromString(nodeId))
+ .setNepUuid(nepBuilder.getId())
+ .setParentNep();
+ nepBuilder.addCep(cepBuilder.getModelObject());
- TapiSipBuilder sipBuilder = TapiSipBuilder.builder().setConnectPoint(cp);
- nepBuilder.addSip(sipBuilder.getUuid());
- sipBuilder.build();
+ if (TapiSipHandler.isSip(port)) {
+ TapiSipHandler sipBuilder = TapiSipHandler.create().setPort(port);
+ nepBuilder.addSip(sipBuilder.getId());
+
+ sipBuilder.add();
}
- nepBuilder.build();
+
+ nepBuilder.add();
}
@Override
@@ -159,16 +170,30 @@
log.info("Remove port: {}", port);
}
+ /**
+ * Add Tapi Context to Dcs store.
+ */
private void initDcsTapiContext() {
- TapiContextBuilder.builder(context).build();
+ TapiContextHandler contextHandler = TapiContextHandler.create();
+ context = contextHandler.getModelObject();
+ contextHandler.add();
}
+ /**
+ * Add Tapi Topology to Dcs store.
+ *
+ * Assumed there is only one topology for ODTN Phase 1.0
+ */
private void initDcsTapiTopology() {
- TapiTopologyBuilder.builder(topology).build();
+ TapiTopologyHandler topologyHandler = TapiTopologyHandler.create();
+ topology = topologyHandler.getModelObject();
+ topologyHandler.add();
}
- // FIXME: move DCS-related methods to DCS
-
+ /**
+ * Setup Dcs configuration tree root node.
+ */
+ // FIXME Dcs seems to setup root node by itself when activatation, this might not needed
private void initDcsIfRootNotExist() {
log.info("read root:");
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiPathComputer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiPathComputer.java
new file mode 100644
index 0000000..f7688cc
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiPathComputer.java
@@ -0,0 +1,120 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+import org.onosproject.net.DeviceId;
+import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.utils.tapi.TapiCepRef;
+import org.onosproject.odtn.utils.tapi.TapiConnection;
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+import org.onosproject.odtn.utils.tapi.TapiNepRef;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.CONNECTION_ID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * DCS-dependent Tapi path computation engine implementation.
+ */
+public class DefaultTapiPathComputer implements TapiPathComputer {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ protected TapiResolver resolver;
+
+ public static DefaultTapiPathComputer create() {
+ DefaultTapiPathComputer self = new DefaultTapiPathComputer();
+ self.resolver = getService(TapiResolver.class);
+ return self;
+ }
+
+ @Override
+ public TapiConnection pathCompute(TapiNepPair neps) {
+ log.info("Path compute with: {}", neps);
+ return pathComputeDetail(neps);
+ }
+
+ /**
+ * Compute and decide multi-hop route/path from e2e intent.
+ * <p>
+ * FIXME this can work only for Phase1.0, we need some features to:
+ * - define Route and select media channel
+ * - with pre-defined topology and forwarding constraint of each devices or domains
+ * - get all ConnectionEndPoint in the defined route and return them
+ * as list of Cep pair for each connection to be created
+ */
+ private TapiConnection pathComputeDetail(TapiNepPair neps) {
+ return mockPathCompute(neps);
+ }
+
+
+ /**
+ * Mock to create path computation result.
+ *
+ * neps.left connection neps.right
+ * ■----------------------------------------------------■
+ * \ /
+ * \ /
+ * \ leftLowerConnection / rightLowerConnection
+ * \ /
+ * \ /
+ * ■ ■
+ * leftLineNep rightLineNep
+ */
+ private TapiConnection mockPathCompute(TapiNepPair neps) {
+ TapiNepRef leftLineNep = mockGetTransponderLinePort(neps.left());
+ TapiNepRef rightLineNep = mockGetTransponderLinePort(neps.right());
+
+ TapiConnection leftLowerConnection = TapiConnection.create(
+ TapiCepRef.create(neps.left(), neps.left().getCepIds().get(0)),
+ TapiCepRef.create(leftLineNep, leftLineNep.getCepIds().get(0))
+ );
+
+ TapiConnection rightLowerConnection = TapiConnection.create(
+ TapiCepRef.create(neps.right(), neps.right().getCepIds().get(0)),
+ TapiCepRef.create(rightLineNep, rightLineNep.getCepIds().get(0))
+ );
+
+ TapiConnection connection = TapiConnection.create(
+ TapiCepRef.create(neps.left(), neps.left().getCepIds().get(0)),
+ TapiCepRef.create(neps.right(), neps.right().getCepIds().get(0))
+ );
+ connection.addLowerConnection(leftLowerConnection)
+ .addLowerConnection(rightLowerConnection);
+
+ return connection;
+ }
+
+ /**
+ * Mock to select line port from client port.
+ */
+ private TapiNepRef mockGetTransponderLinePort(TapiNepRef cliNepRef) {
+ DeviceId deviceId = cliNepRef.getConnectPoint().deviceId();
+ Map<String, String> filter = new HashMap<>();
+ filter.put(DEVICE_ID, deviceId.toString());
+ filter.put(ODTN_PORT_TYPE, OdtnDeviceDescriptionDiscovery.OdtnPortType.LINE.value());
+ filter.put(CONNECTION_ID, cliNepRef.getConnectionId());
+ return resolver.getNepRefs(filter).stream().findAny().get();
+ }
+
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
index f5a9bc6..f309d6d 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
@@ -18,21 +18,27 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.NoSuchElementException;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.ElementId;
+import org.onosproject.odtn.TapiResolver;
import org.onosproject.odtn.utils.tapi.TapiNepRef;
import org.onosproject.odtn.utils.tapi.TapiNodeRef;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;
-
+/**
+ * OSGi Component for ODTN TAPI resolver application.
+ */
@Component(immediate = true)
@Service
public class DefaultTapiResolver implements TapiResolver {
@@ -47,7 +53,7 @@
/**
* When source (e.g. DCS) is updated, set true
* When cache update completed successfully, set false
- *
+ * <p>
* This flag takes effect when cache update failed with exception,
* this remains to be true so the cache update process conducts again
*/
@@ -56,7 +62,7 @@
/**
* When source (e.g. DCS) is updated, set true
* When cache update started, set false
- *
+ * <p>
* This flag takes effect when source updated during cache updating
* this forces cache update again at the next request
*/
@@ -95,12 +101,27 @@
}
@Override
+ public TapiNodeRef getNodeRef(TapiNodeRef nodeRef) throws NoSuchElementException {
+ updateCache();
+ TapiNodeRef ret = null;
+ try {
+ ret = tapiNodeRefList.stream()
+ .filter(nodeRef::equals)
+ .findFirst().get();
+ } catch (NoSuchElementException e) {
+ log.error("Node not found of {}", nodeRef);
+ throw e;
+ }
+ return ret;
+ }
+
+ @Override
public TapiNodeRef getNodeRef(ElementId deviceId) throws NoSuchElementException {
updateCache();
TapiNodeRef ret = null;
try {
ret = tapiNodeRefList.stream()
- .filter(node -> node.getDeviceId().equals(deviceId))
+ .filter(node -> node.getDeviceId() != null && node.getDeviceId().equals(deviceId))
.findFirst().get();
} catch (NoSuchElementException e) {
log.error("Node not found associated with {}", deviceId);
@@ -116,12 +137,37 @@
}
@Override
+ public List<TapiNodeRef> getNodeRefs(Map<String, String> filter) {
+ updateCache();
+ Stream<TapiNodeRef> filterStream = tapiNodeRefList.stream();
+ for (String key : filter.keySet()) {
+ filterStream = filterStream.filter(nodeRef -> nodeRef.is(key, filter.get(key)));
+ }
+ return filterStream.collect(Collectors.toList());
+ }
+
+ @Override
+ public TapiNepRef getNepRef(TapiNepRef nepRef) throws NoSuchElementException {
+ updateCache();
+ TapiNepRef ret = null;
+ try {
+ ret = tapiNepRefList.stream()
+ .filter(nepRef::equals)
+ .findFirst().get();
+ } catch (NoSuchElementException e) {
+ log.error("Nep not found of {}", nepRef);
+ throw e;
+ }
+ return ret;
+ }
+
+ @Override
public TapiNepRef getNepRef(ConnectPoint cp) throws NoSuchElementException {
updateCache();
TapiNepRef ret = null;
try {
ret = tapiNepRefList.stream()
- .filter(nep -> nep.getConnectPoint().equals(cp))
+ .filter(nep -> nep.getConnectPoint() != null && nep.getConnectPoint().equals(cp))
.findFirst().get();
} catch (NoSuchElementException e) {
log.error("Nep not found associated with {}", cp);
@@ -136,7 +182,7 @@
TapiNepRef ret = null;
try {
ret = tapiNepRefList.stream()
- .filter(nep -> nep.getSipId().equals(sipId))
+ .filter(nep -> nep.getSipId() != null && nep.getSipId().equals(sipId))
.findFirst().get();
} catch (NoSuchElementException e) {
log.error("Nep not found associated with {}", sipId);
@@ -152,6 +198,16 @@
}
@Override
+ public List<TapiNepRef> getNepRefs(Map<String, String> filter) {
+ updateCache();
+ Stream<TapiNepRef> filterStream = tapiNepRefList.stream();
+ for (String key : filter.keySet()) {
+ filterStream = filterStream.filter(nepRef -> nepRef.is(key, filter.get(key)));
+ }
+ return filterStream.collect(Collectors.toList());
+ }
+
+ @Override
public void makeDirty() {
sourceUpdated = true;
isDirty = true;
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiConnectionManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiConnectionManager.java
new file mode 100644
index 0000000..baffde9
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiConnectionManager.java
@@ -0,0 +1,57 @@
+/*
+ * 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.odtn.utils.tapi.TapiNepPair;
+import org.onosproject.odtn.utils.tapi.TapiConnectionHandler;
+
+/**
+ * ODTN Tapi connectivity-service:connection manager.
+ */
+public interface TapiConnectionManager {
+
+ /**
+ * Queue Tapi connection object to add to DCS.
+ * If target connection has lower-connections, they are also queued recursively
+ * using other TapiConnectionManager instance.
+ * <p>
+ * Operation will not be conducted until apply method called.
+ *
+ * @param neps Both NodeEdgePoints of Nodes(devices or domains) in the calculated route.
+ * @return connectionHandler of connection to be created
+ */
+ TapiConnectionHandler createConnection(TapiNepPair neps);
+
+ /**
+ * Queue Tapi connection object to remove from DCS
+ * If target connection has lower-connections, they are also queued recursively
+ * using other TapiConnectionManager instance.
+ * <p>
+ * Operation will not be conducted until apply method called.
+ *
+ * @param connectionHandler handler of TAPI connection object to be deleted
+ */
+ void deleteConnection(TapiConnectionHandler connectionHandler);
+
+ /**
+ * Apply add/remove operation for queued connection instances.
+ * If target connection has lower-connections, they are also operated recursively
+ * by other TapiConnectionManager instance.
+ */
+ void apply();
+
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java
index 8d0c2d5..0096fa3 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java
@@ -25,6 +25,7 @@
/**
* Update TapiResolver cache with latest modelObject in DCS.
+ *
* @param resolver update target itself
*/
void updateCacheRequest(DefaultTapiResolver resolver);
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiPathComputer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiPathComputer.java
new file mode 100644
index 0000000..3951f57
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiPathComputer.java
@@ -0,0 +1,34 @@
+/*
+ * 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.odtn.utils.tapi.TapiConnection;
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+
+/**
+ * ODTN Tapi path computation service.
+ */
+public interface TapiPathComputer {
+
+ /**
+ * Compute and decide multi-hop route/path from e2e intent.
+ *
+ * @param neps Both NodeEdgePoints associated with ServiceInterfacePoint of NBI request
+ * @return List of both CEPs of devices or domains in the calculated route
+ */
+ TapiConnection pathCompute(TapiNepPair neps);
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/package-info.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/package-info.java
new file mode 100644
index 0000000..8c0e6a0
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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 interfaces.
+ */
+package org.onosproject.odtn;