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 new file mode 100644 index 0000000000..aa8e553c8b --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java @@ -0,0 +1,27 @@ +/* + * 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.tapicommon.rev20180307.tapicommon.Uuid; + +public class DcsBasedTapiNepRef extends TapiNepRef { + + public DcsBasedTapiNepRef(Uuid topologyId, Uuid nodeId, Uuid nepId) { + super(topologyId.toString(), nodeId.toString(), nepId.toString()); + } + +} 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 new file mode 100644 index 0000000000..5e3c79b33c --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java @@ -0,0 +1,26 @@ +/* + * 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.tapicommon.rev20180307.tapicommon.Uuid; + +public class DcsBasedTapiNodeRef extends TapiNodeRef { + + public DcsBasedTapiNodeRef(Uuid topologyId, Uuid nodeId) { + super(topologyId.toString(), nodeId.toString()); + } +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextBuilder.java new file mode 100644 index 0000000000..2d24dc4d20 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextBuilder.java @@ -0,0 +1,55 @@ +/* + * 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.tapicommon.rev20180307.tapicommon.DefaultContext; +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid; +import org.onosproject.yang.model.ModelObject; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ModelObjectId; + +/** + * Utility builder class for TAPI context creation with DCS. + */ +public final class TapiContextBuilder extends TapiInstanceBuilder { + + private DefaultContext context; + + private TapiContextBuilder(DefaultContext context) { + this.context = context; + } + + public static TapiContextBuilder builder(DefaultContext context) { + return new TapiContextBuilder(context); + } + + @Override + public ModelObjectData build() { + ModelObjectId objId = ModelObjectId.builder().build(); + return getModelObjectData(context, objId); + } + + @Override + public ModelObject getModelObject() { + return context; + } + + @Override + public Uuid getUuid() { + return null; + } +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java new file mode 100644 index 0000000000..834c9275f7 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java @@ -0,0 +1,111 @@ +/* + * 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.tapicommon.rev20180307.tapicommon.Uuid; +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.DefaultName; +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name; +import org.onosproject.yang.model.ModelObject; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import org.slf4j.Logger; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Utility methods dealing with TAPI modelObject which includes global class grouping. + * + *

tapi-common@2018-03-07.yang + * grouping global-class { + * leaf uuid { + * type uuid; + * } + * list name { + * key 'value-name'; + * uses name-and-value; + * } + * } + * + * grouping name-and-value { + * leaf value-name { + * type string; + * description "The name of the value. The value need not have a name."; + * } + * leaf value { + * type string; + * description "The value"; + * } + * description "A scoped name-value pair"; + * } + *

+ */ +public final class TapiGlobalClassUtil { + + private static final Logger log = getLogger(TapiGlobalClassUtil.class); + + private TapiGlobalClassUtil() { + } + + /** + * Generate and set Uuid for the ModelObject. + * @param obj ModelObject + * @param type of ModelObject + * @return generated uuid + */ + public static Uuid setUuid(T obj) { + Uuid uuid = Uuid.of(UUID.randomUUID().toString()); + + @SuppressWarnings("unchecked") + Class cls = (Class) obj.getClass(); + try { + Method method = cls.getMethod("uuid", Uuid.class); + method.invoke(obj, uuid); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + log.error("Exception thrown", e); + } + + return uuid; + } + + /** + * Add key-value to the ModelObject as "name-and-value" list. + * @param obj ModelObject + * @param kvs key-value map + * @param type of ModelObject + */ + public static void setNameList(T obj, Map kvs) { + + @SuppressWarnings("unchecked") + Class cls = (Class) obj.getClass(); + try { + Method method = cls.getMethod("addToName", Name.class); + + for (Entry kv : kvs.entrySet()) { + DefaultName prop = new DefaultName(); + prop.valueName(kv.getKey()); + prop.value(kv.getValue()); + method.invoke(obj, prop); + } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + log.error("Exception thrown", e); + } + } +} \ No newline at end of file diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java new file mode 100644 index 0000000000..ecb07f1f9c --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java @@ -0,0 +1,59 @@ +/* + * 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.tapicommon.rev20180307.tapicommon.Uuid; +import org.onosproject.yang.model.DefaultModelObjectData; +import org.onosproject.yang.model.ModelObject; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ModelObjectId; + +/** + * Utility builder class for TAPI modelobject creation with DCS. + */ +public abstract class TapiInstanceBuilder { + + public static final String ONOS_CP = "onos-cp"; + + public static final String DEVICE_ID = "device_id"; + + /** + * Generate DCS modelObjectData. + * @return ModelObjectData to be built + */ + public abstract ModelObjectData build(); + + /** + * Get modelObject instance. + * @return ModelObject of build target + */ + public abstract ModelObject getModelObject(); + + /** + * Get modelObject uuid. + * @return Uuid of build target + */ + public abstract Uuid getUuid(); + + + ModelObjectData getModelObjectData(ModelObject obj, ModelObjectId objId) { + return DefaultModelObjectData.builder() + .addModelObject(obj) + .identifier(objId) + .build(); + } +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkBuilder.java new file mode 100644 index 0000000000..93fbe5bc21 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkBuilder.java @@ -0,0 +1,83 @@ +/* + * 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.tapicommon.rev20180307.tapicommon.DefaultContext; +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.link.DefaultNodeEdgePoint; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultLink; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys; +import org.onosproject.yang.model.ModelObject; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ModelObjectId; + +import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid; + +/** + * Utility builder class for TAPI link creation with DCS. + */ +public final class TapiLinkBuilder extends TapiInstanceBuilder { + + private Uuid topologyUuid; + private DefaultLink link = new DefaultLink(); + + private TapiLinkBuilder() { + setUuid(link); + } + + public static TapiLinkBuilder builder() { + return new TapiLinkBuilder(); + } + + public TapiLinkBuilder setTopologyUuid(Uuid topologyUuid) { + this.topologyUuid = topologyUuid; + return this; + } + + public TapiLinkBuilder setNep(TapiNepRef nepRef) { + DefaultNodeEdgePoint nep = new DefaultNodeEdgePoint(); + nep.topologyId(nepRef.getTopologyId()); + nep.nodeId(nepRef.getNodeId()); + nep.ownedNodeEdgePointId(nepRef.getNepId()); + link.addToNodeEdgePoint(nep); + return this; + } + + @Override + public ModelObjectData build() { + + TopologyKeys topologyKey = new TopologyKeys(); + topologyKey.uuid(topologyUuid); + ModelObjectId objId = ModelObjectId.builder() + .addChild(DefaultContext.class) + .addChild(DefaultTopology.class, topologyKey) + .build(); + return getModelObjectData(link, objId); + } + + @Override + public ModelObject getModelObject() { + return link; + } + + @Override + public Uuid getUuid() { + return link.uuid(); + } + +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepBuilder.java new file mode 100644 index 0000000000..3524d63a86 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepBuilder.java @@ -0,0 +1,118 @@ +/* + * 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 java.util.HashMap; +import java.util.Map; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.Port; + +import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setNameList; +import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid; + +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.node.DefaultOwnedNodeEdgePoint; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.nodeedgepoint.DefaultMappedServiceInterfacePoint; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.NodeKeys; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys; +import org.onosproject.yang.model.ModelObject; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ModelObjectId; + +/** + * Utility builder class for TAPI nep creation with DCS. + */ +public final class TapiNepBuilder extends TapiInstanceBuilder { + + private Uuid topologyUuid; + private Uuid nodeUuid; + private DefaultOwnedNodeEdgePoint nep = new DefaultOwnedNodeEdgePoint(); + private ConnectPoint cp; + private Map kvs = new HashMap<>(); + + private TapiNepBuilder() { + setUuid(nep); + } + + public static TapiNepBuilder builder() { + return new TapiNepBuilder(); + } + + public TapiNepBuilder setTopologyUuid(Uuid topologyUuid) { + this.topologyUuid = topologyUuid; + return this; + } + + public TapiNepBuilder setNodeUuid(Uuid nodeUuid) { + this.nodeUuid = nodeUuid; + return this; + } + + public TapiNepBuilder setPort(Port port) { + cp = new ConnectPoint(port.element().id(), port.number()); + kvs.put(ONOS_CP, cp.toString()); + return this; + } + + public TapiNepBuilder setConnectPoint(ConnectPoint cp) { + kvs.put(ONOS_CP, cp.toString()); + return this; + } + + public TapiNepBuilder setSip(Uuid sipUuid) { + DefaultMappedServiceInterfacePoint mappedSip = new DefaultMappedServiceInterfacePoint(); + mappedSip.serviceInterfacePointId(sipUuid); + nep.addToMappedServiceInterfacePoint(mappedSip); + return this; + } + + public ConnectPoint getConnectPoint() { + return cp; + } + + @Override + public ModelObject getModelObject() { + return nep; + } + + @Override + public Uuid getUuid() { + return nep.uuid(); + } + + @Override + public ModelObjectData build() { + setNameList(nep, kvs); + + TopologyKeys topologyKey = new TopologyKeys(); + topologyKey.uuid(topologyUuid); + + NodeKeys nodeKey = new NodeKeys(); + nodeKey.uuid(nodeUuid); + + ModelObjectId objId = ModelObjectId.builder() + .addChild(DefaultContext.class) + .addChild(DefaultTopology.class, topologyKey) + .addChild(DefaultNode.class, nodeKey) + .build(); + return getModelObjectData(nep, objId); + } + +} 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 new file mode 100644 index 0000000000..a28d53dba5 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java @@ -0,0 +1,99 @@ +/* + * 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 java.util.UUID; +import org.onosproject.net.ConnectPoint; + +import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Objects.equal; +import static java.util.Objects.hash; + +public class TapiNepRef { + + private final UUID topologyId; + private final UUID nodeId; + private final UUID nepId; + private UUID sipId; + private ConnectPoint cp; + + public String getTopologyId() { + return topologyId.toString(); + } + + public String getNodeId() { + return nodeId.toString(); + } + + public String getNepId() { + return nepId.toString(); + } + + public String getSipId() { + return sipId.toString(); + } + + public ConnectPoint getConnectPoint() { + return cp; + } + + public TapiNepRef setSipId(String sipId) { + this.sipId = UUID.fromString(sipId); + return this; + } + + public TapiNepRef setConnectPoint(ConnectPoint cp) { + this.cp = cp; + return this; + } + + public TapiNepRef(String topologyId, String nodeId, String nepId) { + this.topologyId = UUID.fromString(topologyId); + this.nodeId = UUID.fromString(nodeId); + this.nepId = UUID.fromString(nepId); + } + + public String toString() { + return toStringHelper(getClass()) +// .add("topologyId", topologyId) + .add("nodeId", nodeId) + .add("nepId", nepId) + .add("sipId", sipId) + .add("connectPoint", cp) + .toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TapiNepRef)) { + return false; + } + TapiNepRef that = (TapiNepRef) o; + return equal(topologyId, that.topologyId) && + equal(nodeId, that.nodeId) && + equal(nepId, that.nepId); + } + + @Override + public int hashCode() { + return hash(topologyId, nodeId, nepId); + } + +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeBuilder.java new file mode 100644 index 0000000000..868df722e7 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeBuilder.java @@ -0,0 +1,90 @@ +/* + * 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 java.util.HashMap; +import java.util.Map; +import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setNameList; +import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid; + +import org.onosproject.net.DeviceId; +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.node.OwnedNodeEdgePoint; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys; +import org.onosproject.yang.model.ModelObject; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ModelObjectId; + +/** + * Utility builder class for TAPI node creation with DCS. + */ +public final class TapiNodeBuilder extends TapiInstanceBuilder { + + private Uuid topologyUuid; + private DefaultNode node = new DefaultNode(); + private Map kvs = new HashMap<>(); + + private TapiNodeBuilder() { + setUuid(node); + } + + public static TapiNodeBuilder builder() { + return new TapiNodeBuilder(); + } + + public TapiNodeBuilder setTopologyUuid(Uuid topologyUuid) { + this.topologyUuid = topologyUuid; + return this; + } + + public TapiNodeBuilder setNep(OwnedNodeEdgePoint nep) { + node.addToOwnedNodeEdgePoint(nep); + return this; + } + + public TapiNodeBuilder setDeviceId(DeviceId deviceId) { + kvs.put(DEVICE_ID, deviceId.toString()); + return this; + } + + @Override + public ModelObject getModelObject() { + return node; + } + + @Override + public Uuid getUuid() { + return node.uuid(); + } + + @Override + public ModelObjectData build() { + setNameList(node, kvs); + + TopologyKeys topologyKey = new TopologyKeys(); + topologyKey.uuid(topologyUuid); + ModelObjectId objId = ModelObjectId.builder() + .addChild(DefaultContext.class) + .addChild(DefaultTopology.class, topologyKey) + .build(); + return getModelObjectData(node, objId); + } + +} 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 new file mode 100644 index 0000000000..0fd762b7f9 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java @@ -0,0 +1,75 @@ +/* + * 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 java.util.UUID; +import org.onosproject.net.DeviceId; + +import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Objects.equal; +import static java.util.Objects.hash; + +public class TapiNodeRef { + + private final UUID topologyId; + private final UUID nodeId; + private DeviceId deviceId; + + public String getNodeId() { + return nodeId.toString(); + } + + public DeviceId getDeviceId() { + return deviceId; + } + + public void setDeviceId(DeviceId deviceId) { + this.deviceId = deviceId; + } + + public TapiNodeRef(String topologyId, String nodeId) { + this.topologyId = UUID.fromString(topologyId); + this.nodeId = UUID.fromString(nodeId); + } + + public String toString() { + return toStringHelper(getClass()) +// .add("topologyId", topologyId) + .add("nodeId", nodeId) + .add("deviceId", deviceId) + .toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TapiNodeRef)) { + return false; + } + TapiNodeRef nodeRef = (TapiNodeRef) o; + return equal(topologyId, nodeRef.topologyId) && + equal(nodeId, nodeRef.nodeId); + } + + @Override + public int hashCode() { + return hash(topologyId, nodeId); + } + +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiResolver.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiResolver.java new file mode 100644 index 0000000000..6ec62ffe75 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiResolver.java @@ -0,0 +1,136 @@ +/* + * 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 java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.ElementId; +import org.slf4j.Logger; +import static org.slf4j.LoggerFactory.getLogger; + + +/** + * TAPI instance resolver. + * FIXME: This resolver should provide DCS read cache + */ +public class TapiResolver { + + private final Logger log = getLogger(getClass()); + + private List tapiNodeRefList = new ArrayList<>(); + private List tapiNepRefList = new ArrayList<>(); + + + /** + * Check existence of TAPI node associated with deviceId. + * @param deviceId search key + * @return boolean + */ + public boolean hasNodeRef(ElementId deviceId) { + return tapiNodeRefList.stream() + .anyMatch(node -> node.getDeviceId().equals(deviceId)); + } + + /** + * Check existence of TAPI nep associated with ConnectPoint. + * @param cp search key + * @return TapiNepRef + */ + public boolean hasNepRef(ConnectPoint cp) { + return tapiNepRefList.stream() + .anyMatch(nep -> nep.getConnectPoint().equals(cp)); + } + + /** + * Check existence of TAPI nep associated with TAPI sipId. + * @param sipId search key + * @return TapiNepRef + */ + public boolean hasNepRef(String sipId) { + return tapiNepRefList.stream() + .anyMatch(nep -> nep.getSipId().equals(sipId)); + } + + /** + * Resolve TAPI node associated with deviceId. + * @param deviceId search key + * @return TapiNodeRef + */ + public TapiNodeRef getNodeRef(ElementId deviceId) { + TapiNodeRef ret = null; + try { + ret = tapiNodeRefList.stream() + .filter(node -> node.getDeviceId().equals(deviceId)) + .findFirst().get(); + } catch (NoSuchElementException e) { + log.error("Node not found associated with {}", deviceId); + throw e; + } + return ret; + } + + /** + * Resolve TAPI nep associated with ConnectPoint. + * @param cp search key + * @return TapiNepRef + */ + public TapiNepRef getNepRef(ConnectPoint cp) { + TapiNepRef ret = null; + try { + ret = tapiNepRefList.stream() + .filter(nep -> nep.getConnectPoint().equals(cp)) + .findFirst().get(); + } catch (NoSuchElementException e) { + log.error("Nep not found associated with {}", cp); + throw e; + } + return ret; + } + + /** + * Resolve TAPI nep associated with TAPI sipId. + * @param sipId search key + * @return TapiNepRef + */ + public TapiNepRef getNepRef(String sipId) { + TapiNepRef ret = null; + try { + ret = tapiNepRefList.stream() + .filter(nep -> nep.getSipId().equals(sipId)) + .findFirst().get(); + } catch (NoSuchElementException e) { + log.error("Nep not found associated with {}", sipId); + throw e; + } + return ret; + } + + public TapiResolver addNodeRef(TapiNodeRef nodeRef) { + tapiNodeRefList.add(nodeRef); + log.info("Nodes: {}", tapiNodeRefList); + return this; + } + + public TapiResolver addNepRef(TapiNepRef nepRef) { + tapiNepRefList.add(nepRef); + log.info("Neps: {}", tapiNepRefList); + return this; + } + +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipBuilder.java new file mode 100644 index 0000000000..a12a425506 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipBuilder.java @@ -0,0 +1,91 @@ +/* + * 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 java.util.HashMap; +import java.util.Map; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.Port; + +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext; +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.LayerProtocolName; +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid; + +import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setNameList; +import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid; +import static org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.layerprotocolname.LayerProtocolNameEnum.DSR; +import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.tapicontext.DefaultServiceInterfacePoint; +import org.onosproject.yang.model.ModelObject; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ModelObjectId; + +/** + * Utility builder class for TAPI sip creation with DCS. + */ +public final class TapiSipBuilder extends TapiInstanceBuilder { + + private DefaultServiceInterfacePoint sip = new DefaultServiceInterfacePoint(); + private Map kvs = new HashMap<>(); + + private TapiSipBuilder() { + setUuid(sip); + } + + public static TapiSipBuilder builder() { + return new TapiSipBuilder(); + } + + /** + * Check this builder dealing with port for SIP or not. + * @param port onos port + * @return Is this builder for SIP or not + */ + public static boolean isSip(Port port) { + // FIXME modify this method to appropriate way + ConnectPoint cp = new ConnectPoint(port.element().id(), port.number()); + return cp.toString().contains("TRANSCEIVER"); + } + + public TapiSipBuilder setPort(Port port) { + if (!isSip(port)) { + throw new IllegalStateException("Not allowed to use this port as SIP."); + } + ConnectPoint cp = new ConnectPoint(port.element().id(), port.number()); + kvs.put(ONOS_CP, cp.toString()); + sip.addToLayerProtocolName(LayerProtocolName.of(DSR)); + return this; + } + + @Override + public ModelObjectData build() { + setNameList(sip, kvs); + ModelObjectId objId = ModelObjectId.builder() + .addChild(DefaultContext.class) + .build(); + return getModelObjectData(sip, objId); + } + + @Override + public ModelObject getModelObject() { + return sip; + } + + @Override + public Uuid getUuid() { + return sip.uuid(); + } +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyBuilder.java new file mode 100644 index 0000000000..82e83d7478 --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyBuilder.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 static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid; + +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.context.DefaultAugmentedTapiCommonContext; +import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology; +import org.onosproject.yang.model.ModelObject; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ModelObjectId; + +/** + * Utility builder class for TAPI topology creation with DCS. + */ +public final class TapiTopologyBuilder extends TapiInstanceBuilder { + + private DefaultTopology topology; + + private TapiTopologyBuilder(DefaultTopology topology) { + this.topology = topology; + setUuid(this.topology); + } + + public static TapiTopologyBuilder builder(DefaultTopology topology) { + return new TapiTopologyBuilder(topology); + } + + + @Override + public ModelObjectData build() { + + DefaultAugmentedTapiCommonContext topologyContext = new DefaultAugmentedTapiCommonContext(); + topologyContext.addToTopology(topology); + + ModelObjectId objId = ModelObjectId.builder().addChild(DefaultContext.class).build(); + return getModelObjectData(topologyContext, objId); + } + + @Override + public ModelObject getModelObject() { + return topology; + } + + @Override + public Uuid getUuid() { + return topology.uuid(); + } + +} diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java new file mode 100644 index 0000000000..8d71ec1cad --- /dev/null +++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/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. + */ + +/** + * Utilities to deal with onos-yang-tools TAPI objects. + */ +package org.onosproject.odtn.utils.tapi; \ No newline at end of file diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/tapi/TapiResolverTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/tapi/TapiResolverTest.java new file mode 100644 index 0000000000..0d420d87fd --- /dev/null +++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/tapi/TapiResolverTest.java @@ -0,0 +1,116 @@ +/* + * 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 java.util.NoSuchElementException; +import org.junit.Before; +import org.junit.Test; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.DeviceId; +import org.onosproject.net.PortNumber; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.*; + +public class TapiResolverTest { + + private TapiResolver tapiResolver; + + private TapiNodeRef nodeRef; + private TapiNepRef nepRef; + private DeviceId deviceId; + private ConnectPoint cp; + private String sipId; + + private DeviceId dummyDeviceId; + private Integer dummyPort; + private ConnectPoint dummyCp; + private String dummySipId; + + + @Before + public void setUp() { + nodeRef = new TapiNodeRef( + "49e2ac46-3975-44b4-b84f-8fab28222a39", + "5638e8e6-ac17-40d9-86e4-7c1febab6f1a"); + nepRef = new TapiNepRef( + "59e2ac46-3975-44b4-b84f-8fab28222a39", + "6638e8e6-ac17-40d9-86e4-7c1febab6f1a", + "cd673055-e2b2-4f67-88c8-adfae96385bc"); + deviceId = DeviceId.deviceId("netconf:172.24.3.5:11011"); + cp = new ConnectPoint(deviceId, PortNumber.portNumber("42")); + sipId = "01c39723-7c0d-4754-8d64-fd9ff412404c"; + nodeRef.setDeviceId(deviceId); + nepRef.setConnectPoint(cp).setSipId(sipId); + + dummyDeviceId = DeviceId.deviceId("dummy"); + dummyPort = 4; + dummyCp = new ConnectPoint(dummyDeviceId, PortNumber.portNumber(dummyPort)); + dummySipId = "00000000-0000-0000-0000-000000000000"; + + tapiResolver = new TapiResolver(); + } + + @Test + public void testGetNodeRef() { + assertThat(nodeRef, is(tapiResolver.addNodeRef(nodeRef).getNodeRef(deviceId))); + } + + @Test + public void testGetNepRefWithConnectPoint() { + assertThat(nepRef, is(tapiResolver.addNepRef(nepRef).getNepRef(cp))); + } + + @Test + public void testGetNepRefWithSipId() { + assertThat(nepRef, is(tapiResolver.addNepRef(nepRef).getNepRef(sipId))); + } + + @Test(expected = NoSuchElementException.class) + public void testGetNodeRefWhenEmpty() { + tapiResolver.getNodeRef(deviceId); + } + + @Test(expected = NoSuchElementException.class) + public void testGetNepRefWithConnectPointWhenEmpty() { + tapiResolver.getNepRef(cp); + } + + @Test(expected = NoSuchElementException.class) + public void testGetNepRefWithSipIdWhenEmpty() { + tapiResolver.getNepRef(cp); + } + + @Test(expected = NoSuchElementException.class) + public void testGetNodeRefNotExist() { + tapiResolver.addNodeRef(nodeRef); + tapiResolver.getNodeRef(dummyDeviceId); + } + + @Test(expected = NoSuchElementException.class) + public void testGetNepRefWithConnectPointNotExist() { + tapiResolver.addNepRef(nepRef); + tapiResolver.getNepRef(dummyCp); + } + + @Test(expected = NoSuchElementException.class) + public void testGetNepRefWithSipIdNotExist() { + tapiResolver.addNepRef(nepRef); + tapiResolver.getNepRef(dummySipId); + } + +} \ No newline at end of file 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 b52afbfa91..60cc41a84e 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 @@ -27,7 +27,6 @@ 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.Device; import org.onosproject.net.Link; import org.onosproject.net.config.NetworkConfigService; import org.onosproject.net.device.DeviceEvent; @@ -40,15 +39,6 @@ import org.onosproject.odtn.internal.TapiTopologyManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.onosproject.config.DynamicConfigListener; -import org.onosproject.config.DynamicConfigService; -import org.onosproject.config.DynamicConfigEvent; -import org.onosproject.config.Filter; -import org.onosproject.config.FailedException; -import static org.onosproject.config.DynamicConfigEvent.Type.NODE_ADDED; -import static org.onosproject.config.DynamicConfigEvent.Type.NODE_DELETED; - -// import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180216.TapiConnectivity; import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.TapiConnectivityService; import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307. @@ -62,7 +52,6 @@ import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307. // onos-yang-tools import org.onosproject.yang.model.DataNode; -import org.onosproject.yang.model.NodeKey; import org.onosproject.yang.model.ResourceData; import org.onosproject.yang.model.DefaultResourceData; import org.onosproject.yang.model.ModelObject; @@ -70,7 +59,6 @@ import org.onosproject.yang.model.ModelObjectData; import org.onosproject.yang.model.ModelConverter; import org.onosproject.yang.model.ResourceId; -import org.onosproject.yang.model.SchemaId; import org.onosproject.yang.model.RpcRegistry; import org.onosproject.yang.model.RpcService; @@ -87,8 +75,8 @@ public class ServiceApplicationComponent { private final Logger log = LoggerFactory.getLogger(getClass()); - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - protected DynamicConfigService dynConfigService; +// @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) +// protected DynamicConfigService dynConfigService; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected DeviceService deviceService; @@ -115,8 +103,8 @@ public class ServiceApplicationComponent { protected TapiTopologyManager tapiTopologyManager; // Listener for events from the DCS - private final DynamicConfigListener dynamicConfigServiceListener = - new InternalDynamicConfigListener(); +// private final DynamicConfigListener dynamicConfigServiceListener = +// new InternalDynamicConfigListener(); private DeviceListener deviceListener = new InternalDeviceListener(); private final LinkListener linkListener = new InternalLinkListener(); @@ -129,7 +117,7 @@ public class ServiceApplicationComponent { @Activate protected void activate() { log.info("Started"); - dynConfigService.addListener(dynamicConfigServiceListener); +// dynConfigService.addListener(dynamicConfigServiceListener); deviceService.addListener(deviceListener); linkService.addListener(linkListener); rpcRegistry.registerRpcService(rpcTapiConnectivity); @@ -140,9 +128,9 @@ public class ServiceApplicationComponent { protected void deactivate() { log.info("Stopped"); rpcRegistry.unregisterRpcService(rpcTapiConnectivity); - deviceService.removeListener(deviceListener); linkService.removeListener(linkListener); - dynConfigService.removeListener(dynamicConfigServiceListener); + deviceService.removeListener(deviceListener); +// dynConfigService.removeListener(dynamicConfigServiceListener); } @@ -158,20 +146,19 @@ public class ServiceApplicationComponent { */ @Override public void event(DeviceEvent event) { - Device device = event.subject(); switch (event.type()) { case DEVICE_ADDED: - tapiTopologyManager.addDevice(device); + tapiTopologyManager.addDevice(event.subject()); break; case DEVICE_REMOVED: - tapiTopologyManager.removeDevice(device); + tapiTopologyManager.removeDevice(event.subject()); break; case PORT_ADDED: - tapiTopologyManager.addPort(device); + tapiTopologyManager.addPort(event.port()); break; case PORT_REMOVED: - tapiTopologyManager.removePort(device); + tapiTopologyManager.removePort(event.port()); break; default: log.warn("Unknown Event", event.type()); @@ -209,100 +196,100 @@ public class ServiceApplicationComponent { } } - /** - * Representation of internal listener, listening for dynamic config event. - */ - private class InternalDynamicConfigListener implements DynamicConfigListener { - - /** - * Check if the DCS event should be further processed. - * - * @param event config event - * @return true if event is supported; false otherwise - */ - @Override - public boolean isRelevant(DynamicConfigEvent event) { - // Only care about add and delete - if ((event.type() != NODE_ADDED) && - (event.type() != NODE_DELETED)) { - return false; - } - return true; - } - - - /** - * Process an Event from the Dynamic Configuration Store. - * - * @param event config event - */ - @Override - public void event(DynamicConfigEvent event) { - 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(); - if (!schemaId.namespace().contains("tapi")) { - return; - } - - // Consolidate events +// /** +// * Representation of internal listener, listening for dynamic config event. +// */ +// private class InternalDynamicConfigListener implements DynamicConfigListener { +// +// /** +// * Check if the DCS event should be further processed. +// * +// * @param event config event +// * @return true if event is supported; false otherwise +// */ +// @Override +// public boolean isRelevant(DynamicConfigEvent event) { +// // Only care about add and delete +// if ((event.type() != NODE_ADDED) && +// (event.type() != NODE_DELETED)) { +// return false; +// } +// return true; +// } +// +// +// /** +// * Process an Event from the Dynamic Configuration Store. +// * +// * @param event config event +// */ +// @Override +// public void event(DynamicConfigEvent event) { +// 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(); +// if (!schemaId.namespace().contains("tapi")) { +// return; +// } +// +// // Consolidate events // 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 { @@ -316,6 +303,7 @@ public class ServiceApplicationComponent { */ @Override public RpcOutput createConnectivityService(RpcInput inputVar) { + DataNode data = inputVar.data(); ResourceId rid = inputVar.id(); 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 272319c487..6da8cbf44b 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 @@ -16,24 +16,52 @@ package org.onosproject.odtn.internal; +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.apache.felix.scr.annotations.Service; +import org.onlab.util.XmlString; import org.onosproject.config.DynamicConfigService; import org.onosproject.config.FailedException; import org.onosproject.config.Filter; import org.onosproject.d.config.DeviceResourceIds; -import org.onosproject.d.config.ResourceIds; -import org.onosproject.net.Device; -import org.onosproject.net.Link; -import org.onosproject.yang.model.DataNode; -import org.onosproject.yang.model.InnerNode; -import org.slf4j.Logger; import static org.onosproject.d.config.DeviceResourceIds.DCS_NAMESPACE; + +import org.onosproject.d.config.ResourceIds; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.Device; +import org.onosproject.net.DeviceId; +import org.onosproject.net.Link; +import org.onosproject.net.Port; + +import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence; +import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData; +import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream; + +import org.onosproject.odtn.utils.tapi.TapiLinkBuilder; +import org.onosproject.odtn.utils.tapi.TapiNepRef; +import org.onosproject.odtn.utils.tapi.TapiNodeRef; +import org.onosproject.odtn.utils.tapi.TapiResolver; +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.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; +import org.onosproject.yang.model.DataNode; +import org.onosproject.yang.model.InnerNode; +import org.onosproject.yang.model.ModelConverter; +import org.onosproject.yang.model.ModelObjectData; +import org.onosproject.yang.model.ResourceData; +import org.onosproject.yang.model.ResourceId; +import org.slf4j.Logger; + import static org.slf4j.LoggerFactory.getLogger; /** @@ -48,9 +76,19 @@ public class DcsBasedTapiTopologyManager implements TapiTopologyManager { @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected DynamicConfigService dcs; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected ModelConverter modelConverter; + + private DefaultContext context = new DefaultContext(); + private DefaultTopology topology = new DefaultTopology(); + + private TapiResolver tapiResolver = new TapiResolver(); + @Activate public void activate() { initDcsIfRootNotExist(); + initDcsTapiContext(); + initDcsTapiTopology(); log.info("Started"); } @@ -62,6 +100,18 @@ public class DcsBasedTapiTopologyManager implements TapiTopologyManager { @Override public void addDevice(Device device) { log.info("Add device: {}", device); + DeviceId deviceId = device.id(); + if (tapiResolver.hasNodeRef(deviceId)) { + return; + } + TapiNodeBuilder builder = TapiNodeBuilder.builder() + .setTopologyUuid(topology.uuid()) + .setDeviceId(deviceId); + addModelObjectDataToDcs(builder.build()); + + TapiNodeRef nodeRef = new TapiNodeRef(topology.uuid().toString(), builder.getUuid().toString()); + nodeRef.setDeviceId(deviceId); + tapiResolver.addNodeRef(nodeRef); } @Override @@ -72,6 +122,22 @@ public class DcsBasedTapiTopologyManager implements TapiTopologyManager { @Override public void addLink(Link link) { log.info("Add link: {}", link); + + // validation check + + // src nep + addNep(link.src()); + addNep(link.dst()); + + // link + TapiNepRef srcNepRef = tapiResolver.getNepRef(link.src()); + TapiNepRef dstNepRef = tapiResolver.getNepRef(link.dst()); + + TapiLinkBuilder linkBuilder = TapiLinkBuilder.builder() + .setTopologyUuid(topology.uuid()) + .setNep(srcNepRef) + .setNep(dstNepRef); + addModelObjectDataToDcs(linkBuilder.build()); } @Override @@ -80,13 +146,94 @@ public class DcsBasedTapiTopologyManager implements TapiTopologyManager { } @Override - public void addPort(Device device) { - log.info("Add port: {}", device); + public void addPort(Port port) { + log.info("Add port: {}", port); + if (tapiResolver.hasNepRef(new ConnectPoint(port.element().id(), port.number()))) { + return; + } + + TapiNodeRef nodeRef = tapiResolver.getNodeRef(port.element().id()); + String nodeId = nodeRef.getNodeId(); + + // nep + TapiNepBuilder nepBuilder = TapiNepBuilder.builder() + .setPort(port) + .setTopologyUuid(topology.uuid()) + .setNodeUuid(Uuid.fromString(nodeId)); + + TapiNepRef nepRef = new TapiNepRef(topology.uuid().toString(), nodeId, nepBuilder.getUuid().toString()); + nepRef.setConnectPoint(nepBuilder.getConnectPoint()); + + // sip + if (TapiSipBuilder.isSip(port)) { + TapiSipBuilder sipBuilder = TapiSipBuilder.builder().setPort(port); + nepBuilder.setSip(sipBuilder.getUuid()); + nepRef.setSipId(sipBuilder.getUuid().toString()); + + addModelObjectDataToDcs(sipBuilder.build()); + } + + addModelObjectDataToDcs(nepBuilder.build()); + tapiResolver.addNepRef(nepRef); } @Override - public void removePort(Device device) { - log.info("Remove port: {}", device); + public void removePort(Port port) { + log.info("Remove port: {}", port); + } + + private void addNep(ConnectPoint cp) { + + log.info("device Id: {}", cp.deviceId()); + TapiNodeRef nodeRef = tapiResolver.getNodeRef(cp.deviceId()); + String nodeId = nodeRef.getNodeId(); + + TapiNepBuilder nepBuilder = TapiNepBuilder.builder() + .setConnectPoint(cp) + .setTopologyUuid(topology.uuid()) + .setNodeUuid(Uuid.fromString(nodeId)); + TapiNepRef nepRef = new TapiNepRef(topology.uuid().toString(), nodeId, nepBuilder.getUuid().toString()); + nepRef.setConnectPoint(cp); + + addModelObjectDataToDcs(nepBuilder.build()); + tapiResolver.addNepRef(nepRef); + } + + private void initDcsTapiContext() { + TapiContextBuilder builder = TapiContextBuilder.builder(context); + addModelObjectDataToDcs(builder.build()); + } + + private void initDcsTapiTopology() { + TapiTopologyBuilder builder = TapiTopologyBuilder.builder(topology); + addModelObjectDataToDcs(builder.build()); + } + + // FIXME: move DCS-related methods to DCS + + private void addModelObjectDataToDcs(ModelObjectData input) { + + ResourceData rnode = modelConverter.createDataNode(input); + + // for debug + CharSequence strNode = toCharSequence(toXmlCompositeStream(toCompositeData(rnode))); + log.info("XML:\n{}", XmlString.prettifyXml(strNode)); + + addResourceDataToDcs(rnode); + } + + private void addResourceDataToDcs(ResourceData input) { + addResourceDataToDcs(input, input.resourceId()); + } + + private void addResourceDataToDcs(ResourceData input, ResourceId rid) { + if (input == null || input.dataNodes() == null) { + return; + } + List dataNodes = input.dataNodes(); + for (DataNode node : dataNodes) { + dcs.createNode(rid, node); + } } private void initDcsIfRootNotExist() { @@ -116,4 +263,5 @@ public class DcsBasedTapiTopologyManager implements TapiTopologyManager { log.info("'root' was created without error, but still not there. WTF!"); } } + } 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/internal/TapiTopologyManager.java index d997b4533a..0f02c639cb 100644 --- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java +++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java @@ -18,18 +18,46 @@ package org.onosproject.odtn.internal; import org.onosproject.net.Device; import org.onosproject.net.Link; +import org.onosproject.net.Port; +/** + * ODTN Tapi manager application interface. + */ public interface TapiTopologyManager { + /** + * 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); - void addPort(Device device); + /** + * PORT_ADDED event handler. + * @param port port to be added + */ + void addPort(Port port); - void removePort(Device device); + /** + * PORT_REMOVED event handler. + * @param port port to be removed + */ + void removePort(Port port); } diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/OpenConfigDeviceDiscovery.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/OpenConfigDeviceDiscovery.java index 1c2e599145..ba9864188f 100644 --- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/OpenConfigDeviceDiscovery.java +++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/OpenConfigDeviceDiscovery.java @@ -174,6 +174,16 @@ public class OpenConfigDeviceDiscovery switch (type) { case "oc-platform-types:PORT": + case "oc-opt-types:OPTICAL_CHANNEL": + // TODO assign appropriate port type & annotations at some point + // for now we just need a Port with annotations + builder.type(Type.OCH); + + // Just a heuristics to deal with simple transponder + // if the device declare odtn-connection-id, just use them + // if not assign same value to relevant ports types + props.putIfAbsent(CONNECTION_ID, "the-only-one"); + break; case "oc-platform-types:TRANSCEIVER": //case "oc-opt-types:OPTICAL_CHANNEL": // TODO assign appropriate port type & annotations at some point