Turn PortMappingImpl into a component
[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.transportpce.common.device.DeviceTransactionManager;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
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.mapping.MappingKey;
29 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
30 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilitiesKey;
31 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
32 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.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;
43
44 @Component
45 public class PortMappingImpl implements PortMapping {
46
47     private static final Logger LOG = LoggerFactory.getLogger(PortMappingImpl.class);
48
49     private final DataBroker dataBroker;
50     private final PortMappingVersion710 portMappingVersion710;
51     private final PortMappingVersion221 portMappingVersion22;
52     private final PortMappingVersion121 portMappingVersion121;
53
54     @Activate
55     public PortMappingImpl(@Reference DataBroker dataBroker,
56             @Reference DeviceTransactionManager deviceTransactionManager) {
57         this(dataBroker,
58             new PortMappingVersion710(dataBroker, deviceTransactionManager),
59             new PortMappingVersion221(dataBroker, deviceTransactionManager),
60             new PortMappingVersion121(dataBroker, deviceTransactionManager));
61     }
62
63     public PortMappingImpl(DataBroker dataBroker, PortMappingVersion710 portMappingVersion710,
64         PortMappingVersion221 portMappingVersion22, PortMappingVersion121 portMappingVersion121) {
65
66         this.dataBroker = dataBroker;
67         this.portMappingVersion710 = portMappingVersion710;
68         this.portMappingVersion22 = portMappingVersion22;
69         this.portMappingVersion121 = portMappingVersion121;
70     }
71
72     @Override
73     public PortMappingVersion221 getPortMappingVersion221() {
74         return portMappingVersion22;
75     }
76
77     @Override
78     public PortMappingVersion710 getPortMappingVersion710() {
79         return portMappingVersion710;
80     }
81
82     @Override
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);
91             default:
92                 LOG.error("Unable to create mapping data for unmanaged openroadm device version");
93                 return false;
94         }
95     }
96
97     @Override
98     public Mapping getMapping(String nodeId, String logicalConnPoint) {
99
100         /*
101          * Getting physical mapping corresponding to logical connection point
102          */
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.get();
109                 LOG.info("Found mapping for {} - {}. Mapping: {}", nodeId, logicalConnPoint, mapping.toString());
110                 return mapping;
111             }
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,
115                 nodeId, ex);
116         }
117         return null;
118     }
119
120     @Override
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.isPresent()) {
127                 LOG.warn("Could not get portMapping for node {}", nodeId);
128                 return null;
129             }
130             Map<MappingKey, Mapping> mappings = portMapppingOpt.get().getMapping();
131             for (Mapping mapping : mappings.values()) {
132                 if (circuitPackName.equals(mapping.getSupportingCircuitPackName())
133                     && portName.equals(mapping.getSupportingPort())) {
134                     return mapping;
135                 }
136             }
137         } catch (InterruptedException | ExecutionException ex) {
138             LOG.error("Unable to get mapping list for nodeId {}", nodeId, ex);
139         }
140         return null;
141     }
142
143
144     @Override
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);
151         try {
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);
156         }
157     }
158
159     @Override
160     public McCapabilities getMcCapbilities(String nodeId, String mcLcp) {
161         /*
162          * Getting physical mapping corresponding to logical connection point
163          */
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.get();
171                 LOG.info("Found MC-cap for {} - {}. Mapping: {}", nodeId, mcLcp, mcCap.toString());
172                 return mcCap;
173             }
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,
177                 nodeId, ex);
178         }
179         return null;
180     }
181
182
183     @Override
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);
190         try {
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);
195         }
196     }
197
198     @Override
199     public boolean updateMapping(String nodeId, Mapping oldMapping) {
200         OpenroadmNodeVersion openROADMversion = getNode(nodeId).getNodeInfo().getOpenroadmVersion();
201         switch (openROADMversion.getIntValue()) {
202             case 1:
203                 return portMappingVersion121.updateMapping(nodeId, oldMapping);
204             case 2:
205                 return portMappingVersion22.updateMapping(nodeId, oldMapping);
206             case 3:
207                 return portMappingVersion710.updateMapping(nodeId, oldMapping);
208             default:
209                 return false;
210         }
211     }
212
213     @Override
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.get();
222                 LOG.info("Found node {} in portmapping.", nodeId);
223                 return node;
224             }
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);
228         }
229         return null;
230     }
231
232     @Override
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()) {
237             case 3:
238                 return portMappingVersion710.updatePortMappingWithOduSwitchingPools(nodeId, ospIID, nbliidMap);
239             default:
240                 LOG.error("Update of the port-mapping [odu-switching-pool] not available for this device version {}",
241                     openROADMversion);
242                 return false;
243         }
244     }
245
246     @Override
247     public boolean isNodeExist(String nodeId) {
248         return this.getNode(nodeId) != null;
249     }
250
251 }