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.common.types.rev181019.NodeTypes;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ContextBuilder;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointBuilder;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1Builder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPoint;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointBuilder;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointKey;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionBuilder;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext;
92 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepList;
93 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepListBuilder;
94 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEATTRIBUTEVALUECHANGE;
95 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NotificationBuilder;
96 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributes;
97 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesBuilder;
98 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesKey;
99 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIERMC;
100 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
101 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
102 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
103 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.context.topology.context.topology.node.owned.node.edge.point.PhotonicMediaNodeEdgePointSpec;
104 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
105 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
106 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.NodeEdgePointRef;
107 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
108 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPENODEEDGEPOINT;
109 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
110 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroup;
111 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
112 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
113 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
114 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
115 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
116 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
117 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
118 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
119 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
120 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
121 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
122 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
123 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint;
124 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointBuilder;
125 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey;
126 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
127 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
128 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
129 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
130 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
131 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
132 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
133 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
134 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
135 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
136 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
137 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
138 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder;
139 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
140 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
141 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
142 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
143 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
144 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
145 import org.opendaylight.yangtools.yang.binding.Notification;
146 import org.opendaylight.yangtools.yang.common.Uint16;
147 import org.opendaylight.yangtools.yang.common.Uint32;
148 import org.opendaylight.yangtools.yang.common.Uint64;
149 import org.osgi.service.component.annotations.Activate;
150 import org.osgi.service.component.annotations.Component;
151 import org.osgi.service.component.annotations.Reference;
152 import org.slf4j.Logger;
153 import org.slf4j.LoggerFactory;
157 public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
159 private static final Logger LOG = LoggerFactory.getLogger(TapiNetworkModelServiceImpl.class);
161 private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
162 .getBytes(StandardCharsets.UTF_8)).toString());
163 private final NetworkTransactionService networkTransactionService;
164 private final R2RTapiLinkDiscovery linkDiscovery;
165 private final TapiLink tapiLink;
166 private final ConvertORToTapiTopology tapiFactory;
167 private String topologicalMode;
168 private final ConvertORTopoToTapiFullTopo tapiFullFactory;
169 private final NotificationPublishService notificationPublishService;
170 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap = new HashMap<>();
173 public TapiNetworkModelServiceImpl(@Reference NetworkTransactionService networkTransactionService,
174 @Reference DeviceTransactionManager deviceTransactionManager,
175 @Reference TapiLink tapiLink,
176 @Reference final NotificationPublishService notificationPublishService) {
177 this.networkTransactionService = networkTransactionService;
178 this.linkDiscovery = new R2RTapiLinkDiscovery(networkTransactionService, deviceTransactionManager, tapiLink);
179 this.notificationPublishService = notificationPublishService;
180 this.tapiFactory = new ConvertORToTapiTopology(tapiTopoUuid);
181 this.tapiLink = tapiLink;
182 this.tapiFullFactory = new ConvertORTopoToTapiFullTopo(tapiTopoUuid, tapiLink);
183 this.topologicalMode = tapiFullFactory.getTopologicalMode();
187 public void createTapiNode(String orNodeId, int orNodeVersion, Nodes node) {
188 // TODO -> Implementation with PortMappingListener
189 // check if port mapping exists or not...
190 if (node.getMapping() == null) {
191 LOG.warn("Could not generate port mapping for {} skipping network model creation", orNodeId);
195 LOG.info("Mapping of node {}: {}", orNodeId, node.getMapping().values());
197 // check type of device, check version and create node mapping
198 if (NodeTypes.Rdm.getIntValue() == node.getNodeInfo().getNodeType().getIntValue()) {
200 // transform flat mapping list to per degree and per srg mapping lists
201 Map<String, List<Mapping>> mapDeg = new HashMap<>();
202 Map<String, List<Mapping>> mapSrg = new HashMap<>();
203 List<Mapping> mappingList = new ArrayList<>(node.nonnullMapping().values());
204 mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint));
206 List<String> nodeShardList = getRoadmNodelist(mappingList);
208 // populate degree and srg LCP map
209 for (String str : nodeShardList) {
210 List<Mapping> interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint().contains(str))
211 .collect(Collectors.toList());
212 if (str.contains("DEG")) {
213 mapDeg.put(str, interList);
214 } else if (str.contains("SRG")) {
215 mapSrg.put(str, interList);
217 LOG.error("unknown element");
220 // Transform LCPs into ONEP
221 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap =
222 new HashMap<>(transformSrgToOnep(orNodeId, mapSrg));
223 LOG.debug("CreateTapiNode NetworkModelServiceImpl, TopologicalMode = {}", topologicalMode);
224 LOG.debug("TAPINETWORKMODELSERVICEIMPL call transformSRGtoONEP (OrNodeId {} ", orNodeId);
225 LOG.debug("TAPINETWORKMODELSERVICEIMPL SRG OTSNode of retrieved OnepMap {} ",
226 onepMap.entrySet().stream().filter(e -> e.getValue()
227 .getSupportedCepLayerProtocolQualifierInstances()
228 .contains(new SupportedCepLayerProtocolQualifierInstancesBuilder()
229 .setNumberOfCepInstances(Uint64.valueOf(1))
230 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
232 .collect(Collectors.toList()));
233 if (topologicalMode.equals("Full")) {
234 onepMap.putAll(transformDegToOnep(orNodeId, mapDeg));
235 LOG.debug("TAPINETWORKMODELSERVICEIMPL DEG+SRG OTSNode of retrieved OnepMap {} ",
236 onepMap.entrySet().stream().filter(e -> e.getValue()
237 .getSupportedCepLayerProtocolQualifierInstances()
238 .contains(new SupportedCepLayerProtocolQualifierInstancesBuilder()
239 .setNumberOfCepInstances(Uint64.valueOf(1))
240 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
242 .collect(Collectors.toList()));
243 LOG.debug("TAPINETWORKMODELSERVICEIMPL DEG+SRG complete retrieved OnepMap {} ", onepMap);
245 Node roadmNode = createRoadmTapiNode(orNodeId, onepMap);
246 mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
247 mergeSipsinContext(this.sipMap);
248 // TODO add states corresponding to device config -> based on mapping.
249 // This should be possible after Gilles work is merged
251 // rdm to rdm link creation if neighbour roadm is mounted
252 LOG.info("checking if neighbor roadm exists");
253 Map<LinkKey, Link> rdm2rdmLinks = this.linkDiscovery.readLLDP(new NodeId(orNodeId), orNodeVersion,
255 if (!rdm2rdmLinks.isEmpty()) {
256 mergeLinkinTopology(rdm2rdmLinks);
260 Node roadmNode = createRoadmTapiNode("ROADMINFRA", onepMap);
261 mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
262 mergeSipsinContext(this.sipMap);
263 // TODO add states corresponding to device config -> based on mapping.
264 // This should be possible after Gilles work is merged
267 LOG.info("TAPI node for or node {} successfully merged", orNodeId);
268 } else if (NodeTypes.Xpdr.getIntValue() == node.getNodeInfo().getNodeType().getIntValue()) {
269 List<Mapping> networkMappings = node.nonnullMapping().values()
270 .stream().filter(k -> k.getLogicalConnectionPoint()
271 .contains("NETWORK")).collect(Collectors.toList());
272 Map<Integer, String> xpdrMap = new HashMap<>();
273 for (Mapping mapping : networkMappings) {
274 Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
275 String nodeId = node.getNodeId() + TapiStringConstants.XXPDR + xpdrNb;
276 if (!xpdrMap.containsKey(xpdrNb)) {
277 List<Mapping> xpdrNetMaps = node.nonnullMapping().values()
278 .stream().filter(k -> k.getLogicalConnectionPoint()
279 .contains("XPDR" + xpdrNb + TapiStringConstants.NETWORK)).collect(Collectors.toList());
280 List<Mapping> xpdrClMaps = node.nonnullMapping().values()
281 .stream().filter(k -> k.getLogicalConnectionPoint()
282 .contains("XPDR" + xpdrNb + TapiStringConstants.CLIENT)).collect(Collectors.toList());
283 xpdrMap.put(xpdrNb, node.getNodeId());
285 // create switching pool
286 OduSwitchingPools oorOduSwitchingPool = createSwitchPoolForXpdr(
287 mapping.getXpdrType().getIntValue(), xpdrClMaps, xpdrNetMaps, xpdrNb);
289 // node transformation
290 Map<NodeKey, Node> nodeMap = new HashMap<>(transformXpdrToTapiNode(
291 nodeId, xpdrClMaps, xpdrNetMaps, mapping.getXpdrType(), oorOduSwitchingPool));
292 // add nodes and sips to tapi context
293 mergeNodeinTopology(nodeMap);
294 mergeSipsinContext(this.sipMap);
297 LOG.info("TAPI node for or node {} successfully merged", orNodeId);
299 // Device not managed yet
303 public void updateTapiTopology(String nodeId, Mapping mapping) {
304 List<Uuid> uuids = getChangedNodeUuids(nodeId, mapping);
306 List<Uuid> changedOneps = updateNeps(mapping, uuids);
307 updateLinks(changedOneps, mapping);
308 sendNotification(changedOneps, mapping);
310 LOG.info("Updated TAPI topology successfully.");
313 @SuppressWarnings("rawtypes")
314 private void sendNotification(List<Uuid> changedOneps, Mapping mapping) {
315 Notification notification = new NotificationBuilder()
316 .setNotificationType(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE)
317 // .setTargetObjectType(ObjectType.NODEEDGEPOINT)
318 //TODO: Change this : modification in Models 2.4 does not provide for Object type Node EdgePoint
319 .setTargetObjectType(TOPOLOGYOBJECTTYPENODEEDGEPOINT.VALUE)
320 .setChangedAttributes(getChangedAttributes(changedOneps, mapping))
321 .setUuid(tapiTopoUuid)
324 notificationPublishService.putNotification(notification);
325 } catch (InterruptedException e) {
326 LOG.error("Could not send notification");
330 private Map<ChangedAttributesKey, ChangedAttributes> getChangedAttributes(List<Uuid> changedOneps,
332 Map<ChangedAttributesKey, ChangedAttributes> changedAttributes = new HashMap<>();
333 for (Uuid nep : changedOneps) {
334 changedAttributes.put(new ChangedAttributesKey(nep.getValue()),
335 new ChangedAttributesBuilder().setValueName(nep.getValue())
336 .setOldValue(mapping.getPortOperState().equals("InService") ? "OutOfService" : "InService")
337 .setNewValue(mapping.getPortOperState())
340 return changedAttributes;
343 private void updateLinks(List<Uuid> changedOneps, Mapping mapping) {
345 InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
346 .augmentation(Context1.class).child(TopologyContext.class)
347 .child(Topology.class, new TopologyKey(tapiTopoUuid))
349 Optional<Topology> optTopology = this.networkTransactionService
350 .read(LogicalDatastoreType.OPERATIONAL, topoIID).get();
351 if (optTopology.isEmpty()) {
352 LOG.error("Could not update TAPI links");
355 int nbAffectedLinks = 0;
356 LOG.info("UUIDofAffectedONEPS = {} ", changedOneps.toString());
357 for (Link link : optTopology.orElseThrow().nonnullLink().values()) {
358 List<Uuid> linkNeps = Objects.requireNonNull(link.getNodeEdgePoint()).values().stream()
359 .map(NodeEdgePointRef::getNodeEdgePointUuid).collect(Collectors.toList());
360 LOG.info("LinkEndPointsUUID = {} for link Name {}", linkNeps.toString(), link.getName().toString());
361 if (!Collections.disjoint(changedOneps, linkNeps)) {
362 InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
363 .augmentation(Context1.class).child(TopologyContext.class)
364 .child(Topology.class, new TopologyKey(tapiTopoUuid))
365 .child(Link.class, new LinkKey(link.getUuid())).build();
366 Link linkblr = new LinkBuilder().setUuid(link.getUuid())
367 .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
368 .setOperationalState(transformOperState(mapping.getPortOperState())).build();
369 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, linkIID, linkblr);
373 LOG.info("AffectedLinksNb = {} ", nbAffectedLinks);
374 this.networkTransactionService.commit().get();
375 } catch (InterruptedException | ExecutionException e) {
376 LOG.error("Could not update TAPI links");
380 private List<Uuid> updateNeps(Mapping mapping, List<Uuid> uuids) {
381 List<Uuid> changedOneps = new ArrayList<>();
382 for (Uuid nodeUuid : uuids) {
384 InstanceIdentifier<Node> nodeIID = InstanceIdentifier.builder(Context.class)
385 .augmentation(Context1.class).child(TopologyContext.class)
386 .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
388 Optional<Node> optionalNode = this.networkTransactionService.read(
389 LogicalDatastoreType.OPERATIONAL, nodeIID).get();
390 if (optionalNode.isPresent()) {
391 Node node = optionalNode.orElseThrow();
392 List<OwnedNodeEdgePoint> oneps = node.getOwnedNodeEdgePoint().values().stream()
393 .filter(onep -> ((Name) onep.getName().values().toArray()[0]).getValue()
394 .contains(mapping.getLogicalConnectionPoint())).collect(Collectors.toList());
395 for (OwnedNodeEdgePoint onep : oneps) {
396 changedOneps.add(onep.getUuid());
397 updateSips(mapping, onep);
398 CepList cepList = getUpdatedCeps(mapping, onep);
399 InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
400 .augmentation(Context1.class).child(TopologyContext.class)
401 .child(Topology.class, new TopologyKey(tapiTopoUuid))
402 .child(Node.class, new NodeKey(nodeUuid))
403 .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(onep.getUuid()))
405 OwnedNodeEdgePoint onepblr = new OwnedNodeEdgePointBuilder().setUuid(onep.getUuid())
406 .addAugmentation(new OwnedNodeEdgePoint1Builder().setCepList(cepList).build())
407 .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
408 .setOperationalState(transformOperState(mapping.getPortOperState())).build();
409 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, onepIID, onepblr);
410 LOG.info("UpdatedNEP {} of UUID {} to ADMIN {} OPER {}",
411 onep.getName().toString(), onep.getUuid(),
412 transformAdminState(mapping.getPortAdminState()),
413 transformOperState(mapping.getPortOperState()));
415 this.networkTransactionService.commit().get();
417 } catch (InterruptedException | ExecutionException e) {
418 LOG.error("Could not update TAPI NEP");
424 private CepList getUpdatedCeps(Mapping mapping, OwnedNodeEdgePoint onep) {
425 OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
426 Map<ConnectionEndPointKey, ConnectionEndPoint> cepMap = new HashMap<>();
427 if (onep1 != null && onep1.getCepList() != null && onep1.getCepList().getConnectionEndPoint() != null) {
428 for (Map.Entry<ConnectionEndPointKey, ConnectionEndPoint> entry : onep1.getCepList().getConnectionEndPoint()
430 ConnectionEndPoint cep = new ConnectionEndPointBuilder(entry.getValue())
431 .setOperationalState(transformOperState(mapping.getPortOperState())).build();
432 cepMap.put(entry.getKey(), cep);
435 return new CepListBuilder().setConnectionEndPoint(cepMap).build();
438 private List<Uuid> getChangedNodeUuids(String nodeId, Mapping mapping) {
439 List<Uuid> uuids = new ArrayList<>();
440 if (nodeId.contains("ROADM")) {
441 uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA))
442 .getBytes(StandardCharsets.UTF_8)).toString()));
443 } else if (nodeId.contains("PDR")) {
444 LOG.debug("ANALYSING change in {}", nodeId);
445 int xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
446 String xpdrNodeId = nodeId + TapiStringConstants.XXPDR + xpdrNb;
447 uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", xpdrNodeId, TapiStringConstants.XPDR))
448 .getBytes(StandardCharsets.UTF_8)).toString()));
450 LOG.error("Updating this device is currently not supported");
456 private void updateSips(Mapping mapping, OwnedNodeEdgePoint onep) {
457 if (onep.getMappedServiceInterfacePoint() == null
458 || onep.getMappedServiceInterfacePoint().size() == 0) {
461 for (MappedServiceInterfacePoint msip : onep.getMappedServiceInterfacePoint().values()) {
462 InstanceIdentifier<ServiceInterfacePoint> sipIID = InstanceIdentifier
463 .builder(Context.class)
464 .child(ServiceInterfacePoint.class,
465 new ServiceInterfacePointKey(msip.getServiceInterfacePointUuid()))
467 ServiceInterfacePoint sipblr = new ServiceInterfacePointBuilder()
468 .setUuid(msip.getServiceInterfacePointUuid())
469 .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
470 .setOperationalState(transformOperState(mapping.getPortOperState())).build();
471 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, sipIID, sipblr);
476 private Map<NodeKey, Node> transformXpdrToTapiNode(String nodeId, List<Mapping> xpdrClMaps,
477 List<Mapping> xpdrNetMaps, XpdrNodeTypes xponderType,
478 OduSwitchingPools oorOduSwitchingPool) {
479 Map<NodeKey, Node> nodeMap = new HashMap<>();
480 LOG.info("creation of a DSR/ODU node for {}", nodeId);
481 Uuid nodeUuidDsr = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.XPDR))
482 .getBytes(StandardCharsets.UTF_8)).toString());
483 Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(
484 String.join("+", nodeId, TapiStringConstants.XPDR)).build();
485 Name nameOtsi = new NameBuilder().setValueName("otsi node name").setValue(
486 String.join("+", nodeId, TapiStringConstants.XPDR)).build();
487 Name nameNodeType = new NameBuilder().setValueName("Node Type")
488 .setValue(getNodeType(xponderType)).build();
489 Set<LayerProtocolName> dsrLayerProtocols = Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
490 LayerProtocolName.DIGITALOTN, LayerProtocolName.PHOTONICMEDIA);
491 Node dsrNode = createTapiXpdrNode(Map.of(nameDsr.key(), nameDsr, nameOtsi.key(), nameOtsi, nameNodeType.key(),
492 nameNodeType), dsrLayerProtocols, nodeId, nodeUuidDsr, xpdrClMaps, xpdrNetMaps, xponderType,
493 oorOduSwitchingPool);
495 nodeMap.put(dsrNode.key(), dsrNode);
499 private OduSwitchingPools createSwitchPoolForXpdr(int xpdrType, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
501 // todo: are switching pool correct here??
505 return createTpdrSwitchPool(xpdrNetMaps);
508 return createMuxSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
511 return createSwtchSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
513 LOG.warn("Xpdr type {} not supported", xpdrType);
518 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformSrgToOnep(String orNodeId,
519 Map<String, List<Mapping>> mapSrg) {
520 LOG.debug("CREATENEP transformSrgToOnep, ListOfMapping {}, of NodeId {} ", mapSrg, orNodeId);
521 Map<String, TerminationPoint1> tpMap = new HashMap<>();
522 //List<TerminationPoint> tpList = new ArrayList<>();
523 for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
524 // For each srg node. Loop through the LCPs and create neps and sips for PP
525 for (Mapping m:entry.getValue()) {
526 String tpId = m.getLogicalConnectionPoint();
527 String overlayNodeId = String.join("-", orNodeId, tpId.split("\\-")[0]);
528 if (!tpId.contains("PP")) {
529 LOG.info("LCP {} is not an external TP of SRG node", tpId);
537 } catch (InterruptedException e) {
538 // TODO Auto-generated catch block
539 LOG.debug("Waiting until PP is backported in Topology, Exception raised", e);
541 } while (getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId) == null && counter != 0);
542 if (getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId) != null) {
543 //tpList.add(getNetworkTerminationPointFromDatastore(overlayNodeId, tpId));
544 tpMap.put(tpId, getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId));
545 LOG.debug("LCP {} is not empty for augmentation TP1", tpId);
547 LOG.error("CREATENEP transformSrgToOnep, No Tp1 found in topology for LCP {}, of NodeId {} ",
548 tpId, overlayNodeId);
550 if (getNetworkTerminationPoint11FromDatastore(overlayNodeId, tpId) != null) {
551 LOG.info("LCP {} is not empty for augmentation TP11", tpId);
553 LOG.error("CREATENEP transformSrgToOnep, No Tp11 found in topology for LCP {}, of NodeId {} ",
554 tpId, overlayNodeId);
558 LOG.debug("TransformSRGToONep for tps {}, of NodeId {} ",
559 tpMap.entrySet().stream().map(tp -> tp.getKey()).collect(Collectors.toList()).toString(), orNodeId);
560 return populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OTS);
563 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformDegToOnep(String orNodeId,
564 Map<String, List<Mapping>> mapDeg) {
565 LOG.debug("CREATENEP transformDegToOnep, ListOfMapping {}, of NodeId {} ",
566 mapDeg.toString(), orNodeId);
567 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> degOnepMap = new HashMap<>();
568 Map<String, TerminationPoint1> tpMap = new HashMap<>();
569 //List<TerminationPoint> tpList = new ArrayList<>();
570 for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
571 // For each degree node. Loop through the LCPs and create neps and sips for TTP
572 for (Mapping m:entry.getValue()) {
573 String tpId = m.getLogicalConnectionPoint();
574 String overlayNodeId = String.join("-", orNodeId, tpId.split("\\-")[0]);
575 if (!tpId.contains("TTP")) {
576 LOG.info("LCP {} is not an external TP of DEGREE node", tpId);
579 if (getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId) != null) {
580 //tpList.add(getNetworkTerminationPointFromDatastore(overlayNodeId, tpId));
581 tpMap.put(tpId, getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId));
582 LOG.info("LCP {} is not empty for augmentation TP1", tpId);
584 LOG.error("CREATENEP transformDegToOnep, No Tp found in topology for LCP {}, of NodeId {} ",
585 tpId, overlayNodeId);
589 degOnepMap.putAll(populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OTS));
590 degOnepMap.putAll(populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OMS));
594 private List<String> getRoadmNodelist(List<Mapping> mappingList) {
595 List<String> nodeShardList = new ArrayList<>();
596 for (Mapping mapping : mappingList) {
597 // TODO -> maybe we need to check the id based on the version
598 String str = mapping.getLogicalConnectionPoint().split("-")[0];
599 LOG.info("LCP = {}", str);
600 if (!nodeShardList.contains(str)) {
601 nodeShardList.add(str);
604 return nodeShardList;
608 public void deleteTapinode(String nodeId) {
609 // TODO: check for null objects
610 // Check if it is ROADM or XPDR --> create the uuids of the node and delete from topology the node.
611 // This will delete NEPs. Then check for links that have this node and delete them.
612 // Then check SIPs and delete them. Then services and connections with SIPs and put them to another state.
613 LOG.info("Deleting node {} from TAPI topology", nodeId);
614 InstanceIdentifier<Topology> topologyIID = InstanceIdentifier.builder(Context.class)
615 .augmentation(Context1.class).child(TopologyContext.class).child(Topology.class,
616 new TopologyKey(tapiTopoUuid)).build();
617 Topology topology = null;
619 Optional<Topology> optTopology =
620 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, topologyIID).get();
621 if (!optTopology.isPresent()) {
622 LOG.error("No topology object present. Error deleting node {}", nodeId);
625 topology = optTopology.orElseThrow();
626 } catch (InterruptedException | ExecutionException e) {
627 LOG.error("Couldnt read tapi topology from datastore", e);
629 if (topology == null) {
630 LOG.error("Topology is null, nothing to delete");
633 if (topology.getNode() == null) {
634 LOG.error("No nodes in topology");
637 if (nodeId.contains("ROADM")) {
638 if (topologicalMode.equals("Full")) {
639 // Node is in photonic media layer and UUID can be built from nodeId + PHTN_MEDIA
640 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
641 TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8)).toString());
642 deleteNodeFromTopo(nodeUuid);
644 LOG.info("Abstracted Topo Mode in TAPI topology Datastore for OR topology representation. Node"
645 + " {} is not represented in the abstraction and will not be deleted", nodeId);
648 if (nodeId.contains("XPDR") || nodeId.contains("SPDR") || nodeId.contains("MXPDR")) {
649 // Node is either XPDR, MXPDR or SPDR. Retrieve nodes from topology and check names
650 for (Node tapiNode:topology.getNode().values()) {
651 if (tapiNode.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
652 // Found node we need to delete
653 deleteNodeFromTopo(tapiNode.getUuid());
657 // Delete links of topology
658 Map<LinkKey, Link> linkMap = topology.getLink();
659 if (linkMap != null) {
660 for (Link link:linkMap.values()) {
661 if (link.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
662 deleteLinkFromTopo(link.getUuid());
666 // Delete sips of sip map
667 InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
668 Context context = null;
670 Optional<Context> optContext = this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL,
672 if (!optContext.isPresent()) {
673 LOG.error("No context object present in datastore.");
676 context = optContext.orElseThrow();
677 } catch (InterruptedException | ExecutionException e) {
678 LOG.error("Couldnt read tapi context from datastore", e);
680 if (context == null) {
681 LOG.error("Context is null, nothing to delete");
684 Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips = context.getServiceInterfacePoint();
686 for (ServiceInterfacePoint sip:sips.values()) {
687 if (sip.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
688 // Update state of services that have this sip as an endpoint and also connections
689 updateConnectivityServicesState(sip.getUuid(), nodeId);
690 deleteSipFromTopo(sip.getUuid());
696 private Node createTapiXpdrNode(Map<NameKey, Name> nameMap, Set<LayerProtocolName> layerProtocols,
697 String nodeId, Uuid nodeUuid, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
698 XpdrNodeTypes xponderType, OduSwitchingPools oorOduSwitchingPool) {
700 Map<RuleKey, Rule> ruleList = new HashMap<>();
701 Set<RuleType> ruleTypes = new HashSet<>();
702 ruleTypes.add(RuleType.FORWARDING);
703 Rule rule = new RuleBuilder()
704 .setLocalId("forward")
705 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
706 .setRuleType(ruleTypes)
708 ruleList.put(rule.key(), rule);
709 if (!(layerProtocols.contains(LayerProtocolName.DSR)
710 && layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA))) {
711 LOG.error("Undefined LayerProtocolName for {} node {}", nameMap.get(nameMap.keySet().iterator().next())
712 .getValueName(), nameMap.get(nameMap.keySet().iterator().next()).getValue());
714 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
715 onepl.putAll(createXpdrDsrOduNeps(nodeId, xpdrClMaps, xpdrNetMaps, xponderType));
716 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = createNodeRuleGroupForDsrNode(
717 nodeId, oorOduSwitchingPool, ruleList, onepl);
718 onepl.putAll(createXpdrPhtnMdNeps(nodeId, xpdrNetMaps));
719 LOG.debug("TapiNetworkModelServiceImpl line 721, total NEP map = {}", onepl.toString());
721 // Empty random creation of mandatory fields for avoiding errors....
722 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
723 .setCostAlgorithm("Restricted Shortest Path - RSP")
724 .setCostName("HOP_COUNT")
725 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
727 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
728 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
729 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
730 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
731 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
732 .setTrafficPropertyName("FIXED_LATENCY")
734 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
735 .setRiskCharacteristicName("risk characteristic")
736 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
738 RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
739 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
741 Node builtNode = new NodeBuilder()
744 .setLayerProtocolName(layerProtocols)
745 .setAdministrativeState(AdministrativeState.UNLOCKED)
746 .setOperationalState(OperationalState.ENABLED)
747 .setLifecycleState(LifecycleState.INSTALLED)
748 .setOwnedNodeEdgePoint(onepl)
749 .setNodeRuleGroup(nodeRuleGroupList)
750 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
751 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
752 .setErrorCharacteristic("error")
753 .setLossCharacteristic("loss")
754 .setRepeatDeliveryCharacteristic("repeat delivery")
755 .setDeliveryOrderCharacteristic("delivery order")
756 .setUnavailableTimeCharacteristic("unavailable time")
757 .setServerIntegrityProcessCharacteristic("server integrity process")
758 .setRiskParameterPac(riskParamPac)
760 List<PhotonicMediaNodeEdgePointSpec> pmnepspecList = new ArrayList<>();
761 for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry :
762 builtNode.getOwnedNodeEdgePoint().entrySet()) {
763 if (!entry.getValue().getSupportedCepLayerProtocolQualifierInstances().stream()
764 .filter(sclpqi -> sclpqi.getLayerProtocolQualifier().equals(PHOTONICLAYERQUALIFIEROTS.VALUE))
765 .collect(Collectors.toList()).isEmpty()
766 && entry.getValue().augmentationOrElseThrow(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang
767 .tapi.photonic.media.rev221121.OwnedNodeEdgePoint1.class) != null
768 && entry.getValue().augmentationOrElseThrow(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi
769 .photonic.media.rev221121.OwnedNodeEdgePoint1.class).getPhotonicMediaNodeEdgePointSpec()
771 pmnepspecList.add(entry.getValue().augmentationOrElseThrow(org.opendaylight.yang.gen.v1.urn.onf.otcc
772 .yang.tapi.photonic.media.rev221121.OwnedNodeEdgePoint1.class).getPhotonicMediaNodeEdgePointSpec());
775 LOG.debug("TapiNetworkModelServiceImpl line 775, List of non empty PMNEPSEC is = {}", pmnepspecList);
779 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrPhtnMdNeps(String nodeId,
780 List<Mapping> xpdrNetMaps) {
781 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
783 // eNep creation on otsi node
784 for (int i = 0; i < xpdrNetMaps.size(); i++) {
785 Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
786 (String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
787 xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
788 Name onedName = new NameBuilder()
789 .setValueName("eNodeEdgePoint")
790 .setValue(String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
791 xpdrNetMaps.get(i).getLogicalConnectionPoint()))
794 List<SupportedIfCapability> newSupIfCapList =
795 new ArrayList<>(xpdrNetMaps.get(i).getSupportedInterfaceCapability());
796 List<String> opModeList = new ArrayList<>();
797 if (xpdrNetMaps.get(i).getSupportedOperationalMode() != null) {
798 opModeList.addAll(xpdrNetMaps.get(i).getSupportedOperationalMode());
801 OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid2, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
802 Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
803 true, String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS), newSupIfCapList, opModeList,
804 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
805 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
806 onepl.put(onep.key(), onep);
808 // OTSi_MC Nep creation on otsi node
809 for (int i = 0; i < xpdrNetMaps.size(); i++) {
810 Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(
811 (String.join("+", nodeId, TapiStringConstants.OTSI_MC,
812 xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
813 Name onedName = new NameBuilder()
814 .setValueName("PhotMedNodeEdgePoint")
815 .setValue(String.join("+", nodeId, TapiStringConstants.OTSI_MC,
816 xpdrNetMaps.get(i).getLogicalConnectionPoint()))
819 List<SupportedIfCapability> newSupIfCapList =
820 new ArrayList<>(xpdrNetMaps.get(i).getSupportedInterfaceCapability());
821 List<String> opModeList = new ArrayList<>();
822 if (xpdrNetMaps.get(i).getSupportedOperationalMode() != null) {
823 opModeList.addAll(xpdrNetMaps.get(i).getSupportedOperationalMode());
826 OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid3, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
827 Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
828 false, String.join("+", nodeId, TapiStringConstants.OTSI_MC), newSupIfCapList, opModeList,
829 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
830 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
831 onepl.put(onep.key(), onep);
836 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrDsrOduNeps(String nodeId, List<Mapping> xpdrClMaps,
837 List<Mapping> xpdrNetMaps,
838 XpdrNodeTypes xponderType) {
839 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
840 // client nep creation on DSR node
841 for (int i = 0; i < xpdrClMaps.size(); i++) {
842 LOG.info("Client NEP = {}", String.join("+", nodeId, TapiStringConstants.DSR,
843 xpdrClMaps.get(i).getLogicalConnectionPoint()));
844 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
845 (String.join("+", nodeId, TapiStringConstants.DSR,
846 xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
847 NameBuilder nameBldr = new NameBuilder().setValue(String.join("+", nodeId,
848 TapiStringConstants.DSR, xpdrClMaps.get(i).getLogicalConnectionPoint()));
850 if (OpenroadmNodeType.TPDR.getName().equalsIgnoreCase(xponderType.getName())) {
851 name = nameBldr.setValueName("100G-tpdr").build();
853 name = nameBldr.setValueName("NodeEdgePoint_C").build();
856 List<SupportedIfCapability> newSupIfCapList =
857 new ArrayList<>(xpdrClMaps.get(i).getSupportedInterfaceCapability());
859 OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
860 Map.of(name.key(), name), LayerProtocolName.DSR, LayerProtocolName.DSR, true,
861 String.join("+", nodeId, TapiStringConstants.DSR), newSupIfCapList, null,
862 transformOperState(xpdrClMaps.get(i).getPortOperState()),
863 transformAdminState(xpdrClMaps.get(i).getPortAdminState()));
864 onepl.put(onep.key(), onep);
866 // network nep creation on I_ODU node
867 for (int i = 0; i < xpdrNetMaps.size(); i++) {
868 LOG.info("iODU NEP = {}", String.join("+", nodeId, TapiStringConstants.I_ODU,
869 xpdrNetMaps.get(i).getLogicalConnectionPoint()));
870 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
871 (String.join("+", nodeId, TapiStringConstants.I_ODU,
872 xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
873 Name onedName = new NameBuilder()
874 .setValueName("iNodeEdgePoint_N")
875 .setValue(String.join("+", nodeId, TapiStringConstants.I_ODU,
876 xpdrNetMaps.get(i).getLogicalConnectionPoint()))
879 List<SupportedIfCapability> newSupIfCapList =
880 new ArrayList<>(xpdrNetMaps.get(i).getSupportedInterfaceCapability());
881 OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
882 Map.of(onedName.key(), onedName),
883 LayerProtocolName.ODU, LayerProtocolName.DSR, true,
884 String.join("+", nodeId, TapiStringConstants.I_ODU), newSupIfCapList, null,
885 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
886 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
887 onepl.put(onep.key(), onep);
889 // network nep creation on E_ODU node
890 for (int i = 0; i < xpdrClMaps.size(); i++) {
891 LOG.info("eODU NEP = {}", String.join("+", nodeId, TapiStringConstants.E_ODU,
892 xpdrClMaps.get(i).getLogicalConnectionPoint()));
893 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
894 (String.join("+", nodeId, TapiStringConstants.E_ODU,
895 xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
896 Name onedName = new NameBuilder()
897 .setValueName("eNodeEdgePoint_N")
898 .setValue(String.join("+", nodeId, TapiStringConstants.E_ODU,
899 xpdrClMaps.get(i).getLogicalConnectionPoint()))
902 List<SupportedIfCapability> newSupIfCapList =
903 new ArrayList<>(xpdrClMaps.get(i).getSupportedInterfaceCapability());
905 OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
906 Map.of(onedName.key(), onedName),
907 LayerProtocolName.ODU, LayerProtocolName.DSR, true,
908 String.join("+", nodeId, TapiStringConstants.E_ODU), newSupIfCapList, null,
909 transformOperState(xpdrClMaps.get(i).getPortOperState()),
910 transformAdminState(xpdrClMaps.get(i).getPortAdminState()));
911 onepl.put(onep.key(), onep);
916 private OperationalState transformOperState(String operString) {
917 State operState = org.opendaylight.transportpce.networkmodel.util.TopologyUtils.setNetworkOperState(operString);
918 return operState.equals(State.InService) ? OperationalState.ENABLED : OperationalState.DISABLED;
921 private AdministrativeState transformAdminState(String adminString) {
922 AdminStates adminState = org.opendaylight.transportpce.networkmodel.util.TopologyUtils
923 .setNetworkAdminState(adminString);
924 return adminState.equals(AdminStates.InService) ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
927 private OwnedNodeEdgePoint createNep(String nodeId, Uuid nepUuid, String tpid, Map<NameKey, Name> nepNames,
928 LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword,
929 List<SupportedIfCapability> sicList, List<String> opModeList,
930 OperationalState operState, AdministrativeState adminState) {
931 List<SupportedInterfaceCapability> sicListTemp = new ArrayList<>();
932 List<OperationalModeKey> keyedOpModeList = new ArrayList<>();
933 for (SupportedIfCapability supInterCapa : sicList) {
934 SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
935 .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
936 .setIfCapType(supInterCapa)
938 sicListTemp.add(supIfCapa);
940 Collection<SupportedInterfaceCapability> sicColl = sicListTemp;
941 OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
943 .setLayerProtocolName(nepProtocol)
946 onepBldr.setMappedServiceInterfacePoint(this.tapiFactory.createMSIP(1, nepProtocol, tpid, keyword,
947 sicColl, operState, adminState));
948 this.sipMap.putAll(tapiFactory.getTapiSips());
950 LOG.debug("Node layer {}", nodeProtocol.getName());
951 onepBldr.setSupportedCepLayerProtocolQualifierInstances(
952 this.tapiFactory.createSupportedCepLayerProtocolQualifier(sicColl, nepProtocol));
953 onepBldr.setDirection(Direction.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
954 .setAdministrativeState(adminState).setOperationalState(operState)
955 .setLifecycleState(LifecycleState.INSTALLED);
956 if (keyword.contains(TapiStringConstants.OTSI_MC) || keyword.contains(TapiStringConstants.PHTNC_MEDIA_OTS)) {
957 if (opModeList == null || opModeList.isEmpty()) {
958 for (SupportedInterfaceCapability sic : sicColl) {
959 String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
960 if (("IfOCHOTUCnODUCn").equals(ifCapType) || ("IfOCHOTUCnODUCnUniregen").equals(ifCapType)
961 || ("IfOCHOTUCnODUCnRegen").equals(ifCapType)) {
962 keyedOpModeList.add(new OperationalModeKey("400G"));
963 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "400G rate available", tpid);
967 keyedOpModeList.add(new OperationalModeKey("100G"));
968 LOG.warn(TopologyUtils.NOOPMODEDECLARED + "100G rate available", tpid);
970 for (String opMode : opModeList) {
971 keyedOpModeList.add(new OperationalModeKey(opMode));
974 Map<Double, Double> freqWidthMap = new HashMap<>();
975 if (getNetworkTerminationPointFromDatastore(nodeId, tpid) != null) {
976 freqWidthMap = tapiFactory.getXpdrUsedWavelength(getNetworkTerminationPointFromDatastore(nodeId, tpid));
978 LOG.error("CREATENEP, No Tp found in topology for LCP {}, of NodeId {} ", tpid, nodeId);
980 onepBldr = tapiFactory.addPayloadStructureAndPhotSpecToOnep(nodeId, freqWidthMap, keyedOpModeList,
981 sicColl, onepBldr, keyword);
982 LOG.debug("TapiNetworkServiceImpl line982, onep = {}", onepBldr.build());
984 return onepBldr.build();
987 private Node createRoadmTapiNode(String orNodeId, Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap) {
988 // UUID and Node Names
991 if (orNodeId.equals("ROADMINFRA")) {
992 nodeUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA
993 .getBytes(Charset.forName("UTF-8"))).toString());
994 nodeNames = new NameBuilder().setValueName("roadm node name").setValue(TapiStringConstants.RDM_INFRA)
997 nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
998 TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8)).toString());
999 nodeNames = new NameBuilder().setValueName("roadm node name")
1000 .setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA)).build();
1002 Name nameNodeType = new NameBuilder().setValueName("Node Type")
1003 .setValue(OpenroadmNodeType.ROADM.getName()).build();
1005 Set<LayerProtocolName> layerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
1006 // Empty random creation of mandatory fields for avoiding errors....
1007 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
1008 .setCostAlgorithm("Restricted Shortest Path - RSP")
1009 .setCostName("HOP_COUNT")
1010 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
1012 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1013 .setFixedLatencyCharacteristic(TapiStringConstants.COST_HOP_VALUE)
1014 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
1015 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
1016 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
1017 .setTrafficPropertyName("FIXED_LATENCY")
1019 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1020 .setRiskCharacteristicName("risk characteristic")
1021 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
1023 RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
1024 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1026 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap
1027 = tapiFactory.createAllNodeRuleGroupForRdmNode(topologicalMode, nodeUuid, orNodeId, onepMap.values());
1028 Map<InterRuleGroupKey, InterRuleGroup> interRuleGroupMap
1029 = tapiFactory.createInterRuleGroupForRdmNode(topologicalMode, nodeUuid, orNodeId,
1030 nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList()));
1031 return new NodeBuilder()
1033 .setName(Map.of(nodeNames.key(), nodeNames, nameNodeType.key(), nameNodeType))
1034 .setLayerProtocolName(layerProtocols)
1035 .setAdministrativeState(AdministrativeState.UNLOCKED)
1036 .setOperationalState(OperationalState.ENABLED)
1037 .setLifecycleState(LifecycleState.INSTALLED)
1038 .setOwnedNodeEdgePoint(onepMap)
1039 .setNodeRuleGroup(nodeRuleGroupMap)
1040 .setInterRuleGroup(interRuleGroupMap)
1041 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1042 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1043 .setErrorCharacteristic("error")
1044 .setLossCharacteristic("loss")
1045 .setRepeatDeliveryCharacteristic("repeat delivery")
1046 .setDeliveryOrderCharacteristic("delivery order")
1047 .setUnavailableTimeCharacteristic("unavailable time")
1048 .setServerIntegrityProcessCharacteristic("server integrity process")
1049 .setRiskParameterPac(riskParamPac)
1053 private OduSwitchingPools createTpdrSwitchPool(List<Mapping> xpdrNetMaps) {
1054 Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
1056 for (int i = 1; i <= xpdrNetMaps.size(); i++) {
1057 LOG.info("XPDr net LCP = {}", xpdrNetMaps.get(i - 1).getLogicalConnectionPoint());
1058 LOG.info("XPDr net associated LCP = {}", xpdrNetMaps.get(i - 1).getConnectionMapLcp());
1059 TpId tpid1 = new TpId(xpdrNetMaps.get(i - 1).getLogicalConnectionPoint());
1060 TpId tpid2 = new TpId(xpdrNetMaps.get(i - 1).getConnectionMapLcp());
1061 Set<TpId> tpList = new HashSet<>();
1064 NonBlockingList nbl = new NonBlockingListBuilder()
1065 .setNblNumber(Uint16.valueOf(count))
1068 nblMap.put(nbl.key(), nbl);
1071 return new OduSwitchingPoolsBuilder()
1072 .setNonBlockingList(nblMap)
1073 .setSwitchingPoolNumber(Uint16.valueOf(1))
1077 private OduSwitchingPools createSwtchSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
1079 Set<TpId> tpl = new HashSet<>();
1081 for (int i = 1; i <= xpdrClMaps.size(); i++) {
1082 tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i);
1085 for (int i = 1; i <= xpdrNetMaps.size(); i++) {
1086 tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.NETWORK + i);
1089 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
1090 NonBlockingList nbl = new NonBlockingListBuilder()
1091 .setNblNumber(Uint16.valueOf(1))
1094 nbMap.put(nbl.key(),nbl);
1096 return new OduSwitchingPoolsBuilder()
1097 .setSwitchingPoolNumber(Uint16.valueOf(1))
1098 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
1099 .setNonBlockingList(nbMap)
1103 private OduSwitchingPools createMuxSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps, Integer xpdrNb) {
1104 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
1105 for (int i = 1; i <= xpdrClMaps.size(); i++) {
1106 Set<TpId> tpList = new HashSet<>();
1107 TpId tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i);
1109 tpId = new TpId("XPDR" + xpdrNb + "-NETWORK1");
1111 NonBlockingList nbl = new NonBlockingListBuilder()
1112 .setNblNumber(Uint16.valueOf(i))
1114 .setAvailableInterconnectBandwidth(Uint32.valueOf(xpdrNetMaps.size() * 10L))
1115 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
1117 nbMap.put(nbl.key(),nbl);
1119 return new OduSwitchingPoolsBuilder()
1120 .setSwitchingPoolNumber(Uint16.valueOf(1))
1121 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
1122 .setNonBlockingList(nbMap)
1126 private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForDsrNode(String nodeId,
1127 OduSwitchingPools oorOduSwitchingPool, Map<RuleKey, Rule> ruleList,
1128 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl) {
1129 // create NodeRuleGroup
1130 if (oorOduSwitchingPool == null) {
1131 LOG.info("No switching pool created for node = {}", nodeId);
1132 return new HashMap<>();
1134 LOG.debug("ONEPL = {}", onepl.values());
1135 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
1137 for (NonBlockingList nbl : oorOduSwitchingPool.nonnullNonBlockingList().values()) {
1138 LOG.info("Non blocking list = {}", nbl);
1139 Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
1140 for (TpId tp : nbl.getTpList()) {
1141 LOG.info("EDOU TP = {}", String.join("+", nodeId, TapiStringConstants.E_ODU, tp.getValue()));
1142 LOG.info("DSR TP = {}", String.join("+", nodeId, TapiStringConstants.DSR, tp.getValue()));
1143 Uuid tpUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
1144 TapiStringConstants.E_ODU, tp.getValue())).getBytes(StandardCharsets.UTF_8)).toString());
1145 Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
1146 TapiStringConstants.DSR, tp.getValue())).getBytes(StandardCharsets.UTF_8)).toString());
1147 if (onepl.containsKey(new OwnedNodeEdgePointKey(tpUuid))
1148 && onepl.containsKey(new OwnedNodeEdgePointKey(tp1Uuid))) {
1149 NodeEdgePoint nep1 = new NodeEdgePointBuilder()
1150 .setTopologyUuid(this.tapiTopoUuid)
1151 .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
1152 (String.join("+", nodeId,TapiStringConstants. DSR))
1153 .getBytes(StandardCharsets.UTF_8)).toString()))
1154 .setNodeEdgePointUuid(tp1Uuid)
1156 NodeEdgePoint nep2 = new NodeEdgePointBuilder()
1157 .setTopologyUuid(this.tapiTopoUuid)
1158 .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
1159 (String.join("+", nodeId,TapiStringConstants. DSR))
1160 .getBytes(StandardCharsets.UTF_8)).toString()))
1161 .setNodeEdgePointUuid(tpUuid)
1163 nepList.put(nep1.key(), nep1);
1164 nepList.put(nep2.key(), nep2);
1167 // Empty random creation of mandatory fields for avoiding errors....
1168 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
1169 .setCostAlgorithm("Restricted Shortest Path - RSP")
1170 .setCostName("HOP_COUNT")
1171 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
1173 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1174 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
1175 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
1176 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
1177 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
1178 .setTrafficPropertyName("FIXED_LATENCY")
1180 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1181 .setRiskCharacteristicName("risk characteristic")
1182 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
1184 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
1186 UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(StandardCharsets.UTF_8))
1189 .setNodeEdgePoint(nepList)
1190 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1191 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1192 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1194 nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
1197 return nodeRuleGroupMap;
1200 private String getNodeType(XpdrNodeTypes xponderType) {
1201 switch (xponderType.getIntValue()) {
1203 return OpenroadmNodeType.TPDR.getName();
1205 return OpenroadmNodeType.MUXPDR.getName();
1207 return OpenroadmNodeType.SWITCH.getName();
1209 LOG.info("XpdrType {} not supported", xponderType);
1215 private void mergeNodeinTopology(Map<NodeKey, Node> nodeMap) {
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 InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
1220 .augmentation(Context1.class).child(TopologyContext.class)
1221 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1224 Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid).setNode(nodeMap).build();
1226 // merge in datastore
1227 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
1230 this.networkTransactionService.commit().get();
1231 } catch (InterruptedException | ExecutionException e) {
1232 LOG.error("Error populating TAPI topology: ", e);
1234 LOG.info("Node added succesfully.");
1237 private void mergeLinkinTopology(Map<LinkKey, Link> linkMap) {
1238 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1239 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1240 LOG.info("Creating tapi node in TAPI topology context");
1241 InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
1242 .augmentation(Context1.class).child(TopologyContext.class)
1243 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1246 Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid).setLink(linkMap).build();
1248 // merge in datastore
1249 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
1252 this.networkTransactionService.commit().get();
1253 } catch (InterruptedException | ExecutionException e) {
1254 LOG.error("Error populating TAPI topology: ", e);
1256 LOG.info("Roadm Link added succesfully.");
1259 private void mergeSipsinContext(Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips) {
1260 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1261 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1263 ContextBuilder contextBuilder = new ContextBuilder();
1264 contextBuilder.setServiceInterfacePoint(sips);
1265 InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
1266 // merge in datastore
1267 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, contextIID,
1268 contextBuilder.build());
1269 this.networkTransactionService.commit().get();
1270 LOG.info("TAPI SIPs merged successfully.");
1271 } catch (InterruptedException | ExecutionException e) {
1272 LOG.error("Failed to merge TAPI Sips", e);
1276 private void deleteLinkFromTopo(Uuid linkUuid) {
1277 // TODO: check if this IID is correct
1279 InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
1280 .augmentation(Context1.class).child(TopologyContext.class).child(Topology.class,
1281 new TopologyKey(this.tapiTopoUuid)).child(Link.class, new LinkKey(linkUuid)).build();
1282 this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, linkIID);
1283 this.networkTransactionService.commit().get();
1284 LOG.info("TAPI link deleted successfully.");
1285 } catch (InterruptedException | ExecutionException e) {
1286 LOG.error("Failed to delete TAPI link", e);
1290 private void deleteNodeFromTopo(Uuid nodeUuid) {
1291 // TODO: check if this IID is correct
1293 InstanceIdentifier<Node> nodeIDD = InstanceIdentifier.builder(Context.class)
1294 .augmentation(Context1.class).child(TopologyContext.class).child(Topology.class,
1295 new TopologyKey(this.tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid)).build();
1296 this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, nodeIDD);
1297 this.networkTransactionService.commit().get();
1298 LOG.info("TAPI Node deleted successfully.");
1299 } catch (InterruptedException | ExecutionException e) {
1300 LOG.error("Failed to delete TAPI Node", e);
1304 private void deleteSipFromTopo(Uuid sipUuid) {
1305 // TODO: check if this IID is correct
1307 InstanceIdentifier<ServiceInterfacePoint> sipIID = InstanceIdentifier.builder(Context.class)
1308 .child(ServiceInterfacePoint.class, new ServiceInterfacePointKey(sipUuid)).build();
1309 this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, sipIID);
1310 this.networkTransactionService.commit().get();
1311 LOG.info("TAPI SIP deleted successfully.");
1312 } catch (InterruptedException | ExecutionException e) {
1313 LOG.error("Failed to delete TAPI SIP", e);
1317 private void updateConnectivityServicesState(Uuid sipUuid, String nodeId) {
1318 // TODO: check if this IID is correct
1319 InstanceIdentifier<ConnectivityContext> connectivitycontextIID = InstanceIdentifier.builder(Context.class)
1320 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
1321 .child(ConnectivityContext.class)
1323 ConnectivityContext connContext = null;
1325 Optional<ConnectivityContext> optConnContext =
1326 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivitycontextIID)
1328 if (!optConnContext.isPresent()) {
1329 LOG.error("Couldnt retrieve connectivity context from datastore");
1332 connContext = optConnContext.orElseThrow();
1333 } catch (InterruptedException | ExecutionException e) {
1334 LOG.error("Couldnt read connectivity context from datastore", e);
1336 if (connContext == null) {
1337 LOG.error("Connectivity context is empty");
1340 // Loop through services, check if the endpoint uuid is equal to the sip.
1341 // If so update state.
1342 Map<ConnectivityServiceKey, ConnectivityService> connServMap = connContext.getConnectivityService();
1343 Map<ConnectionKey, Connection> connMap = connContext.getConnection();
1344 if (connServMap != null) {
1345 for (ConnectivityService service:connServMap.values()) {
1346 Map<EndPointKey, EndPoint> serviceEndPoints = service.getEndPoint();
1347 if (serviceEndPoints.values().stream().anyMatch(endPoint -> endPoint.getServiceInterfacePoint()
1348 .getServiceInterfacePointUuid().equals(sipUuid))) {
1349 LOG.info("Service using SIP of node {} identified. Update state of service", nodeId);
1350 ConnectivityService updService = new ConnectivityServiceBuilder(service)
1351 .setAdministrativeState(AdministrativeState.LOCKED)
1352 .setOperationalState(OperationalState.DISABLED)
1353 .setLifecycleState(LifecycleState.PENDINGREMOVAL)
1355 updateConnectivityService(updService);
1359 // Update state of connections
1360 if (connMap != null) {
1361 for (Connection connection:connMap.values()) {
1362 if (connection.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
1363 Connection updConn = new ConnectionBuilder(connection)
1364 .setLifecycleState(LifecycleState.PENDINGREMOVAL)
1365 .setOperationalState(OperationalState.DISABLED)
1367 updateConnection(updConn);
1373 private void updateConnection(Connection updConn) {
1374 // TODO: check if this IID is correct
1375 InstanceIdentifier<Connection> connectionIID = InstanceIdentifier.builder(Context.class)
1376 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
1377 .child(ConnectivityContext.class).child(Connection.class,
1378 new ConnectionKey(updConn.getUuid())).build();
1379 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectionIID, updConn);
1381 this.networkTransactionService.commit().get();
1382 } catch (InterruptedException | ExecutionException e) {
1383 LOG.error("Error committing into datastore", e);
1387 private void updateConnectivityService(ConnectivityService updService) {
1388 // TODO: check if this IID is correct
1389 InstanceIdentifier<ConnectivityService> connectivityserviceIID = InstanceIdentifier.builder(Context.class)
1390 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
1391 .child(ConnectivityContext.class).child(ConnectivityService.class,
1392 new ConnectivityServiceKey(updService.getUuid())).build();
1393 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectivityserviceIID, updService);
1395 this.networkTransactionService.commit().get();
1396 } catch (InterruptedException | ExecutionException e) {
1397 LOG.error("Error committing into datastore", e);
1401 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> populateNepsForRdmNode(String nodeId,
1402 Map<String, TerminationPoint1> tpMap, boolean withSip, String nepPhotonicSublayer) {
1403 // create neps for MC and and Photonic Media OTS/OMS
1404 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
1405 for (Map.Entry<String, TerminationPoint1> entry : tpMap.entrySet()) {
1406 // Admin and oper state common for all tps
1407 OpenroadmTpType tpType = entry.getValue().getTpType();
1408 // PHOTONIC MEDIA nep
1409 LOG.debug("PHOTO NEP = {}", String.join("+", nodeId, nepPhotonicSublayer,
1411 SupportedCepLayerProtocolQualifierInstancesBuilder sclpqiBd =
1412 new SupportedCepLayerProtocolQualifierInstancesBuilder()
1413 .setNumberOfCepInstances(Uint64.valueOf(1));
1414 switch (nepPhotonicSublayer) {
1415 case TapiStringConstants.PHTNC_MEDIA_OMS:
1416 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROMS.VALUE);
1418 case TapiStringConstants.PHTNC_MEDIA_OTS:
1419 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE);
1421 case TapiStringConstants.MC:
1422 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIERMC.VALUE);
1424 case TapiStringConstants.OTSI_MC:
1425 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE);
1431 List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>(List.of(sclpqiBd.build()));
1432 OwnedNodeEdgePointBuilder onepBd = new OwnedNodeEdgePointBuilder();
1433 if (!nepPhotonicSublayer.equals(TapiStringConstants.MC)
1434 && !nepPhotonicSublayer.equals(TapiStringConstants.OTSI_MC)) {
1435 Map<Double,Double> usedFreqMap = new HashMap<>();
1436 Map<Double,Double> availableFreqMap = new HashMap<>();
1438 // Whatever is the TP and its type we consider that it is handled in a bidirectional way :
1439 // same wavelength(s) used in both direction.
1443 usedFreqMap = tapiFactory.getPP11UsedWavelength(
1444 getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
1445 if (usedFreqMap == null || usedFreqMap.isEmpty()) {
1446 availableFreqMap.put(GridConstant.START_EDGE_FREQUENCY * 1E09,
1447 GridConstant.START_EDGE_FREQUENCY * 1E09
1448 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06);
1450 LOG.debug("EnteringLOOPcreateOTSiMC & MC with usedFreqMap non empty {} for Node {}, tp {}",
1451 usedFreqMap.toString(), nodeId, tpMap.toString());
1452 onepMap.putAll(populateNepsForRdmNode(nodeId,
1453 new HashMap<>(Map.of(entry.getKey(), entry.getValue())),
1454 true, TapiStringConstants.MC));
1455 onepMap.putAll(populateNepsForRdmNode(nodeId,
1456 new HashMap<>(Map.of(entry.getKey(), entry.getValue())),
1457 true, TapiStringConstants.OTSI_MC));
1463 usedFreqMap = tapiFactory.getTTP11UsedFreqMap(
1464 getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
1465 availableFreqMap = tapiFactory.getTTP11AvailableFreqMap(
1466 getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
1471 LOG.debug("calling add Photonic NEP spec for Roadm");
1472 onepBd = tapiFactory.addPhotSpecToRoadmOnep(nodeId, usedFreqMap, availableFreqMap, onepBd,
1473 nepPhotonicSublayer);
1475 AdminStates admin = entry.getValue().getAdministrativeState();
1476 State oper = entry.getValue().getOperationalState();
1477 Name nepName = new NameBuilder()
1478 .setValueName(nepPhotonicSublayer + "NodeEdgePoint")
1479 .setValue(String.join("+", nodeId, nepPhotonicSublayer,
1482 OwnedNodeEdgePoint onep = onepBd
1483 .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
1484 nepPhotonicSublayer, entry.getKey()))
1485 .getBytes(Charset.forName("UTF-8"))).toString()))
1486 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
1487 .setName(Map.of(nepName.key(), nepName))
1488 .setSupportedCepLayerProtocolQualifierInstances(sclpqiList)
1489 .setDirection(Direction.BIDIRECTIONAL)
1490 .setLinkPortRole(PortRole.SYMMETRIC)
1491 .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
1492 .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
1493 .setLifecycleState(LifecycleState.INSTALLED)
1495 LOG.debug("ROADMNEPPopulation TapiNetworkModelServiceImpl populate NEP {} for Node {}",
1496 onep.getName().entrySet(), nodeId);
1497 onepMap.put(onep.key(), onep);
1499 LOG.debug("ROADMNEPPopulation FINISH for Node {}", nodeId);
1504 * Get a network termination point for nodeId and tpId.
1505 * @param nodeId String
1506 * @param tpId String
1507 * @return network termination point, null otherwise
1509 private TerminationPoint getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
1510 InstanceIdentifier<TerminationPoint> tpIID = InstanceIdentifier.builder(Networks.class)
1511 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
1513 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1514 .networks.network.Node.class,
1515 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1516 .networks.network.NodeKey(new NodeId(nodeId)))
1517 .augmentation(Node1.class)
1519 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1520 .networks.network.node.TerminationPoint.class,
1521 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1522 .networks.network.node.TerminationPointKey(new TpId(tpId)))
1525 Optional<TerminationPoint> tpOptional =
1526 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
1527 if (tpOptional.isEmpty()) {
1528 LOG.error("readMdSal: Error reading tp {} , empty list",tpIID);
1531 LOG.debug("SUCCES getting LCP TP for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl",
1533 LOG.debug(" The Tp in Datastore is as follows {}", tpOptional);
1534 return tpOptional.orElseThrow();
1535 } catch (ExecutionException | InterruptedException e) {
1536 LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
1537 tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
1543 * Get a network termination point with Common TerminationPoint1 augmentation for nodeId and tpId.
1544 * @param nodeId String
1545 * @param tpId String
1546 * @return network termination point, null otherwise
1548 private TerminationPoint1 getNetworkTerminationPoint1FromDatastore(String nodeId, String tpId) {
1549 InstanceIdentifier<TerminationPoint1> tpIID = InstanceIdentifier.builder(Networks.class)
1550 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
1552 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1553 .networks.network.Node.class,
1554 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1555 .networks.network.NodeKey(new NodeId(nodeId)))
1556 .augmentation(Node1.class)
1558 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1559 .networks.network.node.TerminationPoint.class,
1560 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1561 .networks.network.node.TerminationPointKey(new TpId(tpId)))
1562 .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
1563 .TerminationPoint1.class)
1566 Optional<TerminationPoint1> tpOptional =
1567 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
1568 if (tpOptional.isEmpty()) {
1569 LOG.error("readMdSal: Error reading tp {} , empty list",tpIID);
1572 LOG.debug("SUCCES getting LCP TP1 for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl",
1574 LOG.debug(" The Tp in Datastore is as follows {}", tpOptional);
1575 return tpOptional.orElseThrow();
1576 } catch (ExecutionException | InterruptedException e) {
1577 LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
1578 tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
1583 private org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1
1584 getNetworkTerminationPoint11FromDatastore(String nodeId, String tpId) {
1585 InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1>
1586 tpIID = InstanceIdentifier.builder(Networks.class)
1587 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
1589 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1590 .networks.network.Node.class,
1591 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
1592 .networks.network.NodeKey(new NodeId(nodeId)))
1593 .augmentation(Node1.class)
1595 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1596 .networks.network.node.TerminationPoint.class,
1597 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
1598 .networks.network.node.TerminationPointKey(new TpId(tpId)))
1599 .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1
1603 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1>
1604 tpOptional = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
1605 if (tpOptional.isEmpty()) {
1606 LOG.error("readMdSal: Error reading tp {} , empty list",tpIID);
1609 LOG.debug("SUCCESS getting LCP TP11 for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl"
1610 + " The Tp in Datastore is as follows {}",
1611 nodeId, tpId, tpOptional.toString());
1612 return tpOptional.orElseThrow();
1613 } catch (ExecutionException | InterruptedException e) {
1614 LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
1615 tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);