Add new method in PortMapping interface
[transportpce.git] / common / src / main / java / org / opendaylight / transportpce / common / mapping / PortMappingImpl.java
1 /*
2  * Copyright © 2017 AT&T 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
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;
13
14 import java.util.List;
15 import java.util.Map;
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.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
29 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilitiesKey;
30 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
31 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
33 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;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
36 import org.opendaylight.yangtools.yang.common.Uint16;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40
41 public class PortMappingImpl implements PortMapping {
42
43     private static final Logger LOG = LoggerFactory.getLogger(PortMappingImpl.class);
44
45     private final DataBroker dataBroker;
46     private final PortMappingVersion710 portMappingVersion710;
47     private final PortMappingVersion221 portMappingVersion22;
48     private final PortMappingVersion121 portMappingVersion121;
49
50     public PortMappingImpl(DataBroker dataBroker, PortMappingVersion710 portMappingVersion710,
51         PortMappingVersion221 portMappingVersion22, PortMappingVersion121 portMappingVersion121) {
52
53         this.dataBroker = dataBroker;
54         this.portMappingVersion710 = portMappingVersion710;
55         this.portMappingVersion22 = portMappingVersion22;
56         this.portMappingVersion121 = portMappingVersion121;
57     }
58
59     @Override
60     public PortMappingVersion221 getPortMappingVersion221() {
61         return portMappingVersion22;
62     }
63
64     @Override
65     public PortMappingVersion710 getPortMappingVersion710() {
66         return portMappingVersion710;
67     }
68
69     @Override
70     public boolean createMappingData(String nodeId, String nodeVersion) {
71         switch (nodeVersion) {
72             case OPENROADM_DEVICE_VERSION_1_2_1:
73                 return portMappingVersion121.createMappingData(nodeId);
74             case OPENROADM_DEVICE_VERSION_2_2_1:
75                 return portMappingVersion22.createMappingData(nodeId);
76             case OPENROADM_DEVICE_VERSION_7_1:
77                 return portMappingVersion710.createMappingData(nodeId);
78             default:
79                 LOG.error("Unable to create mapping data for unmanaged openroadm device version");
80                 return false;
81         }
82     }
83
84     @Override
85     public Mapping getMapping(String nodeId, String logicalConnPoint) {
86
87         /*
88          * Getting physical mapping corresponding to logical connection point
89          */
90         InstanceIdentifier<Mapping> portMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
91             new NodesKey(nodeId)).child(Mapping.class, new MappingKey(logicalConnPoint)).build();
92         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
93             Optional<Mapping> mapObject = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
94             if (mapObject.isPresent()) {
95                 Mapping mapping = mapObject.get();
96                 LOG.info("Found mapping for {} - {}. Mapping: {}", nodeId, logicalConnPoint, mapping.toString());
97                 return mapping;
98             }
99             LOG.warn("Could not find mapping for logical connection point {} for nodeId {}", logicalConnPoint, nodeId);
100         } catch (InterruptedException | ExecutionException ex) {
101             LOG.error("Unable to read mapping for logical connection point : {} for nodeId {}", logicalConnPoint,
102                 nodeId, ex);
103         }
104         return null;
105     }
106
107     @Override
108     public Mapping getMapping(String nodeId, String circuitPackName, String portName) {
109         KeyedInstanceIdentifier<Nodes, NodesKey> portMappingIID = InstanceIdentifier.create(Network.class)
110             .child(Nodes.class, new NodesKey(nodeId));
111         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
112             Optional<Nodes> portMapppingOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
113             if (!portMapppingOpt.isPresent()) {
114                 LOG.warn("Could not get portMapping for node {}", nodeId);
115                 return null;
116             }
117             Map<MappingKey, Mapping> mappings = portMapppingOpt.get().getMapping();
118             for (Mapping mapping : mappings.values()) {
119                 if (circuitPackName.equals(mapping.getSupportingCircuitPackName())
120                     && portName.equals(mapping.getSupportingPort())) {
121                     return mapping;
122                 }
123             }
124         } catch (InterruptedException | ExecutionException ex) {
125             LOG.error("Unable to get mapping list for nodeId {}", nodeId, ex);
126         }
127         return null;
128     }
129
130
131     @Override
132     public void deleteMapping(String nodeId, String logicalConnectionPoint) {
133         LOG.info("Deleting Mapping {} of node '{}'", logicalConnectionPoint, nodeId);
134         WriteTransaction rw = this.dataBroker.newWriteOnlyTransaction();
135         InstanceIdentifier<Mapping> mappingIID = InstanceIdentifier.create(Network.class)
136             .child(Nodes.class, new NodesKey(nodeId)).child(Mapping.class, new MappingKey(logicalConnectionPoint));
137         rw.delete(LogicalDatastoreType.CONFIGURATION, mappingIID);
138         try {
139             rw.commit().get(1, TimeUnit.SECONDS);
140             LOG.info("Mapping {} removed for node '{}'", logicalConnectionPoint, nodeId);
141         } catch (InterruptedException | ExecutionException | TimeoutException e) {
142             LOG.error("Error for removing mapping {} for node '{}'", logicalConnectionPoint, nodeId);
143         }
144     }
145
146     @Override
147     public McCapabilities getMcCapbilities(String nodeId, String mcLcp) {
148         /*
149          * Getting physical mapping corresponding to logical connection point
150          */
151         InstanceIdentifier<McCapabilities> mcCapabilitiesIID = InstanceIdentifier.builder(Network.class)
152             .child(Nodes.class, new NodesKey(nodeId)).child(McCapabilities.class, new McCapabilitiesKey(mcLcp)).build();
153         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
154             Optional<McCapabilities> mcCapObject = readTx.read(LogicalDatastoreType.CONFIGURATION,
155                 mcCapabilitiesIID).get();
156             if (mcCapObject.isPresent()) {
157                 McCapabilities mcCap = mcCapObject.get();
158                 LOG.info("Found MC-cap for {} - {}. Mapping: {}", nodeId, mcLcp, mcCap.toString());
159                 return mcCap;
160             }
161             LOG.warn("Could not find mc-capabilities for logical connection point {} for nodeId {}", mcLcp, nodeId);
162         } catch (InterruptedException | ExecutionException ex) {
163             LOG.error("Unable to read mapping for logical connection point : {} for nodeId {}", mcLcp,
164                 nodeId, ex);
165         }
166         return null;
167     }
168
169
170     @Override
171     public void deletePortMappingNode(String nodeId) {
172         LOG.info("Deleting Mapping Data corresponding at node '{}'", nodeId);
173         WriteTransaction rw = this.dataBroker.newWriteOnlyTransaction();
174         InstanceIdentifier<Nodes> nodesIID = InstanceIdentifier.create(Network.class)
175             .child(Nodes.class, new NodesKey(nodeId));
176         rw.delete(LogicalDatastoreType.CONFIGURATION, nodesIID);
177         try {
178             rw.commit().get(1, TimeUnit.SECONDS);
179             LOG.info("Port mapping removal for node '{}'", nodeId);
180         } catch (InterruptedException | ExecutionException | TimeoutException e) {
181             LOG.error("Error for removing port mapping infos for node '{}'", nodeId, e);
182         }
183     }
184
185     @Override
186     public boolean updateMapping(String nodeId, Mapping oldMapping) {
187         OpenroadmNodeVersion openROADMversion = getNode(nodeId).getNodeInfo().getOpenroadmVersion();
188         switch (openROADMversion.getIntValue()) {
189             case 1:
190                 return portMappingVersion121.updateMapping(nodeId, oldMapping);
191             case 2:
192                 return portMappingVersion22.updateMapping(nodeId, oldMapping);
193             case 3:
194                 return portMappingVersion710.updateMapping(nodeId, oldMapping);
195             default:
196                 return false;
197         }
198     }
199
200     @Override
201     public Nodes getNode(String nodeId) {
202         InstanceIdentifier<Nodes> nodePortMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
203             new NodesKey(nodeId)).build();
204         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
205             Optional<Nodes> nodePortMapObject =
206                 readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortMappingIID).get();
207             if (nodePortMapObject.isPresent()) {
208                 Nodes node = nodePortMapObject.get();
209                 LOG.info("Found node {} in portmapping.", nodeId);
210                 return node;
211             }
212             LOG.warn("Could not find node {} in portmapping.", nodeId);
213         } catch (InterruptedException | ExecutionException e) {
214             LOG.error("Unable to get node {} in portmapping", nodeId, e);
215         }
216         return null;
217     }
218
219     @Override
220     public boolean updatePortMappingWithOduSwitchingPools(String nodeId, InstanceIdentifier<OduSwitchingPools> ospIID,
221             Map<Uint16, List<InstanceIdentifier<PortList>>> nbliidMap) {
222         OpenroadmNodeVersion openROADMversion = getNode(nodeId).getNodeInfo().getOpenroadmVersion();
223         switch (openROADMversion.getIntValue()) {
224             case 3:
225                 return portMappingVersion710.updatePortMappingWithOduSwitchingPools(nodeId, ospIID, nbliidMap);
226             default:
227                 LOG.error("Update of the port-mapping [odu-switching-pool] not available for this device version {}",
228                     openROADMversion);
229                 return false;
230         }
231     }
232
233     @Override
234     public boolean isNodeExist(String nodeId) {
235         return this.getNode(nodeId) != null;
236     }
237
238 }