2 * Copyright © 2023 Orange, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.transportpce.tapi.topology;
10 import java.math.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;
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;
116 public class ConvertORToTapiTopology {
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>
129 private Map<LinkKey, Link> tapiLinks;
130 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
131 private Map<String, Uuid> uuidMap;
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<>();
142 public void convertNode(Node ietfNode, List<String> networkPorts) {
143 this.ietfNodeId = ietfNode.getNodeId().getValue();
145 ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class);
146 if (ietfAug == null) {
149 this.ietfNodeType = ietfAug.getNodeType();
150 this.ietfNodeAdminState = ietfAug.getAdministrativeState();
151 this.ietfNodeOperState = ietfAug.getOperationalState();
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()));
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());
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,
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 =
195 Map.of(nameDsr.key(), nameDsr, namePhot.key(), namePhot,nameNodeType.key(), nameNodeType),
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",
203 dsrNode.getOwnedNodeEdgePoint().values().size(),
204 dsrNode.getOwnedNodeEdgePoint().values().stream()
205 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
206 tapiNodes.put(dsrNode.key(), dsrNode);
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())
221 nepMap.put(nep.key(), nep);
223 Rule rule = new RuleBuilder()
224 .setLocalId("forward")
225 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
226 .setRuleType(new HashSet<>(Set.of(RuleType.FORWARDING)))
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)
235 return new HashMap<>(Map.of(nodeRuleGroup.key(), nodeRuleGroup));
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++) {
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)
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);
264 public List<AvailablePayloadStructure> createAvailablePayloadStructureForPhtncMedia(
265 Boolean otsiProvisioned,
266 Collection<SupportedInterfaceCapability> sicList,
267 List<OperationalModeKey> supportedOpModes) {
268 if (supportedOpModes == null || supportedOpModes.isEmpty()) {
272 Integer loopRate = 0;
273 for (OperationalModeKey operationalMode : supportedOpModes) {
274 if (operationalMode.toString().contains("800G")) {
276 } else if (operationalMode.toString().contains("600G")) {
278 } else if (operationalMode.toString().contains("400G")) {
280 } else if (operationalMode.toString().contains("300G")) {
282 } else if (operationalMode.toString().contains("200G")) {
284 } else if (operationalMode.toString().contains("100G")) {
287 if (loopRate >= nepRate) {
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))
302 new CapacityBuilder()
303 .setUnit(CAPACITYUNITGBPS.VALUE)
304 .setValue(Decimal64.valueOf(100.0 * cepInstanceNber, RoundingMode.DOWN))
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))
317 new CapacityBuilder()
318 .setUnit(CAPACITYUNITGBPS.VALUE)
319 .setValue(Decimal64.valueOf(nepRate * 100.0 * cepInstanceNber, RoundingMode.DOWN))
327 return aps.stream().distinct().toList();
330 public List<SupportedPayloadStructure> createSupportedPayloadStructureForPhtncMedia(
331 Collection<SupportedInterfaceCapability> sicList, List<OperationalModeKey> supportedOpModes) {
332 if (supportedOpModes == null || supportedOpModes.isEmpty()) {
336 Integer loopRate = 0;
337 for (OperationalModeKey operationalMode : supportedOpModes) {
338 if (operationalMode.toString().contains("800G")) {
340 } else if (operationalMode.toString().contains("600G")) {
342 } else if (operationalMode.toString().contains("400G")) {
344 } else if (operationalMode.toString().contains("300G")) {
346 } else if (operationalMode.toString().contains("200G")) {
348 } else if (operationalMode.toString().contains("100G")) {
351 if (loopRate >= nepRate) {
355 List<SupportedPayloadStructure> sps = new ArrayList<>();
356 for (SupportedInterfaceCapability sic : sicList) {
357 String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
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))
366 new CapacityBuilder()
367 .setUnit(CAPACITYUNITGBPS.VALUE)
368 .setValue(Decimal64.valueOf(100.0, RoundingMode.DOWN))
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))
382 new CapacityBuilder()
383 .setUnit(CAPACITYUNITGBPS.VALUE)
384 .setValue(Decimal64.valueOf(nepRate * 100.0, RoundingMode.DOWN))
392 return sps.stream().distinct().toList();
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))
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()) {
415 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
416 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
417 .setNumberOfCepInstances(Uint64.valueOf(1))
419 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
420 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
421 .setNumberOfCepInstances(Uint64.valueOf(1))
425 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
426 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
427 .setNumberOfCepInstances(Uint64.valueOf(1))
429 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
430 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
431 .setNumberOfCepInstances(Uint64.valueOf(1))
435 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
436 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
437 .setNumberOfCepInstances(Uint64.valueOf(1))
439 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
440 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
441 .setNumberOfCepInstances(Uint64.valueOf(1))
445 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
446 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
447 .setNumberOfCepInstances(Uint64.valueOf(1))
451 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
452 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
453 .setNumberOfCepInstances(Uint64.valueOf(1))
455 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
456 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
457 .setNumberOfCepInstances(Uint64.valueOf(1))
461 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
462 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
463 .setNumberOfCepInstances(Uint64.valueOf(1))
466 case "IfOCHOTU4ODU4":
468 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
469 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
470 .setNumberOfCepInstances(Uint64.valueOf(1))
474 LOG.error("IfCapability type not managed");
481 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
482 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
483 .setNumberOfCepInstances(Uint64.valueOf(1))
487 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
488 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
489 .setNumberOfCepInstances(Uint64.valueOf(1))
494 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
495 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
496 .setNumberOfCepInstances(Uint64.valueOf(1))
501 case "IfOCHOTU4ODU4":
503 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
504 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
505 .setNumberOfCepInstances(Uint64.valueOf(1))
509 LOG.error("IfCapability type not managed");
513 case "PHOTONIC_MEDIA":
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))
523 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
524 .setLayerProtocolQualifier(OTUTYPEOTUCN.VALUE)
525 .setNumberOfCepInstances(Uint64.valueOf(1))
529 case "IfOCHOTU4ODU4":
530 case "IfOCHOTU4ODU4Regen":
531 case "IfOCHOTU4ODU4Uniregen":
532 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
533 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
534 .setNumberOfCepInstances(Uint64.valueOf(1))
536 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
537 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
538 .setNumberOfCepInstances(Uint64.valueOf(1))
546 LOG.error("Layer Protocol Name is unknown {}", lpn.getName());
550 return sclpqiList.stream().distinct().toList();
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) {
559 var xnattWvlgth = tpAug.getXpdrNetworkAttributes().getWavelength();
560 return xnattWvlgth == null || xnattWvlgth.getFrequency() == null || xnattWvlgth.getWidth() == null
562 : new HashMap<>(Map.of(
563 xnattWvlgth.getFrequency().getValue().doubleValue(),
564 xnattWvlgth.getWidth().getValue().doubleValue()));
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)
571 return ppAtt == null || ppAtt.getUsedWavelength() == null
572 || ppAtt.getUsedWavelength().entrySet().iterator().next() == 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()));
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)) {
586 //Creating OTS & OTSI_MC NEP specific attributes
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));
594 SpectrumCapabilityPacBuilder spectrumPac = new SpectrumCapabilityPacBuilder();
595 if (freqWidthMap == null || freqWidthMap.isEmpty()) {
596 upFreq = Uint64.valueOf(0);
597 loFreq = Uint64.valueOf(0);
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)));
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));
613 .setSupportedPayloadStructure(createSupportedPayloadStructureForPhtncMedia(sicColl, operModeList))
614 .setAvailablePayloadStructure(createAvailablePayloadStructureForPhtncMedia(boolParam, sicColl,operModeList))
616 new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121
617 .OwnedNodeEdgePoint1Builder()
618 .setPhotonicMediaNodeEdgePointSpec(
619 new PhotonicMediaNodeEdgePointSpecBuilder()
620 .setSpectrumCapabilityPac(
622 .setOccupiedSpectrum(new HashMap<>(Map.of(
623 new OccupiedSpectrumKey(loFreq, upFreq),
624 new OccupiedSpectrumBuilder()
625 .setUpperFrequency(upFreq)
626 .setLowerFrequency(loFreq)
628 .setSupportableSpectrum(new HashMap<>(Map.of(
629 new SupportableSpectrumKey(supLoFreq, supUpFreq),
630 new SupportableSpectrumBuilder()
631 .setUpperFrequency(supUpFreq)
632 .setLowerFrequency(supLoFreq)
639 private OduSwitchingPools createOduSwitchingPoolForTp100G() {
640 Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
642 for (TerminationPoint tp : this.oorNetworkPortList) {
643 NonBlockingList nbl = new NonBlockingListBuilder()
644 .setNblNumber(Uint16.valueOf(count))
645 .setTpList(new HashSet<>(Set.of(
647 tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
648 .TerminationPoint1.class)
649 .getAssociatedConnectionMapTp().iterator().next())))
651 nblMap.put(nbl.key(), nbl);
654 return new OduSwitchingPoolsBuilder()
655 .setNonBlockingList(nblMap)
656 .setSwitchingPoolNumber(Uint16.valueOf(1))
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)))
672 nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, new HashMap<>(Map.of(rule.key(), rule)));
674 LOG.error("Undefined LayerProtocolName for {} node {}",
675 nodeNames.get(nodeNames.keySet().iterator().next()).getValueName(),
676 nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
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)
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")
691 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
692 .setRiskCharacteristicName("risk characteristic")
693 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
695 return new NodeBuilder()
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))
710 .setErrorCharacteristic("error")
711 .setLossCharacteristic("loss")
712 .setRepeatDeliveryCharacteristic("repeat delivery")
713 .setDeliveryOrderCharacteristic("delivery order")
714 .setUnavailableTimeCharacteristic("unavailable time")
715 .setServerIntegrityProcessCharacteristic("server integrity process")
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()
732 .setValueName(OpenroadmNodeType.TPDR.equals(this.ietfNodeType) ? "100G-tpdr" : "NodeEdgePoint_C")
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);
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)
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);
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)
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);
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)
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);
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)
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);
812 // create NodeRuleGroup
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())))
841 nepList.put(nep.key(), nep);
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))
850 oduNepList.put(nep1.key(), nep1);
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))
860 oduNepList.put(nep2.key(), nep2);
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)
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")
878 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
879 .setRiskCharacteristicName("risk characteristic")
880 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
882 NodeRuleGroup nodeRuleGroup1 = new NodeRuleGroupBuilder()
883 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("dsr node rule group " + count)
884 .getBytes(Charset.forName("UTF-8"))).toString()))
886 .setNodeEdgePoint(nepList)
887 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
888 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
889 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
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()))
896 .setNodeEdgePoint(oduNepList)
897 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
898 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
899 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
901 nodeRuleGroupList.put(nodeRuleGroup2.key(), nodeRuleGroup2);
904 return this.uuidMap.get(ietfXpdr);
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());
915 AdministrativeState adminState =
916 oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() == null
918 : transformAsToTapiAdminState(
919 oorTp.augmentation(TerminationPoint1.class).getAdministrativeState().getName());
920 OperationalState operState =
921 oorTp.augmentation(TerminationPoint1.class).getOperationalState() == 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)
931 .setSupportedCepLayerProtocolQualifierInstances(
932 createSupportedCepLayerProtocolQualifier(sicColl, nepProtocol))
933 .setDirection(Direction.BIDIRECTIONAL)
934 .setLinkPortRole(PortRole.SYMMETRIC)
935 .setAdministrativeState(adminState)
936 .setOperationalState(operState)
937 .setLifecycleState(LifecycleState.INSTALLED);
939 onepBldr.setMappedServiceInterfacePoint(
940 createMSIP(1, nepProtocol, oorTp.getTpId().getValue(), keyword, sicColl, operState, adminState));
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());
956 opModeList.add(new OperationalModeKey("100G"));
957 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "100G rate available", oorTp.getTpId());
959 opModeList = tp11.getXpdrNetworkAttributes().getSupportedOperationalModes().getOperationalMode()
960 .keySet().stream().toList();
962 onepBldr = addPayloadStructureAndPhotSpecToOnep(
963 this.ietfNodeId, getXpdrUsedWavelength(oorTp), opModeList, sicColl, onepBldr, keyword);
965 return onepBldr.build();
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))
977 return new ServiceInterfacePointBuilder()
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))
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))
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()) {
1011 switch (ifCapType) {
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
1074 case "IfOCHOTU4ODU4":
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))
1083 LOG.error("IfCapability type not managed");
1088 switch (ifCapType) {
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))
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))
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))
1113 case "IfOCHOTU4ODU4":
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))
1122 LOG.error("IfCapability type not managed");
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))
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))
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))
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))
1163 LOG.error("Layer Protocol Name is unknown");
1167 return sclpqiList.stream().distinct().toList();
1170 public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
1175 public Map<LinkKey, Link> getTapiLinks() {
1179 public AdministrativeState transformAsToTapiAdminState(String adminState) {
1180 return adminState == null
1182 : adminState.equals(AdminStates.InService.getName())
1183 || adminState.equals(AdministrativeState.UNLOCKED.getName())
1184 ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
1187 public OperationalState transformOsToTapiOperationalState(String operState) {
1188 return operState == null
1190 : operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
1191 ? OperationalState.ENABLED : OperationalState.DISABLED;
1194 public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
1198 public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
1199 this.tapiSips.putAll(tapiSip);