2 * Copyright © 2019 Orange, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.transportpce.tapi.topology;
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.HashMap;
14 import java.util.List;
16 import java.util.UUID;
17 import java.util.stream.Collectors;
18 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1;
19 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPools;
20 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Link1;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
28 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
29 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
30 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
32 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
33 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
34 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
35 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePoint;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointBuilder;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkBuilder;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
65 import org.slf4j.Logger;
66 import org.slf4j.LoggerFactory;
68 public class ConvertORTopoObjectToTapiTopoObject {
70 private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoObjectToTapiTopoObject.class);
71 private String ietfNodeId;
72 private List<TerminationPoint> oorClientPortList;
73 private List<TerminationPoint> oorNetworkPortList;
74 private OduSwitchingPools oorOduSwitchingPool;
75 private Uuid tapiTopoUuid;
76 private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes;
77 private List<Link> tapiLinks;
78 private Map<String, Uuid> uuidMap;
80 public ConvertORTopoObjectToTapiTopoObject(Node ietfNode, Link1 otnLink, Uuid tapiTopoUuid) {
81 this.ietfNodeId = ietfNode.getNodeId().getValue();
82 this.oorClientPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
83 .network.topology.rev180226.Node1.class).getTerminationPoint().stream()
84 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
85 == OpenroadmTpType.XPONDERCLIENT.getIntValue())
86 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
87 .collect(Collectors.toList());
88 this.oorNetworkPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
89 .network.topology.rev180226.Node1.class).getTerminationPoint().stream()
90 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
91 == OpenroadmTpType.XPONDERNETWORK.getIntValue())
92 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
93 .collect(Collectors.toList());
94 this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools().get(0);
95 this.tapiTopoUuid = tapiTopoUuid;
96 this.tapiNodes = new ArrayList<>();
97 this.tapiLinks = new ArrayList<>();
98 this.uuidMap = new HashMap<>();
102 public void convertNode() {
103 //node creation [DSR/ODU]
104 LOG.info("creation of a DSR/ODU node");
105 Uuid nodeUuid = new Uuid(UUID.randomUUID().toString());
106 this.uuidMap.put(this.ietfNodeId + "+DSR", nodeUuid);
107 List<Name> dsrNodeNames = Arrays.asList(new NameBuilder().setValueName("dsr/odu node name")
108 .setValue(this.ietfNodeId).build());
109 List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
110 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
111 .Node dsrNode = createTapiNode(dsrNodeNames, dsrLayerProtocols);
112 tapiNodes.add(dsrNode);
114 //node creation [otsi]
115 LOG.info("creation of an OTSi node");
116 nodeUuid = new Uuid(UUID.randomUUID().toString());
117 this.uuidMap.put(this.ietfNodeId + "+OTSi", nodeUuid);
118 List<Name> otsiNodeNames = Arrays.asList(new NameBuilder().setValueName("otsi node name")
119 .setValue(this.ietfNodeId).build());
120 List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
121 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
122 .Node otsiNode = createTapiNode(otsiNodeNames, otsiLayerProtocols);
123 tapiNodes.add(otsiNode);
125 //transitional link cration between network nep of DSR/ODU node and iNep of otsi node
126 LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
127 createTapiTransitionalLinks();
130 private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
131 .Node createTapiNode(List<Name> nodeNames, List<LayerProtocolName> layerProtocols) {
132 Uuid nodeUuid = null;
133 List<OwnedNodeEdgePoint> onepl = new ArrayList<>();
134 List<NodeRuleGroup> nodeRuleGroupList = new ArrayList<>();
135 List<Rule> ruleList = new ArrayList<>();
136 Rule rule = new RuleBuilder()
137 .setLocalId("forward")
138 .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
139 .setRuleType(RuleType.FORWARDING)
142 if (layerProtocols.contains(LayerProtocolName.DSR)) {
143 nodeUuid = this.uuidMap.get(this.ietfNodeId + "+DSR");
144 // client nep creation on DSR/ODU node
145 for (int i = 0; i < oorClientPortList.size(); i++) {
146 Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
147 this.uuidMap.put("DSR+" + oorClientPortList.get(i).getTpId().getValue(), nepUuid);
148 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_C")
149 .append(i + 1).toString()).setValue(oorClientPortList.get(i).getTpId().getValue()).build());
150 OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), onedNames, LayerProtocolName.ETH,
151 LayerProtocolName.DSR, true, "DSR+");
154 // network nep creation on DSR/ODU node
155 for (int i = 0; i < oorNetworkPortList.size(); i++) {
156 Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
157 this.uuidMap.put("DSR+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid);
158 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_N")
159 .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
160 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames, LayerProtocolName.ODU,
161 LayerProtocolName.DSR, true, "DSR+");
164 // create NodeRuleGroup
165 for (NonBlockingList nbl : this.oorOduSwitchingPool.getNonBlockingList()) {
166 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
167 .NodeEdgePoint> nepList = new ArrayList<>();
168 for (TpId tp : nbl.getTpList()) {
169 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
170 .NodeEdgePoint nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology
171 .rev181210.node.rule.group.NodeEdgePointBuilder()
172 .setTopologyUuid(tapiTopoUuid)
173 .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+DSR"))
174 .setNodeEdgePointUuid(this.uuidMap.get("DSR+" + tp.getValue()))
178 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
179 .setUuid(new Uuid(UUID.randomUUID().toString()))
181 .setNodeEdgePoint(nepList)
183 nodeRuleGroupList.add(nodeRuleGroup);
185 } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
186 nodeUuid = this.uuidMap.get(this.ietfNodeId + "+OTSi");
187 // iNep creation on otsi node
188 for (int i = 0; i < oorNetworkPortList.size(); i++) {
189 Uuid nepUuid1 = new Uuid(UUID.randomUUID().toString());
190 this.uuidMap.put("iOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid1);
191 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("iNodeEdgePoint_")
192 .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
193 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
194 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "iOTSi+");
197 // eNep creation on otsi node
198 for (int i = 0; i < oorNetworkPortList.size(); i++) {
199 Uuid nepUuid2 = new Uuid(UUID.randomUUID().toString());
200 this.uuidMap.put("eOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid2);
201 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("eNodeEdgePoint_")
202 .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
203 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
204 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "eOTSi+");
207 // create NodeRuleGroup
208 for (TerminationPoint tp : this.oorNetworkPortList) {
209 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
210 .NodeEdgePoint> nepList = new ArrayList<>();
211 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
212 .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
213 .node.rule.group.NodeEdgePointBuilder()
214 .setTopologyUuid(tapiTopoUuid)
215 .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
216 .setNodeEdgePointUuid(this.uuidMap.get("iOTSi+" + tp.getTpId().getValue()))
218 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
219 .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
220 .node.rule.group.NodeEdgePointBuilder()
221 .setTopologyUuid(tapiTopoUuid)
222 .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
223 .setNodeEdgePointUuid(this.uuidMap.get("eOTSi+" + tp.getTpId().getValue()))
227 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
228 .setUuid(new Uuid(UUID.randomUUID().toString()))
230 .setNodeEdgePoint(nepList)
232 nodeRuleGroupList.add(nodeRuleGroup);
235 LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(0).getValueName(), nodeNames.get(0)
240 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node tapiNode =
244 .setLayerProtocolName(layerProtocols)
245 .setAdministrativeState(AdministrativeState.UNLOCKED)
246 .setOperationalState(OperationalState.ENABLED)
247 .setLifecycleState(LifecycleState.INSTALLED)
248 .setOwnedNodeEdgePoint(onepl)
249 .setNodeRuleGroup(nodeRuleGroupList)
254 private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, List<Name> nepNames, LayerProtocolName nepProtocol,
255 LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
256 String key = keyword + oorTp.getTpId().getValue();
257 OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
258 .setUuid(this.uuidMap.get(key))
259 .setLayerProtocolName(nepProtocol)
262 onepBldr.setMappedServiceInterfacePoint(createSIP(1));
264 onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol));
265 onepBldr.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
266 .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
267 .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
268 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
269 return onepBldr.build();
272 private List<MappedServiceInterfacePoint> createSIP(int nb) {
273 List<MappedServiceInterfacePoint> msipl = new ArrayList<>();
274 for (int i = 0; i < nb; i++) {
275 MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
276 .setServiceInterfacePointUuid(new Uuid(UUID.randomUUID().toString())).build();
282 private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedCepLayerProtocolQualifier(TerminationPoint tp,
283 LayerProtocolName lpn) {
284 List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
285 List<SupportedInterfaceCapability> sicList = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm
286 .otn.network.topology.rev181130.TerminationPoint1.class).getTpSupportedInterfaces()
287 .getSupportedInterfaceCapability();
288 for (SupportedInterfaceCapability sic : sicList) {
289 switch (lpn.getName()) {
291 if (sic.getIfCapType().getSimpleName().equals("If10GEODU2e")) {
292 sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
293 sclpqList.add(ODUTYPEODU2E.class);
294 } else if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
295 sclpqList.add(ODUTYPEODU4.class);
296 } else if (sic.getIfCapType().getSimpleName().equals("If100GEODU4")) {
297 sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
298 sclpqList.add(ODUTYPEODU4.class);
301 case "PHOTONIC_MEDIA" :
302 if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
303 sclpqList.add(PHOTONICLAYERQUALIFIEROTSi.class);
304 sclpqList.add(PHOTONICLAYERQUALIFIEROMS.class);
308 LOG.error("Layer Protocol Name is unknown");
315 private void createTapiTransitionalLinks() {
316 for (TerminationPoint tp : this.oorNetworkPortList) {
317 List<NodeEdgePoint> nepList = new ArrayList<>();
318 String sourceKey = "DSR+" + tp.getTpId().getValue();
319 Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
320 String destKey = "iOTSi+" + tp.getTpId().getValue();
321 Uuid destUuidTp = this.uuidMap.get(destKey);
322 NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
323 .setTopologyUuid(this.tapiTopoUuid)
324 .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+DSR"))
325 .setNodeEdgePointUuid(sourceUuidTp)
327 nepList.add(sourceNep);
328 NodeEdgePoint destNep = new NodeEdgePointBuilder()
329 .setTopologyUuid(this.tapiTopoUuid)
330 .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
331 .setNodeEdgePointUuid(destUuidTp)
333 nepList.add(destNep);
334 LinkBuilder transiLinkBldr = new LinkBuilder()
335 .setUuid(new Uuid(UUID.randomUUID().toString()))
336 .setTransitionedLayerProtocolName(Arrays.asList(LayerProtocolName.ODU.getName(),
337 LayerProtocolName.PHOTONICMEDIA.getName()))
338 .setNodeEdgePoint(nepList)
339 .setDirection(ForwardingDirection.BIDIRECTIONAL)
340 .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
341 new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(new BigInteger("100")).build()).build());
342 this.tapiLinks.add(transiLinkBldr.build());
346 public List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> getTapiNodes() {
350 public List<Link> getTapiLinks() {