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.Arrays;
14 import java.util.Collection;
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.List;
20 import java.util.UUID;
21 import java.util.stream.Collectors;
22 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
23 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
24 import org.opendaylight.transportpce.tapi.TapiStringConstants;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev230526.degree.used.wavelengths.UsedWavelengths;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev230526.degree.used.wavelengths.UsedWavelengthsKey;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributes;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributes;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.AvailableCapacityBuilder;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.TotalPotentialCapacityBuilder;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.payload.structure.CapacityBuilder;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointBuilder;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU0;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2E;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU4;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODUCN;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.OTUTYPEOTUCN;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE100GigE;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE10GigELAN;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPEGigE;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSi;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.context.topology.context.topology.node.owned.node.edge.point.PhotonicMediaNodeEdgePointSpec;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.context.topology.context.topology.node.owned.node.edge.point.PhotonicMediaNodeEdgePointSpecBuilder;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.photonic.media.node.edge.point.spec.SpectrumCapabilityPacBuilder;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrum;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrumBuilder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrumKey;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrum;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrumBuilder;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrumKey;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrum;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrumBuilder;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrumKey;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULE;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULECANNOTFORWARDACROSSGROUP;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.AssociatedNodeRuleGroup;
92 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.AssociatedNodeRuleGroupBuilder;
93 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.AssociatedNodeRuleGroupKey;
94 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroup;
95 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupBuilder;
96 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
97 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
98 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
99 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
100 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
101 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
102 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
103 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
104 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.AvailablePayloadStructure;
105 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.AvailablePayloadStructureBuilder;
106 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
107 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointBuilder;
108 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointKey;
109 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
110 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
111 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedPayloadStructure;
112 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedPayloadStructureBuilder;
113 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
114 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
115 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
116 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
117 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
118 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
119 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
120 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
121 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
122 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
123 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
124 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
125 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
126 import org.opendaylight.yangtools.yang.common.Decimal64;
127 import org.opendaylight.yangtools.yang.common.Uint16;
128 import org.opendaylight.yangtools.yang.common.Uint64;
129 import org.slf4j.Logger;
130 import org.slf4j.LoggerFactory;
133 public class ConvertORToTapiTopology {
135 private static final Logger LOG = LoggerFactory.getLogger(ConvertORToTapiTopology.class);
136 private String ietfNodeId;
137 private OpenroadmNodeType ietfNodeType;
138 private AdminStates ietfNodeAdminState;
139 private State ietfNodeOperState;
140 private List<TerminationPoint> oorClientPortList;
141 private List<TerminationPoint> oorNetworkPortList;
142 private OduSwitchingPools oorOduSwitchingPool;
143 private Uuid tapiTopoUuid;
144 private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
146 private Map<LinkKey, Link> tapiLinks;
147 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
148 private Map<String, Uuid> uuidMap;
151 public ConvertORToTapiTopology(Uuid tapiTopoUuid) {
152 this.tapiTopoUuid = tapiTopoUuid;
153 this.tapiNodes = new HashMap<>();
154 this.tapiLinks = new HashMap<>();
155 this.uuidMap = new HashMap<>();
156 this.tapiSips = new HashMap<>();
159 public void convertNode(Node ietfNode, List<String> networkPorts) {
160 this.ietfNodeId = ietfNode.getNodeId().getValue();
162 ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class);
163 if (ietfAug == null) {
166 this.ietfNodeType = ietfAug.getNodeType();
167 this.ietfNodeAdminState = ietfAug.getAdministrativeState();
168 this.ietfNodeOperState = ietfAug.getOperationalState();
170 ietfNode.augmentation(
171 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class);
172 this.oorNetworkPortList = ietfAugTopo.getTerminationPoint().values().stream()
173 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
174 == OpenroadmTpType.XPONDERNETWORK.getIntValue()
175 && networkPorts.contains(tp.getTpId().getValue()))
176 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
177 .collect(Collectors.toList());
178 if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
179 this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
180 List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
181 .flatMap(nbl -> nbl.getTpList().stream())
182 .collect(Collectors.toList());
183 this.oorClientPortList = ietfAugTopo.getTerminationPoint().values().stream()
184 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
185 == OpenroadmTpType.XPONDERCLIENT.getIntValue()
186 && tpList.contains(tp.getTpId()))
187 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
188 .collect(Collectors.toList());
189 this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
191 this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
192 .values().stream().findFirst().orElseThrow();
193 this.oorClientPortList = ietfAugTopo.getTerminationPoint().values().stream()
194 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
195 == OpenroadmTpType.XPONDERCLIENT.getIntValue())
196 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
197 .collect(Collectors.toList());
200 // node creation [DSR/ODU] ([DSR/ODU] and OTSI merged in R 2.4.X)
201 LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
202 String nodeIdXpdr = String.join("+", this.ietfNodeId, TapiStringConstants.XPDR);
203 this.uuidMap.put(nodeIdXpdr,
205 new Uuid(UUID.nameUUIDFromBytes(nodeIdXpdr.getBytes(Charset.forName("UTF-8"))).toString()));
206 Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(nodeIdXpdr).build();
207 Name namePhot = new NameBuilder().setValueName("otsi node name").setValue(nodeIdXpdr).build();
208 Name nameNodeType = new NameBuilder().setValueName("Node Type").setValue(this.ietfNodeType.getName()).build();
209 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
210 .topology.Node dsrNode =
212 Map.of(nameDsr.key(), nameDsr, namePhot.key(), namePhot,nameNodeType.key(), nameNodeType),
214 Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
215 LayerProtocolName.DIGITALOTN, LayerProtocolName.PHOTONICMEDIA));
216 LOG.debug("XPDR Node {} should have {} NEPs and SIPs",
217 this.ietfNodeId, this.oorClientPortList.size() + this.oorNetworkPortList.size());
218 LOG.info("XPDR Node {} has {} NEPs and {} SIPs",
220 dsrNode.getOwnedNodeEdgePoint().values().size(),
221 dsrNode.getOwnedNodeEdgePoint().values().stream()
222 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
223 tapiNodes.put(dsrNode.key(), dsrNode);
226 public Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(String topoType, Uuid nodeUuid,
227 String subNodeName, List<OwnedNodeEdgePointKey> onepl, FORWARDINGRULE forwardingRule, int index) {
228 Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
229 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
230 nepMap = new HashMap<>();
231 for (OwnedNodeEdgePointKey onepKey : onepl) {
232 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint
233 nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group
234 .NodeEdgePointBuilder()
235 .setTopologyUuid(tapiTopoUuid)
236 .setNodeUuid(nodeUuid)
237 .setNodeEdgePointUuid(onepKey.getUuid())
239 nepMap.put(nep.key(), nep);
241 String nrgNameValue = String.join("-", subNodeName, "node-rule-group-" + index);
242 //Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
243 Set<RuleType> ruleTypes = new HashSet<>(Set.of(RuleType.FORWARDING));
244 Map<RuleKey, Rule> ruleList = new HashMap<>();
245 Rule rule = new RuleBuilder()
246 .setLocalId("forward")
247 .setForwardingRule(forwardingRule)
248 .setRuleType(ruleTypes)
250 ruleList.put(rule.key(), rule);
251 Name nrgName = new NameBuilder()
252 .setValueName("nrg name")
253 .setValue(nrgNameValue)
255 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
256 .setName(Map.of(nrgName.key(), nrgName))
257 .setUuid(new Uuid(UUID.nameUUIDFromBytes((nrgNameValue)
258 .getBytes(Charset.forName("UTF-8"))).toString()))
260 .setNodeEdgePoint(nepMap)
262 return new HashMap<>(Map.of(nodeRuleGroup.key(), nodeRuleGroup));
265 public Map<NodeRuleGroupKey, NodeRuleGroup> createAllNodeRuleGroupForRdmNode(String topoType, Uuid nodeUuid,
266 String orNodeId, Collection<OwnedNodeEdgePoint> onepl) {
267 List<OwnedNodeEdgePoint> otsNepList = new ArrayList<>();
268 LOG.info("Creating NRG for {} {}", topoType, otsNepList.toString());
269 if (topoType.equals("T0ML")) {
270 otsNepList = onepl.stream().collect(Collectors.toList());
272 otsNepList = onepl.stream()
273 .filter(onep -> onep.getName().keySet().contains(new NameKey("PHOTONIC_MEDIA_OTSNodeEdgePoint")))
274 .collect(Collectors.toList());
276 List<OwnedNodeEdgePointKey> degOnepKeyList = new ArrayList<>();
277 List<String> srgNames = new ArrayList<>();
278 Map<OwnedNodeEdgePointKey,String> srgMap = new HashMap<>();
279 for (OwnedNodeEdgePoint onep : otsNepList) {
280 String onepName = onep.getName().get(new NameKey(
281 topoType.equals("T0ML") ? "NodeEdgePoint name"
282 : "PHOTONIC_MEDIA_OTSNodeEdgePoint")).getValue();
283 String subNodeName = topoType.equals("T0ML") ? "ROADMINFRA-SRG-PP"
284 : String.join("-", onepName.split("\\+")[0], onepName.split("\\+")[2]);
285 if (subNodeName.contains("DEG")) {
286 subNodeName = subNodeName.split("\\-TTP")[0];
287 degOnepKeyList.add(onep.key());
288 } else if (subNodeName.contains("SRG")) {
289 subNodeName = subNodeName.split("\\-PP")[0];
290 srgMap.put(onep.key(), subNodeName);
291 if (!srgNames.contains(subNodeName)) {
292 srgNames.add(subNodeName);
297 Map<NodeRuleGroupKey, NodeRuleGroup> globalNrgMap = new HashMap<>();
298 if (topoType.equals("Full")) {
300 createNodeRuleGroupForRdmNode(topoType, nodeUuid, String.join("-", orNodeId, "DEG"), degOnepKeyList,
301 FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, index));
304 for (String srgName : srgNames) {
305 globalNrgMap.putAll(createNodeRuleGroupForRdmNode(topoType, nodeUuid, srgName,
306 srgMap.entrySet().stream()
307 .filter(item -> item.getValue().equals(srgName))
308 .map(item -> item.getKey())
309 .collect(Collectors.toList()),
310 // For T0ML we consider any port of ROADM INFRA can connect to potentially any other port
311 //topoType.equals("T0ML") ? FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE
312 topoType.equals("T0ML") ? FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE
313 // Whereas for Abstracted or Full Topology we consider any port of the same SRG can not forward to
314 // another port of the same SRG. Connectivity between SRGS will be defined through inter-rule-group
315 : FORWARDINGRULECANNOTFORWARDACROSSGROUP.VALUE, index));
317 LOG.debug("AllNodeRuleGroup : creating a NRG for {}", srgName);
322 public Map<InterRuleGroupKey, InterRuleGroup> createInterRuleGroupForRdmNode(
323 String topoType, Uuid nodeUuid,String orNodeId, List<NodeRuleGroupKey> nrgList) {
324 Map<AssociatedNodeRuleGroupKey, AssociatedNodeRuleGroup> associatedNrgMap = new HashMap<>();
325 for (NodeRuleGroupKey nrgKey : nrgList) {
326 AssociatedNodeRuleGroup associatedNrg = new AssociatedNodeRuleGroupBuilder()
327 .setTopologyUuid(tapiTopoUuid)
328 .setNodeUuid(nodeUuid)
329 .setNodeRuleGroupUuid(nrgKey.getUuid())
331 associatedNrgMap.put(associatedNrg.key(), associatedNrg);
333 String irgNameValue =
334 topoType.equals("Full")
335 ? orNodeId + " inter rule group-"
336 : "rdm infra inter rule group-";
337 Set<RuleType> ruleTypes = new HashSet<>(Set.of(RuleType.FORWARDING));
338 Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.RuleKey,
339 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.Rule> ruleMap
341 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.Rule rule
342 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.RuleBuilder()
343 .setLocalId("forward")
344 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
345 .setRuleType(ruleTypes)
347 ruleMap.put(rule.key(), rule);
349 Map<InterRuleGroupKey, InterRuleGroup> interRuleGroupMap = new HashMap<>();
351 Name irgName = new NameBuilder()
352 .setValueName("irg name")
353 .setValue(irgNameValue)
355 InterRuleGroup interRuleGroup = new InterRuleGroupBuilder()
356 .setUuid(new Uuid(UUID.nameUUIDFromBytes((irgNameValue)
357 .getBytes(Charset.forName("UTF-8"))).toString()))
358 .setName(Map.of(irgName.key(), irgName))
360 .setAssociatedNodeRuleGroup(associatedNrgMap)
362 interRuleGroupMap.put(new InterRuleGroupKey(interRuleGroup.getUuid()), interRuleGroup);
363 return interRuleGroupMap;
366 public Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createMSIP(int nb,
367 LayerProtocolName layerProtocol, String tpId, String nodeid,
368 Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
369 OperationalState operState, AdministrativeState adminState) {
370 // add them to SIP context
371 Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
372 for (int i = 0; i < nb; i++) {
375 ? String.join("+", "SIP", nodeid, tpId)
376 : String.join("+", "SIP", nodeid, tpId, "Nber", String.valueOf(i));
377 LOG.info("SIP = {}", sipName);
378 Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes(sipName.getBytes(Charset.forName("UTF-8"))).toString());
379 MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
380 .setServiceInterfacePointUuid(sipUuid)
382 ServiceInterfacePoint sip =
383 createSIP(sipUuid, layerProtocol, tpId, nodeid, supportedInterfaceCapability, operState, adminState);
384 this.tapiSips.put(sip.key(), sip);
385 msipl.put(msip.key(), msip);
386 LOG.debug("SIP created {}", sip.getUuid());
387 LOG.debug("This SIP corresponds to SIP+nodeId {} + TpId {}", nodeid, tpId);
392 public List<AvailablePayloadStructure> createAvailablePayloadStructureForPhtncMedia(
393 Boolean otsiProvisioned,
394 Collection<SupportedInterfaceCapability> sicList,
395 List<OperationalModeKey> supportedOpModes) {
396 if (supportedOpModes == null || supportedOpModes.isEmpty()) {
400 Integer loopRate = 0;
401 for (OperationalModeKey operationalMode : supportedOpModes) {
402 if (operationalMode.toString().contains("800G")) {
404 } else if (operationalMode.toString().contains("600G")) {
406 } else if (operationalMode.toString().contains("400G")) {
408 } else if (operationalMode.toString().contains("300G")) {
410 } else if (operationalMode.toString().contains("200G")) {
412 } else if (operationalMode.toString().contains("100G")) {
415 if (loopRate >= nepRate) {
419 List<AvailablePayloadStructure> aps = new ArrayList<>();
420 Integer cepInstanceNber = otsiProvisioned ? 0 : 1;
421 for (SupportedInterfaceCapability sic : sicList) {
422 switch (sic.getIfCapType().toString().split("\\{")[0]) {
423 case "IfOCHOTU4ODU4":
424 case "IfOCHOTU4ODU4Regen":
425 case "IfOCHOTU4ODU4Uniregen":
426 aps.add(new AvailablePayloadStructureBuilder()
427 .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, ODUTYPEODU4.VALUE))
428 .setNumberOfCepInstances(Uint64.valueOf(cepInstanceNber))
430 new CapacityBuilder()
431 .setUnit(CAPACITYUNITGBPS.VALUE)
432 .setValue(Decimal64.valueOf(100.0 * cepInstanceNber, RoundingMode.DOWN))
436 case "IfOCHOTUCnODUCn":
437 case "IfOtsiOtucnOducn":
438 case "IfOCHOTUCnODUCnRegen":
439 case "IfOCHOTUCnODUCnUniregen":
440 aps.add(new AvailablePayloadStructureBuilder()
441 .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, OTUTYPEOTUCN.VALUE,
442 ODUTYPEODUCN.VALUE, ODUTYPEODU4.VALUE))
443 .setNumberOfCepInstances(Uint64.valueOf(nepRate * cepInstanceNber))
445 new CapacityBuilder()
446 .setUnit(CAPACITYUNITGBPS.VALUE)
447 .setValue(Decimal64.valueOf(nepRate * 100.0 * cepInstanceNber, RoundingMode.DOWN))
455 return aps.stream().distinct().toList();
458 public List<SupportedPayloadStructure> createSupportedPayloadStructureForPhtncMedia(
459 Collection<SupportedInterfaceCapability> sicList, List<OperationalModeKey> supportedOpModes) {
460 if (supportedOpModes == null || supportedOpModes.isEmpty()) {
464 Integer loopRate = 0;
465 for (OperationalModeKey operationalMode : supportedOpModes) {
466 if (operationalMode.toString().contains("800G")) {
468 } else if (operationalMode.toString().contains("600G")) {
470 } else if (operationalMode.toString().contains("400G")) {
472 } else if (operationalMode.toString().contains("300G")) {
474 } else if (operationalMode.toString().contains("200G")) {
476 } else if (operationalMode.toString().contains("100G")) {
479 if (loopRate >= nepRate) {
483 List<SupportedPayloadStructure> sps = new ArrayList<>();
484 for (SupportedInterfaceCapability sic : sicList) {
485 String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
487 case "IfOCHOTU4ODU4":
488 case "IfOCHOTU4ODU4Regen":
489 case "IfOCHOTU4ODU4Uniregen":
490 sps.add(new SupportedPayloadStructureBuilder()
491 .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, ODUTYPEODU4.VALUE))
492 .setNumberOfCepInstances(Uint64.valueOf(1))
494 new CapacityBuilder()
495 .setUnit(CAPACITYUNITGBPS.VALUE)
496 .setValue(Decimal64.valueOf(100.0, RoundingMode.DOWN))
500 case "IfOCHOTUCnODUCn":
501 case "IfOtsiOtucnOducn":
502 case "IfOCHOTUCnODUCnRegen":
503 case "IfOCHOTUCnODUCnUniregen":
504 sps.add(new SupportedPayloadStructureBuilder()
505 .setMultiplexingSequence(Set.of(
506 PHOTONICLAYERQUALIFIEROTSi.VALUE, OTUTYPEOTUCN.VALUE,
507 ODUTYPEODUCN.VALUE, ODUTYPEODU4.VALUE))
508 .setNumberOfCepInstances(Uint64.valueOf(nepRate))
510 new CapacityBuilder()
511 .setUnit(CAPACITYUNITGBPS.VALUE)
512 .setValue(Decimal64.valueOf(nepRate * 100.0, RoundingMode.DOWN))
520 return sps.stream().distinct().toList();
523 @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "SF_SWITCH_FALLTHROUGH",
524 justification = "Voluntarily No break in switchcase where comment is inserted in following method")
525 public List<SupportedCepLayerProtocolQualifierInstances> createSupportedCepLayerProtocolQualifier(
526 Collection<SupportedInterfaceCapability> sicList, LayerProtocolName lpn) {
527 if (sicList == null) {
528 return new ArrayList<>(List.of(
529 new SupportedCepLayerProtocolQualifierInstancesBuilder()
530 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
531 .setNumberOfCepInstances(Uint64.valueOf(1))
534 LOG.debug("SIC list = {}", sicList);
535 List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
536 for (SupportedInterfaceCapability sic : sicList) {
537 String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
538 switch (lpn.getName()) {
543 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
544 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
545 .setNumberOfCepInstances(Uint64.valueOf(1))
547 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
548 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
549 .setNumberOfCepInstances(Uint64.valueOf(1))
553 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
554 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
555 .setNumberOfCepInstances(Uint64.valueOf(1))
557 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
558 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
559 .setNumberOfCepInstances(Uint64.valueOf(1))
563 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
564 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
565 .setNumberOfCepInstances(Uint64.valueOf(1))
567 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
568 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
569 .setNumberOfCepInstances(Uint64.valueOf(1))
573 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
574 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
575 .setNumberOfCepInstances(Uint64.valueOf(1))
579 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
580 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
581 .setNumberOfCepInstances(Uint64.valueOf(1))
583 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
584 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
585 .setNumberOfCepInstances(Uint64.valueOf(1))
589 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
590 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
591 .setNumberOfCepInstances(Uint64.valueOf(1))
594 case "IfOCHOTU4ODU4":
596 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
597 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
598 .setNumberOfCepInstances(Uint64.valueOf(1))
602 LOG.error("IfCapability type not managed");
609 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
610 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
611 .setNumberOfCepInstances(Uint64.valueOf(1))
615 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
616 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
617 .setNumberOfCepInstances(Uint64.valueOf(1))
622 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
623 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
624 .setNumberOfCepInstances(Uint64.valueOf(1))
629 case "IfOCHOTU4ODU4":
631 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
632 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
633 .setNumberOfCepInstances(Uint64.valueOf(1))
637 LOG.error("IfCapability type not managed");
641 case "PHOTONIC_MEDIA":
643 case "IfOCHOTUCnODUCn":
644 case "IfOtsiOtucnOducn":
645 case "IfOCHOTUCnODUCnRegen":
646 case "IfOCHOTUCnODUCnUniregen":
647 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
648 .setLayerProtocolQualifier(ODUTYPEODUCN.VALUE)
649 .setNumberOfCepInstances(Uint64.valueOf(1))
651 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
652 .setLayerProtocolQualifier(OTUTYPEOTUCN.VALUE)
653 .setNumberOfCepInstances(Uint64.valueOf(1))
657 case "IfOCHOTU4ODU4":
658 case "IfOCHOTU4ODU4Regen":
659 case "IfOCHOTU4ODU4Uniregen":
660 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
661 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
662 .setNumberOfCepInstances(Uint64.valueOf(1))
664 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
665 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
666 .setNumberOfCepInstances(Uint64.valueOf(1))
674 LOG.error("Layer Protocol Name is unknown {}", lpn.getName());
678 return sclpqiList.stream().distinct().toList();
681 public Map<Double, Double> getXpdrUsedWavelength(TerminationPoint tp) {
682 var tpAug = tp.augmentation(
683 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
684 if (tpAug == null || tpAug.getXpdrNetworkAttributes() == null) {
687 XpdrNetworkAttributes xnatt = tpAug.getXpdrNetworkAttributes();
688 //Map<Double,Double> freqWidthMap = new HashMap<>();
689 var xnattWvlgth = tpAug.getXpdrNetworkAttributes().getWavelength();
690 return xnattWvlgth == null || xnattWvlgth.getFrequency() == null || xnattWvlgth.getWidth() == null
692 : new HashMap<>(Map.of(
693 (xnatt.getWavelength().getFrequency().getValue().doubleValue()
694 - xnatt.getWavelength().getWidth().getValue().doubleValue() * 0.001 / 2),
695 (xnatt.getWavelength().getFrequency().getValue().doubleValue()
696 - xnatt.getWavelength().getWidth().getValue().doubleValue() * 0.001 / 2)));
699 public Map<Double, Double> getPPUsedWavelength(TerminationPoint tp) {
700 var tpAug = tp.augmentation(
701 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
705 PpAttributes ppAtt = tpAug.getPpAttributes();
709 if (ppAtt != null && ppAtt.getUsedWavelength() != null
710 && ppAtt.getUsedWavelength().entrySet().iterator().next() != null) {
711 Double centFreq = ppAtt.getUsedWavelength().entrySet().iterator().next().getValue().getFrequency()
712 .getValue().doubleValue();
713 Double width = ppAtt.getUsedWavelength().entrySet().iterator().next().getValue().getWidth()
714 .getValue().doubleValue();
715 return new HashMap<>(Map.of(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2));
720 public Map<Double, Double> getTTPUsedFreqMap(TerminationPoint tp) {
721 byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
722 Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
723 var termPoint1 = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
724 .TerminationPoint1.class);
725 if (termPoint1 == null || termPoint1.getTxTtpAttributes() == null) {
728 TxTtpAttributes txttpAtt = termPoint1.getTxTtpAttributes();
729 Map<Double,Double> freqMap = new HashMap<>();
730 if (txttpAtt.getUsedWavelengths() != null
731 && txttpAtt.getUsedWavelengths().entrySet().iterator().next() != null) {
732 for (Map.Entry<UsedWavelengthsKey, UsedWavelengths> usedLambdas :
733 txttpAtt.getUsedWavelengths().entrySet()) {
734 Double centFreq = usedLambdas.getValue().getFrequency().getValue().doubleValue();
735 Double width = usedLambdas.getValue().getWidth()
736 .getValue().doubleValue();
737 freqMap.put(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2);
740 } else if (txttpAtt.getAvailFreqMaps() != null
741 && txttpAtt.getAvailFreqMaps().keySet().toString().contains(GridConstant.C_BAND)) {
742 byte[] freqBitSet = new byte[GridConstant.NB_OCTECTS];
743 LOG.debug("Creation of Bitset {}", freqBitSet);
744 freqBitSet = txttpAtt.getAvailFreqMaps().entrySet().stream()
745 .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
746 .findFirst().orElseThrow().getValue().getFreqMap();
747 for (int i = 0; i < GridConstant.EFFECTIVE_BITS; i++) {
748 if (freqBitSet[i] == 0) {
754 return getFreqMapFromBitSet(freqBitSet);
760 public Map<Double, Double> getTTPAvailableFreqMap(TerminationPoint tp) {
761 var termPoint1 = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
762 .TerminationPoint1.class);
763 if (termPoint1 == null || termPoint1.getTxTtpAttributes() == null
764 || termPoint1.getTxTtpAttributes().getAvailFreqMaps() == null
765 || !(termPoint1.getTxTtpAttributes().getAvailFreqMaps().keySet().toString()
766 .contains(GridConstant.C_BAND))) {
769 byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
770 LOG.debug("Creation of Bitset {}", byteArray);
771 return getFreqMapFromBitSet(
772 termPoint1.getTxTtpAttributes().getAvailFreqMaps().entrySet().stream()
773 .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
774 .findFirst().orElseThrow().getValue().getFreqMap());
777 public Map<Double, Double> getTTP11AvailableFreqMap(
778 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 tp) {
779 if (tp == null || tp.getTxTtpAttributes() == null
780 || tp.getTxTtpAttributes().getAvailFreqMaps() == null
781 || !(tp.getTxTtpAttributes().getAvailFreqMaps().keySet().toString()
782 .contains(GridConstant.C_BAND))) {
785 byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
786 LOG.debug("Creation of Bitset {}", byteArray);
787 return getFreqMapFromBitSet(
788 tp.getTxTtpAttributes().getAvailFreqMaps().entrySet().stream()
789 .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
790 .findFirst().orElseThrow().getValue().getFreqMap());
793 public Map<Double, Double> getPP11UsedWavelength(
794 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 tp) {
795 if (tp == null || tp.getPpAttributes() == null
796 || tp.getPpAttributes().getUsedWavelength() == null
797 || tp.getPpAttributes().getUsedWavelength().entrySet().iterator().next() == null) {
800 PpAttributes ppAtt = tp.getPpAttributes();
801 Map<Double,Double> freqMap = new HashMap<>();
802 Double centFreq = ppAtt.getUsedWavelength().entrySet().iterator().next().getValue().getFrequency()
803 .getValue().doubleValue();
804 Double width = ppAtt.getUsedWavelength().entrySet().iterator().next().getValue().getWidth()
805 .getValue().doubleValue();
806 freqMap.put(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2);
810 public Map<Double, Double> getTTP11UsedFreqMap(
811 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 tp) {
812 byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
813 Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
814 if (tp == null || tp.getTxTtpAttributes() == null) {
817 TxTtpAttributes txttpAtt = tp.getTxTtpAttributes();
818 Map<Double,Double> freqMap = new HashMap<>();
819 if (txttpAtt.getUsedWavelengths() != null
820 && txttpAtt.getUsedWavelengths().entrySet().iterator().next() != null) {
821 for (Map.Entry<UsedWavelengthsKey, UsedWavelengths> usedLambdas :
822 txttpAtt.getUsedWavelengths().entrySet()) {
823 Double centFreq = usedLambdas.getValue().getFrequency().getValue().doubleValue();
824 Double width = usedLambdas.getValue().getWidth()
825 .getValue().doubleValue();
826 freqMap.put(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2);
829 } else if (txttpAtt.getAvailFreqMaps() != null
830 && txttpAtt.getAvailFreqMaps().keySet().toString().contains(GridConstant.C_BAND)) {
831 byte[] freqBitSet = new byte[GridConstant.NB_OCTECTS];
832 LOG.debug("Creation of Bitset {}", freqBitSet);
833 freqBitSet = txttpAtt.getAvailFreqMaps().entrySet().stream()
834 .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
835 .findFirst().orElseThrow().getValue().getFreqMap();
836 for (int i = 0; i < GridConstant.EFFECTIVE_BITS; i++) {
837 if (freqBitSet[i] == 0) {
843 return getFreqMapFromBitSet(freqBitSet);
849 public Map<Double, Double> getFreqMapFromBitSet(byte[] byteArray) {
850 // Provides a Map <LowerFreq, HigherFreq> describing start and stop frequencies of all slots that are available
851 // in the ByteArray describing the spectrum : bit sets initially sets to 1/true
852 // In case the byte array has been inverted before calling this method, it provides respectively a map
853 // describing all occupied slots!
854 Map<Double,Double> freqMap = new HashMap<>();
855 Double startFreq = GridConstant.START_EDGE_FREQUENCY;
856 Double stopFreq = 0.0;
857 boolean occupied = false;
858 if (byteArray[0] == 0) {
861 for (int index = 0 ; index < GridConstant.EFFECTIVE_BITS ; index++) {
862 if (byteArray[index] == 1 && occupied) {
863 startFreq = GridUtils.getStartFrequencyFromIndex(index).doubleValue();
864 stopFreq = GridUtils.getStartFrequencyFromIndex(index).doubleValue();
866 } else if (byteArray[index] == 0 && !occupied) {
867 stopFreq = GridUtils.getStartFrequencyFromIndex(index).doubleValue();
870 if (stopFreq.doubleValue() > startFreq.doubleValue() && occupied) {
871 freqMap.put(startFreq, stopFreq);
872 startFreq = stopFreq;
874 if ((index == GridConstant.EFFECTIVE_BITS - 1) && (startFreq.doubleValue() == stopFreq.doubleValue())
876 stopFreq = GridUtils.getStopFrequencyFromIndex(index).doubleValue();
877 freqMap.put(startFreq, stopFreq);
883 public OwnedNodeEdgePointBuilder addPayloadStructureAndPhotSpecToOnep(String nodeId,
884 Map<Double, Double> freqMap, List<OperationalModeKey> operModeList,
885 Collection<SupportedInterfaceCapability> sicColl, OwnedNodeEdgePointBuilder onepBldr, String keyword) {
886 if (String.join("+", nodeId, TapiStringConstants.OTSI_MC).equals(keyword)
887 || String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS).equals(keyword)) {
888 LOG.debug("Entering LOOP Step1");
889 // Creating OTS & OTSI_MC NEP specific attributes
890 onepBldr.setSupportedPayloadStructure(createSupportedPayloadStructureForPhtncMedia(
891 sicColl,operModeList));
892 SpectrumCapabilityPacBuilder spectrumPac = new SpectrumCapabilityPacBuilder();
893 OccupiedSpectrumBuilder ospecBd = new OccupiedSpectrumBuilder();
894 if (freqMap == null || freqMap.isEmpty()) {
895 // TODO: verify if we need to fill OcupiedSpectrum as follows when no lambda provisioned
897 // .setUpperFrequency(Uint64.valueOf(0))
898 // .setLowerFrequency(Uint64.valueOf(0));
899 onepBldr.setAvailablePayloadStructure(createAvailablePayloadStructureForPhtncMedia(
900 false, sicColl,operModeList));
902 AvailableSpectrum aspec = new AvailableSpectrumBuilder()
903 .setLowerFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09 + naz)))
904 .setUpperFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09
905 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06 + naz)))
907 Map<AvailableSpectrumKey, AvailableSpectrum> aspecMap = new HashMap<>();
908 aspecMap.put(new AvailableSpectrumKey(aspec.getLowerFrequency(),
909 aspec.getUpperFrequency()), aspec);
910 spectrumPac.setAvailableSpectrum(aspecMap);
912 LOG.debug("Entering LOOP Step2");
913 onepBldr.setAvailablePayloadStructure(createAvailablePayloadStructureForPhtncMedia(
914 true, sicColl,operModeList));
915 Map<OccupiedSpectrumKey, OccupiedSpectrum> ospecMap = new HashMap<>();
916 for (Map.Entry<Double, Double> frequency : freqMap.entrySet()) {
918 .setLowerFrequency(Uint64.valueOf(Math.round(frequency.getKey().doubleValue() * 1E09)))
919 .setUpperFrequency(Uint64.valueOf(Math.round(frequency.getValue().doubleValue() * 1E09)));
921 OccupiedSpectrum ospec = ospecBd.build();
922 ospecMap.put(new OccupiedSpectrumKey(ospec.getLowerFrequency(), ospec.getUpperFrequency()), ospec);
923 spectrumPac.setOccupiedSpectrum(ospecMap);
925 LOG.debug("Entering LOOP Step3");
927 SupportableSpectrum sspec = new SupportableSpectrumBuilder()
928 .setUpperFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09 + nazz)))
929 .setLowerFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09
930 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06 + nazz)))
932 Map<SupportableSpectrumKey, SupportableSpectrum> sspecMap = new HashMap<>();
933 sspecMap.put(new SupportableSpectrumKey(sspec.getLowerFrequency(),
934 sspec.getUpperFrequency()), sspec);
935 spectrumPac.setSupportableSpectrum(sspecMap);
936 LOG.debug("Entering LOOP Step4");
937 PhotonicMediaNodeEdgePointSpec pnepSpec = new PhotonicMediaNodeEdgePointSpecBuilder()
938 .setSpectrumCapabilityPac(spectrumPac.build())
940 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.OwnedNodeEdgePoint1 onep1 =
941 new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121
942 .OwnedNodeEdgePoint1Builder()
943 .setPhotonicMediaNodeEdgePointSpec(pnepSpec)
945 LOG.debug("creating Photonic NEP SPEC for node {} and nep {}", nodeId, onep1);
946 onepBldr.addAugmentation(onep1);
947 LOG.debug("Entering LOOP Step5");
953 public OwnedNodeEdgePointBuilder addPhotSpecToRoadmOnep(String nodeId,
954 Map<Double, Double> usedFreqMap, Map<Double, Double> availableFreqMap,
955 OwnedNodeEdgePointBuilder onepBldr, String keyword) {
956 if (String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS).equals(keyword)
957 || String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OMS).equals(keyword)) {
958 // Creating OTS/OMS NEP specific attributes
959 SpectrumCapabilityPacBuilder spectrumPac = new SpectrumCapabilityPacBuilder();
960 if ((usedFreqMap == null || usedFreqMap.isEmpty())
961 && (availableFreqMap == null || availableFreqMap.isEmpty())) {
963 AvailableSpectrum aspec = new AvailableSpectrumBuilder()
964 .setLowerFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09 + naz)))
965 .setUpperFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09
966 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06 + naz)))
968 Map<AvailableSpectrumKey, AvailableSpectrum> aspecMap = new HashMap<>();
969 aspecMap.put(new AvailableSpectrumKey(aspec.getLowerFrequency(),
970 aspec.getUpperFrequency()), aspec);
971 spectrumPac.setAvailableSpectrum(aspecMap);
973 if (availableFreqMap != null && !availableFreqMap.isEmpty()) {
974 Map<AvailableSpectrumKey, AvailableSpectrum> aspecMap = new HashMap<>();
975 AvailableSpectrumBuilder aspecBd = new AvailableSpectrumBuilder();
976 for (Map.Entry<Double, Double> frequency : availableFreqMap.entrySet()) {
978 .setLowerFrequency(Uint64.valueOf(Math.round(frequency.getKey().doubleValue() * 1E09)))
979 .setUpperFrequency(Uint64.valueOf(Math.round(frequency.getValue().doubleValue() * 1E09)));
980 AvailableSpectrum aspec = aspecBd.build();
981 aspecMap.put(new AvailableSpectrumKey(aspec.getLowerFrequency(),
982 aspec.getUpperFrequency()), aspec);
984 spectrumPac.setAvailableSpectrum(aspecMap);
986 if (usedFreqMap != null && !usedFreqMap.isEmpty()) {
987 Map<OccupiedSpectrumKey, OccupiedSpectrum> ospecMap = new HashMap<>();
988 OccupiedSpectrumBuilder ospecBd = new OccupiedSpectrumBuilder();
989 for (Map.Entry<Double, Double> frequency : usedFreqMap.entrySet()) {
991 .setLowerFrequency(Uint64.valueOf(Math.round(frequency.getKey().doubleValue() * 1E09)))
992 .setUpperFrequency(Uint64.valueOf(Math.round(frequency.getValue().doubleValue() * 1E09)));
993 OccupiedSpectrum ospec = ospecBd.build();
994 ospecMap.put(new OccupiedSpectrumKey(ospec.getLowerFrequency(),
995 ospec.getUpperFrequency()), ospec);
997 spectrumPac.setOccupiedSpectrum(ospecMap);
1001 SupportableSpectrum sspec = new SupportableSpectrumBuilder()
1002 .setUpperFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09 + nazz)))
1003 .setLowerFrequency(Uint64.valueOf(Math.round(GridConstant.START_EDGE_FREQUENCY * 1E09
1004 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06 + nazz)))
1006 Map<SupportableSpectrumKey, SupportableSpectrum> sspecMap = new HashMap<>();
1007 sspecMap.put(new SupportableSpectrumKey(sspec.getLowerFrequency(),
1008 sspec.getUpperFrequency()), sspec);
1009 spectrumPac.setSupportableSpectrum(sspecMap);
1011 PhotonicMediaNodeEdgePointSpec pnepSpec = new PhotonicMediaNodeEdgePointSpecBuilder()
1012 .setSpectrumCapabilityPac(spectrumPac.build())
1014 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.OwnedNodeEdgePoint1 onep1 =
1015 new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121
1016 .OwnedNodeEdgePoint1Builder()
1017 .setPhotonicMediaNodeEdgePointSpec(pnepSpec)
1019 onepBldr.addAugmentation(onep1);
1020 LOG.debug("Add Photonic Node Edge point Spec to {} including available Spectrum {} = ",
1022 onep1.getPhotonicMediaNodeEdgePointSpec().getSpectrumCapabilityPac().getAvailableSpectrum());
1027 private OduSwitchingPools createOduSwitchingPoolForTp100G() {
1028 Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
1030 for (TerminationPoint tp : this.oorNetworkPortList) {
1031 NonBlockingList nbl = new NonBlockingListBuilder()
1032 .setNblNumber(Uint16.valueOf(count))
1033 .setTpList(new HashSet<>(Set.of(
1035 tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
1036 .TerminationPoint1.class)
1037 .getAssociatedConnectionMapTp().iterator().next())))
1039 nblMap.put(nbl.key(), nbl);
1042 return new OduSwitchingPoolsBuilder()
1043 .setNonBlockingList(nblMap)
1044 .setSwitchingPoolNumber(Uint16.valueOf(1))
1048 private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node createTapiNode(
1049 Map<NameKey, Name> nodeNames, Set<LayerProtocolName> layerProtocols) {
1050 Uuid nodeUuid = null;
1051 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
1052 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
1053 if (layerProtocols.contains(LayerProtocolName.DSR)
1054 || layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
1055 Rule rule = new RuleBuilder()
1056 .setLocalId("forward")
1057 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
1058 .setRuleType(new HashSet<>(Set.of(RuleType.FORWARDING)))
1060 nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, new HashMap<>(Map.of(rule.key(), rule)));
1062 LOG.error("Undefined LayerProtocolName for {} node {}",
1063 nodeNames.get(nodeNames.keySet().iterator().next()).getValueName(),
1064 nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
1066 // Empty random creation of mandatory fields for avoiding errors....
1067 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
1068 .setCostAlgorithm("Restricted Shortest Path - RSP")
1069 .setCostName("HOP_COUNT")
1070 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
1072 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1073 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
1074 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
1075 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
1076 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
1077 .setTrafficPropertyName("FIXED_LATENCY")
1079 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1080 .setRiskCharacteristicName("risk characteristic")
1081 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
1083 return new NodeBuilder()
1086 .setLayerProtocolName(layerProtocols)
1087 .setAdministrativeState(transformAsToTapiAdminState(this.ietfNodeAdminState.getName()))
1088 .setOperationalState(transformOsToTapiOperationalState(this.ietfNodeOperState.getName()))
1089 .setLifecycleState(LifecycleState.INSTALLED)
1090 .setOwnedNodeEdgePoint(onepl)
1091 .setNodeRuleGroup(nodeRuleGroupList)
1092 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1093 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1094 .setRiskParameterPac(
1095 new RiskParameterPacBuilder()
1096 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1098 .setErrorCharacteristic("error")
1099 .setLossCharacteristic("loss")
1100 .setRepeatDeliveryCharacteristic("repeat delivery")
1101 .setDeliveryOrderCharacteristic("delivery order")
1102 .setUnavailableTimeCharacteristic("unavailable time")
1103 .setServerIntegrityProcessCharacteristic("server integrity process")
1107 private Uuid getNodeUuid4Dsr(
1108 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
1109 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList,
1110 Map<RuleKey, Rule> ruleList) {
1111 // client NEP DSR creation on DSR/ODU node
1112 for (int i = 0; i < oorClientPortList.size(); i++) {
1113 String nodeIdDsr = String.join("+",
1114 this.ietfNodeId, TapiStringConstants.DSR, oorClientPortList.get(i).getTpId().getValue());
1115 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(nodeIdDsr.getBytes(Charset.forName("UTF-8"))).toString());
1116 LOG.info("NEP = {} has Uuid {} ", nodeIdDsr, nepUuid);
1117 this.uuidMap.put(nodeIdDsr, nepUuid);
1118 Name name = new NameBuilder()
1119 .setValue(nodeIdDsr)
1120 .setValueName(OpenroadmNodeType.TPDR.equals(this.ietfNodeType) ? "100G-tpdr" : "NodeEdgePoint_C")
1122 OwnedNodeEdgePoint onep = createNep(
1123 oorClientPortList.get(i),
1124 Map.of(name.key(), name),
1125 LayerProtocolName.DSR, LayerProtocolName.DSR, true,
1126 String.join("+", this.ietfNodeId, TapiStringConstants.DSR));
1127 onepl.put(onep.key(), onep);
1129 // CLIENT NEP E_ODU creation on DSR/ODU node
1130 for (int i = 0; i < oorClientPortList.size(); i++) {
1131 String nodeIdEodu = String.join("+",
1132 this.ietfNodeId, TapiStringConstants.E_ODU, oorClientPortList.get(i).getTpId().getValue());
1133 Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(nodeIdEodu.getBytes(Charset.forName("UTF-8"))).toString());
1134 LOG.info("NEP = {} has Uuid {} ", nodeIdEodu, nepUuid1);
1135 this.uuidMap.put(nodeIdEodu, nepUuid1);
1136 Name onedName = new NameBuilder()
1137 .setValueName("eNodeEdgePoint_N")
1138 .setValue(nodeIdEodu)
1140 OwnedNodeEdgePoint onep = createNep(
1141 oorClientPortList.get(i),
1142 Map.of(onedName.key(), onedName),
1143 LayerProtocolName.ODU, LayerProtocolName.DSR, false,
1144 String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU));
1145 onepl.put(onep.key(), onep);
1147 // NETWORK NEPs I_ODU creation on DSR/ODU node
1148 for (int i = 0; i < oorNetworkPortList.size(); i++) {
1149 String nodeIdIodu = String.join("+",
1150 this.ietfNodeId, TapiStringConstants.I_ODU, oorNetworkPortList.get(i).getTpId().getValue());
1151 Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(nodeIdIodu.getBytes(Charset.forName("UTF-8"))).toString());
1152 LOG.info("NEP = {} has Uuid {} ", nodeIdIodu, nepUuid1);
1153 this.uuidMap.put(nodeIdIodu, nepUuid1);
1154 Name onedName = new NameBuilder()
1155 .setValueName("iNodeEdgePoint_N")
1156 .setValue(nodeIdIodu)
1158 OwnedNodeEdgePoint onep = createNep(
1159 oorNetworkPortList.get(i),
1160 Map.of(onedName.key(), onedName),
1161 LayerProtocolName.ODU, LayerProtocolName.DSR, true,
1162 String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU));
1163 onepl.put(onep.key(), onep);
1165 // NETWORK NEP OTS network on DSR/ODU node
1166 for (int i = 0; i < oorNetworkPortList.size(); i++) {
1167 String nodeIdPmOts = String.join("+",
1168 this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, oorNetworkPortList.get(i).getTpId().getValue());
1169 Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(nodeIdPmOts.getBytes(Charset.forName("UTF-8"))).toString());
1170 LOG.info("NEP = {} has Uuid {} ", nodeIdPmOts, nepUuid2);
1171 this.uuidMap.put(nodeIdPmOts, nepUuid2);
1172 Name onedName = new NameBuilder()
1173 .setValueName("eNodeEdgePoint")
1174 .setValue(nodeIdPmOts)
1176 OwnedNodeEdgePoint onep = createNep(
1177 oorNetworkPortList.get(i),
1178 Map.of(onedName.key(), onedName),
1179 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
1180 String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS));
1181 onepl.put(onep.key(), onep);
1183 for (int i = 0; i < oorNetworkPortList.size(); i++) {
1184 String nodeIdOtMc = String.join("+",
1185 this.ietfNodeId, TapiStringConstants.OTSI_MC, oorNetworkPortList.get(i).getTpId().getValue());
1186 Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(nodeIdOtMc.getBytes(Charset.forName("UTF-8"))).toString());
1187 LOG.info("NEP = {} has Uuid {} ", nodeIdOtMc, nepUuid3);
1188 this.uuidMap.put(nodeIdOtMc, nepUuid3);
1189 Name onedName = new NameBuilder()
1190 .setValueName("PhotMedNodeEdgePoint")
1191 .setValue(nodeIdOtMc)
1193 OwnedNodeEdgePoint onep = createNep(
1194 oorNetworkPortList.get(i),
1195 Map.of(onedName.key(), onedName),
1196 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
1197 String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC));
1198 onepl.put(onep.key(), onep);
1200 // create NodeRuleGroup
1202 LOG.debug("ODU switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
1203 String ietfXpdr = String.join("+", this.ietfNodeId, TapiStringConstants.XPDR);
1204 for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
1205 Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
1206 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
1207 nepList = new HashMap<>();
1208 Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
1209 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
1210 oduNepList = new HashMap<>();
1211 LOG.debug("UUidMap={}", this.uuidMap.keySet());
1212 LOG.debug("TP list = {}", nbl.getTpList());
1213 for (TpId tp : nbl.getTpList()) {
1214 LOG.debug("TP={}", tp.getValue());
1215 String ietfEoduTp = String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU, tp.getValue());
1216 LOG.debug("UuidKey={}", ietfEoduTp);
1217 String ietfIoduTp = String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU, tp.getValue());
1218 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, TapiStringConstants.DSR, tp.getValue()))
1219 || this.uuidMap.containsKey(ietfIoduTp)) {
1220 String qual = tp.getValue().contains("CLIENT")
1221 ? TapiStringConstants.DSR : TapiStringConstants.I_ODU;
1222 var nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
1223 .node.rule.group.NodeEdgePointBuilder()
1224 .setTopologyUuid(tapiTopoUuid)
1225 .setNodeUuid(this.uuidMap.get(ietfXpdr))
1226 .setNodeEdgePointUuid(this.uuidMap.get(
1227 String.join("+", this.ietfNodeId, qual, tp.getValue())))
1229 nepList.put(nep.key(), nep);
1231 if (this.uuidMap.containsKey(ietfEoduTp)) {
1232 var nep1 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
1233 .node.rule.group.NodeEdgePointBuilder()
1234 .setTopologyUuid(tapiTopoUuid)
1235 .setNodeUuid(this.uuidMap.get(ietfXpdr))
1236 .setNodeEdgePointUuid(this.uuidMap.get(ietfEoduTp))
1238 oduNepList.put(nep1.key(), nep1);
1240 if (this.uuidMap.containsKey(ietfIoduTp)) {
1241 // TODO already checked with DSR above -> potential factorization ?
1242 var nep2 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
1243 .node.rule.group.NodeEdgePointBuilder()
1244 .setTopologyUuid(tapiTopoUuid)
1245 .setNodeUuid(this.uuidMap.get(ietfXpdr))
1246 .setNodeEdgePointUuid(this.uuidMap.get(ietfIoduTp))
1248 oduNepList.put(nep2.key(), nep2);
1251 LOG.debug("NEPLIST (DSR/I_ODU) of [dsr node rule group] is {}", nepList);
1252 LOG.debug("NEPLIST (E_ODU/I_ODU) of [odu node rule group] is {}", nepList);
1253 // Empty random creation of mandatory fields for avoiding errors....
1254 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
1255 .setCostAlgorithm("Restricted Shortest Path - RSP")
1256 .setCostName("HOP_COUNT")
1257 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
1259 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1260 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
1261 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
1262 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
1263 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
1264 .setTrafficPropertyName("FIXED_LATENCY")
1266 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1267 .setRiskCharacteristicName("risk characteristic")
1268 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
1270 Name nrgName = new NameBuilder()
1271 .setValueName("nrg name")
1272 .setValue("odu node rule group " + count)
1274 NodeRuleGroup nodeRuleGroup1 = new NodeRuleGroupBuilder()
1275 .setName(Map.of(nrgName.key(), nrgName))
1276 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("dsr node rule group " + count)
1277 .getBytes(Charset.forName("UTF-8"))).toString()))
1279 .setNodeEdgePoint(nepList)
1280 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1281 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1282 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1284 nodeRuleGroupList.put(nodeRuleGroup1.key(), nodeRuleGroup1);
1285 NodeRuleGroup nodeRuleGroup2 = new NodeRuleGroupBuilder()
1286 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("odu node rule group " + count)
1287 .getBytes(Charset.forName("UTF-8"))).toString()))
1289 .setNodeEdgePoint(oduNepList)
1290 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1291 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1292 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1294 nodeRuleGroupList.put(nodeRuleGroup2.key(), nodeRuleGroup2);
1297 return this.uuidMap.get(ietfXpdr);
1300 private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
1301 LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
1302 var tp1 = oorTp.augmentation(
1303 org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1.class);
1304 if (tp1.getTpSupportedInterfaces() == null) {
1305 LOG.warn("Tp supported interface doesnt exist on TP {}", oorTp.getTpId().getValue());
1308 AdministrativeState adminState =
1309 oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() == null
1311 : transformAsToTapiAdminState(
1312 oorTp.augmentation(TerminationPoint1.class).getAdministrativeState().getName());
1313 OperationalState operState =
1314 oorTp.augmentation(TerminationPoint1.class).getOperationalState() == null
1316 : transformOsToTapiOperationalState(
1317 oorTp.augmentation(TerminationPoint1.class).getOperationalState().getName());
1318 Collection<SupportedInterfaceCapability> sicColl =
1319 tp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values();
1320 OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
1321 .setUuid(this.uuidMap.get(String.join("+", keyword, oorTp.getTpId().getValue())))
1322 .setLayerProtocolName(nepProtocol)
1324 .setSupportedCepLayerProtocolQualifierInstances(
1325 createSupportedCepLayerProtocolQualifier(sicColl, nepProtocol))
1326 .setDirection(Direction.BIDIRECTIONAL)
1327 .setLinkPortRole(PortRole.SYMMETRIC)
1328 .setAdministrativeState(adminState)
1329 .setOperationalState(operState)
1330 .setLifecycleState(LifecycleState.INSTALLED);
1332 onepBldr.setMappedServiceInterfacePoint(
1333 createMSIP(1, nepProtocol, oorTp.getTpId().getValue(), keyword, sicColl, operState, adminState));
1335 if (oorTp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
1336 List<OperationalModeKey> opModeList = new ArrayList<>();
1337 var tp11 = oorTp.augmentation(
1338 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
1339 if (tp11 == null || tp11.getXpdrNetworkAttributes() == null) {
1340 for (SupportedInterfaceCapability sic : sicColl) {
1341 String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
1342 if (("IfOCHOTUCnODUCn").equals(ifCapType) || ("IfOCHOTUCnODUCnUniregen").equals(ifCapType)
1343 || ("IfOCHOTUCnODUCnRegen").equals(ifCapType)) {
1344 opModeList.add(new OperationalModeKey("400G"));
1345 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "400G rate available", oorTp.getTpId());
1349 opModeList.add(new OperationalModeKey("100G"));
1350 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "100G rate available", oorTp.getTpId());
1352 opModeList = tp11.getXpdrNetworkAttributes().getSupportedOperationalModes().getOperationalMode()
1353 .keySet().stream().toList();
1355 onepBldr = addPayloadStructureAndPhotSpecToOnep(
1356 this.ietfNodeId, getXpdrUsedWavelength(oorTp), opModeList, sicColl, onepBldr, keyword);
1358 LOG.debug("ConvertORToTapiTopology 1360, onep = {}", onepBldr.build());
1359 return onepBldr.build();
1362 private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, String tpId,
1363 String nodeid, Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
1364 OperationalState operState, AdministrativeState adminState) {
1365 // TODO: what value should be set in total capacity and available capacity??
1366 LOG.debug("SIP name = {}", String.join("+", nodeid, tpId));
1367 Name sipName = new NameBuilder()
1368 .setValueName("SIP name")
1369 .setValue(String.join("+", nodeid, tpId))
1371 return new ServiceInterfacePointBuilder()
1373 .setName(Map.of(sipName.key(), sipName))
1374 .setLayerProtocolName(layerProtocol)
1375 .setAdministrativeState(adminState)
1376 .setOperationalState(operState)
1377 .setLifecycleState(LifecycleState.INSTALLED)
1378 .setAvailableCapacity(new AvailableCapacityBuilder().build())
1379 .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
1380 .setSupportedCepLayerProtocolQualifierInstances(createSipSupportedLayerProtocolQualifier(
1381 supportedInterfaceCapability, layerProtocol))
1385 @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "SF_SWITCH_FALLTHROUGH",
1386 justification = "Voluntarily No break in switchcase where comment is inserted in following method")
1387 private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1388 .service._interface.point.SupportedCepLayerProtocolQualifierInstances>
1389 createSipSupportedLayerProtocolQualifier(
1390 Collection<SupportedInterfaceCapability> supportedInterfaceCapability, LayerProtocolName lpn) {
1391 if (supportedInterfaceCapability == null) {
1392 return new ArrayList<>(List.of(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1393 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1394 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
1395 .setNumberOfCepInstances(Uint64.valueOf(1))
1398 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1399 .service._interface.point.SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
1400 for (SupportedInterfaceCapability sic : supportedInterfaceCapability) {
1401 String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
1402 switch (lpn.getName()) {
1405 switch (ifCapType) {
1407 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1408 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1409 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
1410 .setNumberOfCepInstances(Uint64.valueOf(0))
1412 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1413 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1414 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
1415 .setNumberOfCepInstances(Uint64.valueOf(0))
1419 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1420 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1421 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
1422 .setNumberOfCepInstances(Uint64.valueOf(0))
1424 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1425 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1426 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
1427 .setNumberOfCepInstances(Uint64.valueOf(0))
1431 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1432 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1433 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
1434 .setNumberOfCepInstances(Uint64.valueOf(0))
1436 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1437 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1438 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
1439 .setNumberOfCepInstances(Uint64.valueOf(0))
1443 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1444 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1445 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
1446 .setNumberOfCepInstances(Uint64.valueOf(0))
1450 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1451 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1452 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
1453 .setNumberOfCepInstances(Uint64.valueOf(0))
1455 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1456 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1457 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
1458 .setNumberOfCepInstances(Uint64.valueOf(0))
1462 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1463 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1464 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
1465 .setNumberOfCepInstances(Uint64.valueOf(0))
1468 case "IfOCHOTU4ODU4":
1470 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1471 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1472 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
1473 .setNumberOfCepInstances(Uint64.valueOf(0))
1477 LOG.error("IfCapability type not managed");
1482 switch (ifCapType) {
1484 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1485 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1486 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
1487 .setNumberOfCepInstances(Uint64.valueOf(0))
1491 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1492 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1493 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
1494 .setNumberOfCepInstances(Uint64.valueOf(0))
1499 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1500 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1501 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
1502 .setNumberOfCepInstances(Uint64.valueOf(0))
1507 case "IfOCHOTU4ODU4":
1509 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1510 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1511 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
1512 .setNumberOfCepInstances(Uint64.valueOf(0))
1516 LOG.error("IfCapability type not managed");
1520 case "PHOTONIC_MEDIA":
1521 switch (ifCapType) {
1522 case "IfOCHOTUCnODUCn":
1523 case "IfOtsiOtucnOducn":
1524 case "IfOCHOTUCnODUCnRegen":
1525 case "IfOCHOTUCnODUCnUniregen":
1526 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1527 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1528 .setLayerProtocolQualifier(ODUTYPEODUCN.VALUE)
1529 .setNumberOfCepInstances(Uint64.valueOf(1))
1531 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1532 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1533 .setLayerProtocolQualifier(OTUTYPEOTUCN.VALUE)
1534 .setNumberOfCepInstances(Uint64.valueOf(1))
1538 case "IfOCHOTU4ODU4":
1539 case "IfOCHOTU4ODU4Regen":
1540 case "IfOCHOTU4ODU4Uniregen":
1541 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1542 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1543 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
1544 .setNumberOfCepInstances(Uint64.valueOf(1))
1546 sclpqiList.add(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
1547 .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
1548 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
1549 .setNumberOfCepInstances(Uint64.valueOf(1))
1557 LOG.error("Layer Protocol Name is unknown");
1561 return sclpqiList.stream().distinct().toList();
1564 public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
1569 public Map<LinkKey, Link> getTapiLinks() {
1573 public AdministrativeState transformAsToTapiAdminState(String adminState) {
1574 return adminState == null
1576 : adminState.equals(AdminStates.InService.getName())
1577 || adminState.equals(AdministrativeState.UNLOCKED.getName())
1578 ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
1581 public OperationalState transformOsToTapiOperationalState(String operState) {
1582 return operState == null
1584 : operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
1585 ? OperationalState.ENABLED : OperationalState.DISABLED;
1588 public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
1592 public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
1593 this.tapiSips.putAll(tapiSip);