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.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collection;
14 import java.util.Comparator;
15 import java.util.HashMap;
16 import java.util.List;
18 import java.util.Optional;
19 import java.util.UUID;
20 import java.util.concurrent.ExecutionException;
21 import java.util.stream.Collectors;
22 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
23 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
24 import org.opendaylight.transportpce.tapi.R2RTapiLinkDiscovery;
25 import org.opendaylight.transportpce.tapi.TapiStringConstants;
26 import org.opendaylight.transportpce.tapi.utils.TapiLink;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.NodeTypes;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GE;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GE;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GE;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ContextBuilder;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointBuilder;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointKey;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPEGigE;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU0;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
92 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
93 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1;
94 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
95 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
96 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
97 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
98 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
99 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey;
100 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
101 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
102 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
103 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
104 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
105 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
106 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint;
107 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointBuilder;
108 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey;
109 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
110 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
111 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey;
112 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristic;
113 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristicBuilder;
114 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
115 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
116 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node;
117 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
118 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
119 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
120 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyBuilder;
121 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
122 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristic;
123 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristicBuilder;
124 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristic;
125 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristicBuilder;
126 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
127 import org.opendaylight.yangtools.yang.common.Uint16;
128 import org.opendaylight.yangtools.yang.common.Uint32;
129 import org.slf4j.Logger;
130 import org.slf4j.LoggerFactory;
132 public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
134 private static final Logger LOG = LoggerFactory.getLogger(TapiNetworkModelServiceImpl.class);
135 private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
136 .getBytes(Charset.forName("UTF-8"))).toString());
137 private final NetworkTransactionService networkTransactionService;
138 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap;
139 private final R2RTapiLinkDiscovery linkDiscovery;
140 private final TapiLink tapiLink;
142 public TapiNetworkModelServiceImpl(final R2RTapiLinkDiscovery linkDiscovery,
143 NetworkTransactionService networkTransactionService, TapiLink tapiLink) {
144 this.networkTransactionService = networkTransactionService;
145 this.sipMap = new HashMap<>();
146 this.linkDiscovery = linkDiscovery;
147 this.tapiLink = tapiLink;
151 public void createTapiNode(String orNodeId, int orNodeVersion, Nodes node) {
152 // TODO -> Implementation with PortMappingListener
153 // check if port mapping exists or not...
154 if (node.getMapping() == null) {
155 LOG.warn("Could not generate port mapping for {} skipping network model creation", orNodeId);
159 LOG.info("Mapping of node {}: {}", orNodeId, node.getMapping().values());
161 // check type of device, check version and create node mapping
162 if (NodeTypes.Rdm.getIntValue() == node.getNodeInfo().getNodeType().getIntValue()) {
164 // transform flat mapping list to per degree and per srg mapping lists
165 Map<String, List<Mapping>> mapDeg = new HashMap<>();
166 Map<String, List<Mapping>> mapSrg = new HashMap<>();
167 List<Mapping> mappingList = new ArrayList<>(node.nonnullMapping().values());
168 mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint));
170 List<String> nodeShardList = getRoadmNodelist(mappingList);
172 // populate degree and srg LCP map
173 for (String str : nodeShardList) {
174 List<Mapping> interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint().contains(str))
175 .collect(Collectors.toList());
176 if (str.contains("DEG")) {
177 mapDeg.put(str, interList);
178 } else if (str.contains("SRG")) {
179 mapSrg.put(str, interList);
181 LOG.error("unknown element");
184 // Transform LCPs into ONEP
185 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap =
186 new HashMap<>(transformDegToOnep(orNodeId, mapDeg));
187 onepMap.putAll(transformSrgToOnep(orNodeId, mapSrg));
190 Node roadmNode = createRoadmTapiNode(orNodeId, onepMap);
191 mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
192 mergeSipsinContext(this.sipMap);
193 // TODO add states corresponding to device config -> based on mapping.
194 // This should be possible after Gilles work is merged
196 // rdm to rdm link creation if neighbour roadm is mounted
197 LOG.info("checking if neighbor roadm exists");
198 Map<LinkKey, Link> rdm2rdmLinks = this.linkDiscovery.readLLDP(new NodeId(orNodeId), orNodeVersion,
200 if (!rdm2rdmLinks.isEmpty()) {
201 mergeLinkinTopology(rdm2rdmLinks);
203 LOG.info("TAPI node for or node {} successfully merged", orNodeId);
204 } else if (NodeTypes.Xpdr.getIntValue() == node.getNodeInfo().getNodeType().getIntValue()) {
205 List<Mapping> networkMappings = node.nonnullMapping().values()
206 .stream().filter(k -> k.getLogicalConnectionPoint()
207 .contains("NETWORK")).collect(Collectors.toList());
208 Map<Integer, String> xpdrMap = new HashMap<>();
209 for (Mapping mapping : networkMappings) {
210 Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
211 String nodeId = node.getNodeId() + TapiStringConstants.XPDR + xpdrNb;
212 if (!xpdrMap.containsKey(xpdrNb)) {
213 List<Mapping> xpdrNetMaps = node.nonnullMapping().values()
214 .stream().filter(k -> k.getLogicalConnectionPoint()
215 .contains("XPDR" + xpdrNb + TapiStringConstants.NETWORK)).collect(Collectors.toList());
216 List<Mapping> xpdrClMaps = node.nonnullMapping().values()
217 .stream().filter(k -> k.getLogicalConnectionPoint()
218 .contains("XPDR" + xpdrNb + TapiStringConstants.CLIENT)).collect(Collectors.toList());
219 xpdrMap.put(xpdrNb, node.getNodeId());
221 // create switching pool
222 OduSwitchingPools oorOduSwitchingPool = createSwitchPoolForXpdr(
223 mapping.getXponderType().getIntValue(), xpdrClMaps, xpdrNetMaps, xpdrNb);
225 // node transformation
226 Map<NodeKey, Node> nodeMap = new HashMap<>(transformXpdrToTapiNode(
227 nodeId, xpdrClMaps, xpdrNetMaps, mapping.getXponderType(), oorOduSwitchingPool));
228 // add nodes and sips to tapi context
229 mergeNodeinTopology(nodeMap);
230 mergeSipsinContext(this.sipMap);
233 LOG.info("TAPI node for or node {} successfully merged", orNodeId);
235 // Device not managed yet
238 private Map<NodeKey, Node> transformXpdrToTapiNode(String nodeId, List<Mapping> xpdrClMaps,
239 List<Mapping> xpdrNetMaps, XpdrNodeTypes xponderType,
240 OduSwitchingPools oorOduSwitchingPool) {
241 Map<NodeKey, Node> nodeMap = new HashMap<>();
242 LOG.info("creation of a DSR/ODU node for {}", nodeId);
243 Uuid nodeUuidDsr = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.DSR))
244 .getBytes(Charset.forName("UTF-8"))).toString());
245 Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(
246 String.join("+", nodeId, TapiStringConstants.DSR)).build();
247 Name nameNodeType = new NameBuilder().setValueName("Node Type")
248 .setValue(getNodeType(xponderType)).build();
249 List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR,
250 LayerProtocolName.ODU);
251 Node dsrNode = createTapiXpdrNode(Map.of(nameDsr.key(), nameDsr, nameNodeType.key(), nameNodeType),
252 dsrLayerProtocols, nodeId, nodeUuidDsr, xpdrClMaps, xpdrNetMaps, xponderType, oorOduSwitchingPool);
254 nodeMap.put(dsrNode.key(), dsrNode);
256 // node creation [otsi]
257 LOG.info("creation of an OTSi node for {}", nodeId);
258 Uuid nodeUuidOtsi = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.OTSI))
259 .getBytes(Charset.forName("UTF-8"))).toString());
260 Name nameOtsi = new NameBuilder().setValueName("otsi node name").setValue(
261 String.join("+", nodeId, TapiStringConstants.OTSI)).build();
262 List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
263 Node otsiNode = createTapiXpdrNode(Map.of(nameOtsi.key(), nameOtsi, nameNodeType.key(), nameNodeType),
264 otsiLayerProtocols, nodeId, nodeUuidOtsi, xpdrClMaps, xpdrNetMaps, xponderType, null);
266 nodeMap.put(otsiNode.key(), otsiNode);
268 // transitional link cration between network nep of DSR/ODU node and iNep of otsi node
269 LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
270 Map<LinkKey, Link> linkMap = createTapiTransitionalLinks(nodeId, xpdrNetMaps, nodeUuidDsr,
272 mergeLinkinTopology(linkMap);
277 private OduSwitchingPools createSwitchPoolForXpdr(int xpdrType, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
279 // todo: are switching pool correct here??
283 return createTpdrSwitchPool(xpdrNetMaps);
286 return createMuxSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
289 return createSwtchSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
291 LOG.warn("Xpdr type {} not supported", xpdrType);
296 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformSrgToOnep(String orNodeId,
297 Map<String, List<Mapping>> mapSrg) {
298 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
299 for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
300 // For each srg node. Loop through the LCPs and create neps and sips for PP
301 for (Mapping m:entry.getValue()) {
302 if (!m.getLogicalConnectionPoint().contains("PP")) {
303 LOG.info("LCP {} is not an external TP of SRG node", m.getLogicalConnectionPoint());
306 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> srgNeps =
307 createRoadmNeps(orNodeId, m.getLogicalConnectionPoint(), true,
308 transformOperState(m.getPortOperState()), transformAdminState(m.getPortAdminState()));
309 onepMap.putAll(srgNeps);
315 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformDegToOnep(String orNodeId,
316 Map<String, List<Mapping>> mapDeg) {
317 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
318 for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
319 // For each degree node. Loop through the LCPs and create neps and sips for TTP
320 for (Mapping m:entry.getValue()) {
321 if (!m.getLogicalConnectionPoint().contains("TTP")) {
322 LOG.info("LCP {} is not an external TP of DEGREE node", m.getLogicalConnectionPoint());
325 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> degNeps =
326 createRoadmNeps(orNodeId, m.getLogicalConnectionPoint(), false,
327 transformOperState(m.getPortOperState()), transformAdminState(m.getPortAdminState()));
328 onepMap.putAll(degNeps);
334 private List<String> getRoadmNodelist(List<Mapping> mappingList) {
335 List<String> nodeShardList = new ArrayList<>();
336 for (Mapping mapping : mappingList) {
337 // TODO -> maybe we need to check the id based on the version
338 String str = mapping.getLogicalConnectionPoint().split("-")[0];
339 LOG.info("LCP = {}", str);
340 if (!nodeShardList.contains(str)) {
341 nodeShardList.add(str);
344 return nodeShardList;
348 public void deleteTapinode(String nodeId) {
349 // TODO: check for null objects
350 // Check if it is ROADM or XPDR --> create the uuids of the node and delete from topology the node.
351 // This will delete NEPs. Then check for links that have this node and delete them.
352 // Then check SIPs and delete them. Then services and connections with SIPs and put them to another state.
353 LOG.info("Deleting node {} from TAPI topology", nodeId);
354 InstanceIdentifier<Topology> topologyIID = InstanceIdentifier.builder(Context.class)
355 .augmentation(Context1.class).child(TopologyContext.class).child(Topology.class,
356 new TopologyKey(tapiTopoUuid)).build();
357 Topology topology = null;
359 Optional<Topology> optTopology =
360 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, topologyIID).get();
361 if (!optTopology.isPresent()) {
362 LOG.error("No topology object present. Error deleting node {}", nodeId);
365 topology = optTopology.get();
366 } catch (InterruptedException | ExecutionException e) {
367 LOG.error("Couldnt read tapi topology from datastore", e);
369 if (topology == null) {
370 LOG.error("Topology is null, nothing to delete");
373 if (topology.getNode() == null) {
374 LOG.error("No nodes in topology");
377 if (nodeId.contains("ROADM")) {
378 // Node is in photonic media layer and UUID can be built from nodeId + PHTN_MEDIA
379 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
380 TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
381 deleteNodeFromTopo(nodeUuid);
383 if (nodeId.contains("XPDR") || nodeId.contains("SPDR") || nodeId.contains("MXPDR")) {
384 // Node is either XPDR, MXPDR or SPDR. Retrieve nodes from topology and check names
385 for (Node tapiNode:topology.getNode().values()) {
386 if (tapiNode.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
387 // Found node we need to delete
388 deleteNodeFromTopo(tapiNode.getUuid());
392 // Delete links of topology
393 Map<LinkKey, Link> linkMap = topology.getLink();
394 if (linkMap != null) {
395 for (Link link:linkMap.values()) {
396 if (link.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
397 deleteLinkFromTopo(link.getUuid());
401 // Delete sips of sip map
402 InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
403 Context context = null;
405 Optional<Context> optContext = this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL,
407 if (!optContext.isPresent()) {
408 LOG.error("No context object present in datastore.");
411 context = optContext.get();
412 } catch (InterruptedException | ExecutionException e) {
413 LOG.error("Couldnt read tapi context from datastore", e);
415 if (context == null) {
416 LOG.error("Context is null, nothing to delete");
419 Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips = context.getServiceInterfacePoint();
421 for (ServiceInterfacePoint sip:sips.values()) {
422 if (sip.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
423 // Update state of services that have this sip as an endpoint and also connections
424 updateConnectivityServicesState(sip.getUuid(), nodeId);
425 deleteSipFromTopo(sip.getUuid());
431 private Node createTapiXpdrNode(Map<NameKey, Name> nameMap, List<LayerProtocolName> layerProtocols,
432 String nodeId, Uuid nodeUuid, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
433 XpdrNodeTypes xponderType, OduSwitchingPools oorOduSwitchingPool) {
434 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
435 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
436 Map<RuleKey, Rule> ruleList = new HashMap<>();
437 Rule rule = new RuleBuilder()
438 .setLocalId("forward")
439 .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
440 .setRuleType(RuleType.FORWARDING)
442 ruleList.put(rule.key(), rule);
443 if (layerProtocols.contains(LayerProtocolName.DSR)) {
444 // neps for dsr/odu layer
445 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> dsroduNeps =
446 createXpdrDsrOduNeps(nodeId, xpdrClMaps, xpdrNetMaps, xponderType);
447 onepl.putAll(dsroduNeps);
448 nodeRuleGroupList = createNodeRuleGroupForDsrNode(nodeId, oorOduSwitchingPool, ruleList, onepl);
449 } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
450 // neps for photonic layer
451 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> phtmdNeps =
452 createXpdrPhtnMdNeps(nodeId, xpdrNetMaps);
453 onepl.putAll(phtmdNeps);
454 nodeRuleGroupList = createNodeRuleGroupForOtsiNode(nodeId, xpdrNetMaps, ruleList);
456 LOG.error("Undefined LayerProtocolName for {} node {}", nameMap.get(nameMap.keySet().iterator().next())
457 .getValueName(), nameMap.get(nameMap.keySet().iterator().next()).getValue());
459 // Empty random creation of mandatory fields for avoiding errors....
460 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
461 .setCostAlgorithm("Restricted Shortest Path - RSP")
462 .setCostName("HOP_COUNT")
463 .setCostValue("12345678")
465 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
466 .setFixedLatencyCharacteristic("12345678")
467 .setQueingLatencyCharacteristic("12345678")
468 .setJitterCharacteristic("12345678")
469 .setWanderCharacteristic("12345678")
470 .setTrafficPropertyName("FIXED_LATENCY")
472 return new NodeBuilder()
475 .setLayerProtocolName(layerProtocols)
476 .setAdministrativeState(AdministrativeState.UNLOCKED)
477 .setOperationalState(OperationalState.ENABLED)
478 .setLifecycleState(LifecycleState.INSTALLED)
479 .setOwnedNodeEdgePoint(onepl)
480 .setNodeRuleGroup(nodeRuleGroupList)
481 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
482 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
483 .setErrorCharacteristic("error")
484 .setLossCharacteristic("loss")
485 .setRepeatDeliveryCharacteristic("repeat delivery")
486 .setDeliveryOrderCharacteristic("delivery order")
487 .setUnavailableTimeCharacteristic("unavailable time")
488 .setServerIntegrityProcessCharacteristic("server integrity process")
492 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrPhtnMdNeps(String nodeId,
493 List<Mapping> xpdrNetMaps) {
494 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
496 // iNep creation on otsi node
497 for (int i = 0; i < xpdrNetMaps.size(); i++) {
498 Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
499 (String.join("+", nodeId, TapiStringConstants.I_OTSI,
500 xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
501 Name onedName = new NameBuilder()
502 .setValueName("iNodeEdgePoint")
503 .setValue(String.join("+", nodeId, TapiStringConstants.I_OTSI,
504 xpdrNetMaps.get(i).getLogicalConnectionPoint()))
507 ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
509 OwnedNodeEdgePoint onep = createNep(nepUuid1, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
510 Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
511 true, String.join("+", nodeId, TapiStringConstants.I_OTSI), newSupIfCapList,
512 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
513 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
514 onepl.put(onep.key(), onep);
516 // eNep creation on otsi node
517 for (int i = 0; i < xpdrNetMaps.size(); i++) {
518 Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
519 (String.join("+", nodeId, TapiStringConstants.E_OTSI,
520 xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
521 Name onedName = new NameBuilder()
522 .setValueName("eNodeEdgePoint")
523 .setValue(String.join("+", nodeId, TapiStringConstants.E_OTSI,
524 xpdrNetMaps.get(i).getLogicalConnectionPoint()))
527 ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
529 OwnedNodeEdgePoint onep = createNep(nepUuid2, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
530 Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
531 false, String.join("+", nodeId, TapiStringConstants.E_OTSI), newSupIfCapList,
532 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
533 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
534 onepl.put(onep.key(), onep);
536 // Photonic Media Nep creation on otsi node
537 for (int i = 0; i < xpdrNetMaps.size(); i++) {
538 Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(
539 (String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA,
540 xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
541 Name onedName = new NameBuilder()
542 .setValueName("PhotMedNodeEdgePoint")
543 .setValue(String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA,
544 xpdrNetMaps.get(i).getLogicalConnectionPoint()))
547 ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
549 OwnedNodeEdgePoint onep = createNep(nepUuid3, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
550 Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
551 false, String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA), newSupIfCapList,
552 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
553 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
554 onepl.put(onep.key(), onep);
559 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrDsrOduNeps(String nodeId, List<Mapping> xpdrClMaps,
560 List<Mapping> xpdrNetMaps,
561 XpdrNodeTypes xponderType) {
562 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
563 // client nep creation on DSR node
564 for (int i = 0; i < xpdrClMaps.size(); i++) {
565 LOG.info("Client NEP = {}", String.join("+", nodeId, TapiStringConstants.DSR,
566 xpdrClMaps.get(i).getLogicalConnectionPoint()));
567 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
568 (String.join("+", nodeId, TapiStringConstants.DSR,
569 xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
570 NameBuilder nameBldr = new NameBuilder().setValue(String.join("+", nodeId,
571 TapiStringConstants.DSR, xpdrClMaps.get(i).getLogicalConnectionPoint()));
573 if (OpenroadmNodeType.TPDR.getName().equalsIgnoreCase(xponderType.getName())) {
574 name = nameBldr.setValueName("100G-tpdr").build();
576 name = nameBldr.setValueName("NodeEdgePoint_C").build();
579 ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrClMaps, i);
581 OwnedNodeEdgePoint onep = createNep(nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
582 Map.of(name.key(), name), LayerProtocolName.DSR, LayerProtocolName.DSR, true,
583 String.join("+", nodeId, TapiStringConstants.DSR), newSupIfCapList,
584 transformOperState(xpdrClMaps.get(i).getPortOperState()),
585 transformAdminState(xpdrClMaps.get(i).getPortAdminState()));
586 onepl.put(onep.key(), onep);
588 // network nep creation on I_ODU node
589 for (int i = 0; i < xpdrNetMaps.size(); i++) {
590 LOG.info("iODU NEP = {}", String.join("+", nodeId, TapiStringConstants.I_ODU,
591 xpdrNetMaps.get(i).getLogicalConnectionPoint()));
592 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
593 (String.join("+", nodeId, TapiStringConstants.I_ODU,
594 xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
595 Name onedName = new NameBuilder()
596 .setValueName("iNodeEdgePoint_N")
597 .setValue(String.join("+", nodeId, TapiStringConstants.I_ODU,
598 xpdrNetMaps.get(i).getLogicalConnectionPoint()))
601 ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
603 OwnedNodeEdgePoint onep = createNep(nepUuid, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
604 Map.of(onedName.key(), onedName),
605 LayerProtocolName.ODU, LayerProtocolName.DSR, true,
606 String.join("+", nodeId, TapiStringConstants.I_ODU), newSupIfCapList,
607 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
608 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
609 onepl.put(onep.key(), onep);
611 // network nep creation on E_ODU node
612 for (int i = 0; i < xpdrClMaps.size(); i++) {
613 LOG.info("eODU NEP = {}", String.join("+", nodeId, TapiStringConstants.E_ODU,
614 xpdrClMaps.get(i).getLogicalConnectionPoint()));
615 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
616 (String.join("+", nodeId, TapiStringConstants.E_ODU,
617 xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
618 Name onedName = new NameBuilder()
619 .setValueName("eNodeEdgePoint_N")
620 .setValue(String.join("+", nodeId, TapiStringConstants.E_ODU,
621 xpdrClMaps.get(i).getLogicalConnectionPoint()))
624 ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrClMaps, i);
626 OwnedNodeEdgePoint onep = createNep(nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
627 Map.of(onedName.key(), onedName),
628 LayerProtocolName.ODU, LayerProtocolName.DSR, false,
629 String.join("+", nodeId, TapiStringConstants.E_ODU), newSupIfCapList,
630 transformOperState(xpdrClMaps.get(i).getPortOperState()),
631 transformAdminState(xpdrClMaps.get(i).getPortAdminState()));
632 onepl.put(onep.key(), onep);
637 private OperationalState transformOperState(String operString) {
638 State operState = org.opendaylight.transportpce.networkmodel.util.TopologyUtils.setNetworkOperState(operString);
639 return operState.equals(State.InService) ? OperationalState.ENABLED : OperationalState.DISABLED;
642 private AdministrativeState transformAdminState(String adminString) {
643 AdminStates adminState = org.opendaylight.transportpce.networkmodel.util.TopologyUtils
644 .setNetworkAdminState(adminString);
645 return adminState.equals(AdminStates.InService) ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
648 private OwnedNodeEdgePoint createNep(Uuid nepUuid, String tpid, Map<NameKey, Name> nepNames,
649 LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip,
651 List<Class<? extends SupportedIfCapability>> supportedInterfaceCapability,
652 OperationalState operState, AdministrativeState adminState) {
653 OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
655 .setLayerProtocolName(nepProtocol)
658 onepBldr.setMappedServiceInterfacePoint(createMSIP(1, nepProtocol, tpid, keyword,
659 supportedInterfaceCapability, operState, adminState));
661 LOG.debug("Node layer {}", nodeProtocol.getName());
662 onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedLayerProtocolQualifier(
663 supportedInterfaceCapability, nepProtocol));
664 onepBldr.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
665 .setAdministrativeState(adminState).setOperationalState(operState)
666 .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
667 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
668 return onepBldr.build();
671 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createRoadmNeps(String orNodeId, String tpId,
672 boolean withSip, OperationalState operState,
673 AdministrativeState adminState) {
674 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
675 // PHOTONIC MEDIA nep
676 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
677 TapiStringConstants.PHTNC_MEDIA, tpId)).getBytes(Charset.forName("UTF-8"))).toString());
678 Name nepName = new NameBuilder()
679 .setValueName(TapiStringConstants.PHTNC_MEDIA + "NodeEdgePoint")
680 .setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA, tpId))
682 OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
684 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
685 .setName(Map.of(nepName.key(), nepName))
686 .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
687 .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
688 .setAdministrativeState(adminState).setOperationalState(operState)
689 .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
690 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
692 onepMap.put(onep.key(), onep);
695 Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
696 TapiStringConstants.MC, tpId)).getBytes(Charset.forName("UTF-8"))).toString());
697 Name nepName1 = new NameBuilder()
698 .setValueName(TapiStringConstants.MC + "NodeEdgePoint")
699 .setValue(String.join("+", orNodeId, TapiStringConstants.MC, tpId))
701 OwnedNodeEdgePointBuilder onepBldr1 = new OwnedNodeEdgePointBuilder()
703 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
704 .setName(Map.of(nepName1.key(), nepName1))
705 .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
706 .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
707 .setAdministrativeState(adminState).setOperationalState(operState)
708 .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
709 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
711 onepBldr1.setMappedServiceInterfacePoint(createMSIP(1, LayerProtocolName.PHOTONICMEDIA,
712 tpId, String.join("+", orNodeId, TapiStringConstants.MC), null,
713 operState, adminState));
715 OwnedNodeEdgePoint onep1 = onepBldr1.build();
716 onepMap.put(onep1.key(), onep1);
719 Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId, TapiStringConstants.OTSI_MC,
720 tpId)).getBytes(Charset.forName("UTF-8"))).toString());
721 Name nepName2 = new NameBuilder()
722 .setValueName(TapiStringConstants.OTSI_MC + "NodeEdgePoint")
723 .setValue(String.join("+", orNodeId, TapiStringConstants.OTSI_MC, tpId))
726 OwnedNodeEdgePoint onep2 = new OwnedNodeEdgePointBuilder()
728 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
729 .setName(Map.of(nepName2.key(), nepName2))
730 .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
731 .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
732 .setAdministrativeState(adminState).setOperationalState(operState)
733 .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
734 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
736 onepMap.put(onep2.key(), onep2);
740 private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint>
741 createMSIP(int nb, LayerProtocolName layerProtocol, String tpid, String nodeid,
742 List<Class<? extends SupportedIfCapability>> supportedInterfaceCapability,
743 OperationalState operState, AdministrativeState adminState) {
744 Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
745 for (int i = 0; i < nb; i++) {
746 Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeid,
747 tpid)).getBytes(Charset.forName("UTF-8"))).toString());
748 MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
749 .setServiceInterfacePointUuid(sipUuid).build();
750 ServiceInterfacePoint sip = createSIP(sipUuid, layerProtocol, tpid, nodeid, supportedInterfaceCapability,
751 operState, adminState);
752 this.sipMap.put(sip.key(), sip);
753 LOG.info("SIP created {}", sip.getUuid());
754 // this.tapiSips.put(sip.key(), sip);
755 msipl.put(msip.key(), msip);
760 private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, String tpid, String nodeid,
761 List<Class<? extends SupportedIfCapability>> supportedInterfaceCapability,
762 OperationalState operState, AdministrativeState adminState) {
763 // TODO: what value should be set in total capacity and available capacity
764 LOG.info("SIP name = {}", String.join("+", nodeid, tpid));
765 Name sipName = new NameBuilder()
766 .setValueName("SIP name")
767 .setValue(String.join("+", nodeid, tpid))
769 return new ServiceInterfacePointBuilder()
771 .setName(Map.of(sipName.key(), sipName))
772 .setLayerProtocolName(layerProtocol)
773 .setAdministrativeState(adminState)
774 .setOperationalState(operState)
775 .setLifecycleState(LifecycleState.INSTALLED)
776 .setAvailableCapacity(new AvailableCapacityBuilder().build())
777 .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
778 .setSupportedLayerProtocolQualifier(createSupportedLayerProtocolQualifier(supportedInterfaceCapability,
783 private Node createRoadmTapiNode(String orNodeId, Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist) {
785 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
786 TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
788 Name nodeNames = new NameBuilder().setValueName("roadm node name")
789 .setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA)).build();
790 Name nameNodeType = new NameBuilder().setValueName("Node Type")
791 .setValue(OpenroadmNodeType.ROADM.getName()).build();
793 List<LayerProtocolName> layerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
794 // Empty random creation of mandatory fields for avoiding errors....
795 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
796 .setCostAlgorithm("Restricted Shortest Path - RSP")
797 .setCostName("HOP_COUNT")
798 .setCostValue("12345678")
800 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
801 .setFixedLatencyCharacteristic("12345678")
802 .setQueingLatencyCharacteristic("12345678")
803 .setJitterCharacteristic("12345678")
804 .setWanderCharacteristic("12345678")
805 .setTrafficPropertyName("FIXED_LATENCY")
807 return new NodeBuilder()
809 .setName(Map.of(nodeNames.key(), nodeNames, nameNodeType.key(), nameNodeType))
810 .setLayerProtocolName(layerProtocols)
811 .setAdministrativeState(AdministrativeState.UNLOCKED)
812 .setOperationalState(OperationalState.ENABLED)
813 .setLifecycleState(LifecycleState.INSTALLED)
814 .setOwnedNodeEdgePoint(oneplist)
815 .setNodeRuleGroup(createNodeRuleGroupForRdmNode(orNodeId, nodeUuid, oneplist.values()))
816 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
817 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
818 .setErrorCharacteristic("error")
819 .setLossCharacteristic("loss")
820 .setRepeatDeliveryCharacteristic("repeat delivery")
821 .setDeliveryOrderCharacteristic("delivery order")
822 .setUnavailableTimeCharacteristic("unavailable time")
823 .setServerIntegrityProcessCharacteristic("server integrity process")
827 private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(String orNodeId, Uuid nodeUuid,
828 Collection<OwnedNodeEdgePoint> onepl) {
829 Map<NodeEdgePointKey, NodeEdgePoint>
830 nepMap = new HashMap<>();
831 for (OwnedNodeEdgePoint onep : onepl) {
832 NodeEdgePoint nep = new NodeEdgePointBuilder()
833 .setTopologyUuid(this.tapiTopoUuid)
834 .setNodeUuid(nodeUuid)
835 .setNodeEdgePointUuid(onep.key().getUuid())
837 nepMap.put(nep.key(), nep);
839 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
840 Map<RuleKey, Rule> ruleList = new HashMap<>();
841 Rule rule = new RuleBuilder()
842 .setLocalId("forward")
843 .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
844 .setRuleType(RuleType.FORWARDING)
846 ruleList.put(rule.key(), rule);
847 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
848 .setUuid(new Uuid(UUID.nameUUIDFromBytes((orNodeId + " node rule group")
849 .getBytes(Charset.forName("UTF-8"))).toString()))
851 .setNodeEdgePoint(nepMap)
853 nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
854 return nodeRuleGroupMap;
857 private Map<LinkKey, Link> createTapiTransitionalLinks(String nodeId, List<Mapping> xpdrNetMaps, Uuid nodeUuidDsr,
859 Map<LinkKey, Link> linkMap = new HashMap<>();
860 for (Mapping mapping : xpdrNetMaps) {
861 Link transiLink = tapiLink.createTapiLink(nodeId, mapping.getLogicalConnectionPoint(), nodeId,
862 mapping.getLogicalConnectionPoint(), TapiStringConstants.TRANSITIONAL_LINK, TapiStringConstants.DSR,
863 TapiStringConstants.OTSI, TapiStringConstants.I_ODU, TapiStringConstants.I_OTSI,
864 "inService", "inService", Arrays.asList(LayerProtocolName.ODU,
865 LayerProtocolName.PHOTONICMEDIA),
866 Arrays.asList(LayerProtocolName.ODU.getName(), LayerProtocolName.PHOTONICMEDIA.getName()),
868 linkMap.put(transiLink.key(), transiLink);
870 // return a map of links and then we can do merge the corresponding link map into the topology context
874 private OduSwitchingPools createTpdrSwitchPool(List<Mapping> xpdrNetMaps) {
875 Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
877 for (int i = 1; i <= xpdrNetMaps.size(); i++) {
878 LOG.info("XPDr net LCP = {}", xpdrNetMaps.get(i - 1).getLogicalConnectionPoint());
879 LOG.info("XPDr net associated LCP = {}", xpdrNetMaps.get(i - 1).getConnectionMapLcp());
880 TpId tpid1 = new TpId(xpdrNetMaps.get(i - 1).getLogicalConnectionPoint());
881 TpId tpid2 = new TpId(xpdrNetMaps.get(i - 1).getConnectionMapLcp());
882 List<TpId> tpList = new ArrayList<>();
885 NonBlockingList nbl = new NonBlockingListBuilder()
886 .setNblNumber(Uint16.valueOf(count))
889 nblMap.put(nbl.key(), nbl);
892 return new OduSwitchingPoolsBuilder()
893 .setNonBlockingList(nblMap)
894 .setSwitchingPoolNumber(Uint16.valueOf(1))
898 private OduSwitchingPools createSwtchSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
900 List<TpId> tpl = new ArrayList<>();
902 for (int i = 1; i <= xpdrClMaps.size(); i++) {
903 tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i);
906 for (int i = 1; i <= xpdrNetMaps.size(); i++) {
907 tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.NETWORK + i);
910 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
911 NonBlockingList nbl = new NonBlockingListBuilder()
912 .setNblNumber(Uint16.valueOf(1))
915 nbMap.put(nbl.key(),nbl);
917 return new OduSwitchingPoolsBuilder()
918 .setSwitchingPoolNumber(Uint16.valueOf(1))
919 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
920 .setNonBlockingList(nbMap)
924 private OduSwitchingPools createMuxSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps, Integer xpdrNb) {
925 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
926 for (int i = 1; i <= xpdrClMaps.size(); i++) {
927 List<TpId> tpList = new ArrayList<>();
928 TpId tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i);
930 tpId = new TpId("XPDR" + xpdrNb + "-NETWORK1");
932 NonBlockingList nbl = new NonBlockingListBuilder()
933 .setNblNumber(Uint16.valueOf(i))
935 .setAvailableInterconnectBandwidth(Uint32.valueOf(xpdrNetMaps.size() * 10L))
936 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
938 nbMap.put(nbl.key(),nbl);
940 return new OduSwitchingPoolsBuilder()
941 .setSwitchingPoolNumber(Uint16.valueOf(1))
942 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
943 .setNonBlockingList(nbMap)
947 private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForOtsiNode(String nodeId,
948 List<Mapping> xpdrNetMaps,
949 Map<RuleKey, Rule> ruleList) {
950 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
951 // create NodeRuleGroup
953 for (Mapping tpMapping : xpdrNetMaps) {
954 Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
955 NodeEdgePoint inep = new NodeEdgePointBuilder()
956 .setTopologyUuid(this.tapiTopoUuid)
957 .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
958 TapiStringConstants.OTSI)).getBytes(Charset.forName("UTF-8"))).toString()))
959 .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
960 TapiStringConstants.I_OTSI, tpMapping.getLogicalConnectionPoint()))
961 .getBytes(Charset.forName("UTF-8"))).toString()))
963 NodeEdgePoint enep = new NodeEdgePointBuilder()
964 .setTopologyUuid(this.tapiTopoUuid)
965 .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
966 TapiStringConstants.OTSI)).getBytes(Charset.forName("UTF-8"))).toString()))
967 .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes(
968 (String.join("+", nodeId, TapiStringConstants.E_OTSI,
969 tpMapping.getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString()))
971 nepList.put(inep.key(), inep);
972 nepList.put(enep.key(), enep);
973 // Empty random creation of mandatory fields for avoiding errors....
974 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
975 .setCostAlgorithm("Restricted Shortest Path - RSP")
976 .setCostName("HOP_COUNT")
977 .setCostValue("12345678")
979 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
980 .setFixedLatencyCharacteristic("12345678")
981 .setQueingLatencyCharacteristic("12345678")
982 .setJitterCharacteristic("12345678")
983 .setWanderCharacteristic("12345678")
984 .setTrafficPropertyName("FIXED_LATENCY")
986 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
987 .setRiskCharacteristicName("risk characteristic")
988 .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
990 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
992 UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
995 .setNodeEdgePoint(nepList)
996 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
997 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
998 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1000 nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
1003 return nodeRuleGroupMap;
1006 private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForDsrNode(String nodeId,
1007 OduSwitchingPools oorOduSwitchingPool,
1008 Map<RuleKey, Rule> ruleList,
1009 Map<OwnedNodeEdgePointKey,
1010 OwnedNodeEdgePoint> onepl) {
1011 // create NodeRuleGroup
1012 if (oorOduSwitchingPool == null) {
1013 LOG.info("No switching pool created for node = {}", nodeId);
1014 return new HashMap<>();
1016 LOG.info("ONEPL = {}", onepl.values());
1017 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
1019 for (NonBlockingList nbl : oorOduSwitchingPool.nonnullNonBlockingList().values()) {
1020 LOG.info("Non blocking list = {}", nbl);
1021 Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
1022 for (TpId tp : nbl.getTpList()) {
1023 LOG.info("EDOU TP = {}", String.join("+", nodeId, TapiStringConstants.E_ODU, tp.getValue()));
1024 LOG.info("DSR TP = {}", String.join("+", nodeId, TapiStringConstants.DSR, tp.getValue()));
1025 Uuid tpUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
1026 TapiStringConstants.E_ODU, tp.getValue())).getBytes(Charset.forName("UTF-8"))).toString());
1027 Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
1028 TapiStringConstants.DSR, tp.getValue())).getBytes(Charset.forName("UTF-8"))).toString());
1029 if (onepl.containsKey(new OwnedNodeEdgePointKey(tpUuid))
1030 && onepl.containsKey(new OwnedNodeEdgePointKey(tp1Uuid))) {
1031 NodeEdgePoint nep1 = new NodeEdgePointBuilder()
1032 .setTopologyUuid(this.tapiTopoUuid)
1033 .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
1034 (String.join("+", nodeId,TapiStringConstants. DSR))
1035 .getBytes(Charset.forName("UTF-8"))).toString()))
1036 .setNodeEdgePointUuid(tp1Uuid)
1038 NodeEdgePoint nep2 = new NodeEdgePointBuilder()
1039 .setTopologyUuid(this.tapiTopoUuid)
1040 .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
1041 (String.join("+", nodeId,TapiStringConstants. DSR))
1042 .getBytes(Charset.forName("UTF-8"))).toString()))
1043 .setNodeEdgePointUuid(tpUuid)
1045 nepList.put(nep1.key(), nep1);
1046 nepList.put(nep2.key(), nep2);
1049 // Empty random creation of mandatory fields for avoiding errors....
1050 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
1051 .setCostAlgorithm("Restricted Shortest Path - RSP")
1052 .setCostName("HOP_COUNT")
1053 .setCostValue("12345678")
1055 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1056 .setFixedLatencyCharacteristic("12345678")
1057 .setQueingLatencyCharacteristic("12345678")
1058 .setJitterCharacteristic("12345678")
1059 .setWanderCharacteristic("12345678")
1060 .setTrafficPropertyName("FIXED_LATENCY")
1062 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1063 .setRiskCharacteristicName("risk characteristic")
1064 .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
1066 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
1068 UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
1071 .setNodeEdgePoint(nepList)
1072 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1073 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1074 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1076 nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
1079 return nodeRuleGroupMap;
1082 private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedLayerProtocolQualifier(
1083 List<Class<? extends SupportedIfCapability>> sicList, LayerProtocolName lpn) {
1084 if (sicList == null) {
1085 return List.of(PHOTONICLAYERQUALIFIEROMS.class);
1087 Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfMap = new HashMap<>();
1088 LOG.info("SIC list = {}", sicList);
1089 for (Class<? extends SupportedIfCapability> supInterCapa : sicList) {
1090 SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
1091 .withKey(new SupportedInterfaceCapabilityKey(convertSupIfCapa(supInterCapa)))
1092 .setIfCapType(convertSupIfCapa(supInterCapa))
1094 supIfMap.put(supIfCapa.key(), supIfCapa);
1096 List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
1097 for (SupportedInterfaceCapability sic : supIfMap.values()) {
1098 switch (lpn.getName()) {
1100 switch (sic.getIfCapType().getSimpleName()) {
1101 // TODO: it may be needed to add more cases clauses if the interface capabilities of a
1102 // port are extended in the config file
1104 sclpqList.add(ODUTYPEODU0.class);
1105 sclpqList.add(DIGITALSIGNALTYPEGigE.class);
1108 sclpqList.add(ODUTYPEODU2E.class);
1109 sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
1112 sclpqList.add(ODUTYPEODU2.class);
1113 sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
1116 sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
1119 sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
1120 sclpqList.add(ODUTYPEODU4.class);
1123 sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
1125 case "IfOCHOTU4ODU4":
1127 sclpqList.add(ODUTYPEODU4.class);
1130 LOG.error("IfCapability type not managed");
1135 switch (sic.getIfCapType().getSimpleName()) {
1136 // TODO: it may be needed to add more cases clauses if the interface capabilities of a
1137 // port are extended in the config file
1139 sclpqList.add(ODUTYPEODU0.class);
1142 sclpqList.add(ODUTYPEODU2E.class);
1146 sclpqList.add(ODUTYPEODU2.class);
1150 case "IfOCHOTU4ODU4":
1152 sclpqList.add(ODUTYPEODU4.class);
1155 LOG.error("IfCapability type not managed");
1159 case "PHOTONIC_MEDIA":
1160 if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")
1161 || sic.getIfCapType().getSimpleName().equals("IfOCH")) {
1162 sclpqList.add(PHOTONICLAYERQUALIFIEROTSi.class);
1163 sclpqList.add(PHOTONICLAYERQUALIFIEROMS.class);
1167 LOG.error("Layer Protocol Name is unknown {}", lpn.getName());
1174 private static Class<? extends SupportedIfCapability> convertSupIfCapa(Class<? extends
1175 SupportedIfCapability> ifCapType) {
1176 LOG.info("Interface Capability type = {}", ifCapType.getSimpleName());
1177 switch (ifCapType.getSimpleName()) {
1179 return If100GEODU4.class;
1180 case "IfOCHOTU4ODU4":
1181 return IfOCHOTU4ODU4.class;
1183 return If1GEODU0.class;
1185 return If10GEODU2e.class;
1187 return If10GEODU2.class;
1189 return If100GE.class;
1191 return If10GE.class;
1201 private String getNodeType(XpdrNodeTypes xponderType) {
1202 switch (xponderType.getIntValue()) {
1204 return OpenroadmNodeType.TPDR.getName();
1206 return OpenroadmNodeType.MUXPDR.getName();
1208 return OpenroadmNodeType.SWITCH.getName();
1210 LOG.info("XpdrType {} not supported", xponderType);
1216 private void mergeNodeinTopology(Map<NodeKey, Node> nodeMap) {
1217 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1218 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1219 LOG.info("Creating tapi node in TAPI topology context");
1220 InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
1221 .augmentation(Context1.class).child(TopologyContext.class)
1222 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1225 Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid).setNode(nodeMap).build();
1227 // merge in datastore
1228 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
1231 this.networkTransactionService.commit().get();
1232 } catch (InterruptedException | ExecutionException e) {
1233 LOG.error("Error populating TAPI topology: ", e);
1235 LOG.info("Node added succesfully.");
1238 private void mergeLinkinTopology(Map<LinkKey, Link> linkMap) {
1239 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1240 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1241 LOG.info("Creating tapi node in TAPI topology context");
1242 InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
1243 .augmentation(Context1.class).child(TopologyContext.class)
1244 .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
1247 Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid).setLink(linkMap).build();
1249 // merge in datastore
1250 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
1253 this.networkTransactionService.commit().get();
1254 } catch (InterruptedException | ExecutionException e) {
1255 LOG.error("Error populating TAPI topology: ", e);
1257 LOG.info("Roadm Link added succesfully.");
1260 private void mergeSipsinContext(Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips) {
1261 // TODO is this merge correct? Should we just merge topology by changing the nodes map??
1262 // TODO: verify this is correct. Should we identify the context IID with the context UUID??
1264 ContextBuilder contextBuilder = new ContextBuilder();
1265 contextBuilder.setServiceInterfacePoint(sips);
1266 InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
1267 // merge in datastore
1268 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, contextIID,
1269 contextBuilder.build());
1270 this.networkTransactionService.commit().get();
1271 LOG.info("TAPI SIPs merged successfully.");
1272 } catch (InterruptedException | ExecutionException e) {
1273 LOG.error("Failed to merge TAPI Sips", e);
1277 private void deleteLinkFromTopo(Uuid linkUuid) {
1278 // TODO: check if this IID is correct
1280 InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
1281 .augmentation(Context1.class).child(TopologyContext.class).child(Topology.class,
1282 new TopologyKey(this.tapiTopoUuid)).child(Link.class, new LinkKey(linkUuid)).build();
1283 this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, linkIID);
1284 this.networkTransactionService.commit().get();
1285 LOG.info("TAPI link deleted successfully.");
1286 } catch (InterruptedException | ExecutionException e) {
1287 LOG.error("Failed to delete TAPI link", e);
1291 private void deleteNodeFromTopo(Uuid nodeUuid) {
1292 // TODO: check if this IID is correct
1294 InstanceIdentifier<Node> nodeIDD = InstanceIdentifier.builder(Context.class)
1295 .augmentation(Context1.class).child(TopologyContext.class).child(Topology.class,
1296 new TopologyKey(this.tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid)).build();
1297 this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, nodeIDD);
1298 this.networkTransactionService.commit().get();
1299 LOG.info("TAPI Node deleted successfully.");
1300 } catch (InterruptedException | ExecutionException e) {
1301 LOG.error("Failed to delete TAPI Node", e);
1305 private void deleteSipFromTopo(Uuid sipUuid) {
1306 // TODO: check if this IID is correct
1308 InstanceIdentifier<ServiceInterfacePoint> sipIID = InstanceIdentifier.builder(Context.class)
1309 .child(ServiceInterfacePoint.class, new ServiceInterfacePointKey(sipUuid)).build();
1310 this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, sipIID);
1311 this.networkTransactionService.commit().get();
1312 LOG.info("TAPI SIP deleted successfully.");
1313 } catch (InterruptedException | ExecutionException e) {
1314 LOG.error("Failed to delete TAPI SIP", e);
1318 private void updateConnectivityServicesState(Uuid sipUuid, String nodeId) {
1319 // TODO: check if this IID is correct
1320 InstanceIdentifier<ConnectivityContext> connectivitycontextIID = InstanceIdentifier.builder(Context.class)
1321 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1.class)
1322 .child(ConnectivityContext.class)
1324 ConnectivityContext connContext = null;
1326 Optional<ConnectivityContext> optConnContext =
1327 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivitycontextIID)
1329 if (!optConnContext.isPresent()) {
1330 LOG.error("Couldnt retrieve connectivity context from datastore");
1333 connContext = optConnContext.get();
1334 } catch (InterruptedException | ExecutionException e) {
1335 LOG.error("Couldnt read connectivity context from datastore", e);
1337 if (connContext == null) {
1338 LOG.error("Connectivity context is empty");
1341 // Loop through services, check if the endpoint uuid is equal to the sip.
1342 // If so update state.
1343 Map<ConnectivityServiceKey, ConnectivityService> connServMap = connContext.getConnectivityService();
1344 Map<ConnectionKey, Connection> connMap = connContext.getConnection();
1345 if (connServMap != null) {
1346 for (ConnectivityService service:connServMap.values()) {
1347 Map<EndPointKey, EndPoint> serviceEndPoints = service.getEndPoint();
1348 if (serviceEndPoints.values().stream().anyMatch(endPoint -> endPoint.getServiceInterfacePoint()
1349 .getServiceInterfacePointUuid().equals(sipUuid))) {
1350 LOG.info("Service using SIP of node {} identified. Update state of service", nodeId);
1351 ConnectivityService updService = new ConnectivityServiceBuilder(service)
1352 .setAdministrativeState(AdministrativeState.LOCKED)
1353 .setOperationalState(OperationalState.DISABLED)
1354 .setLifecycleState(LifecycleState.PENDINGREMOVAL)
1356 updateConnectivityService(updService);
1360 // Update state of connections
1361 if (connMap != null) {
1362 for (Connection connection:connMap.values()) {
1363 if (connection.getName().values().stream().anyMatch(name -> name.getValue().contains(nodeId))) {
1364 Connection updConn = new ConnectionBuilder(connection)
1365 .setLifecycleState(LifecycleState.PENDINGREMOVAL)
1366 .setOperationalState(OperationalState.DISABLED)
1368 updateConnection(updConn);
1374 private void updateConnection(Connection updConn) {
1375 // TODO: check if this IID is correct
1376 InstanceIdentifier<Connection> connectionIID = InstanceIdentifier.builder(Context.class)
1377 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1.class)
1378 .child(ConnectivityContext.class).child(Connection.class,
1379 new ConnectionKey(updConn.getUuid())).build();
1380 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectionIID, updConn);
1382 this.networkTransactionService.commit().get();
1383 } catch (InterruptedException | ExecutionException e) {
1384 LOG.error("Error committing into datastore", e);
1388 private void updateConnectivityService(ConnectivityService updService) {
1389 // TODO: check if this IID is correct
1390 InstanceIdentifier<ConnectivityService> connectivityserviceIID = InstanceIdentifier.builder(Context.class)
1391 .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1.class)
1392 .child(ConnectivityContext.class).child(ConnectivityService.class,
1393 new ConnectivityServiceKey(updService.getUuid())).build();
1394 this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectivityserviceIID, updService);
1396 this.networkTransactionService.commit().get();
1397 } catch (InterruptedException | ExecutionException e) {
1398 LOG.error("Error committing into datastore", e);
1402 private ArrayList<Class<? extends SupportedIfCapability>> convertSupIfCapaList(List<Mapping> xpdrNetMaps,
1404 ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = new ArrayList<Class<? extends
1405 SupportedIfCapability>>();
1406 xpdrNetMaps.get(index).getSupportedInterfaceCapability()
1407 .forEach(a -> newSupIfCapList.add(xpdrNetMaps.get(index).getSupportedInterfaceCapability().get(0)));
1408 return newSupIfCapList;