2 * Copyright © 2021 Nokia, 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.nio.charset.Charset;
11 import java.nio.charset.StandardCharsets;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.Collections;
15 import java.util.Comparator;
16 import java.util.HashMap;
17 import java.util.HashSet;
18 import java.util.List;
20 import java.util.Objects;
21 import java.util.Optional;
23 import java.util.UUID;
24 import java.util.concurrent.ExecutionException;
25 import java.util.stream.Collectors;
26 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
27 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
28 import org.opendaylight.transportpce.common.NetworkUtils;
29 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
30 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
31 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
32 import org.opendaylight.transportpce.tapi.R2RTapiLinkDiscovery;
33 import org.opendaylight.transportpce.tapi.TapiStringConstants;
34 import org.opendaylight.transportpce.tapi.utils.TapiLink;
35 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
36 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ContextBuilder;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointBuilder;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1Builder;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPoint;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointBuilder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointKey;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionBuilder;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepList;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepListBuilder;
92 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEATTRIBUTEVALUECHANGE;
93 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NotificationBuilder;
94 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributes;
95 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesBuilder;
96 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesKey;
97 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIERMC;
98 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
99 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
100 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
101 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.context.topology.context.topology.node.owned.node.edge.point.PhotonicMediaNodeEdgePointSpec;
102 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
103 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
104 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.NodeEdgePointRef;
105 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
106 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPENODEEDGEPOINT;
107 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
108 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
109 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
110 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
111 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
112 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
113 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
114 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
115 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
116 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
117 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
118 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
119 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint;
120 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointBuilder;
121 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey;
122 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
123 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
124 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
125 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
126 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
127 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
128 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
129 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
130 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
131 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
132 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
133 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
134 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder;
135 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
136 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
137 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
138 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
139 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
140 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
141 import org.opendaylight.yangtools.yang.common.Uint16;
142 import org.opendaylight.yangtools.yang.common.Uint32;
143 import org.opendaylight.yangtools.yang.common.Uint64;
144 import org.osgi.service.component.annotations.Activate;
145 import org.osgi.service.component.annotations.Component;
146 import org.osgi.service.component.annotations.Reference;
147 import org.slf4j.Logger;
148 import org.slf4j.LoggerFactory;
152 public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
154 private static final Logger LOG = LoggerFactory.getLogger(TapiNetworkModelServiceImpl.class);
156 private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
157 .getBytes(StandardCharsets.UTF_8)).toString());
158 private final NetworkTransactionService networkTransactionService;
159 private final R2RTapiLinkDiscovery linkDiscovery;
160 private final TapiLink tapiLink;
161 private final ConvertORToTapiTopology tapiFactory;
162 private String topologicalMode;
163 private final ConvertORTopoToTapiFullTopo tapiFullFactory;
164 private final NotificationPublishService notificationPublishService;
165 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap = new HashMap<>();
168 public TapiNetworkModelServiceImpl(@Reference NetworkTransactionService networkTransactionService,
169 @Reference DeviceTransactionManager deviceTransactionManager,
170 @Reference TapiLink tapiLink,
171 @Reference final NotificationPublishService notificationPublishService) {
172 this.networkTransactionService = networkTransactionService;
173 this.linkDiscovery = new R2RTapiLinkDiscovery(networkTransactionService, deviceTransactionManager, tapiLink);
174 this.notificationPublishService = notificationPublishService;
175 this.tapiFactory = new ConvertORToTapiTopology(tapiTopoUuid);
176 this.tapiLink = tapiLink;
177 this.tapiFullFactory = new ConvertORTopoToTapiFullTopo(tapiTopoUuid, tapiLink);
178 this.topologicalMode = tapiFullFactory.getTopologicalMode();
182 public void createTapiNode(String orNodeId, int orNodeVersion, Nodes node) {
183 // TODO -> Implementation with PortMappingListener
184 // check if port mapping exists or not...
185 if (node.getMapping() == null) {
186 LOG.warn("Could not generate port mapping for {} skipping network model creation", orNodeId);
190 LOG.info("Mapping of node {}: {}", orNodeId, node.getMapping().values());
191 // check type of device, check version and create node mapping
192 switch (node.getNodeInfo().getNodeType()) {
195 // transform flat mapping list to per degree and per srg mapping lists
196 Map<String, List<Mapping>> mapDeg = new HashMap<>();
197 Map<String, List<Mapping>> mapSrg = new HashMap<>();
198 List<Mapping> mappingList = new ArrayList<>(node.nonnullMapping().values());
199 mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint));
200 // populate degree and srg LCP map
201 for (String str : getRoadmNodelist(mappingList)) {
202 List<Mapping> interList = mappingList.stream()
203 .filter(x -> x.getLogicalConnectionPoint().contains(str))
204 .collect(Collectors.toList());
205 if (str.contains("DEG")) {
206 mapDeg.put(str, interList);
207 } else if (str.contains("SRG")) {
208 mapSrg.put(str, interList);
210 LOG.error("unknown element");
213 // Transform LCPs into ONEP
214 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap =
215 new HashMap<>(transformSrgToOnep(orNodeId, mapSrg));
216 LOG.debug("CreateTapiNode NetworkModelServiceImpl, TopologicalMode = {}", topologicalMode);
217 LOG.debug("TAPINETWORKMODELSERVICEIMPL call transformSRGtoONEP (OrNodeId {} ", orNodeId);
218 LOG.debug("TAPINETWORKMODELSERVICEIMPL SRG OTSNode of retrieved OnepMap {} ",
219 onepMap.entrySet().stream()
220 .filter(e -> e.getValue().getSupportedCepLayerProtocolQualifierInstances()
222 new SupportedCepLayerProtocolQualifierInstancesBuilder()
223 .setNumberOfCepInstances(Uint64.valueOf(1))
224 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
226 .collect(Collectors.toList()));
227 if (!topologicalMode.equals("Full")) {
229 Node roadmNode = createRoadmTapiNode("ROADMINFRA", onepMap);
230 mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
231 mergeSipsinContext(this.sipMap);
232 // TODO add states corresponding to device config -> based on mapping.
233 // This should be possible after Gilles work is merged
234 LOG.info("TAPI node for or node {} successfully merged", orNodeId);
237 onepMap.putAll(transformDegToOnep(orNodeId, mapDeg));
238 LOG.debug("TAPINETWORKMODELSERVICEIMPL DEG+SRG OTSNode of retrieved OnepMap {} ",
239 onepMap.entrySet().stream()
240 .filter(e -> e.getValue().getSupportedCepLayerProtocolQualifierInstances()
242 new SupportedCepLayerProtocolQualifierInstancesBuilder()
243 .setNumberOfCepInstances(Uint64.valueOf(1))
244 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
246 .collect(Collectors.toList()));
247 LOG.debug("TAPINETWORKMODELSERVICEIMPL DEG+SRG complete retrieved OnepMap {} ", onepMap);
249 Node roadmNode = createRoadmTapiNode(orNodeId, onepMap);
250 mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
251 mergeSipsinContext(this.sipMap);
252 // TODO add states corresponding to device config -> based on mapping.
253 // This should be possible after Gilles work is merged
255 // rdm to rdm link creation if neighbour roadm is mounted
256 LOG.info("checking if neighbor roadm exists");
257 Map<LinkKey, Link> rdm2rdmLinks =
258 this.linkDiscovery.readLLDP(new NodeId(orNodeId), orNodeVersion, this.tapiTopoUuid);
259 if (!rdm2rdmLinks.isEmpty()) {
260 mergeLinkinTopology(rdm2rdmLinks);
262 LOG.info("TAPI node for or node {} successfully merged", orNodeId);
266 Map<Integer, String> xpdrMap = new HashMap<>();
267 for (Mapping mapping : node.nonnullMapping().values().stream()
268 .filter(k -> k.getLogicalConnectionPoint().contains("NETWORK"))
269 .collect(Collectors.toList())) {
271 Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
272 String nodeId = node.getNodeId() + TapiStringConstants.XXPDR + xpdrNb;
273 if (xpdrMap.containsKey(xpdrNb)) {
276 List<Mapping> xpdrNetMaps = node.nonnullMapping().values().stream()
277 .filter(k -> k.getLogicalConnectionPoint()
278 .contains("XPDR" + xpdrNb + TapiStringConstants.NETWORK))
279 .collect(Collectors.toList());
280 List<Mapping> xpdrClMaps = node.nonnullMapping().values().stream()
281 .filter(k -> k.getLogicalConnectionPoint()
282 .contains("XPDR" + xpdrNb + TapiStringConstants.CLIENT))
283 .collect(Collectors.toList());
284 xpdrMap.put(xpdrNb, node.getNodeId());
285 // create switching pool
286 OduSwitchingPools oorOduSwitchingPool =
287 createSwitchPoolForXpdr(mapping.getXpdrType(), xpdrClMaps, xpdrNetMaps, xpdrNb);
288 // add nodes and sips to tapi context
289 mergeNodeinTopology(new HashMap<>(
290 // node transformation
291 transformXpdrToTapiNode(
292 nodeId, xpdrClMaps, xpdrNetMaps, mapping.getXpdrType(), oorOduSwitchingPool)));
293 mergeSipsinContext(this.sipMap);
295 LOG.info("TAPI node for or node {} successfully merged", orNodeId);
301 // Device not managed yet
305 public void updateTapiTopology(String nodeId, Mapping mapping) {
306 List<Uuid> changedOneps = updateNeps(mapping, getChangedNodeUuids(nodeId, mapping));
307 updateLinks(changedOneps, mapping);
308 sendNotification(changedOneps, mapping);
309 LOG.info("Updated TAPI topology successfully.");
312 @SuppressWarnings("rawtypes")
313 private void sendNotification(List<Uuid> changedOneps, Mapping mapping) {
315 notificationPublishService.putNotification(
316 new NotificationBuilder()
317 .setNotificationType(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE)
318 // .setTargetObjectType(ObjectType.NODEEDGEPOINT)
319 //TODO: Change this : modification in Models 2.4 does not provide for Object type Node EdgePoint
320 .setTargetObjectType(TOPOLOGYOBJECTTYPENODEEDGEPOINT.VALUE)
321 .setChangedAttributes(getChangedAttributes(changedOneps, mapping))
322 .setUuid(tapiTopoUuid)
324 } catch (InterruptedException e) {
325 LOG.error("Could not send notification");
329 private Map<ChangedAttributesKey, ChangedAttributes> getChangedAttributes(
330 List<Uuid> changedOneps, Mapping mapping) {
331 Map<ChangedAttributesKey, ChangedAttributes> changedAttributes = new HashMap<>();
332 String operState = mapping.getPortOperState();
333 String oldState = operState.equals("InService") ? "OutOfService" : "InService";
334 for (Uuid nep : changedOneps) {
335 String nepVal = nep.getValue();
336 changedAttributes.put(
337 new ChangedAttributesKey(nepVal),
338 new ChangedAttributesBuilder()
339 .setValueName(nepVal)
340 .setOldValue(oldState)
341 .setNewValue(operState)
344 return changedAttributes;
347 private void updateLinks(List<Uuid> changedOneps, Mapping mapping) {
349 Optional<Topology> optTopology =
350 this.networkTransactionService.read(
351 LogicalDatastoreType.OPERATIONAL,
352 InstanceIdentifier.builder(Context.class)
353 .augmentation(Context1.class)
354 .child(TopologyContext.class)
355 .child(Topology.class, new TopologyKey(tapiTopoUuid))
358 if (optTopology.isEmpty()) {
359 LOG.error("Could not update TAPI links");
362 int nbAffectedLinks = 0;
363 LOG.info("UUIDofAffectedONEPS = {} ", changedOneps);
364 AdministrativeState newAdmState = transformAdminState(mapping.getPortAdminState());
365 OperationalState newOprState = transformOperState(mapping.getPortOperState());
366 for (Link link : optTopology.orElseThrow().nonnullLink().values()) {
367 List<Uuid> linkNeps = Objects.requireNonNull(link.getNodeEdgePoint()).values().stream()
368 .map(NodeEdgePointRef::getNodeEdgePointUuid)
369 .collect(Collectors.toList());
370 LOG.info("LinkEndPointsUUID = {} for link Name {}", linkNeps, link.getName());
371 if (Collections.disjoint(changedOneps, linkNeps)) {
374 this.networkTransactionService.merge(
375 LogicalDatastoreType.OPERATIONAL,
376 InstanceIdentifier.builder(Context.class)
377 .augmentation(Context1.class)
378 .child(TopologyContext.class)
379 .child(Topology.class, new TopologyKey(tapiTopoUuid))
380 .child(Link.class, new LinkKey(link.getUuid()))
383 .setUuid(link.getUuid())
384 .setAdministrativeState(newAdmState)
385 .setOperationalState(newOprState)
389 LOG.info("AffectedLinksNb = {} ", nbAffectedLinks);
390 this.networkTransactionService.commit().get();
391 } catch (InterruptedException | ExecutionException e) {
392 LOG.error("Could not update TAPI links");
396 private List<Uuid> updateNeps(Mapping mapping, List<Uuid> uuids) {
397 List<Uuid> changedOneps = new ArrayList<>();
398 AdministrativeState newAdmState = transformAdminState(mapping.getPortAdminState());
399 OperationalState newOprState = transformOperState(mapping.getPortOperState());
400 for (Uuid nodeUuid : uuids) {
402 Optional<Node> optionalNode =
403 this.networkTransactionService.read(
404 LogicalDatastoreType.OPERATIONAL,
405 InstanceIdentifier.builder(Context.class)
406 .augmentation(Context1.class)
407 .child(TopologyContext.class)
408 .child(Topology.class, new TopologyKey(tapiTopoUuid))
409 .child(Node.class, new NodeKey(nodeUuid))
412 if (optionalNode.isEmpty()) {
415 for (OwnedNodeEdgePoint onep : optionalNode.orElseThrow().getOwnedNodeEdgePoint().values().stream()
416 .filter(onep -> ((Name) onep.getName().values().toArray()[0]).getValue()
417 .contains(mapping.getLogicalConnectionPoint()))
418 .collect(Collectors.toList())) {
419 changedOneps.add(onep.getUuid());
420 updateSips(mapping, onep);
421 this.networkTransactionService.merge(
422 LogicalDatastoreType.OPERATIONAL,
423 InstanceIdentifier.builder(Context.class)
424 .augmentation(Context1.class)
425 .child(TopologyContext.class)
426 .child(Topology.class, new TopologyKey(tapiTopoUuid))
427 .child(Node.class, new NodeKey(nodeUuid))
428 .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(onep.getUuid()))
430 new OwnedNodeEdgePointBuilder()
431 .setUuid(onep.getUuid())
433 new OwnedNodeEdgePoint1Builder().setCepList(getUpdatedCeps(mapping, onep)).build())
434 .setAdministrativeState(newAdmState)
435 .setOperationalState(newOprState)
437 LOG.info("UpdatedNEP {} of UUID {} to ADMIN {} OPER {}",
438 onep.getName(), onep.getUuid(), newAdmState, newOprState);
440 this.networkTransactionService.commit().get();
441 } catch (InterruptedException | ExecutionException e) {
442 LOG.error("Could not update TAPI NEP");
448 private CepList getUpdatedCeps(Mapping mapping, OwnedNodeEdgePoint onep) {
449 OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
451 return new CepListBuilder().setConnectionEndPoint(new HashMap<>()).build();
453 CepList onep1CepList = onep1.getCepList();
454 if (onep1CepList == null) {
455 return new CepListBuilder().setConnectionEndPoint(new HashMap<>()).build();
457 var onep1CepListConnEndPoint = onep1CepList.getConnectionEndPoint();
458 if (onep1CepListConnEndPoint == null) {
459 return new CepListBuilder().setConnectionEndPoint(new HashMap<>()).build();
461 Map<ConnectionEndPointKey, ConnectionEndPoint> cepMap = new HashMap<>();
462 OperationalState newOprState = transformOperState(mapping.getPortOperState());
463 for (Map.Entry<ConnectionEndPointKey, ConnectionEndPoint> entry : onep1CepListConnEndPoint.entrySet()) {
466 new ConnectionEndPointBuilder(entry.getValue()).setOperationalState(newOprState).build());
468 return new CepListBuilder().setConnectionEndPoint(cepMap).build();
471 private List<Uuid> getChangedNodeUuids(String nodeId, Mapping mapping) {
472 if (nodeId.contains("ROADM")) {
473 return new ArrayList<>(List.of(new Uuid(
474 UUID.nameUUIDFromBytes(
475 (String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8))
478 if (nodeId.contains("PDR")) {
479 LOG.debug("ANALYSING change in {}", nodeId);
480 return new ArrayList<>(List.of(new Uuid(
481 UUID.nameUUIDFromBytes(
484 nodeId + TapiStringConstants.XXPDR
487 mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]),
488 TapiStringConstants.XPDR))
489 .getBytes(StandardCharsets.UTF_8))
492 LOG.error("Updating this device is currently not supported");
493 return new ArrayList<>();
496 private void updateSips(Mapping mapping, OwnedNodeEdgePoint onep) {
497 if (onep.getMappedServiceInterfacePoint() == null) {
500 AdministrativeState newAdmState = transformAdminState(mapping.getPortAdminState());
501 OperationalState newOprState = transformOperState(mapping.getPortOperState());
502 for (MappedServiceInterfacePoint msip : onep.getMappedServiceInterfacePoint().values()) {
503 this.networkTransactionService.merge(
504 LogicalDatastoreType.OPERATIONAL,
506 .builder(Context.class)
507 .child(ServiceInterfacePoint.class,
508 new ServiceInterfacePointKey(msip.getServiceInterfacePointUuid()))
510 new ServiceInterfacePointBuilder()
511 .setUuid(msip.getServiceInterfacePointUuid())
512 .setAdministrativeState(newAdmState)
513 .setOperationalState(newOprState)
518 private Map<NodeKey, Node> transformXpdrToTapiNode(String nodeId, List<Mapping> xpdrClMaps,
519 List<Mapping> xpdrNetMaps, XpdrNodeTypes xponderType, OduSwitchingPools oorOduSwitchingPool) {
520 LOG.info("creation of a DSR/ODU node for {}", nodeId);
521 String nameVal = String.join("+", nodeId, TapiStringConstants.XPDR);
522 Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(nameVal).build();
523 Name nameOtsi = new NameBuilder().setValueName("otsi node name").setValue(nameVal).build();
524 Name nameNodeType = new NameBuilder().setValueName("Node Type").setValue(getNodeType(xponderType)).build();
525 Node dsrNode = createTapiXpdrNode(
526 Map.of(nameDsr.key(), nameDsr, nameOtsi.key(), nameOtsi, nameNodeType.key(), nameNodeType),
527 Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
528 LayerProtocolName.DIGITALOTN, LayerProtocolName.PHOTONICMEDIA),
529 nodeId, new Uuid(UUID.nameUUIDFromBytes(nameVal.getBytes(StandardCharsets.UTF_8)).toString()),
530 xpdrClMaps, xpdrNetMaps, xponderType, oorOduSwitchingPool);
531 return new HashMap<>(Map.of(dsrNode.key(), dsrNode));
534 private OduSwitchingPools createSwitchPoolForXpdr(
535 XpdrNodeTypes xpdrType, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps, Integer xpdrNb) {
536 //TODO are switching pool correct here??
539 return createTpdrSwitchPool(xpdrNetMaps);
541 return createMuxSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
543 return createSwtchSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
547 LOG.warn("Xpdr type {} not supported", xpdrType);
552 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformSrgToOnep(
553 String orNodeId, Map<String, List<Mapping>> mapSrg) {
554 LOG.debug("CREATENEP transformSrgToOnep, ListOfMapping {}, of NodeId {} ", mapSrg, orNodeId);
555 Map<String, TerminationPoint1> tpMap = new HashMap<>();
556 //List<TerminationPoint> tpList = new ArrayList<>();
557 for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
558 // For each srg node. Loop through the LCPs and create neps and sips for PP
559 for (Mapping m : entry.getValue()) {
560 String tpId = m.getLogicalConnectionPoint();
561 String overlayNodeId = String.join("-", orNodeId, tpId.split("\\-")[0]);
562 if (!tpId.contains("PP")) {
563 LOG.info("LCP {} is not an external TP of SRG node", tpId);
568 var netTP1fromDS = getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId);
569 if (netTP1fromDS != null) {
570 //tpList.add(netTP1fromDS);
571 tpMap.put(tpId, netTP1fromDS);
572 LOG.debug("LCP {} is not empty for augmentation TP1", tpId);
577 } catch (InterruptedException e) {
578 // TODO Auto-generated catch block
579 LOG.debug("Waiting until PP is backported in Topology, Exception raised", e);
582 } while (counter > 0);
584 LOG.error("CREATENEP transformSrgToOnep, No Tp1 found in topology for LCP {}, of NodeId {} ",
585 tpId, overlayNodeId);
587 if (getNetworkTerminationPoint11FromDatastore(overlayNodeId, tpId) == null) {
588 LOG.error("CREATENEP transformSrgToOnep, No Tp11 found in topology for LCP {}, of NodeId {} ",
589 tpId, overlayNodeId);
591 LOG.info("LCP {} is not empty for augmentation TP11", tpId);
595 LOG.debug("TransformSRGToONep for tps {}, of NodeId {} ",
596 tpMap.entrySet().stream().map(tp -> tp.getKey()).collect(Collectors.toList()), orNodeId);
597 return populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OTS);
600 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformDegToOnep(
601 String orNodeId, Map<String, List<Mapping>> mapDeg) {
602 LOG.debug("CREATENEP transformDegToOnep, ListOfMapping {}, of NodeId {} ", mapDeg, orNodeId);
603 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> degOnepMap = new HashMap<>();
604 Map<String, TerminationPoint1> tpMap = new HashMap<>();
605 //List<TerminationPoint> tpList = new ArrayList<>();
606 for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
607 // For each degree node. Loop through the LCPs and create neps and sips for TTP
608 for (Mapping m:entry.getValue()) {
609 String tpId = m.getLogicalConnectionPoint();
610 if (!tpId.contains("TTP")) {
611 LOG.info("LCP {} is not an external TP of DEGREE node", tpId);
614 String overlayNodeId = String.join("-", orNodeId, tpId.split("\\-")[0]);
615 var netTP1fromDS = getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId);
616 if (netTP1fromDS == null) {
617 LOG.error("CREATENEP transformDegToOnep, No Tp found in topology for LCP {}, of NodeId {} ",
618 tpId, overlayNodeId);
621 //tpList.add(getNetworkTerminationPointFromDatastore(overlayNodeId, tpId));
622 tpMap.put(tpId, netTP1fromDS);
623 LOG.info("LCP {} is not empty for augmentation TP1", tpId);
626 degOnepMap.putAll(populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OTS));
627 degOnepMap.putAll(populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OMS));
631 private List<String> getRoadmNodelist(List<Mapping> mappingList) {
632 List<String> nodeShardList = new ArrayList<>();
633 for (Mapping mapping : mappingList) {
634 // TODO -> maybe we need to check the id based on the version
635 String str = mapping.getLogicalConnectionPoint().split("-")[0];
636 LOG.info("LCP = {}", str);
637 if (!nodeShardList.contains(str)) {
638 nodeShardList.add(str);
641 return nodeShardList;
645 public void deleteTapinode(String nodeId) {
646 // TODO: check for null objects
647 // Check if it is ROADM or XPDR --> create the uuids of the node and delete from topology the node.
648 // This will delete NEPs. Then check for links that have this node and delete them.
649 // Then check SIPs and delete them. Then services and connections with SIPs and put them to another state.
650 LOG.info("Deleting node {} from TAPI topology", nodeId);
651 InstanceIdentifier<Topology> topologyIID = InstanceIdentifier.builder(Context.class)
652 .augmentation(Context1.class)
653 .child(TopologyContext.class)
654 .child(Topology.class, new TopologyKey(tapiTopoUuid))
656 Topology topology = null;
658 Optional<Topology> optTopology =
659 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, topologyIID).get();
660 if (optTopology.isEmpty()) {
661 LOG.error("No topology object present. Error deleting node {}", nodeId);
664 topology = optTopology.orElseThrow();
665 } catch (InterruptedException | ExecutionException e) {
666 LOG.error("Couldnt read tapi topology from datastore", e);
668 if (topology == null) {
669 LOG.error("Topology is null, nothing to delete");
672 if (topology.getNode() == null) {
673 LOG.error("No nodes in topology");
676 if (nodeId.contains("ROADM")) {
677 if (topologicalMode.equals("Full")) {
678 // Node is in photonic media layer and UUID can be built from nodeId + PHTN_MEDIA
679 Uuid nodeUuid = new Uuid(
680 UUID.nameUUIDFromBytes(
681 (String.join("+", nodeId,TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8))
683 deleteNodeFromTopo(nodeUuid);
685 LOG.info("Abstracted Topo Mode in TAPI topology Datastore for OR topology representation. Node"
686 + " {} is not represented in the abstraction and will not be deleted", nodeId);
689 if (nodeId.contains("XPDR") || nodeId.contains("SPDR") || nodeId.contains("MXPDR")) {
690 // Node is either XPDR, MXPDR or SPDR. Retrieve nodes from topology and check names
691 for (Node tapiNode:topology.getNode().values()) {
692 if (tapiNode.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
693 // Found node we need to delete
694 deleteNodeFromTopo(tapiNode.getUuid());
698 // Delete links of topology
699 Map<LinkKey, Link> linkMap = topology.getLink();
700 if (linkMap != null) {
701 for (Link link:linkMap.values()) {
702 if (link.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
703 deleteLinkFromTopo(link.getUuid());
707 // Delete sips of sip map
708 InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
709 Context context = null;
711 Optional<Context> optContext =
712 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, contextIID).get();
713 if (optContext.isEmpty()) {
714 LOG.error("No context object present in datastore.");
717 context = optContext.orElseThrow();
718 } catch (InterruptedException | ExecutionException e) {
719 LOG.error("Couldnt read tapi context from datastore", e);
721 if (context == null) {
722 LOG.error("Context is null, nothing to delete");
725 Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips = context.getServiceInterfacePoint();
729 for (ServiceInterfacePoint sip:sips.values()) {
730 if (sip.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
731 // Update state of services that have this sip as an endpoint and also connections
732 updateConnectivityServicesState(sip.getUuid(), nodeId);
733 deleteSipFromTopo(sip.getUuid());
738 private Node createTapiXpdrNode(
739 Map<NameKey, Name> nameMap, Set<LayerProtocolName> layerProtocols,
740 String nodeId, Uuid nodeUuid,
741 List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
742 XpdrNodeTypes xponderType, OduSwitchingPools oorOduSwitchingPool) {
743 if (!layerProtocols.contains(LayerProtocolName.DSR)
744 || !layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
745 LOG.error("Undefined LayerProtocolName for {} node {}",
746 nameMap.get(nameMap.keySet().iterator().next()).getValueName(),
747 nameMap.get(nameMap.keySet().iterator().next()).getValue());
749 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl =
750 new HashMap<>(createXpdrDsrOduNeps(nodeId, xpdrClMaps, xpdrNetMaps, xponderType));
751 Rule rule = new RuleBuilder()
752 .setLocalId("forward")
753 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
754 .setRuleType(new HashSet<>(Set.of(RuleType.FORWARDING)))
756 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList =
757 createNodeRuleGroupForDsrNode(nodeId, oorOduSwitchingPool, new HashMap<>(Map.of(rule.key(), rule)), onepl);
758 onepl.putAll(createXpdrPhtnMdNeps(nodeId, xpdrNetMaps));
759 LOG.debug("TapiNetworkModelServiceImpl line 721, total NEP map = {}", onepl);
761 // Empty random creation of mandatory fields for avoiding errors....
762 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
763 .setCostAlgorithm("Restricted Shortest Path - RSP")
764 .setCostName("HOP_COUNT")
765 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
767 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
768 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
769 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
770 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
771 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
772 .setTrafficPropertyName("FIXED_LATENCY")
774 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
775 .setRiskCharacteristicName("risk characteristic")
776 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
778 RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
779 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
781 Node builtNode = new NodeBuilder()
784 .setLayerProtocolName(layerProtocols)
785 .setAdministrativeState(AdministrativeState.UNLOCKED)
786 .setOperationalState(OperationalState.ENABLED)
787 .setLifecycleState(LifecycleState.INSTALLED)
788 .setOwnedNodeEdgePoint(onepl)
789 .setNodeRuleGroup(nodeRuleGroupList)
790 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
791 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
792 .setErrorCharacteristic("error")
793 .setLossCharacteristic("loss")
794 .setRepeatDeliveryCharacteristic("repeat delivery")
795 .setDeliveryOrderCharacteristic("delivery order")
796 .setUnavailableTimeCharacteristic("unavailable time")
797 .setServerIntegrityProcessCharacteristic("server integrity process")
798 .setRiskParameterPac(riskParamPac)
800 List<PhotonicMediaNodeEdgePointSpec> pmnepspecList = new ArrayList<>();
801 for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry :
802 builtNode.getOwnedNodeEdgePoint().entrySet()) {
803 if (entry.getValue().getSupportedCepLayerProtocolQualifierInstances().stream()
804 .filter(sclpqi -> sclpqi.getLayerProtocolQualifier().equals(PHOTONICLAYERQUALIFIEROTS.VALUE))
805 .collect(Collectors.toList()).isEmpty()) {
808 var aug1 = entry.getValue().augmentationOrElseThrow(
809 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121
810 .OwnedNodeEdgePoint1.class);
814 var phMedNepSpec = aug1.getPhotonicMediaNodeEdgePointSpec();
815 if (phMedNepSpec != null) {
816 pmnepspecList.add(phMedNepSpec);
819 LOG.debug("TapiNetworkModelServiceImpl line 775, List of non empty PMNEPSEC is = {}", pmnepspecList);
823 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrPhtnMdNeps(
824 String nodeId, List<Mapping> xpdrNetMaps) {
825 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
826 // eNep creation on otsi node
827 for (Mapping mapping : xpdrNetMaps) {
828 var lcp = mapping.getLogicalConnectionPoint();
829 String onedNameVal = String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS, lcp);
830 Name onedName = new NameBuilder().setValueName("eNodeEdgePoint").setValue(onedNameVal).build();
831 var supOpModes = mapping.getSupportedOperationalMode();
832 List<String> opModeList = supOpModes == null ? new ArrayList<>() : new ArrayList<>(supOpModes);
833 AdministrativeState newAdmState = transformAdminState(mapping.getPortAdminState());
834 OperationalState newOprState = transformOperState(mapping.getPortOperState());
835 OwnedNodeEdgePoint onep = createNep(
837 new Uuid(UUID.nameUUIDFromBytes(onedNameVal.getBytes(StandardCharsets.UTF_8)).toString()),
838 lcp, Map.of(onedName.key(), onedName),
839 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
840 String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS),
841 new ArrayList<>(mapping.getSupportedInterfaceCapability()), opModeList, newOprState, newAdmState);
842 onepl.put(onep.key(), onep);
843 // OTSi_MC Nep creation on otsi node
844 String onedNameVal2 = String.join("+", nodeId, TapiStringConstants.OTSI_MC, lcp);
845 Name onedName2 = new NameBuilder().setValueName("PhotMedNodeEdgePoint").setValue(onedNameVal2).build();
846 OwnedNodeEdgePoint onep2 = createNep(
848 new Uuid(UUID.nameUUIDFromBytes(onedNameVal2.getBytes(StandardCharsets.UTF_8)).toString()),
849 lcp, Map.of(onedName2.key(), onedName2),
850 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, false,
851 String.join("+", nodeId, TapiStringConstants.OTSI_MC),
852 new ArrayList<>(mapping.getSupportedInterfaceCapability()), opModeList, newOprState, newAdmState);
853 onepl.put(onep2.key(), onep2);
858 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrDsrOduNeps(
859 String nodeId, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps, XpdrNodeTypes xponderType) {
860 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
861 // client nep creation on DSR node
862 for (Mapping mapping : xpdrClMaps) {
863 var lcp = mapping.getLogicalConnectionPoint();
864 String nepvalue = String.join("+", nodeId, TapiStringConstants.DSR, lcp);
865 LOG.info("Client NEP = {}", nepvalue);
866 Name name = new NameBuilder()
868 .setValueName(OpenroadmNodeType.TPDR.getName().equalsIgnoreCase(xponderType.getName())
869 ? "100G-tpdr" : "NodeEdgePoint_C")
871 AdministrativeState newAdmState = transformAdminState(mapping.getPortAdminState());
872 OperationalState newOprState = transformOperState(mapping.getPortOperState());
873 OwnedNodeEdgePoint onep = createNep(
874 nodeId, new Uuid(UUID.nameUUIDFromBytes(nepvalue.getBytes(StandardCharsets.UTF_8)).toString()),
875 lcp, Map.of(name.key(), name), LayerProtocolName.DSR, LayerProtocolName.DSR, true,
876 String.join("+", nodeId, TapiStringConstants.DSR),
877 new ArrayList<>(mapping.getSupportedInterfaceCapability()), null, newOprState, newAdmState);
878 onepl.put(onep.key(), onep);
879 // network nep creation on E_ODU node
880 String onedNameVal = String.join("+", nodeId, TapiStringConstants.E_ODU, lcp);
881 LOG.info("eODU NEP = {}", onedNameVal);
882 Name onedName = new NameBuilder().setValueName("eNodeEdgePoint_N").setValue(onedNameVal).build();
883 OwnedNodeEdgePoint onep2 = createNep(
884 nodeId, new Uuid(UUID.nameUUIDFromBytes(onedNameVal.getBytes(StandardCharsets.UTF_8)).toString()),
885 lcp, Map.of(onedName.key(), onedName), LayerProtocolName.ODU, LayerProtocolName.DSR, true,
886 String.join("+", nodeId, TapiStringConstants.E_ODU),
887 new ArrayList<>(mapping.getSupportedInterfaceCapability()), null, newOprState, newAdmState);
888 onepl.put(onep2.key(), onep2);
890 // network nep creation on I_ODU node
891 for (Mapping mapping : xpdrNetMaps) {
892 var lcp = mapping.getLogicalConnectionPoint();
893 String onedNameVal = String.join("+", nodeId, TapiStringConstants.I_ODU, lcp);
894 LOG.info("iODU NEP = {}", onedNameVal);
895 Name onedName = new NameBuilder().setValueName("iNodeEdgePoint_N").setValue(onedNameVal).build();
896 OwnedNodeEdgePoint onep = createNep(
897 nodeId, new Uuid(UUID.nameUUIDFromBytes(onedNameVal.getBytes(StandardCharsets.UTF_8)).toString()),
898 lcp, Map.of(onedName.key(), onedName), LayerProtocolName.ODU, LayerProtocolName.DSR, true,
899 String.join("+", nodeId, TapiStringConstants.I_ODU),
900 new ArrayList<>(mapping.getSupportedInterfaceCapability()),
901 null, transformOperState(mapping.getPortOperState()),transformAdminState(mapping.getPortAdminState()));
902 onepl.put(onep.key(), onep);
907 private OperationalState transformOperState(String operString) {
908 return org.opendaylight.transportpce.networkmodel.util.TopologyUtils.setNetworkOperState(operString)
909 .equals(State.InService) ? OperationalState.ENABLED : OperationalState.DISABLED;
912 private AdministrativeState transformAdminState(String adminString) {
913 return org.opendaylight.transportpce.networkmodel.util.TopologyUtils.setNetworkAdminState(adminString)
914 .equals(AdminStates.InService) ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
917 private OwnedNodeEdgePoint createNep(String nodeId, Uuid nepUuid, String tpid, Map<NameKey, Name> nepNames,
918 LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword,
919 List<SupportedIfCapability> sicList, List<String> opModeList,
920 OperationalState operState, AdministrativeState adminState) {
921 List<SupportedInterfaceCapability> sicListTemp = new ArrayList<>();
922 List<OperationalModeKey> keyedOpModeList = new ArrayList<>();
923 for (SupportedIfCapability supInterCapa : sicList) {
924 sicListTemp.add(new SupportedInterfaceCapabilityBuilder()
925 .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
926 .setIfCapType(supInterCapa)
929 Collection<SupportedInterfaceCapability> sicColl = sicListTemp;
930 OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
932 .setLayerProtocolName(nepProtocol)
935 onepBldr.setMappedServiceInterfacePoint(
936 this.tapiFactory.createMSIP(1, nepProtocol, tpid, keyword, sicColl, operState, adminState));
937 this.sipMap.putAll(tapiFactory.getTapiSips());
939 LOG.debug("Node layer {}", nodeProtocol.getName());
941 .setSupportedCepLayerProtocolQualifierInstances(
942 this.tapiFactory.createSupportedCepLayerProtocolQualifier(sicColl, nepProtocol))
943 .setDirection(Direction.BIDIRECTIONAL)
944 .setLinkPortRole(PortRole.SYMMETRIC)
945 .setAdministrativeState(adminState).setOperationalState(operState)
946 .setLifecycleState(LifecycleState.INSTALLED);
947 if (!keyword.contains(TapiStringConstants.OTSI_MC) && !keyword.contains(TapiStringConstants.PHTNC_MEDIA_OTS)) {
948 return onepBldr.build();
950 if (opModeList == null || opModeList.isEmpty()) {
951 for (SupportedInterfaceCapability sic : sicColl) {
952 switch (sic.getIfCapType().toString().split("\\{")[0]) {
953 case "IfOCHOTUCnODUCn":
954 case "IfOCHOTUCnODUCnUniregen":
955 case "IfOCHOTUCnODUCnRegen":
956 keyedOpModeList.add(new OperationalModeKey("400G"));
957 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "400G rate available", tpid);
964 keyedOpModeList.add(new OperationalModeKey("100G"));
965 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "100G rate available", tpid);
967 for (String opMode : opModeList) {
968 keyedOpModeList.add(new OperationalModeKey(opMode));
971 Map<Double, Double> freqWidthMap = new HashMap<>();
972 if (getNetworkTerminationPointFromDatastore(nodeId, tpid) == null) {
973 LOG.error("CREATENEP, No Tp found in topology for LCP {}, of NodeId {} ", tpid, nodeId);
975 freqWidthMap = tapiFactory.getXpdrUsedWavelength(getNetworkTerminationPointFromDatastore(nodeId, tpid));
977 OwnedNodeEdgePoint onep = tapiFactory.addPayloadStructureAndPhotSpecToOnep(
978 nodeId, freqWidthMap, keyedOpModeList, sicColl, onepBldr, keyword)
980 LOG.debug("TapiNetworkServiceImpl line982, onep = {}", onep);
984 private Node createRoadmTapiNode(String orNodeId, Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap) {
985 // UUID and Node Names
988 if (orNodeId.equals("ROADMINFRA")) {
990 UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA.getBytes(Charset.forName("UTF-8")))
993 new NameBuilder().setValueName("roadm node name").setValue(TapiStringConstants.RDM_INFRA).build();
995 String nodeNamesVal = String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA);
997 UUID.nameUUIDFromBytes(nodeNamesVal.getBytes(StandardCharsets.UTF_8))
999 nodeNames = new NameBuilder().setValueName("roadm node name").setValue(nodeNamesVal).build();
1002 new NameBuilder().setValueName("Node Type").setValue(OpenroadmNodeType.ROADM.getName()).build();
1004 // Empty random creation of mandatory fields for avoiding errors....
1005 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
1006 .setCostAlgorithm("Restricted Shortest Path - RSP")
1007 .setCostName("HOP_COUNT")
1008 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
1010 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1011 .setFixedLatencyCharacteristic(TapiStringConstants.COST_HOP_VALUE)
1012 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
1013 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
1014 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
1015 .setTrafficPropertyName("FIXED_LATENCY")
1017 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1018 .setRiskCharacteristicName("risk characteristic")
1019 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
1021 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap =
1022 tapiFactory.createAllNodeRuleGroupForRdmNode(topologicalMode, nodeUuid, orNodeId, onepMap.values());
1023 return new NodeBuilder()
1025 .setName(Map.of(nodeNames.key(), nodeNames, nameNodeType.key(), nameNodeType))
1026 .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA))
1027 .setAdministrativeState(AdministrativeState.UNLOCKED)
1028 .setOperationalState(OperationalState.ENABLED)
1029 .setLifecycleState(LifecycleState.INSTALLED)
1030 .setOwnedNodeEdgePoint(onepMap)
1031 .setNodeRuleGroup(nodeRuleGroupMap)
1033 tapiFactory.createInterRuleGroupForRdmNode(topologicalMode, nodeUuid, orNodeId,
1034 nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList())))
1035 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1036 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1037 .setErrorCharacteristic("error")
1038 .setLossCharacteristic("loss")
1039 .setRepeatDeliveryCharacteristic("repeat delivery")
1040 .setDeliveryOrderCharacteristic("delivery order")
1041 .setUnavailableTimeCharacteristic("unavailable time")
1042 .setServerIntegrityProcessCharacteristic("server integrity process")
1043 .setRiskParameterPac(
1044 new RiskParameterPacBuilder()
1045 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1050 private OduSwitchingPools createTpdrSwitchPool(List<Mapping> xpdrNetMaps) {
1051 Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
1052 for (int i = 1; i <= xpdrNetMaps.size(); i++) {
1053 String netLCP = xpdrNetMaps.get(i - 1).getLogicalConnectionPoint();
1054 String netAssoLCP = xpdrNetMaps.get(i - 1).getConnectionMapLcp();
1055 LOG.info("XPDr net LCP = {}", netLCP);
1056 LOG.info("XPDr net associated LCP = {}", netAssoLCP);
1057 NonBlockingList nbl = new NonBlockingListBuilder()
1058 .setNblNumber(Uint16.valueOf(i))
1059 .setTpList(new HashSet<>(Set.of(new TpId(netLCP), new TpId(netAssoLCP))))
1061 nblMap.put(nbl.key(), nbl);
1063 return new OduSwitchingPoolsBuilder()
1064 .setNonBlockingList(nblMap)
1065 .setSwitchingPoolNumber(Uint16.valueOf(1))
1069 private OduSwitchingPools createSwtchSwitchPool(
1070 List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps, Integer xpdrNb) {
1071 Set<TpId> tpl = new HashSet<>();
1072 for (int i = 1; i <= xpdrClMaps.size(); i++) {
1073 tpl.add(new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i));
1074 tpl.add(new TpId("XPDR" + xpdrNb + TapiStringConstants.NETWORK + i));
1076 NonBlockingList nbl = new NonBlockingListBuilder().setNblNumber(Uint16.valueOf(1)).setTpList(tpl).build();
1077 return new OduSwitchingPoolsBuilder()
1078 .setSwitchingPoolNumber(Uint16.valueOf(1))
1079 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
1080 .setNonBlockingList(new HashMap<>(Map.of(nbl.key(),nbl)))
1084 private OduSwitchingPools createMuxSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps, Integer xpdrNb) {
1085 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
1086 for (int i = 1; i <= xpdrClMaps.size(); i++) {
1087 NonBlockingList nbl = new NonBlockingListBuilder()
1088 .setNblNumber(Uint16.valueOf(i))
1090 new HashSet<>(Set.of(
1091 new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i),
1092 new TpId("XPDR" + xpdrNb + "-NETWORK1"))))
1093 .setAvailableInterconnectBandwidth(Uint32.valueOf(xpdrNetMaps.size() * 10L))
1094 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
1096 nbMap.put(nbl.key(),nbl);
1098 return new OduSwitchingPoolsBuilder()
1099 .setSwitchingPoolNumber(Uint16.valueOf(1))
1100 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
1101 .setNonBlockingList(nbMap)
1105 private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForDsrNode(String nodeId,
1106 OduSwitchingPools oorOduSwitchingPool, Map<RuleKey, Rule> ruleList,
1107 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl) {
1108 // create NodeRuleGroup
1109 if (oorOduSwitchingPool == null) {
1110 LOG.info("No switching pool created for node = {}", nodeId);
1111 return new HashMap<>();
1113 LOG.debug("ONEPL = {}", onepl.values());
1114 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
1115 Uuid nodeUuid = new Uuid(
1116 UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.DSR)).getBytes(StandardCharsets.UTF_8))
1119 for (NonBlockingList nbl : oorOduSwitchingPool.nonnullNonBlockingList().values()) {
1120 LOG.info("Non blocking list = {}", nbl);
1121 Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
1122 for (TpId tp : nbl.getTpList()) {
1123 String tpUuidSd = String.join("+", nodeId, TapiStringConstants.E_ODU, tp.getValue());
1124 LOG.info("EDOU TP = {}", tpUuidSd);
1125 Uuid tpUuid = new Uuid(UUID.nameUUIDFromBytes(tpUuidSd.getBytes(StandardCharsets.UTF_8)).toString());
1126 String tp1UuidSd = String.join("+", nodeId, TapiStringConstants.DSR, tp.getValue());
1127 LOG.info("DSR TP = {}", tp1UuidSd);
1128 Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes(tp1UuidSd.getBytes(StandardCharsets.UTF_8)).toString());
1129 if (onepl.containsKey(new OwnedNodeEdgePointKey(tpUuid))
1130 && onepl.containsKey(new OwnedNodeEdgePointKey(tp1Uuid))) {
1131 NodeEdgePoint nep1 = new NodeEdgePointBuilder()
1132 .setTopologyUuid(this.tapiTopoUuid)
1133 .setNodeUuid(nodeUuid)
1134 .setNodeEdgePointUuid(tp1Uuid)
1136 NodeEdgePoint nep2 = new NodeEdgePointBuilder()
1137 .setTopologyUuid(this.tapiTopoUuid)
1138 .setNodeUuid(nodeUuid)
1139 .setNodeEdgePointUuid(tpUuid)
1141 nepList.put(nep1.key(), nep1);
1142 nepList.put(nep2.key(), nep2);
1145 // Empty random creation of mandatory fields for avoiding errors....
1146 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
1147 .setCostAlgorithm("Restricted Shortest Path - RSP")
1148 .setCostName("HOP_COUNT")
1149 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
1151 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1152 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
1153 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
1154 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
1155 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
1156 .setTrafficPropertyName("FIXED_LATENCY")
1158 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1159 .setRiskCharacteristicName("risk characteristic")
1160 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
1162 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
1164 UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(StandardCharsets.UTF_8))
1167 .setNodeEdgePoint(nepList)
1168 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1169 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1170 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1172 nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
1175 return nodeRuleGroupMap;
1178 private String getNodeType(XpdrNodeTypes xponderType) {
1179 switch (xponderType) {
1181 return OpenroadmNodeType.TPDR.getName();
1183 return OpenroadmNodeType.MUXPDR.getName();
1185 return OpenroadmNodeType.SWITCH.getName();
1189 LOG.info("XpdrType {} not supported", xponderType);
1194 private void mergeNodeinTopology(Map<NodeKey, Node> nodeMap) {
1195 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1196 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1197 LOG.info("Creating tapi node in TAPI topology context");
1198 // merge in datastore
1199 this.networkTransactionService.merge(
1200 LogicalDatastoreType.OPERATIONAL,
1201 InstanceIdentifier.builder(Context.class)
1202 .augmentation(Context1.class)
1203 .child(TopologyContext.class)
1204 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1206 new TopologyBuilder().setUuid(this.tapiTopoUuid).setNode(nodeMap).build());
1208 this.networkTransactionService.commit().get();
1209 } catch (InterruptedException | ExecutionException e) {
1210 LOG.error("Error populating TAPI topology: ", e);
1212 LOG.info("Node added succesfully.");
1215 private void mergeLinkinTopology(Map<LinkKey, Link> linkMap) {
1216 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1217 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1218 LOG.info("Creating tapi node in TAPI topology context");
1219 // merge in datastore
1220 this.networkTransactionService.merge(
1221 LogicalDatastoreType.OPERATIONAL,
1222 InstanceIdentifier.builder(Context.class)
1223 .augmentation(Context1.class)
1224 .child(TopologyContext.class)
1225 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1227 new TopologyBuilder().setUuid(this.tapiTopoUuid).setLink(linkMap).build());
1229 this.networkTransactionService.commit().get();
1230 } catch (InterruptedException | ExecutionException e) {
1231 LOG.error("Error populating TAPI topology: ", e);
1233 LOG.info("Roadm Link added succesfully.");
1236 private void mergeSipsinContext(Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips) {
1237 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1238 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1240 // merge in datastore
1241 this.networkTransactionService.merge(
1242 LogicalDatastoreType.OPERATIONAL,
1243 InstanceIdentifier.builder(Context.class).build(),
1244 new ContextBuilder().setServiceInterfacePoint(sips).build());
1245 this.networkTransactionService.commit().get();
1246 LOG.info("TAPI SIPs merged successfully.");
1247 } catch (InterruptedException | ExecutionException e) {
1248 LOG.error("Failed to merge TAPI Sips", e);
1252 private void deleteLinkFromTopo(Uuid linkUuid) {
1254 this.networkTransactionService.delete(
1255 LogicalDatastoreType.OPERATIONAL,
1256 // TODO: check if this IID is correct
1257 InstanceIdentifier.builder(Context.class)
1258 .augmentation(Context1.class)
1259 .child(TopologyContext.class)
1260 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1261 .child(Link.class, new LinkKey(linkUuid)).build());
1262 this.networkTransactionService.commit().get();
1263 LOG.info("TAPI link deleted successfully.");
1264 } catch (InterruptedException | ExecutionException e) {
1265 LOG.error("Failed to delete TAPI link", e);
1269 private void deleteNodeFromTopo(Uuid nodeUuid) {
1271 this.networkTransactionService.delete(
1272 LogicalDatastoreType.OPERATIONAL,
1273 // TODO: check if this IID is correct
1274 InstanceIdentifier.builder(Context.class)
1275 .augmentation(Context1.class)
1276 .child(TopologyContext.class)
1277 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1278 .child(Node.class, new NodeKey(nodeUuid)).build());
1279 this.networkTransactionService.commit().get();
1280 LOG.info("TAPI Node deleted successfully.");
1281 } catch (InterruptedException | ExecutionException e) {
1282 LOG.error("Failed to delete TAPI Node", e);
1286 private void deleteSipFromTopo(Uuid sipUuid) {
1287 // TODO: check if this IID is correct
1289 this.networkTransactionService.delete(
1290 LogicalDatastoreType.OPERATIONAL,
1291 InstanceIdentifier.builder(Context.class)
1292 .child(ServiceInterfacePoint.class, new ServiceInterfacePointKey(sipUuid))
1294 this.networkTransactionService.commit().get();
1295 LOG.info("TAPI SIP deleted successfully.");
1296 } catch (InterruptedException | ExecutionException e) {
1297 LOG.error("Failed to delete TAPI SIP", e);
1301 private void updateConnectivityServicesState(Uuid sipUuid, String nodeId) {
1302 // TODO: check if this IID is correct
1303 ConnectivityContext connContext = null;
1305 Optional<ConnectivityContext> optConnContext =
1306 this.networkTransactionService.read(
1307 LogicalDatastoreType.OPERATIONAL,
1308 InstanceIdentifier.builder(Context.class)
1309 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
1311 .child(ConnectivityContext.class)
1314 if (optConnContext.isEmpty()) {
1315 LOG.error("Couldnt retrieve connectivity context from datastore");
1318 connContext = optConnContext.orElseThrow();
1319 } catch (InterruptedException | ExecutionException e) {
1320 LOG.error("Couldnt read connectivity context from datastore", e);
1322 if (connContext == null) {
1323 LOG.error("Connectivity context is empty");
1326 // Loop through services, check if the endpoint uuid is equal to the sip.
1327 // If so update state.
1328 Map<ConnectivityServiceKey, ConnectivityService> connServMap = connContext.getConnectivityService();
1329 Map<ConnectionKey, Connection> connMap = connContext.getConnection();
1330 if (connServMap != null) {
1331 for (ConnectivityService service : connServMap.values()) {
1332 Map<EndPointKey, EndPoint> serviceEndPoints = service.getEndPoint();
1333 if (serviceEndPoints.values().stream()
1334 .anyMatch(endPoint -> endPoint.getServiceInterfacePoint().getServiceInterfacePointUuid()
1335 .equals(sipUuid))) {
1336 LOG.info("Service using SIP of node {} identified. Update state of service", nodeId);
1337 updateConnectivityService(
1338 new ConnectivityServiceBuilder(service)
1339 .setAdministrativeState(AdministrativeState.LOCKED)
1340 .setOperationalState(OperationalState.DISABLED)
1341 .setLifecycleState(LifecycleState.PENDINGREMOVAL)
1346 // Update state of connections
1347 if (connMap == null) {
1350 for (Connection connection:connMap.values()) {
1351 if (connection.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
1353 new ConnectionBuilder(connection)
1354 .setLifecycleState(LifecycleState.PENDINGREMOVAL)
1355 .setOperationalState(OperationalState.DISABLED)
1361 private void updateConnection(Connection updConn) {
1362 this.networkTransactionService.merge(
1363 LogicalDatastoreType.OPERATIONAL,
1364 // TODO: check if this IID is correct
1365 InstanceIdentifier.builder(Context.class)
1366 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
1367 .child(ConnectivityContext.class)
1368 .child(Connection.class, new ConnectionKey(updConn.getUuid()))
1372 this.networkTransactionService.commit().get();
1373 } catch (InterruptedException | ExecutionException e) {
1374 LOG.error("Error committing into datastore", e);
1378 private void updateConnectivityService(ConnectivityService updService) {
1379 this.networkTransactionService.merge(
1380 LogicalDatastoreType.OPERATIONAL,
1381 // TODO: check if this IID is correct
1382 InstanceIdentifier.builder(Context.class)
1383 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
1385 .child(ConnectivityContext.class)
1386 .child(ConnectivityService.class, new ConnectivityServiceKey(updService.getUuid()))
1390 this.networkTransactionService.commit().get();
1391 } catch (InterruptedException | ExecutionException e) {
1392 LOG.error("Error committing into datastore", e);
1396 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> populateNepsForRdmNode(
1397 String nodeId, Map<String, TerminationPoint1> tpMap, boolean withSip, String nepPhotonicSublayer) {
1398 // create neps for MC and and Photonic Media OTS/OMS
1399 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
1400 for (Map.Entry<String, TerminationPoint1> entry : tpMap.entrySet()) {
1401 // Admin and oper state common for all tps
1402 // PHOTONIC MEDIA nep
1403 String nepNameValue = String.join("+", nodeId, nepPhotonicSublayer, entry.getKey());
1404 LOG.debug("PHOTO NEP = {}", nepNameValue);
1405 SupportedCepLayerProtocolQualifierInstancesBuilder sclpqiBd =
1406 new SupportedCepLayerProtocolQualifierInstancesBuilder().setNumberOfCepInstances(Uint64.valueOf(1));
1407 switch (nepPhotonicSublayer) {
1408 case TapiStringConstants.PHTNC_MEDIA_OMS:
1409 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROMS.VALUE);
1411 case TapiStringConstants.PHTNC_MEDIA_OTS:
1412 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE);
1414 case TapiStringConstants.MC:
1415 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIERMC.VALUE);
1417 case TapiStringConstants.OTSI_MC:
1418 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE);
1423 List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>(List.of(sclpqiBd.build()));
1424 OwnedNodeEdgePointBuilder onepBd = new OwnedNodeEdgePointBuilder();
1425 if (!nepPhotonicSublayer.equals(TapiStringConstants.MC)
1426 && !nepPhotonicSublayer.equals(TapiStringConstants.OTSI_MC)) {
1427 Map<Double,Double> usedFreqMap = new HashMap<>();
1428 Map<Double,Double> availableFreqMap = new HashMap<>();
1429 switch (entry.getValue().getTpType()) {
1430 // Whatever is the TP and its type we consider that it is handled in a bidirectional way :
1431 // same wavelength(s) used in both direction.
1435 usedFreqMap = tapiFactory.getPP11UsedWavelength(
1436 getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
1437 if (usedFreqMap == null || usedFreqMap.isEmpty()) {
1438 availableFreqMap.put(
1439 GridConstant.START_EDGE_FREQUENCY * 1E09,
1440 GridConstant.START_EDGE_FREQUENCY * 1E09
1441 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06);
1443 LOG.debug("EnteringLOOPcreateOTSiMC & MC with usedFreqMap non empty {} for Node {}, tp {}",
1444 usedFreqMap, nodeId, tpMap);
1445 onepMap.putAll(populateNepsForRdmNode(nodeId,
1446 new HashMap<>(Map.of(entry.getKey(), entry.getValue())),
1447 true, TapiStringConstants.MC));
1448 onepMap.putAll(populateNepsForRdmNode(nodeId,
1449 new HashMap<>(Map.of(entry.getKey(), entry.getValue())),
1450 true, TapiStringConstants.OTSI_MC));
1456 usedFreqMap = tapiFactory.getTTP11UsedFreqMap(
1457 getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
1458 availableFreqMap = tapiFactory.getTTP11AvailableFreqMap(
1459 getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
1464 LOG.debug("calling add Photonic NEP spec for Roadm");
1465 onepBd = tapiFactory.addPhotSpecToRoadmOnep(
1466 nodeId, usedFreqMap, availableFreqMap, onepBd, nepPhotonicSublayer);
1469 new NameBuilder().setValueName(nepPhotonicSublayer + "NodeEdgePoint").setValue(nepNameValue).build();
1470 OwnedNodeEdgePoint onep = onepBd
1471 .setUuid(new Uuid(UUID.nameUUIDFromBytes(nepNameValue.getBytes(Charset.forName("UTF-8"))).toString()))
1472 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
1473 .setName(Map.of(nepName.key(), nepName))
1474 .setSupportedCepLayerProtocolQualifierInstances(sclpqiList)
1475 .setDirection(Direction.BIDIRECTIONAL)
1476 .setLinkPortRole(PortRole.SYMMETRIC)
1477 .setAdministrativeState(
1478 this.tapiLink.setTapiAdminState(entry.getValue().getAdministrativeState().getName()))
1479 .setOperationalState(
1480 this.tapiLink.setTapiOperationalState(entry.getValue().getOperationalState().getName()))
1481 .setLifecycleState(LifecycleState.INSTALLED)
1483 LOG.debug("ROADMNEPPopulation TapiNetworkModelServiceImpl populate NEP {} for Node {}",
1484 onep.getName().entrySet(), nodeId);
1485 onepMap.put(onep.key(), onep);
1487 LOG.debug("ROADMNEPPopulation FINISH for Node {}", nodeId);
1492 * Get a network termination point for nodeId and tpId.
1493 * @param nodeId String
1494 * @param tpId String
1495 * @return network termination point, null otherwise
1497 private TerminationPoint getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
1498 InstanceIdentifier<TerminationPoint> tpIID = InstanceIdentifier.builder(Networks.class)
1499 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
1501 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1502 .networks.network.Node.class,
1503 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1504 .networks.network.NodeKey(new NodeId(nodeId)))
1505 .augmentation(Node1.class)
1507 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1508 .networks.network.node.TerminationPoint.class,
1509 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1510 .networks.network.node.TerminationPointKey(new TpId(tpId)))
1513 Optional<TerminationPoint> tpOptional =
1514 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
1515 if (tpOptional.isEmpty()) {
1516 LOG.error("readMdSal: Error reading tp {} , empty list", tpIID);
1519 LOG.debug("SUCCES getting LCP TP for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl",
1521 LOG.debug(" The Tp in Datastore is as follows {}", tpOptional);
1522 return tpOptional.orElseThrow();
1523 } catch (ExecutionException | InterruptedException e) {
1524 LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
1525 tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
1531 * Get a network termination point with Common TerminationPoint1 augmentation for nodeId and tpId.
1532 * @param nodeId String
1533 * @param tpId String
1534 * @return network termination point, null otherwise
1536 private TerminationPoint1 getNetworkTerminationPoint1FromDatastore(String nodeId, String tpId) {
1537 InstanceIdentifier<TerminationPoint1> tpIID = InstanceIdentifier.builder(Networks.class)
1538 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
1540 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1541 .networks.network.Node.class,
1542 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1543 .networks.network.NodeKey(new NodeId(nodeId)))
1544 .augmentation(Node1.class)
1546 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1547 .networks.network.node.TerminationPoint.class,
1548 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1549 .networks.network.node.TerminationPointKey(new TpId(tpId)))
1550 .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
1551 .TerminationPoint1.class)
1554 Optional<TerminationPoint1> tpOptional =
1555 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
1556 if (tpOptional.isEmpty()) {
1557 LOG.error("readMdSal: Error reading tp {} , empty list",tpIID);
1560 LOG.debug("SUCCES getting LCP TP1 for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl",
1562 LOG.debug(" The Tp in Datastore is as follows {}", tpOptional);
1563 return tpOptional.orElseThrow();
1564 } catch (ExecutionException | InterruptedException e) {
1565 LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
1566 tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
1571 private org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
1572 .TerminationPoint1 getNetworkTerminationPoint11FromDatastore(String nodeId, String tpId) {
1573 InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
1574 .TerminationPoint1> tpIID = InstanceIdentifier.builder(Networks.class)
1575 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
1577 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1578 .networks.network.Node.class,
1579 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1580 .networks.network.NodeKey(new NodeId(nodeId)))
1581 .augmentation(Node1.class)
1583 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1584 .networks.network.node.TerminationPoint.class,
1585 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1586 .networks.network.node.TerminationPointKey(new TpId(tpId)))
1588 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class)
1591 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1>
1592 tpOptional = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
1593 if (tpOptional.isEmpty()) {
1594 LOG.error("readMdSal: Error reading tp {} , empty list", tpIID);
1597 LOG.debug("SUCCESS getting LCP TP11 for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl"
1598 + " The Tp in Datastore is as follows {}", nodeId, tpId, tpOptional);
1599 return tpOptional.orElseThrow();
1600 } catch (ExecutionException | InterruptedException e) {
1601 LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
1602 tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);