Do not instantiate JsonParser
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / util / OpenRoadmOtnTopology.java
1 /*
2  * Copyright © 2020 Orange. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.transportpce.networkmodel.util;
10
11 import com.google.common.collect.ImmutableMap;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.stream.Collectors;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.transportpce.common.NetworkUtils;
19 import org.opendaylight.transportpce.networkmodel.dto.OtnTopoNode;
20 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220114.mapping.Mapping;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220114.network.Nodes;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsKey;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTU4TsAllocated;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTUCnTs;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU0;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU2;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU2e;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OdtuTypeIdentity;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OduRateIdentity;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1Builder;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1Builder;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1Builder;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPoolsBuilder;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.TpBandwidthSharingBuilder;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.XpdrAttributesBuilder;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.SupportedIfCapability;
57 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
58 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPool;
59 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
60 import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPoint;
76 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointBuilder;
77 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointKey;
78 import org.opendaylight.yangtools.yang.common.Uint16;
79 import org.opendaylight.yangtools.yang.common.Uint32;
80 import org.slf4j.Logger;
81 import org.slf4j.LoggerFactory;
82
83 public final class OpenRoadmOtnTopology {
84
85     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmOtnTopology.class);
86     private static final String CLIENT = "-CLIENT";
87     private static final String NETWORK = "-NETWORK";
88     private static final String XPDR = "-XPDR";
89     private static final String OTN_PARAMS_ERROR = "Error with otn parameters of supported link {}";
90     private static final int NB_TRIB_PORTS = 80;
91     private static final int NB_TRIB_SLOTS = 80;
92
93     private static Map<String, Class<? extends OduRateIdentity>> rateMap = Map.of(
94         "If100GEODU4", ODU4.class,
95         "IfOCHOTU4ODU4", ODU4.class,
96         "If1GEODU0", ODU0.class,
97         "If10GEODU2", ODU2.class,
98         "If10GEODU2e", ODU2e.class);
99     private static Map<OtnLinkType, Long> otnLinkTypeBwMap = Map.of(
100         OtnLinkType.ODTU4, 100000L,
101         OtnLinkType.ODUC4, 400000L,
102         OtnLinkType.ODUC3, 300000L,
103         OtnLinkType.ODUC2, 200000L);
104     private static Map<Uint32, Long> serviceRateBwIncrMap = Map.of(
105         Uint32.valueOf(1), 1000L,
106         Uint32.valueOf(10), 10000L,
107         Uint32.valueOf(100), 100000L);
108
109     private OpenRoadmOtnTopology() {
110     }
111
112     public static TopologyShard createTopologyShard(Nodes mappingNode) {
113         List<Node> nodes = new ArrayList<>();
114         List<Link> links = new ArrayList<>();
115         Map<Integer, OtnTopoNode> xpdrMap = convertPortMappingToOtnNodeList(mappingNode);
116         for (OtnTopoNode node : xpdrMap.values()) {
117             switch (node.getNodeType()) {
118                 case Tpdr:
119                     nodes.add(createTpdr(node));
120                     break;
121                 case Mpdr:
122                     nodes.add(createMuxpdr(node));
123                     break;
124                 case Switch:
125                     nodes.add(createSwitch(node));
126                     break;
127                 default:
128                     LOG.error("unknown otn node type {}", node.getNodeType().getName());
129                     return null;
130             }
131         }
132         return new TopologyShard(nodes, links);
133     }
134
135     public static TopologyShard createOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
136             OtnLinkType linkType) {
137
138         return new TopologyShard(
139             null,
140             OtnLinkType.OTU4.equals(linkType) || OtnLinkType.OTUC4.equals(linkType)
141                 ? initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType)
142                 : null);
143     }
144
145     public static TopologyShard createOtnLinks(
146             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
147                 .Link notifLink,
148             OtnLinkType linkType) {
149
150         return new TopologyShard(
151             null,
152             initialiseOtnLinks(notifLink.getATermination().getNodeId(),
153             notifLink.getATermination().getTpId(),
154             notifLink.getZTermination().getNodeId(),
155             notifLink.getZTermination().getTpId(),
156             linkType));
157     }
158
159     public static TopologyShard createOtnLinks(
160             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
161                 .Link notifLink,
162             List<Link> supportedOtu4links, List<TerminationPoint> supportedTPs, OtnLinkType linkType) {
163
164         List<Link> links;
165         switch (linkType) {
166             case OTU4:
167             case OTUC4:
168                 links = initialiseOtnLinks(
169                         notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
170                         notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType);
171                 return new TopologyShard(null, links);
172             case ODTU4:
173             case ODUC4:
174                 links = initialiseOtnLinks(
175                     notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
176                     notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType);
177                 links.addAll(updateOtnLinkBwParameters(supportedOtu4links, linkType));
178                 List<TerminationPoint> updatedTPs = new ArrayList<>();
179                 for (TerminationPoint tp : supportedTPs) {
180                     updatedTPs.add(updateTp(tp, true, linkType));
181                 }
182                 return new TopologyShard(null, links, updatedTPs);
183                 //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
184             default:
185                 return null;
186         }
187     }
188
189     public static TopologyShard createOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
190             OtnLinkType linkType) {
191
192         List<Link> links = new ArrayList<>();
193         for (Link link : suppOtuLinks) {
194             if (link.augmentation(Link1.class) == null) {
195                 LOG.error("Error with OTN parameters of supported link {}", link.getLinkId().getValue());
196                 continue;
197             }
198             if (!otnLinkTypeBwMap.containsKey(linkType)) {
199                 LOG.error("Error with link {} : unsupported OTN link type", link.getLinkId().getValue());
200                 continue;
201             }
202             if (!link.augmentation(Link1.class).getAvailableBandwidth()
203                     .equals(Uint32.valueOf(otnLinkTypeBwMap.get(linkType)))) {
204                     //TODO shouldn't it be < rather than !equals() here ?
205                 LOG.error("Error with link {} : unsufficient available bandwith", link.getLinkId().getValue());
206                 continue;
207             }
208             links.add(updateOtnLinkBwParameters(link, 0L, otnLinkTypeBwMap.get(linkType)));
209         }
210         if (links.size() == 2) {
211             links.addAll(initialiseOtnLinks(suppOtuLinks.get(0).getSource().getSourceNode().getValue(),
212                 suppOtuLinks.get(0).getSource().getSourceTp().getValue(),
213                 suppOtuLinks.get(0).getDestination().getDestNode().getValue(),
214                 suppOtuLinks.get(0).getDestination().getDestTp().getValue(),
215                 linkType));
216         }
217         List<TerminationPoint> tps = new ArrayList<>();
218         for (TerminationPoint tp : oldTps) {
219             tps.add(updateTp(tp, true, linkType));
220         }
221         return links.size() == 4 && tps.size() == 2
222             ?  new TopologyShard(null, links, tps)
223             :  new TopologyShard(null, null, null);
224     }
225
226     public static TopologyShard updateOtnLinks(List<Link> suppOduLinks, List<TerminationPoint> oldTps,
227             Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
228
229         List<Link> links = new ArrayList<>();
230         if (!serviceRateBwIncrMap.containsKey(serviceRate)) {
231             LOG.warn("Error with not managed service rate {}", serviceRate.toString());
232             return new TopologyShard(null, null, null);
233         }
234         Long bwIncr = serviceRateBwIncrMap.get(serviceRate);
235         for (Link link : suppOduLinks) {
236             if (link.augmentation(Link1.class) == null
237                     || link.augmentation(Link1.class).getAvailableBandwidth() == null
238                     || link.augmentation(Link1.class).getUsedBandwidth() == null) {
239                 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
240             } else {
241                 Uint32 avlBw = link.augmentation(Link1.class).getAvailableBandwidth();
242                 Uint32 usedBw = link.augmentation(Link1.class).getUsedBandwidth();
243                 if (avlBw.toJava() < bwIncr) {
244                     bwIncr = 0L;
245                 }
246                 links.add(
247                     isDeletion
248                         ? updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr, usedBw.toJava() - bwIncr)
249                         : updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr, usedBw.toJava() + bwIncr)
250                 );
251             }
252         }
253         List<TerminationPoint> tps = new ArrayList<>();
254         for (TerminationPoint tp : oldTps) {
255             if (bwIncr != 0) {
256             //TODO shouldn't it be 0L rather?
257                 tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, minTribSlotNb, maxTribSlotNb, isDeletion));
258             }
259         }
260         if (!links.isEmpty() && !tps.isEmpty()) {
261             return new TopologyShard(null, links, tps);
262         } else {
263             LOG.error("unable to update otn links");
264             return new TopologyShard(null, null, null);
265         }
266     }
267
268     public static TopologyShard updateOtnLinks(List<Link> suppOtuLinks, boolean isDeletion) {
269
270         List<Link> links = new ArrayList<>();
271         for (Link link : suppOtuLinks) {
272             if (link.augmentation(Link1.class) == null
273                 || link.augmentation(Link1.class).getAvailableBandwidth() == null
274                 || link.augmentation(Link1.class).getUsedBandwidth() == null) {
275                 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
276             } else {
277                 links.add(
278                     isDeletion
279                         ? updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0))
280                         : updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000))
281                 );
282             }
283         }
284         if (links.isEmpty()) {
285             LOG.error("unable to update otn links");
286             return new TopologyShard(null, null, null);
287         } else {
288             return new TopologyShard(null, links, null);
289         }
290     }
291
292     public static TopologyShard deleteOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
293             OtnLinkType linkType) {
294
295         List<Link> links = new ArrayList<>();
296         OtnLinkType otnLinkType = null;
297         for (Link link : suppOtuLinks) {
298             if (link.augmentation(Link1.class) == null
299                     || link.augmentation(
300                         org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class) == null) {
301                 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
302                 return new TopologyShard(null, null, null);
303             }
304             otnLinkType = link.augmentation(
305                     org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class).getOtnLinkType();
306             if (OtnLinkType.OTU4.equals(otnLinkType)) {
307                 links.add(updateOtnLinkBwParameters(link, 100000L, 0L));
308             } else if (OtnLinkType.OTUC4.equals(otnLinkType)) {
309                 links.add(updateOtnLinkBwParameters(link, 400000L, 0L));
310             } else {
311                 LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId());
312             }
313             //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
314         }
315         List<TerminationPoint> tps = new ArrayList<>();
316         for (TerminationPoint tp : oldTps) {
317             tps.add(updateTp(tp, false, linkType));
318         }
319         return
320             links.isEmpty() || tps.isEmpty()
321                 ? new TopologyShard(null, null, null)
322                 : new TopologyShard(null, links, tps);
323     }
324
325     private static List<Link> initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
326             OtnLinkType linkType) {
327
328         List<Link> links = new ArrayList<>();
329         String nodeATopo = formatNodeName(nodeA, tpA);
330         String nodeZTopo = formatNodeName(nodeZ, tpZ);
331         org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1 tpceLink1
332             = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1Builder()
333                 .setOtnLinkType(linkType).build();
334         Link1Builder otnLink1Bldr = new Link1Builder()
335             .setUsedBandwidth(Uint32.valueOf(0));
336         switch (linkType) {
337             case OTU4:
338             case ODTU4:
339                 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(100000));
340                 break;
341             case OTUC4:
342             case ODUC4:
343                 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(400000));
344                 break;
345             default:
346                 LOG.error("unable to set available bandwidth to unknown link type");
347                 break;
348             //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
349         }
350         // create link A-Z
351         LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkType.getName());
352         ietfLinkAZBldr
353             .addAugmentation(tpceLink1)
354             .addAugmentation(otnLink1Bldr.build())
355             .addAugmentation(
356                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder(
357                         ietfLinkAZBldr.augmentation(
358                             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class))
359                     .setLinkType(OpenroadmLinkType.OTNLINK)
360                     .setOperationalState(State.InService)
361                     .setAdministrativeState(AdminStates.InService)
362                     .build());
363         links.add(ietfLinkAZBldr.build());
364         // create link Z-A
365         LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkType.getName());
366         ietfLinkZABldr
367             .addAugmentation(tpceLink1)
368             .addAugmentation(otnLink1Bldr.build())
369             .addAugmentation(
370                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder(
371                         ietfLinkZABldr.augmentation(
372                             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class))
373                     .setLinkType(OpenroadmLinkType.OTNLINK)
374                     .setOperationalState(State.InService)
375                     .setAdministrativeState(AdminStates.InService)
376                     .build());
377         links.add(ietfLinkZABldr.build());
378         return links;
379     }
380
381     private static Link updateOtnLinkBwParameters(Link link, Long availBw, Long usedBw) {
382
383         LOG.debug("in updateOtnLinkBwParameters with availBw = {}, usedBw = {}", availBw, usedBw);
384         LinkBuilder updatedLinkBldr = new LinkBuilder(link);
385         Link1Builder updatedLink1Bldr = new Link1Builder(link.augmentation(Link1.class))
386             .setAvailableBandwidth(Uint32.valueOf(availBw))
387             .setUsedBandwidth(Uint32.valueOf(usedBw));
388         updatedLinkBldr.addAugmentation(updatedLink1Bldr.build());
389         return updatedLinkBldr.build();
390     }
391
392     private static List<Link> updateOtnLinkBwParameters(List<Link> supportedLinks, OtnLinkType linkType) {
393
394         LOG.debug("in updateOtnLinkBwParameters with supportedLinks = {}, linkType = {}", supportedLinks, linkType);
395         Uint32 usedBw;
396         switch (linkType) {
397             case ODTU4:
398                 usedBw = Uint32.valueOf(100000);
399                 break;
400             case ODUC4:
401                 usedBw = Uint32.valueOf(400000);
402                 break;
403             default:
404                 usedBw = Uint32.valueOf(0);
405                 break;
406         }
407         //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
408         List<Link> updatedlinks = new ArrayList<>();
409         for (Link link : supportedLinks) {
410             LinkBuilder updatedLinkBldr = new LinkBuilder(link);
411             updatedLinkBldr.addAugmentation(new Link1Builder(link.augmentation(Link1.class))
412                 .setAvailableBandwidth(Uint32.valueOf(0))
413                 .setUsedBandwidth(usedBw)
414                 .build());
415             updatedlinks.add(updatedLinkBldr.build());
416         }
417         return updatedlinks;
418     }
419
420     private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination,
421             OtnLinkType linkType) {
422
423         LOG.debug("in updateTp");
424         TerminationPointBuilder tpBldr = new TerminationPointBuilder(originalTp);
425         TerminationPoint1Builder otnTp1Bldr =
426             new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class));
427         XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
428             new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr.getXpdrTpPortConnectionAttributes());
429         if (addingTsTpnPoolTermination) {
430             List<Uint16> tsPool = new ArrayList<>();
431             for (int i = 1; i <= NB_TRIB_SLOTS; i++) {
432                 tsPool.add(Uint16.valueOf(i));
433             }
434             xtpcaBldr.setTsPool(tsPool);
435             List<Uint16> tpnPool = new ArrayList<>();
436             int nbTribPort = NB_TRIB_PORTS;
437             if (OtnLinkType.ODUC4.equals(linkType)) {
438                 nbTribPort = 4;
439             }
440             for (int i = 1; i <= nbTribPort; i++) {
441                 tpnPool.add(Uint16.valueOf(i));
442             }
443             OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder()
444                 .setOdtuType(ODTU4TsAllocated.class)
445                 .setTpnPool(tpnPool)
446                 .build();
447             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool));
448         } else {
449             xtpcaBldr.setTsPool(null);
450             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of());
451         }
452         return tpBldr.addAugmentation(otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build()).build();
453     }
454
455     private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, Uint32 serviceRate, Short tribPortNb,
456             Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
457
458         LOG.debug("in updateNodeTpTsPool");
459         TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp);
460         @Nullable
461         XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
462             new XpdrTpPortConnectionAttributesBuilder(
463                 tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
464         List<Uint16> tsPool = new ArrayList<>(xtpcaBldr.getTsPool());
465         if (isDeletion) {
466             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
467                 tsPool.add(Uint16.valueOf(i));
468             }
469         } else {
470             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
471                 tsPool.remove(Uint16.valueOf(i));
472             }
473         }
474         xtpcaBldr.setTsPool(tsPool);
475         List<Uint16> tpnPool;
476         List<OdtuTpnPool> odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values());
477         if (odtuTpnPoolValues.get(0).getTpnPool() == null) {
478             tpnPool = new ArrayList<>();
479         } else {
480             tpnPool = new ArrayList<>(odtuTpnPoolValues.get(0).getTpnPool());
481             if (isDeletion) {
482                 tpnPool.add(Uint16.valueOf(tribPortNb));
483             } else {
484                 tpnPool.remove(Uint16.valueOf(tribPortNb));
485             }
486         }
487         Class<? extends OdtuTypeIdentity> odtuType = null;
488         switch (serviceRate.intValue()) {
489             case 1:
490             case 10:
491                 odtuType = ODTU4TsAllocated.class;
492                 break;
493             case 100:
494                 odtuType = ODTUCnTs.class;
495                 break;
496             default:
497                 LOG.warn("Unable to set the odtu-type");
498                 break;
499         }
500         OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder()
501             .setOdtuType(odtuType)
502             .setTpnPool(tpnPool)
503             .build();
504         xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool));
505         tpBldr.addAugmentation(
506             new TerminationPoint1Builder(
507                 tp.augmentation(TerminationPoint1.class))
508                     .setXpdrTpPortConnectionAttributes(xtpcaBldr.build())
509                     .build());
510         return tpBldr.build();
511     }
512
513     private static Map<Integer, OtnTopoNode> convertPortMappingToOtnNodeList(Nodes mappingNode) {
514
515         List<Mapping> networkMappings =
516             mappingNode.nonnullMapping().values().stream()
517                 .filter(k -> k.getLogicalConnectionPoint().contains("NETWORK"))
518                 .collect(Collectors.toList());
519         Map<Integer, OtnTopoNode> xpdrMap = new HashMap<>();
520         for (Mapping mapping : networkMappings) {
521             Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
522             if (!xpdrMap.containsKey(xpdrNb)) {
523                 List<Mapping> xpdrNetMaps =
524                     mappingNode.nonnullMapping().values().stream()
525                         .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + NETWORK))
526                         .collect(Collectors.toList());
527                 List<Mapping> xpdrClMaps =
528                     mappingNode.nonnullMapping().values().stream()
529                         .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + CLIENT))
530                         .collect(Collectors.toList());
531                 xpdrMap.put(
532                     xpdrNb,
533                     new OtnTopoNode(
534                         mappingNode.getNodeId(),
535                         mappingNode.getNodeInfo().getNodeClli(),
536                         xpdrNb,
537                         mapping.getXponderType() == null
538                             ? XpdrNodeTypes.Tpdr
539                             : mapping.getXponderType(),
540                         fillConnectionMapLcp(xpdrNetMaps),
541                         fillConnectionMapLcp(xpdrClMaps),
542                         xpdrNetMaps,
543                         xpdrClMaps
544                     ));
545             }
546         }
547         LOG.debug("there are {} xpdr to build", xpdrMap.size());
548         xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}",
549             k, v.getNodeId(), v.getNodeType(), v.getNbTpClient(), v.getNbTpNetwork()));
550         return xpdrMap;
551     }
552
553     private static Map<String, String> fillConnectionMapLcp(List<Mapping> mappingList) {
554
555         Map<String, String> xpdrConnectionMap = new HashMap<>();
556         for (Mapping map : mappingList) {
557             xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
558         }
559         return xpdrConnectionMap;
560     }
561
562     private static Node createTpdr(OtnTopoNode node) {
563
564         // prepare ietf node augmentation to add TP list
565         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
566         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
567         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
568         // return ietfNode
569         return new NodeBuilder()
570             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
571             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
572             .setSupportingNode(createSupportingNodes(node))
573             .addAugmentation(
574                 new Node1Builder()
575                     .setXpdrAttributes(
576                         new XpdrAttributesBuilder()
577                             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
578                             .build())
579                     .build())
580             .addAugmentation(
581                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
582                     .setNodeType(OpenroadmNodeType.TPDR)
583                     .setOperationalState(State.InService)
584                     .setAdministrativeState(AdminStates.InService)
585                     .build())
586             .addAugmentation(
587                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
588                     .Node1Builder()
589                         .setTerminationPoint(tpMap)
590                         .build())
591             .build();
592     }
593
594     private static Node createMuxpdr(OtnTopoNode node) {
595
596         // prepare otn-topology node augmentation
597         // TODO: will need to be completed
598         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
599         for (int i = 1; i <= node.getNbTpClient(); i++) {
600             List<TpId> tpList = new ArrayList<>();
601             tpList.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
602             tpList.add(new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1"));
603             NonBlockingList nbl = new NonBlockingListBuilder()
604                 .setNblNumber(Uint16.valueOf(i))
605                 .setTpList(tpList)
606                 .setAvailableInterconnectBandwidth(Uint32.valueOf(node.getNbTpNetwork() * 10L))
607                 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
608                 .build();
609             nbMap.put(nbl.key(),nbl);
610         }
611         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
612             .setSwitchingPoolNumber(Uint16.valueOf(1))
613             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
614             .setNonBlockingList(nbMap)
615             .build();
616         // prepare ietf node augmentation to add TP list
617         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
618         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
619         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
620         // return ietfNode
621         return new NodeBuilder()
622             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
623             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
624             .setSupportingNode(createSupportingNodes(node))
625             .addAugmentation(
626                 new Node1Builder()
627                     .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
628                     .setXpdrAttributes(
629                         new XpdrAttributesBuilder()
630                             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
631                             .build())
632                     .setSwitchingPools(
633                         new SwitchingPoolsBuilder()
634                             .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool))
635                             .build())
636                     .build())
637             .addAugmentation(
638                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
639                     .setNodeType(OpenroadmNodeType.MUXPDR)
640                     .setAdministrativeState(AdminStates.InService)
641                     .setOperationalState(State.InService)
642                     .build())
643             .addAugmentation(
644                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
645                     .Node1Builder()
646                         .setTerminationPoint(tpMap)
647                         .build())
648             .build();
649     }
650
651     private static Node createSwitch(OtnTopoNode node) {
652
653         List<TpId> tpl = new ArrayList<>();
654         for (int i = 1; i <= node.getNbTpClient(); i++) {
655             tpl.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
656         }
657         for (int i = 1; i <= node.getNbTpNetwork(); i++) {
658             tpl.add(new TpId("XPDR" + node.getXpdrNb() + NETWORK + i));
659         }
660         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
661         NonBlockingList nbl = new NonBlockingListBuilder()
662             .setNblNumber(Uint16.valueOf(1))
663             .setTpList(tpl)
664             .build();
665         nbMap.put(nbl.key(),nbl);
666         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
667             .setSwitchingPoolNumber(Uint16.valueOf(1))
668             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
669             .setNonBlockingList(nbMap)
670             .build();
671         Map<OduSwitchingPoolsKey, OduSwitchingPools> oduSwitchPoolList = new HashMap<>();
672         oduSwitchPoolList.put(oduSwitchPool.key(),oduSwitchPool);
673         // prepare ietf node augmentation to add TP list
674         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
675         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
676         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
677         // return ietfNode
678         return new NodeBuilder()
679             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
680             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
681             .setSupportingNode(createSupportingNodes(node))
682             .addAugmentation(
683                 new Node1Builder()
684                     .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
685                     .setXpdrAttributes(
686                         new XpdrAttributesBuilder()
687                             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
688                             .build())
689                     .setSwitchingPools(
690                         new SwitchingPoolsBuilder()
691                             .setOduSwitchingPools(oduSwitchPoolList)
692                             .build())
693                     .build())
694             .addAugmentation(
695                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
696                     .setNodeType(OpenroadmNodeType.SWITCH)
697                     .setOperationalState(State.InService)
698                     .setAdministrativeState(AdminStates.InService)
699                     .build())
700             .addAugmentation(
701                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
702                     .Node1Builder()
703                         .setTerminationPoint(tpMap)
704                         .build())
705             .build();
706     }
707
708     private static void createTP(Map<TerminationPointKey, TerminationPoint> tpMap,
709             OtnTopoNode node, OpenroadmTpType tpType, boolean withRate) {
710
711         List<Mapping> mappings = null;
712         switch (tpType) {
713             case XPONDERNETWORK:
714                 mappings = node.getXpdrNetMappings();
715                 break;
716             case XPONDERCLIENT:
717                 mappings = node.getXpdrClMappings();
718                 break;
719             default:
720                 LOG.error("Error with Termination Point type {}", tpType);
721                 return;
722         }
723         fillTpMap(tpMap, node, tpType, withRate, mappings);
724     }
725
726     private static void fillTpMap(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node,
727             OpenroadmTpType tpType, boolean withRate, List<Mapping> mappings) {
728
729         for (Mapping mapping : mappings) {
730             // openroadm-otn-topoology augmentation
731             Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfMap = new HashMap<>();
732             TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder();
733             if (mapping.getSupportedInterfaceCapability() == null) {
734                 LOG.warn("mapping {} of node {} has no if-cap-type",
735                     mapping.getLogicalConnectionPoint(), node.getNodeId());
736             } else {
737                 XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
738                 for (Class<? extends SupportedIfCapability> supInterCapa : mapping.getSupportedInterfaceCapability()) {
739                     SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
740                         .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
741                         .setIfCapType(supInterCapa)
742                         .build();
743                     supIfMap.put(supIfCapa.key(), supIfCapa);
744                 }
745                 otnTp1Bldr.setTpSupportedInterfaces(
746                     new TpSupportedInterfacesBuilder()
747                         .setSupportedInterfaceCapability(supIfMap)
748                         .build()
749                 );
750                 //TODO: It is not logical to assign a priori one of the possible rate to the TP.
751                 //Would be worth assigning per default "unallocated" at the tp creation step,
752                 //and updating it with correct rate when it supports a specific service.
753                 if (withRate) {
754                     otnTp1Bldr.setXpdrTpPortConnectionAttributes(
755                         xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability())).build());
756                 }
757             }
758             setclientNwTpAttr(
759                 tpMap,
760                 node,
761                 new TpId(mapping.getLogicalConnectionPoint()),
762                 tpType,
763                 otnTp1Bldr.build(),
764                 new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder(),
765                 mapping);
766         }
767     }
768
769     private static void setclientNwTpAttr(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node, TpId tpId,
770             OpenroadmTpType tpType, TerminationPoint1 otnTp1,
771             org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr,
772             Mapping mapping) {
773
774         switch (tpType) {
775             case XPONDERNETWORK:
776                 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
777                     tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrNetConnectionMap().get(tpId.getValue()));
778                 }
779                 SupportingTerminationPoint stp = new SupportingTerminationPointBuilder()
780                     .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
781                     .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
782                     .setTpRef(tpId)
783                     .build();
784                 TerminationPoint ietfTpNw =
785                     buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping);
786                 tpMap.put(ietfTpNw.key(),ietfTpNw);
787                 break;
788             case XPONDERCLIENT:
789                 if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) {
790                     tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrCliConnectionMap().get(tpId.getValue()));
791                 }
792                 TerminationPoint ietfTpCl = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, null, mapping);
793                 tpMap.put(ietfTpCl.key(),ietfTpCl);
794                 break;
795             default:
796                 LOG.error("Undefined tpType for Termination point {} of {}", tpId.getValue(), node.getNodeId());
797                 break;
798         }
799     }
800
801     private static Class<? extends OduRateIdentity> fixRate(List<Class<? extends SupportedIfCapability>> list) {
802
803         for (Class<? extends SupportedIfCapability> class1 : list) {
804             if (rateMap.containsKey(class1.getSimpleName())) {
805                 return rateMap.get(class1.getSimpleName());
806             }
807         }
808         return null;
809     }
810
811     private static Map<SupportingNodeKey,SupportingNode> createSupportingNodes(OtnTopoNode node) {
812
813         SupportingNode suppNode1 = new SupportingNodeBuilder()
814             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
815             .setNodeRef(new NodeId(node.getNodeId()))
816             .withKey(
817                 new SupportingNodeKey(
818                     new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
819                     new NodeId(node.getNodeId())))
820             .build();
821         SupportingNode suppNode2 = new SupportingNodeBuilder()
822             .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
823             .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
824             .withKey(
825                 new SupportingNodeKey(
826                     new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
827                     new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
828             .build();
829         SupportingNode suppNode3 = new SupportingNodeBuilder()
830             .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
831             .setNodeRef(new NodeId(node.getClli()))
832             .withKey(
833                 new SupportingNodeKey(
834                     new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
835                     new NodeId(node.getClli())))
836             .build();
837         Map<SupportingNodeKey,SupportingNode> suppNodeMap = new HashMap<>();
838         suppNodeMap.put(suppNode1.key(),suppNode1);
839         suppNodeMap.put(suppNode2.key(),suppNode2);
840         suppNodeMap.put(suppNode3.key(),suppNode3);
841         return suppNodeMap;
842     }
843
844     private static TerminationPoint buildIetfTp(
845             org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr,
846             TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
847             Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
848
849         TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
850         if (tpceTp1Bldr.getAssociatedConnectionMapPort() != null) {
851             ietfTpBldr.addAugmentation(tpceTp1Bldr.build());
852         }
853         if (supportTpMap != null) {
854             ietfTpBldr.setSupportingTerminationPoint(supportTpMap);
855         }
856         return ietfTpBldr
857             .setTpId(tpId)
858             .withKey(new TerminationPointKey(tpId))
859             .addAugmentation(otnTp1)
860             .addAugmentation(
861                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder()
862                     .setTpType(tpType)
863                     .setAdministrativeState(TopologyUtils.setNetworkAdminState(mapping.getPortAdminState()))
864                     .setOperationalState(TopologyUtils.setNetworkOperState(mapping.getPortOperState()))
865                     .build())
866             .build();
867     }
868
869     private static String formatNodeName(String nodeName, String tpName) {
870
871         return nodeName.contains(XPDR)
872                 ? nodeName
873                 : new StringBuilder(nodeName).append("-").append(tpName.split("-")[0]).toString();
874     }
875 }