mirror of
				https://github.com/opennetworkinglab/onos.git
				synced 2025-10-31 00:01:01 +01:00 
			
		
		
		
	Add Tapi Context/Topology/Node/Link builders and utility class
ONOS-7679 Change-Id: I85f856b11a5e272460b38c16ca46212fb4a0a082
This commit is contained in:
		
							parent
							
								
									45197709f3
								
							
						
					
					
						commit
						ec18d3a759
					
				| @ -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()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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()); | ||||
|     } | ||||
| } | ||||
| @ -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; | ||||
|     } | ||||
| } | ||||
| @ -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. | ||||
|  * | ||||
|  * <p> 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"; | ||||
|  * } | ||||
|  * </p> | ||||
|  */ | ||||
| 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 <T> type of ModelObject | ||||
|      * @return generated uuid | ||||
|      */ | ||||
|     public static <T extends ModelObject> Uuid setUuid(T obj) { | ||||
|         Uuid uuid = Uuid.of(UUID.randomUUID().toString()); | ||||
| 
 | ||||
|         @SuppressWarnings("unchecked") | ||||
|         Class<T> cls = (Class<T>) 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 <T> type of ModelObject | ||||
|      */ | ||||
|     public static <T extends ModelObject> void setNameList(T obj, Map<String, String> kvs) { | ||||
| 
 | ||||
|         @SuppressWarnings("unchecked") | ||||
|         Class<T> cls = (Class<T>) obj.getClass(); | ||||
|         try { | ||||
|             Method method = cls.getMethod("addToName", Name.class); | ||||
| 
 | ||||
|             for (Entry<String, String> 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -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(); | ||||
|     } | ||||
| } | ||||
| @ -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(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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<String, String> 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); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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<String, String> 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); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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<TapiNodeRef> tapiNodeRefList = new ArrayList<>(); | ||||
|     private List<TapiNepRef> 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; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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<String, String> 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(); | ||||
|     } | ||||
| } | ||||
| @ -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(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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; | ||||
| @ -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); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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(); | ||||
| 
 | ||||
|  | ||||
| @ -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<DataNode> 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!"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user