2 * Copyright © 2017 AT&T 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
9 package org.opendaylight.transportpce.common.mapping;
10 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_1_2_1;
11 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
12 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_7_1;
14 import java.util.List;
16 import java.util.Optional;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.TimeUnit;
19 import java.util.concurrent.TimeoutException;
20 import org.opendaylight.mdsal.binding.api.DataBroker;
21 import org.opendaylight.mdsal.binding.api.ReadTransaction;
22 import org.opendaylight.mdsal.binding.api.WriteTransaction;
23 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
24 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
29 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
30 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilitiesKey;
31 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
32 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
37 import org.opendaylight.yangtools.yang.common.Uint16;
38 import org.osgi.service.component.annotations.Activate;
39 import org.osgi.service.component.annotations.Component;
40 import org.osgi.service.component.annotations.Reference;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
45 public class PortMappingImpl implements PortMapping {
47 private static final Logger LOG = LoggerFactory.getLogger(PortMappingImpl.class);
49 private final DataBroker dataBroker;
50 private final PortMappingVersion710 portMappingVersion710;
51 private final PortMappingVersion221 portMappingVersion22;
52 private final PortMappingVersion121 portMappingVersion121;
55 public PortMappingImpl(@Reference DataBroker dataBroker,
56 @Reference DeviceTransactionManager deviceTransactionManager) {
58 new PortMappingVersion710(dataBroker, deviceTransactionManager),
59 new PortMappingVersion221(dataBroker, deviceTransactionManager),
60 new PortMappingVersion121(dataBroker, deviceTransactionManager));
63 public PortMappingImpl(DataBroker dataBroker, PortMappingVersion710 portMappingVersion710,
64 PortMappingVersion221 portMappingVersion22, PortMappingVersion121 portMappingVersion121) {
66 this.dataBroker = dataBroker;
67 this.portMappingVersion710 = portMappingVersion710;
68 this.portMappingVersion22 = portMappingVersion22;
69 this.portMappingVersion121 = portMappingVersion121;
73 public PortMappingVersion221 getPortMappingVersion221() {
74 return portMappingVersion22;
78 public PortMappingVersion710 getPortMappingVersion710() {
79 return portMappingVersion710;
83 public boolean createMappingData(String nodeId, String nodeVersion) {
84 switch (nodeVersion) {
85 case OPENROADM_DEVICE_VERSION_1_2_1:
86 return portMappingVersion121.createMappingData(nodeId);
87 case OPENROADM_DEVICE_VERSION_2_2_1:
88 return portMappingVersion22.createMappingData(nodeId);
89 case OPENROADM_DEVICE_VERSION_7_1:
90 return portMappingVersion710.createMappingData(nodeId);
92 LOG.error("Unable to create mapping data for unmanaged openroadm device version");
98 public Mapping getMapping(String nodeId, String logicalConnPoint) {
101 * Getting physical mapping corresponding to logical connection point
103 InstanceIdentifier<Mapping> portMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
104 new NodesKey(nodeId)).child(Mapping.class, new MappingKey(logicalConnPoint)).build();
105 try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
106 Optional<Mapping> mapObject = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
107 if (mapObject.isPresent()) {
108 Mapping mapping = mapObject.orElseThrow();
109 LOG.info("Found mapping for {} - {}. Mapping: {}", nodeId, logicalConnPoint, mapping.toString());
112 LOG.warn("Could not find mapping for logical connection point {} for nodeId {}", logicalConnPoint, nodeId);
113 } catch (InterruptedException | ExecutionException ex) {
114 LOG.error("Unable to read mapping for logical connection point : {} for nodeId {}", logicalConnPoint,
121 public Mapping getMapping(String nodeId, String circuitPackName, String portName) {
122 KeyedInstanceIdentifier<Nodes, NodesKey> portMappingIID = InstanceIdentifier.create(Network.class)
123 .child(Nodes.class, new NodesKey(nodeId));
124 try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
125 Optional<Nodes> portMapppingOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
126 if (portMapppingOpt.isEmpty()) {
127 LOG.warn("Could not get portMapping for node {}", nodeId);
130 Map<MappingKey, Mapping> mappings = portMapppingOpt.orElseThrow().getMapping();
131 for (Mapping mapping : mappings.values()) {
132 if (circuitPackName.equals(mapping.getSupportingCircuitPackName())
133 && portName.equals(mapping.getSupportingPort())) {
137 } catch (InterruptedException | ExecutionException ex) {
138 LOG.error("Unable to get mapping list for nodeId {}", nodeId, ex);
145 public void deleteMapping(String nodeId, String logicalConnectionPoint) {
146 LOG.info("Deleting Mapping {} of node '{}'", logicalConnectionPoint, nodeId);
147 WriteTransaction rw = this.dataBroker.newWriteOnlyTransaction();
148 InstanceIdentifier<Mapping> mappingIID = InstanceIdentifier.create(Network.class)
149 .child(Nodes.class, new NodesKey(nodeId)).child(Mapping.class, new MappingKey(logicalConnectionPoint));
150 rw.delete(LogicalDatastoreType.CONFIGURATION, mappingIID);
152 rw.commit().get(1, TimeUnit.SECONDS);
153 LOG.info("Mapping {} removed for node '{}'", logicalConnectionPoint, nodeId);
154 } catch (InterruptedException | ExecutionException | TimeoutException e) {
155 LOG.error("Error for removing mapping {} for node '{}'", logicalConnectionPoint, nodeId);
160 public McCapabilities getMcCapbilities(String nodeId, String mcLcp) {
162 * Getting physical mapping corresponding to logical connection point
164 InstanceIdentifier<McCapabilities> mcCapabilitiesIID = InstanceIdentifier.builder(Network.class)
165 .child(Nodes.class, new NodesKey(nodeId)).child(McCapabilities.class, new McCapabilitiesKey(mcLcp)).build();
166 try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
167 Optional<McCapabilities> mcCapObject = readTx.read(LogicalDatastoreType.CONFIGURATION,
168 mcCapabilitiesIID).get();
169 if (mcCapObject.isPresent()) {
170 McCapabilities mcCap = mcCapObject.orElseThrow();
171 LOG.info("Found MC-cap for {} - {}. Mapping: {}", nodeId, mcLcp, mcCap.toString());
174 LOG.warn("Could not find mc-capabilities for logical connection point {} for nodeId {}", mcLcp, nodeId);
175 } catch (InterruptedException | ExecutionException ex) {
176 LOG.error("Unable to read mapping for logical connection point : {} for nodeId {}", mcLcp,
184 public void deletePortMappingNode(String nodeId) {
185 LOG.info("Deleting Mapping Data corresponding at node '{}'", nodeId);
186 WriteTransaction rw = this.dataBroker.newWriteOnlyTransaction();
187 InstanceIdentifier<Nodes> nodesIID = InstanceIdentifier.create(Network.class)
188 .child(Nodes.class, new NodesKey(nodeId));
189 rw.delete(LogicalDatastoreType.CONFIGURATION, nodesIID);
191 rw.commit().get(1, TimeUnit.SECONDS);
192 LOG.info("Port mapping removal for node '{}'", nodeId);
193 } catch (InterruptedException | ExecutionException | TimeoutException e) {
194 LOG.error("Error for removing port mapping infos for node '{}'", nodeId, e);
199 public boolean updateMapping(String nodeId, Mapping oldMapping) {
200 OpenroadmNodeVersion openROADMversion = getNode(nodeId).getNodeInfo().getOpenroadmVersion();
201 switch (openROADMversion.getIntValue()) {
203 return portMappingVersion121.updateMapping(nodeId, oldMapping);
205 return portMappingVersion22.updateMapping(nodeId, oldMapping);
207 return portMappingVersion710.updateMapping(nodeId, oldMapping);
214 public Nodes getNode(String nodeId) {
215 InstanceIdentifier<Nodes> nodePortMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
216 new NodesKey(nodeId)).build();
217 try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
218 Optional<Nodes> nodePortMapObject =
219 readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortMappingIID).get();
220 if (nodePortMapObject.isPresent()) {
221 Nodes node = nodePortMapObject.orElseThrow();
222 LOG.info("Found node {} in portmapping.", nodeId);
225 LOG.warn("Could not find node {} in portmapping.", nodeId);
226 } catch (InterruptedException | ExecutionException e) {
227 LOG.error("Unable to get node {} in portmapping", nodeId, e);
233 public boolean updatePortMappingWithOduSwitchingPools(String nodeId, InstanceIdentifier<OduSwitchingPools> ospIID,
234 Map<Uint16, List<InstanceIdentifier<PortList>>> nbliidMap) {
235 OpenroadmNodeVersion openROADMversion = getNode(nodeId).getNodeInfo().getOpenroadmVersion();
236 switch (openROADMversion.getIntValue()) {
238 return portMappingVersion710.updatePortMappingWithOduSwitchingPools(nodeId, ospIID, nbliidMap);
240 LOG.error("Update of the port-mapping [odu-switching-pool] not available for this device version {}",
247 public boolean isNodeExist(String nodeId) {
248 return this.getNode(nodeId) != null;
252 public Mapping getMappingFromOtsInterface(String nodeId, String interfName) {
253 KeyedInstanceIdentifier<Nodes, NodesKey> nodePortmappingIID = InstanceIdentifier.create(Network.class)
254 .child(Nodes.class, new NodesKey(nodeId));
255 try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
256 Optional<Nodes> nodePortmapppingOpt
257 = readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortmappingIID).get();
258 if (nodePortmapppingOpt.isEmpty()) {
259 LOG.warn("Could not get portMapping for node {}", nodeId);
262 Map<MappingKey, Mapping> mappings = nodePortmapppingOpt.orElseThrow().getMapping();
263 for (Mapping mapping : mappings.values()) {
264 if (interfName.equals(mapping.getSupportingOts())) {
268 } catch (InterruptedException | ExecutionException ex) {
269 LOG.error("Unable to get mapping list for nodeId {}", nodeId, ex);