Refactor TAPI ConvertORToTapiTopology
[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.math.RoundingMode;
11 import java.nio.charset.Charset;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Set;
19 import java.util.UUID;
20 import java.util.stream.Collectors;
21 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
22 import org.opendaylight.transportpce.tapi.TapiStringConstants;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
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.rev230526.networks.network.node.termination.point.PpAttributes;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.AvailableCapacityBuilder;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.TotalPotentialCapacityBuilder;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.payload.structure.CapacityBuilder;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointBuilder;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU0;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2E;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU4;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODUCN;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.OTUTYPEOTUCN;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE100GigE;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE10GigELAN;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPEGigE;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSi;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.context.topology.context.topology.node.owned.node.edge.point.PhotonicMediaNodeEdgePointSpecBuilder;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.photonic.media.node.edge.point.spec.SpectrumCapabilityPacBuilder;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrum;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrumBuilder;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrumKey;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrumBuilder;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrumKey;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrumBuilder;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrumKey;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.AvailablePayloadStructure;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.AvailablePayloadStructureBuilder;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointBuilder;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointKey;
92 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
93 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
94 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedPayloadStructure;
95 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedPayloadStructureBuilder;
96 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
97 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
98 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
99 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
100 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
101 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
102 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
103 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
104 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
105 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
106 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
107 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
108 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
109 import org.opendaylight.yangtools.yang.common.Decimal64;
110 import org.opendaylight.yangtools.yang.common.Uint16;
111 import org.opendaylight.yangtools.yang.common.Uint64;
112 import org.slf4j.Logger;
113 import org.slf4j.LoggerFactory;
114
115
116 public class ConvertORToTapiTopology {
117
118     private static final Logger LOG = LoggerFactory.getLogger(ConvertORToTapiTopology.class);
119     private String ietfNodeId;
120     private OpenroadmNodeType ietfNodeType;
121     private AdminStates ietfNodeAdminState;
122     private State ietfNodeOperState;
123     private List<TerminationPoint> oorClientPortList;
124     private List<TerminationPoint> oorNetworkPortList;
125     private OduSwitchingPools oorOduSwitchingPool;
126     private Uuid tapiTopoUuid;
127     private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
128         tapiNodes;
129     private Map<LinkKey, Link> tapiLinks;
130     private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
131     private Map<String, Uuid> uuidMap;
132
133
134     public ConvertORToTapiTopology(Uuid tapiTopoUuid) {
135         this.tapiTopoUuid = tapiTopoUuid;
136         this.tapiNodes = new HashMap<>();
137         this.tapiLinks = new HashMap<>();
138         this.uuidMap = new HashMap<>();
139         this.tapiSips = new HashMap<>();
140     }
141
142     public void convertNode(Node ietfNode, List<String> networkPorts) {
143         this.ietfNodeId = ietfNode.getNodeId().getValue();
144         var ietfAug =
145             ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class);
146         if (ietfAug == null) {
147             return;
148         }
149         this.ietfNodeType = ietfAug.getNodeType();
150         this.ietfNodeAdminState = ietfAug.getAdministrativeState();
151         this.ietfNodeOperState = ietfAug.getOperationalState();
152         var ietfAugTopo =
153             ietfNode.augmentation(
154                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class);
155         this.oorNetworkPortList = ietfAugTopo.getTerminationPoint().values().stream()
156             .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
157                     == OpenroadmTpType.XPONDERNETWORK.getIntValue()
158                 && networkPorts.contains(tp.getTpId().getValue()))
159             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
160             .collect(Collectors.toList());
161         if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
162             this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
163             List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
164                 .flatMap(nbl -> nbl.getTpList().stream())
165                 .collect(Collectors.toList());
166             this.oorClientPortList = ietfAugTopo.getTerminationPoint().values().stream()
167                 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
168                         == OpenroadmTpType.XPONDERCLIENT.getIntValue()
169                     && tpList.contains(tp.getTpId()))
170                 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
171                 .collect(Collectors.toList());
172             this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
173         } else {
174             this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
175                 .values().stream().findFirst().orElseThrow();
176             this.oorClientPortList = ietfAugTopo.getTerminationPoint().values().stream()
177                 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
178                     == OpenroadmTpType.XPONDERCLIENT.getIntValue())
179                 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
180                 .collect(Collectors.toList());
181         }
182
183         // node creation [DSR/ODU] ([DSR/ODU] and OTSI merged in R 2.4.X)
184         LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
185         String nodeIdXpdr = String.join("+", this.ietfNodeId, TapiStringConstants.XPDR);
186         this.uuidMap.put(nodeIdXpdr,
187                 //nodeUuid
188                 new Uuid(UUID.nameUUIDFromBytes(nodeIdXpdr.getBytes(Charset.forName("UTF-8"))).toString()));
189         Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(nodeIdXpdr).build();
190         Name namePhot = new NameBuilder().setValueName("otsi node name").setValue(nodeIdXpdr).build();
191         Name nameNodeType = new NameBuilder().setValueName("Node Type").setValue(this.ietfNodeType.getName()).build();
192         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
193                 .topology.Node dsrNode =
194             createTapiNode(
195                 Map.of(nameDsr.key(), nameDsr, namePhot.key(), namePhot,nameNodeType.key(), nameNodeType),
196                 //dsrLayerProtocols
197                 Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
198                        LayerProtocolName.DIGITALOTN, LayerProtocolName.PHOTONICMEDIA));
199         LOG.debug("XPDR Node {} should have {} NEPs and SIPs",
200             this.ietfNodeId, this.oorClientPortList.size() + this.oorNetworkPortList.size());
201         LOG.info("XPDR Node {} has {} NEPs and {} SIPs",
202             this.ietfNodeId,
203             dsrNode.getOwnedNodeEdgePoint().values().size(),
204             dsrNode.getOwnedNodeEdgePoint().values().stream()
205                 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
206         tapiNodes.put(dsrNode.key(), dsrNode);
207     }
208
209     public Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(
210             String topoType, Uuid nodeUuid, String orNodeId, Collection<OwnedNodeEdgePoint> onepl) {
211         Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
212             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
213                 nepMap = new HashMap<>();
214         for (OwnedNodeEdgePoint onep : onepl) {
215             var nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
216                     .node.rule.group.NodeEdgePointBuilder()
217                 .setTopologyUuid(tapiTopoUuid)
218                 .setNodeUuid(nodeUuid)
219                 .setNodeEdgePointUuid(onep.key().getUuid())
220                 .build();
221             nepMap.put(nep.key(), nep);
222         }
223         Rule rule = new RuleBuilder()
224             .setLocalId("forward")
225             .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
226             .setRuleType(new HashSet<>(Set.of(RuleType.FORWARDING)))
227             .build();
228         NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
229             .setUuid(new Uuid(UUID.nameUUIDFromBytes((
230                     topoType.equals("Abstracted") ? "rdm infra node rule group" : orNodeId + " node rule group")
231                 .getBytes(Charset.forName("UTF-8"))).toString()))
232             .setRule(new HashMap<>(Map.of(rule.key(), rule)))
233             .setNodeEdgePoint(nepMap)
234             .build();
235         return new HashMap<>(Map.of(nodeRuleGroup.key(), nodeRuleGroup));
236     }
237
238     public Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createMSIP(
239             int nb, LayerProtocolName layerProtocol, String tpId, String nodeid,
240             Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
241             OperationalState operState, AdministrativeState adminState) {
242         // add them to SIP context
243         Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
244         for (int i = 0; i < nb; i++) {
245             String sipName =
246                 nb == 1
247                     ? String.join("+", "SIP", nodeid, tpId)
248                     : String.join("+", "SIP", nodeid, tpId, "Nber", String.valueOf(i));
249             LOG.info("SIP = {}", sipName);
250             Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes(sipName.getBytes(Charset.forName("UTF-8"))).toString());
251             MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
252                 .setServiceInterfacePointUuid(sipUuid)
253                 .build();
254             ServiceInterfacePoint sip =
255                 createSIP(sipUuid, layerProtocol, tpId, nodeid, supportedInterfaceCapability, operState, adminState);
256             this.tapiSips.put(sip.key(), sip);
257             msipl.put(msip.key(), msip);
258             LOG.debug("SIP created {}", sip.getUuid());
259             LOG.debug("This SIP corresponds to SIP+nodeId {} + TpId {}", nodeid, tpId);
260         }
261         return msipl;
262     }
263
264     public List<AvailablePayloadStructure> createAvailablePayloadStructureForPhtncMedia(
265             Boolean otsiProvisioned,
266             Collection<SupportedInterfaceCapability> sicList,
267             List<OperationalModeKey> supportedOpModes) {
268         if (supportedOpModes == null || supportedOpModes.isEmpty()) {
269             return null;
270         }
271         Integer nepRate = 0;
272         Integer loopRate = 0;
273         for (OperationalModeKey operationalMode : supportedOpModes) {
274             if (operationalMode.toString().contains("800G")) {
275                 loopRate = 8;
276             } else if (operationalMode.toString().contains("600G")) {
277                 loopRate = 6;
278             } else if (operationalMode.toString().contains("400G")) {
279                 loopRate = 4;
280             } else if (operationalMode.toString().contains("300G")) {
281                 loopRate = 3;
282             } else if (operationalMode.toString().contains("200G")) {
283                 loopRate = 2;
284             } else if (operationalMode.toString().contains("100G")) {
285                 loopRate = 1;
286             }
287             if (loopRate >= nepRate) {
288                 nepRate = loopRate;
289             }
290         }
291         List<AvailablePayloadStructure> aps = new ArrayList<>();
292         Integer cepInstanceNber = otsiProvisioned ? 0 : 1;
293         for (SupportedInterfaceCapability sic : sicList) {
294             switch (sic.getIfCapType().toString().split("\\{")[0]) {
295                 case "IfOCHOTU4ODU4":
296                 case "IfOCHOTU4ODU4Regen":
297                 case "IfOCHOTU4ODU4Uniregen":
298                     aps.add(new AvailablePayloadStructureBuilder()
299                         .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, ODUTYPEODU4.VALUE))
300                         .setNumberOfCepInstances(Uint64.valueOf(cepInstanceNber))
301                         .setCapacity(
302                             new CapacityBuilder()
303                                 .setUnit(CAPACITYUNITGBPS.VALUE)
304                                 .setValue(Decimal64.valueOf(100.0 * cepInstanceNber, RoundingMode.DOWN))
305                                 .build())
306                         .build());
307                     break;
308                 case "IfOCHOTUCnODUCn":
309                 case "IfOtsiOtucnOducn":
310                 case "IfOCHOTUCnODUCnRegen":
311                 case "IfOCHOTUCnODUCnUniregen":
312                     aps.add(new AvailablePayloadStructureBuilder()
313                         .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, OTUTYPEOTUCN.VALUE,
314                             ODUTYPEODUCN.VALUE, ODUTYPEODU4.VALUE))
315                         .setNumberOfCepInstances(Uint64.valueOf(nepRate * cepInstanceNber))
316                         .setCapacity(
317                             new CapacityBuilder()
318                                 .setUnit(CAPACITYUNITGBPS.VALUE)
319                                 .setValue(Decimal64.valueOf(nepRate * 100.0 * cepInstanceNber, RoundingMode.DOWN))
320                                 .build())
321                         .build());
322                     break;
323                 default:
324                     break;
325             }
326         }
327         return aps.stream().distinct().toList();
328     }
329
330     public List<SupportedPayloadStructure> createSupportedPayloadStructureForPhtncMedia(
331             Collection<SupportedInterfaceCapability> sicList, List<OperationalModeKey> supportedOpModes) {
332         if (supportedOpModes == null || supportedOpModes.isEmpty()) {
333             return null;
334         }
335         Integer nepRate = 0;
336         Integer loopRate = 0;
337         for (OperationalModeKey operationalMode : supportedOpModes) {
338             if (operationalMode.toString().contains("800G")) {
339                 loopRate = 8;
340             } else if (operationalMode.toString().contains("600G")) {
341                 loopRate = 6;
342             } else if (operationalMode.toString().contains("400G")) {
343                 loopRate = 4;
344             } else if (operationalMode.toString().contains("300G")) {
345                 loopRate = 3;
346             } else if (operationalMode.toString().contains("200G")) {
347                 loopRate = 2;
348             } else if (operationalMode.toString().contains("100G")) {
349                 loopRate = 1;
350             }
351             if (loopRate >= nepRate) {
352                 nepRate = loopRate;
353             }
354         }
355         List<SupportedPayloadStructure> sps = new ArrayList<>();
356         for (SupportedInterfaceCapability sic : sicList) {
357             String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
358             switch (ifCapType) {
359                 case "IfOCHOTU4ODU4":
360                 case "IfOCHOTU4ODU4Regen":
361                 case "IfOCHOTU4ODU4Uniregen":
362                     sps.add(new SupportedPayloadStructureBuilder()
363                         .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, ODUTYPEODU4.VALUE))
364                         .setNumberOfCepInstances(Uint64.valueOf(1))
365                         .setCapacity(
366                             new CapacityBuilder()
367                                 .setUnit(CAPACITYUNITGBPS.VALUE)
368                                 .setValue(Decimal64.valueOf(100.0, RoundingMode.DOWN))
369                                 .build())
370                         .build());
371                     break;
372                 case "IfOCHOTUCnODUCn":
373                 case "IfOtsiOtucnOducn":
374                 case "IfOCHOTUCnODUCnRegen":
375                 case "IfOCHOTUCnODUCnUniregen":
376                     sps.add(new SupportedPayloadStructureBuilder()
377                         .setMultiplexingSequence(Set.of(
378                             PHOTONICLAYERQUALIFIEROTSi.VALUE, OTUTYPEOTUCN.VALUE,
379                             ODUTYPEODUCN.VALUE, ODUTYPEODU4.VALUE))
380                         .setNumberOfCepInstances(Uint64.valueOf(nepRate))
381                         .setCapacity(
382                             new CapacityBuilder()
383                                 .setUnit(CAPACITYUNITGBPS.VALUE)
384                                 .setValue(Decimal64.valueOf(nepRate * 100.0, RoundingMode.DOWN))
385                                 .build())
386                         .build());
387                     break;
388                 default:
389                     break;
390             }
391         }
392         return sps.stream().distinct().toList();
393     }
394
395     @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "SF_SWITCH_FALLTHROUGH",
396         justification = "Voluntarily No break in switchcase where comment is inserted in following method")
397     public List<SupportedCepLayerProtocolQualifierInstances> createSupportedCepLayerProtocolQualifier(
398             Collection<SupportedInterfaceCapability> sicList, LayerProtocolName lpn) {
399         if (sicList == null) {
400             return new ArrayList<>(List.of(
401                 new SupportedCepLayerProtocolQualifierInstancesBuilder()
402                     .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
403                     .setNumberOfCepInstances(Uint64.valueOf(1))
404                     .build()));
405         }
406         LOG.debug("SIC list = {}", sicList);
407         List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
408         for (SupportedInterfaceCapability sic : sicList) {
409             String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
410             switch (lpn.getName()) {
411                 case "ETH":
412                 case "DSR":
413                     switch (ifCapType) {
414                         case "If1GEODU0":
415                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
416                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
417                                 .setNumberOfCepInstances(Uint64.valueOf(1))
418                                 .build());
419                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
420                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
421                                 .setNumberOfCepInstances(Uint64.valueOf(1))
422                                 .build());
423                             break;
424                         case "If10GEODU2e":
425                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
426                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
427                                 .setNumberOfCepInstances(Uint64.valueOf(1))
428                                 .build());
429                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
430                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
431                                 .setNumberOfCepInstances(Uint64.valueOf(1))
432                                 .build());
433                             break;
434                         case "If10GEODU2":
435                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
436                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
437                                 .setNumberOfCepInstances(Uint64.valueOf(1))
438                                 .build());
439                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
440                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
441                                 .setNumberOfCepInstances(Uint64.valueOf(1))
442                                 .build());
443                             break;
444                         case "If10GE":
445                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
446                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
447                                 .setNumberOfCepInstances(Uint64.valueOf(1))
448                                 .build());
449                             break;
450                         case "If100GEODU4":
451                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
452                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
453                                 .setNumberOfCepInstances(Uint64.valueOf(1))
454                                 .build());
455                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
456                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
457                                 .setNumberOfCepInstances(Uint64.valueOf(1))
458                                 .build());
459                             break;
460                         case "If100GE":
461                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
462                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
463                                 .setNumberOfCepInstances(Uint64.valueOf(1))
464                                 .build());
465                             break;
466                         case "IfOCHOTU4ODU4":
467                         case "IfOCH":
468                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
469                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
470                                 .setNumberOfCepInstances(Uint64.valueOf(1))
471                                 .build());
472                             break;
473                         default:
474                             LOG.error("IfCapability type not managed");
475                             break;
476                     }
477                     break;
478                 case "ODU":
479                     switch (ifCapType) {
480                         case "If1GEODU0":
481                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
482                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
483                                 .setNumberOfCepInstances(Uint64.valueOf(1))
484                                 .build());
485                             break;
486                         case "If10GEODU2e":
487                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
488                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
489                                 .setNumberOfCepInstances(Uint64.valueOf(1))
490                                 .build());
491                             break;
492                         case "If10GEODU2":
493                         case "If10GE":
494                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
495                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
496                                 .setNumberOfCepInstances(Uint64.valueOf(1))
497                                 .build());
498                             break;
499                         case "If100GEODU4":
500                         case "If100GE":
501                         case "IfOCHOTU4ODU4":
502                         case "IfOCH":
503                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
504                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
505                                 .setNumberOfCepInstances(Uint64.valueOf(1))
506                                 .build());
507                             break;
508                         default:
509                             LOG.error("IfCapability type not managed");
510                             break;
511                     }
512                     break;
513                 case "PHOTONIC_MEDIA":
514                     switch (ifCapType) {
515                         case "IfOCHOTUCnODUCn":
516                         case "IfOtsiOtucnOducn":
517                         case "IfOCHOTUCnODUCnRegen":
518                         case "IfOCHOTUCnODUCnUniregen":
519                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
520                                 .setLayerProtocolQualifier(ODUTYPEODUCN.VALUE)
521                                 .setNumberOfCepInstances(Uint64.valueOf(1))
522                                 .build());
523                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
524                                 .setLayerProtocolQualifier(OTUTYPEOTUCN.VALUE)
525                                 .setNumberOfCepInstances(Uint64.valueOf(1))
526                                 .build());
527                         //fallthrough
528                         case "IfOCH":
529                         case "IfOCHOTU4ODU4":
530                         case "IfOCHOTU4ODU4Regen":
531                         case "IfOCHOTU4ODU4Uniregen":
532                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
533                                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
534                                 .setNumberOfCepInstances(Uint64.valueOf(1))
535                                 .build());
536                             sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
537                                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
538                                 .setNumberOfCepInstances(Uint64.valueOf(1))
539                                 .build());
540                             break;
541                         default:
542                             break;
543                     }
544                     break;
545                 default:
546                     LOG.error("Layer Protocol Name is unknown {}", lpn.getName());
547                     break;
548             }
549         }
550         return sclpqiList.stream().distinct().toList();
551     }
552
553     public Map<Double, Double> getXpdrUsedWavelength(TerminationPoint tp) {
554         var tpAug = tp.augmentation(
555             org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
556         if (tpAug == null || tpAug.getXpdrNetworkAttributes() == null) {
557             return null;
558         }
559         var xnattWvlgth = tpAug.getXpdrNetworkAttributes().getWavelength();
560         return xnattWvlgth == null || xnattWvlgth.getFrequency() == null || xnattWvlgth.getWidth() == null
561             ? null
562             : new HashMap<>(Map.of(
563                 xnattWvlgth.getFrequency().getValue().doubleValue(),
564                 xnattWvlgth.getWidth().getValue().doubleValue()));
565     }
566
567     public Map<Double, Double> getPPUsedWavelength(TerminationPoint tp) {
568         PpAttributes ppAtt = tp.augmentation(
569                 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class)
570             .getPpAttributes();
571         return ppAtt == null || ppAtt.getUsedWavelength() == null
572                 || ppAtt.getUsedWavelength().entrySet().iterator().next() == null
573             ? null
574             : new HashMap<>(Map.of(
575             ppAtt.getUsedWavelength().entrySet().iterator().next().getValue().getFrequency().getValue().doubleValue(),
576             ppAtt.getUsedWavelength().entrySet().iterator().next().getValue().getFrequency().getValue().doubleValue()));
577     }
578
579     public OwnedNodeEdgePointBuilder addPayloadStructureAndPhotSpecToOnep(
580             String nodeId, Map<Double, Double> freqWidthMap, List<OperationalModeKey> operModeList,
581             Collection<SupportedInterfaceCapability> sicColl, OwnedNodeEdgePointBuilder onepBldr, String keyword) {
582         if (!String.join("+", nodeId, TapiStringConstants.OTSI_MC).equals(keyword)
583                 && !String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS).equals(keyword)) {
584             return onepBldr;
585         }
586         //Creating OTS & OTSI_MC NEP specific attributes
587         double naz = 0.01;
588         Uint64 supLoFreq = Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09 + naz));
589         Uint64 supUpFreq = Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09
590                 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06 + naz));
591         boolean boolParam;
592         Uint64 upFreq;
593         Uint64 loFreq;
594         SpectrumCapabilityPacBuilder spectrumPac = new SpectrumCapabilityPacBuilder();
595         if (freqWidthMap == null || freqWidthMap.isEmpty()) {
596             upFreq = Uint64.valueOf(0);
597             loFreq = Uint64.valueOf(0);
598             boolParam = false;
599             AvailableSpectrum  aspec =
600                 new AvailableSpectrumBuilder().setUpperFrequency(supUpFreq).setLowerFrequency(supLoFreq).build();
601             spectrumPac.setAvailableSpectrum(new HashMap<>(Map.of(
602                 new AvailableSpectrumKey(aspec.getLowerFrequency(), aspec.getUpperFrequency()), aspec)));
603         } else {
604             upFreq = Uint64.valueOf(Math.round(
605                     freqWidthMap.keySet().iterator().next().doubleValue() * 1E09
606                     + (freqWidthMap.entrySet().iterator().next().getValue().doubleValue() * 1E06) / 2));
607             loFreq = Uint64.valueOf(Math.round(
608                     freqWidthMap.keySet().iterator().next().doubleValue() * 1E09
609                     - (freqWidthMap.entrySet().iterator().next().getValue().doubleValue() * 1E06) / 2));
610             boolParam = true;
611         }
612         return onepBldr
613             .setSupportedPayloadStructure(createSupportedPayloadStructureForPhtncMedia(sicColl, operModeList))
614             .setAvailablePayloadStructure(createAvailablePayloadStructureForPhtncMedia(boolParam, sicColl,operModeList))
615             .addAugmentation(
616                 new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121
617                         .OwnedNodeEdgePoint1Builder()
618                     .setPhotonicMediaNodeEdgePointSpec(
619                         new PhotonicMediaNodeEdgePointSpecBuilder()
620                             .setSpectrumCapabilityPac(
621                                 spectrumPac
622                                     .setOccupiedSpectrum(new HashMap<>(Map.of(
623                                         new OccupiedSpectrumKey(loFreq, upFreq),
624                                         new OccupiedSpectrumBuilder()
625                                             .setUpperFrequency(upFreq)
626                                             .setLowerFrequency(loFreq)
627                                             .build())))
628                                     .setSupportableSpectrum(new HashMap<>(Map.of(
629                                         new SupportableSpectrumKey(supLoFreq, supUpFreq),
630                                         new SupportableSpectrumBuilder()
631                                             .setUpperFrequency(supUpFreq)
632                                             .setLowerFrequency(supLoFreq)
633                                             .build())))
634                                     .build())
635                             .build())
636                     .build());
637     }
638
639     private OduSwitchingPools createOduSwitchingPoolForTp100G() {
640         Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
641         int count = 1;
642         for (TerminationPoint tp : this.oorNetworkPortList) {
643             NonBlockingList nbl = new NonBlockingListBuilder()
644                 .setNblNumber(Uint16.valueOf(count))
645                 .setTpList(new HashSet<>(Set.of(
646                     tp.getTpId(),
647                     tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
648                             .TerminationPoint1.class)
649                         .getAssociatedConnectionMapTp().iterator().next())))
650                 .build();
651             nblMap.put(nbl.key(), nbl);
652             count++;
653         }
654         return new OduSwitchingPoolsBuilder()
655             .setNonBlockingList(nblMap)
656             .setSwitchingPoolNumber(Uint16.valueOf(1))
657             .build();
658     }
659
660     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node createTapiNode(
661             Map<NameKey, Name> nodeNames, Set<LayerProtocolName> layerProtocols) {
662         Uuid nodeUuid = null;
663         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
664         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
665         if (layerProtocols.contains(LayerProtocolName.DSR)
666                 || layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
667             Rule rule = new RuleBuilder()
668                 .setLocalId("forward")
669                 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
670                 .setRuleType(new HashSet<>(Set.of(RuleType.FORWARDING)))
671                 .build();
672             nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, new HashMap<>(Map.of(rule.key(), rule)));
673         } else {
674             LOG.error("Undefined LayerProtocolName for {} node {}",
675                 nodeNames.get(nodeNames.keySet().iterator().next()).getValueName(),
676                 nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
677         }
678      // Empty random creation of mandatory fields for avoiding errors....
679         CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
680             .setCostAlgorithm("Restricted Shortest Path - RSP")
681             .setCostName("HOP_COUNT")
682             .setCostValue(TapiStringConstants.COST_HOP_VALUE)
683             .build();
684         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
685             .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
686             .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
687             .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
688             .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
689             .setTrafficPropertyName("FIXED_LATENCY")
690             .build();
691         RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
692             .setRiskCharacteristicName("risk characteristic")
693             .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
694             .build();
695         return new NodeBuilder()
696             .setUuid(nodeUuid)
697             .setName(nodeNames)
698             .setLayerProtocolName(layerProtocols)
699             .setAdministrativeState(transformAsToTapiAdminState(this.ietfNodeAdminState.getName()))
700             .setOperationalState(transformOsToTapiOperationalState(this.ietfNodeOperState.getName()))
701             .setLifecycleState(LifecycleState.INSTALLED)
702             .setOwnedNodeEdgePoint(onepl)
703             .setNodeRuleGroup(nodeRuleGroupList)
704             .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
705             .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
706             .setRiskParameterPac(
707                 new RiskParameterPacBuilder()
708                     .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
709                     .build())
710             .setErrorCharacteristic("error")
711             .setLossCharacteristic("loss")
712             .setRepeatDeliveryCharacteristic("repeat delivery")
713             .setDeliveryOrderCharacteristic("delivery order")
714             .setUnavailableTimeCharacteristic("unavailable time")
715             .setServerIntegrityProcessCharacteristic("server integrity process")
716             .build();
717     }
718
719     private Uuid getNodeUuid4Dsr(
720             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
721             Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList,
722             Map<RuleKey, Rule> ruleList) {
723         // client NEP DSR creation on DSR/ODU node
724         for (int i = 0; i < oorClientPortList.size(); i++) {
725             String nodeIdDsr = String.join("+",
726                 this.ietfNodeId, TapiStringConstants.DSR, oorClientPortList.get(i).getTpId().getValue());
727             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(nodeIdDsr.getBytes(Charset.forName("UTF-8"))).toString());
728             LOG.info("NEP = {} has Uuid {} ", nodeIdDsr, nepUuid);
729             this.uuidMap.put(nodeIdDsr, nepUuid);
730             Name name = new NameBuilder()
731                 .setValue(nodeIdDsr)
732                 .setValueName(OpenroadmNodeType.TPDR.equals(this.ietfNodeType) ? "100G-tpdr" : "NodeEdgePoint_C")
733                 .build();
734             OwnedNodeEdgePoint onep = createNep(
735                 oorClientPortList.get(i),
736                 Map.of(name.key(), name),
737                 LayerProtocolName.DSR, LayerProtocolName.DSR, true,
738                 String.join("+", this.ietfNodeId, TapiStringConstants.DSR));
739             onepl.put(onep.key(), onep);
740         }
741         // CLIENT NEP E_ODU creation on DSR/ODU node
742         for (int i = 0; i < oorClientPortList.size(); i++) {
743             String nodeIdEodu = String.join("+",
744                 this.ietfNodeId, TapiStringConstants.E_ODU, oorClientPortList.get(i).getTpId().getValue());
745             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(nodeIdEodu.getBytes(Charset.forName("UTF-8"))).toString());
746             LOG.info("NEP = {} has Uuid {} ", nodeIdEodu, nepUuid1);
747             this.uuidMap.put(nodeIdEodu, nepUuid1);
748             Name onedName = new NameBuilder()
749                 .setValueName("eNodeEdgePoint_N")
750                 .setValue(nodeIdEodu)
751                 .build();
752             OwnedNodeEdgePoint onep = createNep(
753                 oorClientPortList.get(i),
754                 Map.of(onedName.key(), onedName),
755                 LayerProtocolName.ODU, LayerProtocolName.DSR, false,
756                 String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU));
757             onepl.put(onep.key(), onep);
758         }
759         // NETWORK NEPs I_ODU creation on DSR/ODU node
760         for (int i = 0; i < oorNetworkPortList.size(); i++) {
761             String nodeIdIodu = String.join("+",
762                 this.ietfNodeId, TapiStringConstants.I_ODU, oorNetworkPortList.get(i).getTpId().getValue());
763             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(nodeIdIodu.getBytes(Charset.forName("UTF-8"))).toString());
764             LOG.info("NEP = {} has Uuid {} ", nodeIdIodu, nepUuid1);
765             this.uuidMap.put(nodeIdIodu, nepUuid1);
766             Name onedName = new NameBuilder()
767                 .setValueName("iNodeEdgePoint_N")
768                 .setValue(nodeIdIodu)
769                 .build();
770             OwnedNodeEdgePoint onep = createNep(
771                 oorNetworkPortList.get(i),
772                 Map.of(onedName.key(), onedName),
773                 LayerProtocolName.ODU, LayerProtocolName.DSR, true,
774                 String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU));
775             onepl.put(onep.key(), onep);
776         }
777         // NETWORK NEP OTS network on DSR/ODU node
778         for (int i = 0; i < oorNetworkPortList.size(); i++) {
779             String nodeIdPmOts = String.join("+",
780                 this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, oorNetworkPortList.get(i).getTpId().getValue());
781             Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(nodeIdPmOts.getBytes(Charset.forName("UTF-8"))).toString());
782             LOG.info("NEP = {} has Uuid {} ", nodeIdPmOts, nepUuid2);
783             this.uuidMap.put(nodeIdPmOts, nepUuid2);
784             Name onedName = new NameBuilder()
785                 .setValueName("eNodeEdgePoint")
786                 .setValue(nodeIdPmOts)
787                 .build();
788             OwnedNodeEdgePoint onep = createNep(
789                 oorNetworkPortList.get(i),
790                 Map.of(onedName.key(), onedName),
791                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
792                 String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS));
793             onepl.put(onep.key(), onep);
794         }
795         for (int i = 0; i < oorNetworkPortList.size(); i++) {
796             String nodeIdOtMc = String.join("+",
797                 this.ietfNodeId, TapiStringConstants.OTSI_MC, oorNetworkPortList.get(i).getTpId().getValue());
798             Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(nodeIdOtMc.getBytes(Charset.forName("UTF-8"))).toString());
799             LOG.info("NEP = {} has Uuid {} ", nodeIdOtMc, nepUuid3);
800             this.uuidMap.put(nodeIdOtMc, nepUuid3);
801             Name onedName = new NameBuilder()
802                 .setValueName("PhotMedNodeEdgePoint")
803                 .setValue(nodeIdOtMc)
804                 .build();
805             OwnedNodeEdgePoint onep = createNep(
806                 oorNetworkPortList.get(i),
807                 Map.of(onedName.key(), onedName),
808                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
809                 String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC));
810             onepl.put(onep.key(), onep);
811         }
812         // create NodeRuleGroup
813         int count = 1;
814         LOG.debug("ODU switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
815         String ietfXpdr = String.join("+", this.ietfNodeId, TapiStringConstants.XPDR);
816         for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
817             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
818                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
819                     nepList = new HashMap<>();
820             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
821                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
822                     oduNepList = new HashMap<>();
823             LOG.debug("UUidMap={}", this.uuidMap.keySet());
824             LOG.debug("TP list = {}", nbl.getTpList());
825             for (TpId tp : nbl.getTpList()) {
826                 LOG.debug("TP={}", tp.getValue());
827                 String ietfEoduTp = String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU, tp.getValue());
828                 LOG.debug("UuidKey={}", ietfEoduTp);
829                 String ietfIoduTp = String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU, tp.getValue());
830                 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, TapiStringConstants.DSR, tp.getValue()))
831                         || this.uuidMap.containsKey(ietfIoduTp)) {
832                     String qual = tp.getValue().contains("CLIENT")
833                         ? TapiStringConstants.DSR : TapiStringConstants.I_ODU;
834                     var nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
835                                 .node.rule.group.NodeEdgePointBuilder()
836                             .setTopologyUuid(tapiTopoUuid)
837                             .setNodeUuid(this.uuidMap.get(ietfXpdr))
838                             .setNodeEdgePointUuid(this.uuidMap.get(
839                                 String.join("+", this.ietfNodeId, qual, tp.getValue())))
840                             .build();
841                     nepList.put(nep.key(), nep);
842                 }
843                 if (this.uuidMap.containsKey(ietfEoduTp)) {
844                     var nep1 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
845                                 .node.rule.group.NodeEdgePointBuilder()
846                             .setTopologyUuid(tapiTopoUuid)
847                             .setNodeUuid(this.uuidMap.get(ietfXpdr))
848                             .setNodeEdgePointUuid(this.uuidMap.get(ietfEoduTp))
849                             .build();
850                     oduNepList.put(nep1.key(), nep1);
851                 }
852                 if (this.uuidMap.containsKey(ietfIoduTp)) {
853                 // TODO already checked with DSR above -> potential factorization ?
854                     var nep2 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
855                                 .node.rule.group.NodeEdgePointBuilder()
856                             .setTopologyUuid(tapiTopoUuid)
857                             .setNodeUuid(this.uuidMap.get(ietfXpdr))
858                             .setNodeEdgePointUuid(this.uuidMap.get(ietfIoduTp))
859                             .build();
860                     oduNepList.put(nep2.key(), nep2);
861                 }
862             }
863             LOG.debug("NEPLIST (DSR/I_ODU) of [dsr node rule group] is {}", nepList);
864             LOG.debug("NEPLIST (E_ODU/I_ODU) of [odu node rule group] is {}", nepList);
865             // Empty random creation of mandatory fields for avoiding errors....
866             CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
867                 .setCostAlgorithm("Restricted Shortest Path - RSP")
868                 .setCostName("HOP_COUNT")
869                 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
870                 .build();
871             LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
872                 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
873                 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
874                 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
875                 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
876                 .setTrafficPropertyName("FIXED_LATENCY")
877                 .build();
878             RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
879                 .setRiskCharacteristicName("risk characteristic")
880                 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
881                 .build();
882             NodeRuleGroup nodeRuleGroup1 = new NodeRuleGroupBuilder()
883                 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("dsr node rule group " + count)
884                     .getBytes(Charset.forName("UTF-8"))).toString()))
885                 .setRule(ruleList)
886                 .setNodeEdgePoint(nepList)
887                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
888                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
889                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
890                 .build();
891             nodeRuleGroupList.put(nodeRuleGroup1.key(), nodeRuleGroup1);
892             NodeRuleGroup nodeRuleGroup2 = new NodeRuleGroupBuilder()
893                 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("odu node rule group " + count)
894                     .getBytes(Charset.forName("UTF-8"))).toString()))
895                 .setRule(ruleList)
896                 .setNodeEdgePoint(oduNepList)
897                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
898                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
899                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
900                 .build();
901             nodeRuleGroupList.put(nodeRuleGroup2.key(), nodeRuleGroup2);
902             count++;
903         }
904         return this.uuidMap.get(ietfXpdr);
905     }
906
907     private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
908             LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
909         var tp1 = oorTp.augmentation(
910             org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1.class);
911         if (tp1.getTpSupportedInterfaces() == null) {
912             LOG.warn("Tp supported interface doesnt exist on TP {}", oorTp.getTpId().getValue());
913             return null;
914         }
915         AdministrativeState adminState =
916             oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() == null
917                 ? null
918                 : transformAsToTapiAdminState(
919                     oorTp.augmentation(TerminationPoint1.class).getAdministrativeState().getName());
920         OperationalState operState =
921             oorTp.augmentation(TerminationPoint1.class).getOperationalState() == null
922                 ? null
923                 : transformOsToTapiOperationalState(
924                     oorTp.augmentation(TerminationPoint1.class).getOperationalState().getName());
925         Collection<SupportedInterfaceCapability> sicColl =
926             tp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values();
927         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
928             .setUuid(this.uuidMap.get(String.join("+", keyword, oorTp.getTpId().getValue())))
929             .setLayerProtocolName(nepProtocol)
930             .setName(nepNames)
931             .setSupportedCepLayerProtocolQualifierInstances(
932                 createSupportedCepLayerProtocolQualifier(sicColl, nepProtocol))
933             .setDirection(Direction.BIDIRECTIONAL)
934             .setLinkPortRole(PortRole.SYMMETRIC)
935             .setAdministrativeState(adminState)
936             .setOperationalState(operState)
937             .setLifecycleState(LifecycleState.INSTALLED);
938         if (withSip) {
939             onepBldr.setMappedServiceInterfacePoint(
940                 createMSIP(1, nepProtocol, oorTp.getTpId().getValue(), keyword, sicColl, operState, adminState));
941         }
942         if (oorTp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
943             List<OperationalModeKey> opModeList = new ArrayList<>();
944             var tp11 = oorTp.augmentation(
945                 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
946             if (tp11 == null || tp11.getXpdrNetworkAttributes() == null) {
947                 for (SupportedInterfaceCapability sic : sicColl) {
948                     String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
949                     if (("IfOCHOTUCnODUCn").equals(ifCapType) || ("IfOCHOTUCnODUCnUniregen").equals(ifCapType)
950                             || ("IfOCHOTUCnODUCnRegen").equals(ifCapType)) {
951                         opModeList.add(new OperationalModeKey("400G"));
952                         LOG.warn(TopologyUtils.NOOPMODEDECLARED + "400G rate available", oorTp.getTpId());
953                         break;
954                     }
955                 }
956                 opModeList.add(new OperationalModeKey("100G"));
957                 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "100G rate available", oorTp.getTpId());
958             } else {
959                 opModeList = tp11.getXpdrNetworkAttributes().getSupportedOperationalModes().getOperationalMode()
960                     .keySet().stream().toList();
961             }
962             onepBldr = addPayloadStructureAndPhotSpecToOnep(
963                 this.ietfNodeId, getXpdrUsedWavelength(oorTp), opModeList, sicColl, onepBldr, keyword);
964         }
965         return onepBldr.build();
966     }
967
968     private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, String tpId,
969         String nodeid, Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
970         OperationalState operState, AdministrativeState adminState) {
971     // TODO: what value should be set in total capacity and available capacity??
972     // LOG.info("SIP name = {}", String.join("+", nodeid, tp.getTpId().getValue()));
973         Name sipName = new NameBuilder()
974             .setValueName("SIP name")
975             .setValue(String.join("+", nodeid, tpId))
976             .build();
977         return new ServiceInterfacePointBuilder()
978             .setUuid(sipUuid)
979             .setName(Map.of(sipName.key(), sipName))
980             .setLayerProtocolName(layerProtocol)
981             .setAdministrativeState(adminState)
982             .setOperationalState(operState)
983             .setLifecycleState(LifecycleState.INSTALLED)
984             .setAvailableCapacity(new AvailableCapacityBuilder().build())
985             .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
986             .setSupportedCepLayerProtocolQualifierInstances(createSipSupportedLayerProtocolQualifier(
987                 supportedInterfaceCapability, layerProtocol))
988             .build();
989     }
990
991     @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "SF_SWITCH_FALLTHROUGH",
992         justification = "Voluntarily No break in switchcase where comment is inserted in following method")
993     private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
994                 .service._interface.point.SupportedCepLayerProtocolQualifierInstances>
995              createSipSupportedLayerProtocolQualifier(
996                 Collection<SupportedInterfaceCapability> supportedInterfaceCapability, LayerProtocolName lpn) {
997         if (supportedInterfaceCapability == null) {
998             return new ArrayList<>(List.of(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
999                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1000                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
1001                 .setNumberOfCepInstances(Uint64.valueOf(1))
1002                 .build()));
1003         }
1004         List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1005             .service._interface.point.SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
1006         for (SupportedInterfaceCapability sic : supportedInterfaceCapability) {
1007             String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
1008             switch (lpn.getName()) {
1009                 case "ETH":
1010                 case "DSR":
1011                     switch (ifCapType) {
1012                         case "If1GEODU0":
1013                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1014                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1015                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
1016                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1017                                 .build());
1018                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1019                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1020                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
1021                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1022                                 .build());
1023                             break;
1024                         case "If10GEODU2e":
1025                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1026                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1027                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
1028                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1029                                 .build());
1030                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1031                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1032                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
1033                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1034                                 .build());
1035                             break;
1036                         case "If10GEODU2":
1037                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1038                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1039                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
1040                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1041                                 .build());
1042                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1043                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1044                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
1045                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1046                                 .build());
1047                             break;
1048                         case "If10GE":
1049                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1050                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1051                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
1052                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1053                                 .build());
1054                             break;
1055                         case "If100GEODU4":
1056                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1057                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1058                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
1059                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1060                                 .build());
1061                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1062                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1063                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
1064                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1065                                 .build());
1066                             break;
1067                         case "If100GE":
1068                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1069                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1070                                 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
1071                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1072                                 .build());
1073                             break;
1074                         case "IfOCHOTU4ODU4":
1075                         case "IfOCH":
1076                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1077                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1078                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
1079                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1080                                 .build());
1081                             break;
1082                         default:
1083                             LOG.error("IfCapability type not managed");
1084                             break;
1085                     }
1086                     break;
1087                 case "ODU":
1088                     switch (ifCapType) {
1089                         case "If1GEODU0":
1090                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1091                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1092                                 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
1093                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1094                                 .build());
1095                             break;
1096                         case "If10GEODU2e":
1097                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1098                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1099                                 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
1100                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1101                                 .build());
1102                             break;
1103                         case "If10GEODU2":
1104                         case "If10GE":
1105                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1106                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1107                                 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
1108                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1109                                 .build());
1110                             break;
1111                         case "If100GEODU4":
1112                         case "If100GE":
1113                         case "IfOCHOTU4ODU4":
1114                         case "IfOCH":
1115                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1116                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1117                                 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
1118                                 .setNumberOfCepInstances(Uint64.valueOf(0))
1119                                 .build());
1120                             break;
1121                         default:
1122                             LOG.error("IfCapability type not managed");
1123                             break;
1124                     }
1125                     break;
1126                 case "PHOTONIC_MEDIA":
1127                     switch (ifCapType) {
1128                         case "IfOCHOTUCnODUCn":
1129                         case "IfOtsiOtucnOducn":
1130                         case "IfOCHOTUCnODUCnRegen":
1131                         case "IfOCHOTUCnODUCnUniregen":
1132                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1133                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1134                                 .setLayerProtocolQualifier(ODUTYPEODUCN.VALUE)
1135                                 .setNumberOfCepInstances(Uint64.valueOf(1))
1136                                 .build());
1137                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1138                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1139                                 .setLayerProtocolQualifier(OTUTYPEOTUCN.VALUE)
1140                                 .setNumberOfCepInstances(Uint64.valueOf(1))
1141                                 .build());
1142                          //fallthrough
1143                         case "IfOCH":
1144                         case "IfOCHOTU4ODU4":
1145                         case "IfOCHOTU4ODU4Regen":
1146                         case "IfOCHOTU4ODU4Uniregen":
1147                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1148                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1149                                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
1150                                 .setNumberOfCepInstances(Uint64.valueOf(1))
1151                                 .build());
1152                             sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1153                                     .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1154                                 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
1155                                 .setNumberOfCepInstances(Uint64.valueOf(1))
1156                                 .build());
1157                             break;
1158                         default:
1159                             break;
1160                     }
1161                     break;
1162                 default:
1163                     LOG.error("Layer Protocol Name is unknown");
1164                     break;
1165             }
1166         }
1167         return sclpqiList.stream().distinct().toList();
1168     }
1169
1170     public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
1171             getTapiNodes() {
1172         return tapiNodes;
1173     }
1174
1175     public Map<LinkKey, Link> getTapiLinks() {
1176         return tapiLinks;
1177     }
1178
1179     public AdministrativeState transformAsToTapiAdminState(String adminState) {
1180         return adminState == null
1181             ? null
1182             : adminState.equals(AdminStates.InService.getName())
1183                     || adminState.equals(AdministrativeState.UNLOCKED.getName())
1184                 ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
1185     }
1186
1187     public OperationalState transformOsToTapiOperationalState(String operState) {
1188         return operState == null
1189             ? null
1190             : operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
1191                 ? OperationalState.ENABLED : OperationalState.DISABLED;
1192     }
1193
1194     public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
1195         return tapiSips;
1196     }
1197
1198     public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
1199         this.tapiSips.putAll(tapiSip);
1200     }
1201
1202 }