134f892ea6821447a1f7f11f28ab641293c33d13
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / topology / ConvertORToTapiTopology.java
1 /*
2  * Copyright © 2023 Orange, Inc. and others.  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 package org.opendaylight.transportpce.tapi.topology;
9
10 import java.nio.charset.Charset;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.UUID;
19 import java.util.stream.Collectors;
20 import org.opendaylight.transportpce.tapi.TapiStringConstants;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.AvailableCapacityBuilder;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.TotalPotentialCapacityBuilder;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointBuilder;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU0;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2E;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU4;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE100GigE;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE10GigELAN;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPEGigE;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointBuilder;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointKey;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
88 import org.opendaylight.yangtools.yang.common.Uint16;
89 import org.opendaylight.yangtools.yang.common.Uint64;
90 import org.slf4j.Logger;
91 import org.slf4j.LoggerFactory;
92
93
94 public class ConvertORToTapiTopology {
95
96     private static final Logger LOG = LoggerFactory.getLogger(ConvertORToTapiTopology.class);
97     private String ietfNodeId;
98     private OpenroadmNodeType ietfNodeType;
99     private AdminStates ietfNodeAdminState;
100     private State ietfNodeOperState;
101     private List<TerminationPoint> oorClientPortList;
102     private List<TerminationPoint> oorNetworkPortList;
103     private OduSwitchingPools oorOduSwitchingPool;
104     private Uuid tapiTopoUuid;
105     private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
106         tapiNodes;
107     private Map<LinkKey, Link> tapiLinks;
108     private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
109     private Map<String, Uuid> uuidMap;
110
111
112     public ConvertORToTapiTopology(Uuid tapiTopoUuid) {
113         this.tapiTopoUuid = tapiTopoUuid;
114         this.tapiNodes = new HashMap<>();
115         this.tapiLinks = new HashMap<>();
116         this.uuidMap = new HashMap<>();
117         this.tapiSips = new HashMap<>();
118     }
119
120     public void convertNode(Node ietfNode, List<String> networkPorts) {
121         this.ietfNodeId = ietfNode.getNodeId().getValue();
122         if (ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
123                 == null) {
124             return;
125         }
126         this.ietfNodeType = ietfNode.augmentation(
127             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class).getNodeType();
128         this.ietfNodeAdminState = ietfNode.augmentation(
129                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
130             .getAdministrativeState();
131         this.ietfNodeOperState = ietfNode.augmentation(
132                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
133             .getOperationalState();
134         this.oorNetworkPortList = ietfNode.augmentation(
135                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
136             .getTerminationPoint().values().stream()
137             .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
138                 == OpenroadmTpType.XPONDERNETWORK.getIntValue()
139                 && networkPorts.contains(tp.getTpId().getValue()))
140             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
141             .collect(Collectors.toList());
142         if (!OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
143             this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
144                 .values().stream().findFirst().orElseThrow();
145             this.oorClientPortList = ietfNode.augmentation(
146                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
147                 .getTerminationPoint().values().stream()
148                 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
149                     == OpenroadmTpType.XPONDERCLIENT.getIntValue())
150                 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
151                 .collect(Collectors.toList());
152         } else {
153             this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
154             List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
155                 .flatMap(nbl -> nbl.getTpList().stream())
156                 .collect(Collectors.toList());
157             this.oorClientPortList = ietfNode.augmentation(
158                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
159                 .getTerminationPoint().values().stream()
160                 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
161                     == OpenroadmTpType.XPONDERCLIENT.getIntValue() && tpList.contains(tp.getTpId()))
162                 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
163                 .collect(Collectors.toList());
164             this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
165         }
166
167         // node creation [DSR/ODU] ([DSR/ODU] and OTSI merged in R 2.4.X)
168         LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
169         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
170             TapiStringConstants.XPDR)).getBytes(Charset.forName("UTF-8"))).toString());
171         this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR), nodeUuid);
172         Name nameDsr = new NameBuilder().setValueName("dsr/odu node name")
173             .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR)).build();
174         Name namePhot = new NameBuilder().setValueName("otsi node name")
175             .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR)).build();
176         Name nameNodeType = new NameBuilder().setValueName("Node Type")
177             .setValue(this.ietfNodeType.getName()).build();
178         Set<LayerProtocolName> dsrLayerProtocols = Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
179             LayerProtocolName.DIGITALOTN,LayerProtocolName.PHOTONICMEDIA);
180         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology
181             .Node dsrNode = createTapiNode(Map.of(nameDsr.key(), nameDsr, namePhot.key(), namePhot,nameNodeType.key(),
182                 nameNodeType), dsrLayerProtocols);
183         LOG.debug("XPDR Node {} should have {} NEPs and SIPs", this.ietfNodeId,
184             this.oorClientPortList.size() + this.oorNetworkPortList.size());
185         LOG.info("XPDR Node {} has {} NEPs and {} SIPs", this.ietfNodeId,
186             dsrNode.getOwnedNodeEdgePoint().values().size(), dsrNode.getOwnedNodeEdgePoint().values().stream()
187                 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
188         tapiNodes.put(dsrNode.key(), dsrNode);
189     }
190
191     public Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(String topoType, Uuid nodeUuid,
192             String orNodeId, Collection<OwnedNodeEdgePoint> onepl) {
193         Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
194             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
195             nepMap = new HashMap<>();
196         for (OwnedNodeEdgePoint onep : onepl) {
197             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint
198                 nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group
199                     .NodeEdgePointBuilder()
200                 .setTopologyUuid(tapiTopoUuid)
201                 .setNodeUuid(nodeUuid)
202                 .setNodeEdgePointUuid(onep.key().getUuid())
203                 .build();
204             nepMap.put(nep.key(), nep);
205         }
206         String rdmName =
207             topoType.equals("Abstracted")
208                 ? "rdm infra node rule group"
209                 : orNodeId + " node rule group";
210         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
211         Set<RuleType> ruleTypes = new HashSet<>();
212         ruleTypes.add(RuleType.FORWARDING);
213         Map<RuleKey, Rule> ruleList = new HashMap<>();
214         Rule rule = new RuleBuilder()
215             .setLocalId("forward")
216             .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
217             .setRuleType(ruleTypes)
218             .build();
219         ruleList.put(rule.key(), rule);
220         NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
221             .setUuid(new Uuid(UUID.nameUUIDFromBytes((rdmName)
222                 .getBytes(Charset.forName("UTF-8"))).toString()))
223             .setRule(ruleList)
224             .setNodeEdgePoint(nepMap)
225             .build();
226         nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
227         return nodeRuleGroupMap;
228     }
229
230     public Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createMSIP(int nb,
231             LayerProtocolName layerProtocol, String tpId, String nodeid,
232             Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
233             OperationalState operState, AdministrativeState adminState) {
234         // add them to SIP context
235         Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
236         for (int i = 0; i < nb; i++) {
237             String sipName =
238                 nb == 1
239                     ? String.join("+", "SIP", nodeid, tpId)
240                     : String.join("+", "SIP", nodeid, tpId,"Nber", String.valueOf(i));
241             LOG.info("SIP = {}", sipName);
242             Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes(sipName.getBytes(Charset.forName("UTF-8"))).toString());
243             MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
244                 .setServiceInterfacePointUuid(sipUuid).build();
245             ServiceInterfacePoint sip = createSIP(sipUuid, layerProtocol, tpId, nodeid, supportedInterfaceCapability,
246                 operState, adminState);
247             this.tapiSips.put(sip.key(), sip);
248             msipl.put(msip.key(), msip);
249             LOG.debug("SIP created {}", sip.getUuid());
250             LOG.debug("This SIP corresponds to SIP+nodeId {} + TpId {}", nodeid, tpId);
251         }
252         return msipl;
253     }
254
255     public List<SupportedCepLayerProtocolQualifierInstances> createSupportedCepLayerProtocolQualifier(
256         Collection<SupportedInterfaceCapability> sicList, LayerProtocolName lpn) {
257         List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
258         if (sicList == null) {
259             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
260                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
261                 .setNumberOfCepInstances(Uint64.valueOf(1))
262                 .build());
263             return sclpqiList;
264         }
265         LOG.debug("SIC list = {}", sicList);
266         for (SupportedInterfaceCapability sic : sicList) {
267             String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
268             switch (lpn.getName()) {
269                 case "ETH":
270                 case "DSR":
271                     switch (ifCapType) {
272                         // TODO: it may be needed to add more cases clauses if the interface capabilities of a
273                         //  port are extended in the config file
274                         case "If1GEODU0":
275                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
276                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
277                                 .setNumberOfCepInstances(Uint64.valueOf(0))
278                                 .build());
279                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
280                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
281                                 .setNumberOfCepInstances(Uint64.valueOf(0))
282                                 .build());
283                             break;
284                         case "If10GEODU2e":
285                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
286                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
287                                 .setNumberOfCepInstances(Uint64.valueOf(0))
288                                 .build());
289                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
290                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
291                                 .setNumberOfCepInstances(Uint64.valueOf(0))
292                                 .build());
293                             break;
294                         case "If10GEODU2":
295                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
296                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
297                                 .setNumberOfCepInstances(Uint64.valueOf(0))
298                                 .build());
299                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
300                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
301                                 .setNumberOfCepInstances(Uint64.valueOf(0))
302                                 .build());
303                             break;
304                         case "If10GE":
305                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
306                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
307                                 .setNumberOfCepInstances(Uint64.valueOf(0))
308                                 .build());
309                             break;
310                         case "If100GEODU4":
311                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
312                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
313                                 .setNumberOfCepInstances(Uint64.valueOf(0))
314                                 .build());
315                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
316                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
317                                 .setNumberOfCepInstances(Uint64.valueOf(0))
318                                 .build());
319                             break;
320                         case "If100GE":
321                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
322                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
323                                 .setNumberOfCepInstances(Uint64.valueOf(0))
324                                 .build());
325                             break;
326                         case "IfOCHOTU4ODU4":
327                         case "IfOCH":
328                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
329                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
330                                 .setNumberOfCepInstances(Uint64.valueOf(0))
331                                 .build());
332                             break;
333                         default:
334                             LOG.error("IfCapability type not managed");
335                             break;
336                     }
337                     break;
338                 case "ODU":
339                     switch (ifCapType) {
340                         // TODO: it may be needed to add more cases clauses if the interface capabilities of a
341                         //  port are extended in the config file
342                         case "If1GEODU0":
343                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
344                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
345                                 .setNumberOfCepInstances(Uint64.valueOf(0))
346                                 .build());
347                             break;
348                         case "If10GEODU2e":
349                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
350                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
351                                 .setNumberOfCepInstances(Uint64.valueOf(0))
352                                 .build());
353                             break;
354                         case "If10GEODU2":
355                         case "If10GE":
356                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
357                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
358                                 .setNumberOfCepInstances(Uint64.valueOf(0))
359                                 .build());
360                             break;
361                         case "If100GEODU4":
362                         case "If100GE":
363                         case "IfOCHOTU4ODU4":
364                         case "IfOCH":
365                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
366                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
367                                 .setNumberOfCepInstances(Uint64.valueOf(0))
368                                 .build());
369                             break;
370                         default:
371                             LOG.error("IfCapability type not managed");
372                             break;
373                     }
374                     break;
375                 case "PHOTONIC_MEDIA":
376                     if (ifCapType.equals("IfOCHOTU4ODU4") || ifCapType.equals("IfOCH")) {
377                         sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
378                             .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
379                             .setNumberOfCepInstances(Uint64.valueOf(0))
380                             .build());
381                         sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
382                             .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
383                             .setNumberOfCepInstances(Uint64.valueOf(0))
384                             .build());
385                     }
386                     break;
387                 default:
388                     LOG.error("Layer Protocol Name is unknown {}", lpn.getName());
389                     break;
390             }
391         }
392         return sclpqiList.stream().distinct().toList();
393     }
394
395     private OduSwitchingPools createOduSwitchingPoolForTp100G() {
396         Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
397         int count = 1;
398         for (TerminationPoint tp : this.oorNetworkPortList) {
399             TpId tpid1 = tp.getTpId();
400             TpId tpid2 = tp.augmentation(
401                     org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1.class)
402                 .getAssociatedConnectionMapTp().iterator().next();
403             Set<TpId> tpList = new HashSet<>();
404             tpList.add(tpid1);
405             tpList.add(tpid2);
406             NonBlockingList nbl = new NonBlockingListBuilder()
407                 .setNblNumber(Uint16.valueOf(count))
408                 .setTpList(tpList)
409                 .build();
410             nblMap.put(nbl.key(), nbl);
411             count++;
412         }
413         return new OduSwitchingPoolsBuilder()
414             .setNonBlockingList(nblMap)
415             .setSwitchingPoolNumber(Uint16.valueOf(1))
416             .build();
417     }
418
419     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node
420             createTapiNode(Map<NameKey, Name> nodeNames, Set<LayerProtocolName> layerProtocols) {
421         Uuid nodeUuid = null;
422         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
423         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
424         Map<RuleKey, Rule> ruleList = new HashMap<>();
425         Set<RuleType> ruleTypes = new HashSet<>();
426         ruleTypes.add(RuleType.FORWARDING);
427         Rule rule = new RuleBuilder()
428             .setLocalId("forward")
429             .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
430             .setRuleType(ruleTypes)
431             .build();
432         ruleList.put(rule.key(), rule);
433         if (layerProtocols.contains(LayerProtocolName.DSR)
434                 || layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
435             nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, ruleList);
436         } else {
437             LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(nodeNames.keySet().iterator().next())
438                 .getValueName(), nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
439         }
440      // Empty random creation of mandatory fields for avoiding errors....
441         CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
442             .setCostAlgorithm("Restricted Shortest Path - RSP")
443             .setCostName("HOP_COUNT")
444             .setCostValue(TapiStringConstants.COST_HOP_VALUE)
445             .build();
446         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
447             .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
448             .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
449             .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
450             .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
451             .setTrafficPropertyName("FIXED_LATENCY")
452             .build();
453         RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
454             .setRiskCharacteristicName("risk characteristic")
455             .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
456             .build();
457         RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
458             .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
459             .build();
460         return new NodeBuilder()
461             .setUuid(nodeUuid)
462             .setName(nodeNames)
463             .setLayerProtocolName(layerProtocols)
464             .setAdministrativeState(transformAsToTapiAdminState(this.ietfNodeAdminState.getName()))
465             .setOperationalState(transformOsToTapiOperationalState(this.ietfNodeOperState.getName()))
466             .setLifecycleState(LifecycleState.INSTALLED)
467             .setOwnedNodeEdgePoint(onepl)
468             .setNodeRuleGroup(nodeRuleGroupList)
469             .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
470             .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
471             .setRiskParameterPac(riskParamPac)
472             .setErrorCharacteristic("error")
473             .setLossCharacteristic("loss")
474             .setRepeatDeliveryCharacteristic("repeat delivery")
475             .setDeliveryOrderCharacteristic("delivery order")
476             .setUnavailableTimeCharacteristic("unavailable time")
477             .setServerIntegrityProcessCharacteristic("server integrity process")
478             .build();
479     }
480
481     private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
482                                  Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
483         Uuid nodeUuid;
484         nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR));
485         // client NEP DSR creation on DSR/ODU node
486         for (int i = 0; i < oorClientPortList.size(); i++) {
487             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
488                 (String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
489                     oorClientPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
490             LOG.info("NEP = {} has Uuid {} ", String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
491                 oorClientPortList.get(i).getTpId().getValue()), nepUuid);
492             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
493                     oorClientPortList.get(i).getTpId().getValue()), nepUuid);
494             NameBuilder nameBldr = new NameBuilder().setValue(
495                 String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
496                     oorClientPortList.get(i).getTpId().getValue()));
497             Name name;
498             if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
499                 name = nameBldr.setValueName("100G-tpdr").build();
500             } else {
501                 name = nameBldr.setValueName("NodeEdgePoint_C").build();
502             }
503
504             OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
505                 LayerProtocolName.DSR, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
506                     TapiStringConstants.DSR));
507             onepl.put(onep.key(), onep);
508         }
509         // CLIENT NEP E_ODU creation on DSR/ODU node
510         for (int i = 0; i < oorClientPortList.size(); i++) {
511             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
512                 (String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
513                     oorClientPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
514             LOG.info("NEP = {} has Uuid {} ", String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
515                 oorClientPortList.get(i).getTpId().getValue()), nepUuid1);
516             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
517                 oorClientPortList.get(i).getTpId().getValue()), nepUuid1);
518             Name onedName = new NameBuilder()
519                 .setValueName("eNodeEdgePoint_N")
520                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
521                     oorClientPortList.get(i).getTpId().getValue()))
522                 .build();
523
524             OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(onedName.key(), onedName),
525                 LayerProtocolName.ODU, LayerProtocolName.DSR, false, String.join("+", this.ietfNodeId,
526                     TapiStringConstants.E_ODU));
527             onepl.put(onep.key(), onep);
528         }
529         // NETWORK NEPs I_ODU creation on DSR/ODU node
530         for (int i = 0; i < oorNetworkPortList.size(); i++) {
531             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
532                 (String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
533                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
534             LOG.info("NEP = {} has Uuid {} ", String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
535                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid1);
536             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
537                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid1);
538             Name onedName = new NameBuilder()
539                 .setValueName("iNodeEdgePoint_N")
540                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
541                     oorNetworkPortList.get(i).getTpId().getValue()))
542                 .build();
543
544             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
545                 LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
546                     TapiStringConstants.I_ODU));
547             onepl.put(onep.key(), onep);
548         }
549         // NETWORK NEP OTS network on DSR/ODU node
550         for (int i = 0; i < oorNetworkPortList.size(); i++) {
551             Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
552                 (String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
553                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
554                 .toString());
555             LOG.info("NEP = {} has Uuid {} ", String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
556                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid2);
557             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
558                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid2);
559             Name onedName = new NameBuilder()
560                 .setValueName("eNodeEdgePoint")
561                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
562                     oorNetworkPortList.get(i).getTpId().getValue()))
563                 .build();
564
565             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
566                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
567                 String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS));
568             onepl.put(onep.key(), onep);
569         }
570         // NETWORK NEP OTSI_MC network nep creation
571         //TODO: add test to see if wavelength is provionned and condition this creation to this!
572         for (int i = 0; i < oorNetworkPortList.size(); i++) {
573             Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(
574                 (String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
575                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
576                 .toString());
577             LOG.info("NEP = {} has Uuid {} ", String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
578                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid3);
579             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
580                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid3);
581             Name onedName = new NameBuilder()
582                 .setValueName("PhotMedNodeEdgePoint")
583                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
584                     oorNetworkPortList.get(i).getTpId().getValue()))
585                 .build();
586
587             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
588                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
589                 String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC));
590             onepl.put(onep.key(), onep);
591         }
592         // create NodeRuleGroup
593         int count = 1;
594         LOG.debug("ODU switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
595         for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
596             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
597                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
598                 nepList = new HashMap<>();
599             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
600                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
601                 oduNepList = new HashMap<>();
602             LOG.debug("UUidMap={}", this.uuidMap.keySet());
603             LOG.debug("TP list = {}", nbl.getTpList());
604             for (TpId tp : nbl.getTpList()) {
605                 LOG.debug("TP={}", tp.getValue());
606                 LOG.debug("UuidKey={}", String.join("+", this.ietfNodeId,
607                     TapiStringConstants.E_ODU, tp.getValue()));
608                 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
609                     tp.getValue())) || this.uuidMap.containsKey(String.join(
610                         "+", this.ietfNodeId, TapiStringConstants.I_ODU, tp.getValue()))) {
611                     String qual = tp.getValue().contains("CLIENT") ? TapiStringConstants.DSR
612                         : TapiStringConstants.I_ODU;
613                     org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint
614                             nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
615                             .node.rule.group.NodeEdgePointBuilder()
616                         .setTopologyUuid(tapiTopoUuid)
617                         .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
618                             TapiStringConstants.XPDR)))
619                         .setNodeEdgePointUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
620                             qual, tp.getValue())))
621                         .build();
622                     nepList.put(nep.key(), nep);
623                 }
624                 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId,
625                         TapiStringConstants.E_ODU, tp.getValue()))) {
626                     org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint
627                             nep1 = new org.opendaylight.yang.gen.v1.urn
628                             .onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointBuilder()
629                         .setTopologyUuid(tapiTopoUuid)
630                         .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
631                             TapiStringConstants.XPDR)))
632                         .setNodeEdgePointUuid(this.uuidMap.get(String.join(
633                             "+", this.ietfNodeId, TapiStringConstants.E_ODU, tp.getValue())))
634                         .build();
635                     oduNepList.put(nep1.key(), nep1);
636                 }
637                 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId,
638                         TapiStringConstants.I_ODU, tp.getValue()))) {
639                     org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint
640                             nep2 = new org.opendaylight.yang.gen.v1.urn
641                             .onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointBuilder()
642                         .setTopologyUuid(tapiTopoUuid)
643                         .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
644                             TapiStringConstants.XPDR)))
645                         .setNodeEdgePointUuid(this.uuidMap.get(String.join(
646                             "+", this.ietfNodeId, TapiStringConstants.I_ODU, tp.getValue())))
647                         .build();
648                     oduNepList.put(nep2.key(), nep2);
649                 }
650             }
651             LOG.debug("NEPLIST (DSR/I_ODU) of [dsr node rule group] is {}", nepList.toString());
652             LOG.debug("NEPLIST (E_ODU/I_ODU) of [odu node rule group] is {}", nepList.toString());
653             // Empty random creation of mandatory fields for avoiding errors....
654             CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
655                 .setCostAlgorithm("Restricted Shortest Path - RSP")
656                 .setCostName("HOP_COUNT")
657                 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
658                 .build();
659             LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
660                 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
661                 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
662                 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
663                 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
664                 .setTrafficPropertyName("FIXED_LATENCY")
665                 .build();
666             RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
667                 .setRiskCharacteristicName("risk characteristic")
668                 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
669                 .build();
670             NodeRuleGroup nodeRuleGroup1 = new NodeRuleGroupBuilder()
671                 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("dsr node rule group " + count)
672                     .getBytes(Charset.forName("UTF-8"))).toString()))
673                 .setRule(ruleList)
674                 .setNodeEdgePoint(nepList)
675                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
676                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
677                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
678                 .build();
679             nodeRuleGroupList.put(nodeRuleGroup1.key(), nodeRuleGroup1);
680             NodeRuleGroup nodeRuleGroup2 = new NodeRuleGroupBuilder()
681                 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("odu node rule group " + count)
682                     .getBytes(Charset.forName("UTF-8"))).toString()))
683                 .setRule(ruleList)
684                 .setNodeEdgePoint(oduNepList)
685                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
686                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
687                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
688                 .build();
689             nodeRuleGroupList.put(nodeRuleGroup2.key(), nodeRuleGroup2);
690             count++;
691         }
692         return nodeUuid;
693     }
694
695     private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
696             LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
697         String key = String.join("+", keyword, oorTp.getTpId().getValue());
698         AdministrativeState adminState = (oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() != null)
699             ? transformAsToTapiAdminState(oorTp.augmentation(TerminationPoint1.class).getAdministrativeState()
700                 .getName())
701             : null;
702         OperationalState operState = (oorTp.augmentation(TerminationPoint1.class).getOperationalState() != null)
703             ? transformOsToTapiOperationalState(oorTp.augmentation(TerminationPoint1.class).getOperationalState()
704                 .getName())
705             : null;
706         org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1 tp1 =
707             oorTp.augmentation(org.opendaylight.yang.gen.v1.http
708                 .org.openroadm.otn.network.topology.rev230526.TerminationPoint1.class);
709         if (tp1.getTpSupportedInterfaces() == null) {
710             LOG.warn("Tp supported interface doesnt exist on TP {}", oorTp.getTpId().getValue());
711             return null;
712         }
713 //        Collection<SupportedInterfaceCapability> sicList = tp1.getTpSupportedInterfaces()
714         Collection<SupportedInterfaceCapability> sicColl = tp1.getTpSupportedInterfaces()
715             .getSupportedInterfaceCapability().values();
716         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
717             .setUuid(this.uuidMap.get(key))
718             .setLayerProtocolName(nepProtocol)
719             .setName(nepNames);
720         onepBldr.setSupportedCepLayerProtocolQualifierInstances(createSupportedCepLayerProtocolQualifier(sicColl,
721                 nepProtocol))
722             .setDirection(Direction.BIDIRECTIONAL)
723             .setLinkPortRole(PortRole.SYMMETRIC)
724             .setAdministrativeState(adminState)
725             .setOperationalState(operState)
726             .setLifecycleState(LifecycleState.INSTALLED);
727         if (withSip) {
728             onepBldr.setMappedServiceInterfacePoint(
729                 createMSIP(1, nepProtocol, oorTp.getTpId().getValue(), keyword, sicColl, operState, adminState));
730         }
731         return onepBldr.build();
732     }
733
734     private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, String tpId,
735         String nodeid, Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
736         OperationalState operState, AdministrativeState adminState) {
737     // TODO: what value should be set in total capacity and available capacity??
738     // LOG.info("SIP name = {}", String.join("+", nodeid, tp.getTpId().getValue()));
739         Name sipName = new NameBuilder()
740             .setValueName("SIP name")
741             .setValue(String.join("+", nodeid, tpId))
742             .build();
743
744         return new ServiceInterfacePointBuilder()
745             .setUuid(sipUuid)
746             .setName(Map.of(sipName.key(), sipName))
747             .setLayerProtocolName(layerProtocol)
748             .setAdministrativeState(adminState)
749             .setOperationalState(operState)
750             .setLifecycleState(LifecycleState.INSTALLED)
751             .setAvailableCapacity(new AvailableCapacityBuilder().build())
752             .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
753             .setSupportedCepLayerProtocolQualifierInstances(createSipSupportedLayerProtocolQualifier(
754                 supportedInterfaceCapability, layerProtocol))
755             .build();
756     }
757
758     private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
759             .service._interface.point.SupportedCepLayerProtocolQualifierInstances>
760             createSipSupportedLayerProtocolQualifier(
761             Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
762             LayerProtocolName lpn) {
763         List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
764             .service._interface.point.SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
765         if (supportedInterfaceCapability == null) {
766             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
767                 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
768                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
769                 .setNumberOfCepInstances(Uint64.valueOf(1))
770                 .build());
771             return sclpqiList;
772         }
773         for (SupportedInterfaceCapability sic : supportedInterfaceCapability) {
774             String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
775             switch (lpn.getName()) {
776                 case "ETH":
777                 case "DSR":
778                     switch (ifCapType) {
779                         // TODO: it may be needed to add more cases clauses if the interface capabilities of a
780                         //  port are extended in the config file
781                         case "If1GEODU0":
782                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
783                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
784                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
785                                 .setNumberOfCepInstances(Uint64.valueOf(0))
786                                 .build());
787                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
788                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
789                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
790                                 .setNumberOfCepInstances(Uint64.valueOf(0))
791                                 .build());
792                             break;
793                         case "If10GEODU2e":
794                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
795                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
796                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
797                                 .setNumberOfCepInstances(Uint64.valueOf(0))
798                                 .build());
799                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
800                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
801                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
802                                 .setNumberOfCepInstances(Uint64.valueOf(0))
803                                 .build());
804                             break;
805                         case "If10GEODU2":
806                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
807                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
808                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
809                                 .setNumberOfCepInstances(Uint64.valueOf(0))
810                                 .build());
811                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
812                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
813                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
814                                 .setNumberOfCepInstances(Uint64.valueOf(0))
815                                 .build());
816                             break;
817                         case "If10GE":
818                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
819                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
820                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
821                                 .setNumberOfCepInstances(Uint64.valueOf(0))
822                                 .build());
823                             break;
824                         case "If100GEODU4":
825                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
826                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
827                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
828                                 .setNumberOfCepInstances(Uint64.valueOf(0))
829                                 .build());
830                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
831                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
832                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
833                                 .setNumberOfCepInstances(Uint64.valueOf(0))
834                                 .build());
835                             break;
836                         case "If100GE":
837                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
838                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
839                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
840                                 .setNumberOfCepInstances(Uint64.valueOf(0))
841                                 .build());
842                             break;
843                         case "IfOCHOTU4ODU4":
844                         case "IfOCH":
845                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
846                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
847                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
848                                 .setNumberOfCepInstances(Uint64.valueOf(0))
849                                 .build());
850                             break;
851                         default:
852                             LOG.error("IfCapability type not managed");
853                             break;
854                     }
855                     break;
856                 case "ODU":
857                     switch (ifCapType) {
858                         // TODO: it may be needed to add more cases clauses if the interface capabilities of a
859                         //  port are extended in the config file
860                         case "If1GEODU0":
861                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
862                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
863                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
864                                 .setNumberOfCepInstances(Uint64.valueOf(0))
865                                 .build());
866                             break;
867                         case "If10GEODU2e":
868                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
869                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
870                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
871                                 .setNumberOfCepInstances(Uint64.valueOf(0))
872                                 .build());
873                             break;
874                         case "If10GEODU2":
875                         case "If10GE":
876                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
877                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
878                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
879                                 .setNumberOfCepInstances(Uint64.valueOf(0))
880                                 .build());
881                             break;
882                         case "If100GEODU4":
883                         case "If100GE":
884                         case "IfOCHOTU4ODU4":
885                         case "IfOCH":
886                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
887                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
888                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
889                                 .setNumberOfCepInstances(Uint64.valueOf(0))
890                                 .build());
891                             break;
892                         default:
893                             LOG.error("IfCapability type not managed");
894                             break;
895                     }
896                     break;
897                 case "PHOTONIC_MEDIA":
898                     if (ifCapType.equals("IfOCHOTU4ODU4") || ifCapType.equals("IfOCH")) {
899                         sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
900                                 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
901                             .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
902                             .setNumberOfCepInstances(Uint64.valueOf(0))
903                             .build());
904                         sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
905                             .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
906                                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
907                             .setNumberOfCepInstances(Uint64.valueOf(0))
908                             .build());
909                     }
910                     break;
911                 default:
912                     LOG.error("Layer Protocol Name is unknown");
913                     break;
914             }
915         }
916         return sclpqiList.stream().distinct().toList();
917     }
918
919     public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
920             getTapiNodes() {
921         return tapiNodes;
922     }
923
924     public Map<LinkKey, Link> getTapiLinks() {
925         return tapiLinks;
926     }
927
928     public AdministrativeState transformAsToTapiAdminState(String adminState) {
929         if (adminState == null) {
930             return null;
931         }
932         return adminState.equals(AdminStates.InService.getName())
933             || adminState.equals(AdministrativeState.UNLOCKED.getName()) ? AdministrativeState.UNLOCKED
934                 : AdministrativeState.LOCKED;
935     }
936
937     public OperationalState transformOsToTapiOperationalState(String operState) {
938         if (operState == null) {
939             return null;
940         }
941         return operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
942             ? OperationalState.ENABLED : OperationalState.DISABLED;
943     }
944
945     public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
946         return tapiSips;
947     }
948
949     public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
950         this.tapiSips.putAll(tapiSip);
951     }
952
953 }