Refactor SupportedIfCapability usage
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / topology / TapiNetworkModelServiceImpl.java
1 /*
2  * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.transportpce.tapi.topology;
9
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;
17 import java.util.Map;
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;
131
132 public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
133
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;
141
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;
148     }
149
150     @Override
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);
156             return;
157         }
158         this.sipMap.clear();
159         LOG.info("Mapping of node {}: {}", orNodeId, node.getMapping().values());
160
161         // check type of device, check version and create node mapping
162         if (NodeTypes.Rdm.getIntValue() == node.getNodeInfo().getNodeType().getIntValue()) {
163             // ROADM device
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));
169
170             List<String> nodeShardList = getRoadmNodelist(mappingList);
171
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);
180                 } else {
181                     LOG.error("unknown element");
182                 }
183             }
184             // Transform LCPs into ONEP
185             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap =
186                 new HashMap<>(transformDegToOnep(orNodeId, mapDeg));
187             onepMap.putAll(transformSrgToOnep(orNodeId, mapSrg));
188
189             // create tapi Node
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
195
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,
199                 this.tapiTopoUuid);
200             if (!rdm2rdmLinks.isEmpty()) {
201                 mergeLinkinTopology(rdm2rdmLinks);
202             }
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());
220
221                     // create switching pool
222                     OduSwitchingPools oorOduSwitchingPool = createSwitchPoolForXpdr(
223                         mapping.getXponderType().getIntValue(), xpdrClMaps, xpdrNetMaps, xpdrNb);
224
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);
231                 }
232             }
233             LOG.info("TAPI node for or node {} successfully merged", orNodeId);
234         }
235         // Device not managed yet
236     }
237
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);
253
254         nodeMap.put(dsrNode.key(), dsrNode);
255
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);
265
266         nodeMap.put(otsiNode.key(), otsiNode);
267
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,
271             nodeUuidOtsi);
272         mergeLinkinTopology(linkMap);
273
274         return nodeMap;
275     }
276
277     private OduSwitchingPools createSwitchPoolForXpdr(int xpdrType, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
278                                                       Integer xpdrNb) {
279         // todo: are switching pool correct here??
280         switch (xpdrType) {
281             case 1:
282                 // Tpdr
283                 return createTpdrSwitchPool(xpdrNetMaps);
284             case 2:
285                 // Mux
286                 return createMuxSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
287             case 3:
288                 // Switch
289                 return createSwtchSwitchPool(xpdrClMaps, xpdrNetMaps, xpdrNb);
290             default:
291                 LOG.warn("Xpdr type {} not supported", xpdrType);
292         }
293         return null;
294     }
295
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());
304                     continue;
305                 }
306                 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> srgNeps =
307                     createRoadmNeps(orNodeId, m.getLogicalConnectionPoint(), true,
308                             transformOperState(m.getPortOperState()), transformAdminState(m.getPortAdminState()));
309                 onepMap.putAll(srgNeps);
310             }
311         }
312         return onepMap;
313     }
314
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());
323                     continue;
324                 }
325                 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> degNeps =
326                     createRoadmNeps(orNodeId, m.getLogicalConnectionPoint(), false,
327                             transformOperState(m.getPortOperState()), transformAdminState(m.getPortAdminState()));
328                 onepMap.putAll(degNeps);
329             }
330         }
331         return onepMap;
332     }
333
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);
342             }
343         }
344         return nodeShardList;
345     }
346
347     @Override
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;
358         try {
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);
363                 return;
364             }
365             topology = optTopology.get();
366         } catch (InterruptedException | ExecutionException e) {
367             LOG.error("Couldnt read tapi topology from datastore", e);
368         }
369         if (topology == null) {
370             LOG.error("Topology is null, nothing to delete");
371             return;
372         }
373         if (topology.getNode() == null) {
374             LOG.error("No nodes in topology");
375             return;
376         }
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);
382         }
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());
389                 }
390             }
391         }
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());
398                 }
399             }
400         }
401         // Delete sips of sip map
402         InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
403         Context context = null;
404         try {
405             Optional<Context> optContext = this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL,
406                     contextIID).get();
407             if (!optContext.isPresent()) {
408                 LOG.error("No context object present in datastore.");
409                 return;
410             }
411             context = optContext.get();
412         } catch (InterruptedException | ExecutionException e) {
413             LOG.error("Couldnt read tapi context from datastore", e);
414         }
415         if (context == null) {
416             LOG.error("Context is null, nothing to delete");
417             return;
418         }
419         Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips = context.getServiceInterfacePoint();
420         if (sips != null) {
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());
426                 }
427             }
428         }
429     }
430
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)
441                 .build();
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);
455         } else {
456             LOG.error("Undefined LayerProtocolName for {} node {}", nameMap.get(nameMap.keySet().iterator().next())
457                     .getValueName(), nameMap.get(nameMap.keySet().iterator().next()).getValue());
458         }
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")
464             .build();
465         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
466             .setFixedLatencyCharacteristic("12345678")
467             .setQueingLatencyCharacteristic("12345678")
468             .setJitterCharacteristic("12345678")
469             .setWanderCharacteristic("12345678")
470             .setTrafficPropertyName("FIXED_LATENCY")
471             .build();
472         return new NodeBuilder()
473             .setUuid(nodeUuid)
474             .setName(nameMap)
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")
489             .build();
490     }
491
492     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrPhtnMdNeps(String nodeId,
493                                                                                 List<Mapping> xpdrNetMaps) {
494         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
495
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()))
505                 .build();
506
507             ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
508
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);
515         }
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()))
525                 .build();
526
527             ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
528
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);
535         }
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()))
545                 .build();
546
547             ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
548
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);
555         }
556         return onepl;
557     }
558
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()));
572             Name name;
573             if (OpenroadmNodeType.TPDR.getName().equalsIgnoreCase(xponderType.getName())) {
574                 name = nameBldr.setValueName("100G-tpdr").build();
575             } else {
576                 name = nameBldr.setValueName("NodeEdgePoint_C").build();
577             }
578
579             ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrClMaps, i);
580
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);
587         }
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()))
599                 .build();
600
601             ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
602
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);
610         }
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()))
622                 .build();
623
624             ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrClMaps, i);
625
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);
633         }
634         return onepl;
635     }
636
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;
640     }
641
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;
646     }
647
648     private OwnedNodeEdgePoint createNep(Uuid nepUuid, String tpid, Map<NameKey, Name> nepNames,
649                                          LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip,
650                                          String keyword,
651                                          List<Class<? extends SupportedIfCapability>> supportedInterfaceCapability,
652                                          OperationalState operState, AdministrativeState adminState) {
653         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
654                 .setUuid(nepUuid)
655                 .setLayerProtocolName(nepProtocol)
656                 .setName(nepNames);
657         if (withSip) {
658             onepBldr.setMappedServiceInterfacePoint(createMSIP(1, nepProtocol, tpid, keyword,
659                     supportedInterfaceCapability, operState, adminState));
660         }
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();
669     }
670
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))
681                 .build();
682         OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
683             .setUuid(nepUuid)
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)
691             .build();
692         onepMap.put(onep.key(), onep);
693
694         // MC nep
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))
700                 .build();
701         OwnedNodeEdgePointBuilder onepBldr1 = new OwnedNodeEdgePointBuilder()
702                 .setUuid(nepUuid1)
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);
710         if (withSip) {
711             onepBldr1.setMappedServiceInterfacePoint(createMSIP(1, LayerProtocolName.PHOTONICMEDIA,
712                 tpId, String.join("+", orNodeId, TapiStringConstants.MC), null,
713                 operState, adminState));
714         }
715         OwnedNodeEdgePoint onep1 = onepBldr1.build();
716         onepMap.put(onep1.key(), onep1);
717
718         // OTSiMC nep
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))
724                 .build();
725
726         OwnedNodeEdgePoint onep2 = new OwnedNodeEdgePointBuilder()
727             .setUuid(nepUuid2)
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)
735             .build();
736         onepMap.put(onep2.key(), onep2);
737         return onepMap;
738     }
739
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);
756         }
757         return msipl;
758     }
759
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))
768                 .build();
769         return new ServiceInterfacePointBuilder()
770                 .setUuid(sipUuid)
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,
779                         layerProtocol))
780                 .build();
781     }
782
783     private Node createRoadmTapiNode(String orNodeId, Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist) {
784         // UUID
785         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
786             TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
787         // Names
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();
792         // Protocol Layer
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")
799             .build();
800         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
801             .setFixedLatencyCharacteristic("12345678")
802             .setQueingLatencyCharacteristic("12345678")
803             .setJitterCharacteristic("12345678")
804             .setWanderCharacteristic("12345678")
805             .setTrafficPropertyName("FIXED_LATENCY")
806             .build();
807         return new NodeBuilder()
808             .setUuid(nodeUuid)
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")
824             .build();
825     }
826
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())
836                 .build();
837             nepMap.put(nep.key(), nep);
838         }
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)
845                 .build();
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()))
850                 .setRule(ruleList)
851                 .setNodeEdgePoint(nepMap)
852                 .build();
853         nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
854         return nodeRuleGroupMap;
855     }
856
857     private Map<LinkKey, Link> createTapiTransitionalLinks(String nodeId, List<Mapping> xpdrNetMaps, Uuid nodeUuidDsr,
858                                                            Uuid nodeUuidOtsi) {
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()),
867                 this.tapiTopoUuid);
868             linkMap.put(transiLink.key(), transiLink);
869         }
870         // return a map of links and then we can do merge the corresponding link map into the topology context
871         return linkMap;
872     }
873
874     private OduSwitchingPools createTpdrSwitchPool(List<Mapping> xpdrNetMaps) {
875         Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
876         int count = 1;
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<>();
883             tpList.add(tpid1);
884             tpList.add(tpid2);
885             NonBlockingList nbl = new NonBlockingListBuilder()
886                 .setNblNumber(Uint16.valueOf(count))
887                 .setTpList(tpList)
888                 .build();
889             nblMap.put(nbl.key(), nbl);
890             count++;
891         }
892         return new OduSwitchingPoolsBuilder()
893             .setNonBlockingList(nblMap)
894             .setSwitchingPoolNumber(Uint16.valueOf(1))
895             .build();
896     }
897
898     private OduSwitchingPools createSwtchSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
899                                                     Integer xpdrNb) {
900         List<TpId> tpl = new ArrayList<>();
901         TpId tpId = null;
902         for (int i = 1; i <= xpdrClMaps.size(); i++) {
903             tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i);
904             tpl.add(tpId);
905         }
906         for (int i = 1; i <= xpdrNetMaps.size(); i++) {
907             tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.NETWORK + i);
908             tpl.add(tpId);
909         }
910         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
911         NonBlockingList nbl = new NonBlockingListBuilder()
912             .setNblNumber(Uint16.valueOf(1))
913             .setTpList(tpl)
914             .build();
915         nbMap.put(nbl.key(),nbl);
916
917         return new OduSwitchingPoolsBuilder()
918             .setSwitchingPoolNumber(Uint16.valueOf(1))
919             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
920             .setNonBlockingList(nbMap)
921             .build();
922     }
923
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);
929             tpList.add(tpId);
930             tpId = new TpId("XPDR" + xpdrNb + "-NETWORK1");
931             tpList.add(tpId);
932             NonBlockingList nbl = new NonBlockingListBuilder()
933                 .setNblNumber(Uint16.valueOf(i))
934                 .setTpList(tpList)
935                 .setAvailableInterconnectBandwidth(Uint32.valueOf(xpdrNetMaps.size() * 10L))
936                 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
937                 .build();
938             nbMap.put(nbl.key(),nbl);
939         }
940         return new OduSwitchingPoolsBuilder()
941                 .setSwitchingPoolNumber(Uint16.valueOf(1))
942                 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
943                 .setNonBlockingList(nbMap)
944                 .build();
945     }
946
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
952         int count = 1;
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()))
962                 .build();
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()))
970                 .build();
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")
978                 .build();
979             LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
980                 .setFixedLatencyCharacteristic("12345678")
981                 .setQueingLatencyCharacteristic("12345678")
982                 .setJitterCharacteristic("12345678")
983                 .setWanderCharacteristic("12345678")
984                 .setTrafficPropertyName("FIXED_LATENCY")
985                 .build();
986             RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
987                 .setRiskCharacteristicName("risk characteristic")
988                 .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
989                 .build();
990             NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
991                 .setUuid(new Uuid(
992                     UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
993                         .toString()))
994                 .setRule(ruleList)
995                 .setNodeEdgePoint(nepList)
996                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
997                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
998                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
999                 .build();
1000             nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
1001             count++;
1002         }
1003         return nodeRuleGroupMap;
1004     }
1005
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<>();
1015         }
1016         LOG.info("ONEPL = {}", onepl.values());
1017         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
1018         int count = 1;
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)
1037                         .build();
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)
1044                         .build();
1045                     nepList.put(nep1.key(), nep1);
1046                     nepList.put(nep2.key(), nep2);
1047                 }
1048             }
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")
1054                 .build();
1055             LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
1056                 .setFixedLatencyCharacteristic("12345678")
1057                 .setQueingLatencyCharacteristic("12345678")
1058                 .setJitterCharacteristic("12345678")
1059                 .setWanderCharacteristic("12345678")
1060                 .setTrafficPropertyName("FIXED_LATENCY")
1061                 .build();
1062             RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
1063                 .setRiskCharacteristicName("risk characteristic")
1064                 .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
1065                 .build();
1066             NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
1067                 .setUuid(new Uuid(
1068                     UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
1069                         .toString()))
1070                 .setRule(ruleList)
1071                 .setNodeEdgePoint(nepList)
1072                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
1073                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
1074                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
1075                 .build();
1076             nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
1077             count++;
1078         }
1079         return nodeRuleGroupMap;
1080     }
1081
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);
1086         }
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))
1093                     .build();
1094             supIfMap.put(supIfCapa.key(), supIfCapa);
1095         }
1096         List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
1097         for (SupportedInterfaceCapability sic : supIfMap.values()) {
1098             switch (lpn.getName()) {
1099                 case "DSR":
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
1103                         case "If1GEODU0":
1104                             sclpqList.add(ODUTYPEODU0.class);
1105                             sclpqList.add(DIGITALSIGNALTYPEGigE.class);
1106                             break;
1107                         case "If10GEODU2e":
1108                             sclpqList.add(ODUTYPEODU2E.class);
1109                             sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
1110                             break;
1111                         case "If10GEODU2":
1112                             sclpqList.add(ODUTYPEODU2.class);
1113                             sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
1114                             break;
1115                         case "If10GE":
1116                             sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
1117                             break;
1118                         case "If100GEODU4":
1119                             sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
1120                             sclpqList.add(ODUTYPEODU4.class);
1121                             break;
1122                         case "If100GE":
1123                             sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
1124                             break;
1125                         case "IfOCHOTU4ODU4":
1126                         case "IfOCH":
1127                             sclpqList.add(ODUTYPEODU4.class);
1128                             break;
1129                         default:
1130                             LOG.error("IfCapability type not managed");
1131                             break;
1132                     }
1133                     break;
1134                 case "ODU":
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
1138                         case "If1GEODU0":
1139                             sclpqList.add(ODUTYPEODU0.class);
1140                             break;
1141                         case "If10GEODU2e":
1142                             sclpqList.add(ODUTYPEODU2E.class);
1143                             break;
1144                         case "If10GEODU2":
1145                         case "If10GE":
1146                             sclpqList.add(ODUTYPEODU2.class);
1147                             break;
1148                         case "If100GEODU4":
1149                         case "If100GE":
1150                         case "IfOCHOTU4ODU4":
1151                         case "IfOCH":
1152                             sclpqList.add(ODUTYPEODU4.class);
1153                             break;
1154                         default:
1155                             LOG.error("IfCapability type not managed");
1156                             break;
1157                     }
1158                     break;
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);
1164                     }
1165                     break;
1166                 default:
1167                     LOG.error("Layer Protocol Name is unknown {}", lpn.getName());
1168                     break;
1169             }
1170         }
1171         return sclpqList;
1172     }
1173
1174     private static Class<? extends SupportedIfCapability> convertSupIfCapa(Class<? extends
1175             SupportedIfCapability> ifCapType) {
1176         LOG.info("Interface Capability type = {}", ifCapType.getSimpleName());
1177         switch (ifCapType.getSimpleName()) {
1178             case "If100GEODU4":
1179                 return If100GEODU4.class;
1180             case "IfOCHOTU4ODU4":
1181                 return IfOCHOTU4ODU4.class;
1182             case "If1GEODU0":
1183                 return If1GEODU0.class;
1184             case "If10GEODU2e":
1185                 return If10GEODU2e.class;
1186             case "If10GEODU2":
1187                 return If10GEODU2.class;
1188             case "If100GE":
1189                 return If100GE.class;
1190             case "If10GE":
1191                 return If10GE.class;
1192             case "If1GE":
1193                 return If1GE.class;
1194             case "IfOCH":
1195                 return IfOCH.class;
1196             default:
1197                 return null;
1198         }
1199     }
1200
1201     private String getNodeType(XpdrNodeTypes xponderType) {
1202         switch (xponderType.getIntValue()) {
1203             case 1:
1204                 return OpenroadmNodeType.TPDR.getName();
1205             case 2:
1206                 return OpenroadmNodeType.MUXPDR.getName();
1207             case 3:
1208                 return OpenroadmNodeType.SWITCH.getName();
1209             default:
1210                 LOG.info("XpdrType {} not supported", xponderType);
1211                 break;
1212         }
1213         return null;
1214     }
1215
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))
1223             .build();
1224
1225         Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid).setNode(nodeMap).build();
1226
1227         // merge in datastore
1228         this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
1229                 topology);
1230         try {
1231             this.networkTransactionService.commit().get();
1232         } catch (InterruptedException | ExecutionException e) {
1233             LOG.error("Error populating TAPI topology: ", e);
1234         }
1235         LOG.info("Node added succesfully.");
1236     }
1237
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))
1245             .build();
1246
1247         Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid).setLink(linkMap).build();
1248
1249         // merge in datastore
1250         this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
1251                 topology);
1252         try {
1253             this.networkTransactionService.commit().get();
1254         } catch (InterruptedException | ExecutionException e) {
1255             LOG.error("Error populating TAPI topology: ", e);
1256         }
1257         LOG.info("Roadm Link added succesfully.");
1258     }
1259
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??
1263         try {
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);
1274         }
1275     }
1276
1277     private void deleteLinkFromTopo(Uuid linkUuid) {
1278         // TODO: check if this IID is correct
1279         try {
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);
1288         }
1289     }
1290
1291     private void deleteNodeFromTopo(Uuid nodeUuid) {
1292         // TODO: check if this IID is correct
1293         try {
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);
1302         }
1303     }
1304
1305     private void deleteSipFromTopo(Uuid sipUuid) {
1306         // TODO: check if this IID is correct
1307         try {
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);
1315         }
1316     }
1317
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)
1323             .build();
1324         ConnectivityContext connContext = null;
1325         try {
1326             Optional<ConnectivityContext> optConnContext =
1327                     this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivitycontextIID)
1328                             .get();
1329             if (!optConnContext.isPresent()) {
1330                 LOG.error("Couldnt retrieve connectivity context from datastore");
1331                 return;
1332             }
1333             connContext = optConnContext.get();
1334         } catch (InterruptedException | ExecutionException e) {
1335             LOG.error("Couldnt read connectivity context from datastore", e);
1336         }
1337         if (connContext == null) {
1338             LOG.error("Connectivity context is empty");
1339             return;
1340         }
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)
1355                         .build();
1356                     updateConnectivityService(updService);
1357                 }
1358             }
1359         }
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)
1367                         .build();
1368                     updateConnection(updConn);
1369                 }
1370             }
1371         }
1372     }
1373
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);
1381         try {
1382             this.networkTransactionService.commit().get();
1383         } catch (InterruptedException | ExecutionException e) {
1384             LOG.error("Error committing into datastore", e);
1385         }
1386     }
1387
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);
1395         try {
1396             this.networkTransactionService.commit().get();
1397         } catch (InterruptedException | ExecutionException e) {
1398             LOG.error("Error committing into datastore", e);
1399         }
1400     }
1401
1402     private ArrayList<Class<? extends SupportedIfCapability>> convertSupIfCapaList(List<Mapping> xpdrNetMaps,
1403             int index) {
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;
1409     }
1410 }