Update portmapping YANG model
[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_0;
13
14 import java.util.Map;
15 import java.util.Optional;
16 import java.util.concurrent.ExecutionException;
17 import java.util.concurrent.TimeUnit;
18 import java.util.concurrent.TimeoutException;
19 import org.opendaylight.mdsal.binding.api.DataBroker;
20 import org.opendaylight.mdsal.binding.api.ReadTransaction;
21 import org.opendaylight.mdsal.binding.api.WriteTransaction;
22 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.Network;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.OpenroadmNodeVersion;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.mapping.Mapping;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.mapping.MappingKey;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.mc.capabilities.McCapabilities;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.mc.capabilities.McCapabilitiesKey;
29 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.network.Nodes;
30 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.network.NodesKey;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36
37 public class PortMappingImpl implements PortMapping {
38
39     private static final Logger LOG = LoggerFactory.getLogger(PortMappingImpl.class);
40
41     private final DataBroker dataBroker;
42     private final PortMappingVersion710 portMappingVersion710;
43     private final PortMappingVersion221 portMappingVersion22;
44     private final PortMappingVersion121 portMappingVersion121;
45
46     public PortMappingImpl(DataBroker dataBroker, PortMappingVersion710 portMappingVersion710,
47         PortMappingVersion221 portMappingVersion22, PortMappingVersion121 portMappingVersion121) {
48
49         this.dataBroker = dataBroker;
50         this.portMappingVersion710 = portMappingVersion710;
51         this.portMappingVersion22 = portMappingVersion22;
52         this.portMappingVersion121 = portMappingVersion121;
53     }
54
55     @Override
56     public boolean createMappingData(String nodeId, String nodeVersion) {
57         switch (nodeVersion) {
58             case OPENROADM_DEVICE_VERSION_1_2_1:
59                 return portMappingVersion121.createMappingData(nodeId);
60             case OPENROADM_DEVICE_VERSION_2_2_1:
61                 return portMappingVersion22.createMappingData(nodeId);
62             case OPENROADM_DEVICE_VERSION_7_1_0:
63                 return portMappingVersion710.createMappingData(nodeId);
64             default:
65                 LOG.error("Unable to create mapping data for unmanaged openroadm device version");
66                 return false;
67         }
68     }
69
70     @Override
71     public Mapping getMapping(String nodeId, String logicalConnPoint) {
72
73         /*
74          * Getting physical mapping corresponding to logical connection point
75          */
76         InstanceIdentifier<Mapping> portMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
77             new NodesKey(nodeId)).child(Mapping.class, new MappingKey(logicalConnPoint)).build();
78         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
79             Optional<Mapping> mapObject = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
80             if (mapObject.isPresent()) {
81                 Mapping mapping = mapObject.get();
82                 LOG.info("Found mapping for {} - {}. Mapping: {}", nodeId, logicalConnPoint, mapping.toString());
83                 return mapping;
84             }
85             LOG.warn("Could not find mapping for logical connection point {} for nodeId {}", logicalConnPoint, nodeId);
86         } catch (InterruptedException | ExecutionException ex) {
87             LOG.error("Unable to read mapping for logical connection point : {} for nodeId {}", logicalConnPoint,
88                 nodeId, ex);
89         }
90         return null;
91     }
92
93     @Override
94     public Mapping getMapping(String nodeId, String circuitPackName, String portName) {
95         KeyedInstanceIdentifier<Nodes, NodesKey> portMappingIID = InstanceIdentifier.create(Network.class)
96             .child(Nodes.class, new NodesKey(nodeId));
97         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
98             Optional<Nodes> portMapppingOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
99             if (!portMapppingOpt.isPresent()) {
100                 LOG.warn("Could not get portMapping for node {}", nodeId);
101                 return null;
102             }
103             Map<MappingKey, Mapping> mappings = portMapppingOpt.get().getMapping();
104             for (Mapping mapping : mappings.values()) {
105                 if (circuitPackName.equals(mapping.getSupportingCircuitPackName())
106                     && portName.equals(mapping.getSupportingPort())) {
107                     return mapping;
108                 }
109             }
110         } catch (InterruptedException | ExecutionException ex) {
111             LOG.error("Unable to get mapping list for nodeId {}", nodeId, ex);
112         }
113         return null;
114     }
115
116     @Override
117     public McCapabilities getMcCapbilities(String nodeId, String mcLcp) {
118         /*
119          * Getting physical mapping corresponding to logical connection point
120          */
121         InstanceIdentifier<McCapabilities> mcCapabilitiesIID = InstanceIdentifier.builder(Network.class)
122             .child(Nodes.class, new NodesKey(nodeId)).child(McCapabilities.class, new McCapabilitiesKey(mcLcp)).build();
123         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
124             Optional<McCapabilities> mcCapObject = readTx.read(LogicalDatastoreType.CONFIGURATION,
125                 mcCapabilitiesIID).get();
126             if (mcCapObject.isPresent()) {
127                 McCapabilities mcCap = mcCapObject.get();
128                 LOG.info("Found MC-cap for {} - {}. Mapping: {}", nodeId, mcLcp, mcCap.toString());
129                 return mcCap;
130             }
131             LOG.warn("Could not find mapping for logical connection point {} for nodeId {}", mcLcp, nodeId);
132         } catch (InterruptedException | ExecutionException ex) {
133             LOG.error("Unable to read mapping for logical connection point : {} for nodeId {}", mcLcp,
134                 nodeId, ex);
135         }
136         return null;
137     }
138
139
140     @Override
141     public void deleteMappingData(String nodeId) {
142         LOG.info("Deleting Mapping Data corresponding at node '{}'", nodeId);
143         WriteTransaction rw = this.dataBroker.newWriteOnlyTransaction();
144         InstanceIdentifier<Nodes> nodesIID = InstanceIdentifier.create(Network.class)
145             .child(Nodes.class, new NodesKey(nodeId));
146         rw.delete(LogicalDatastoreType.CONFIGURATION, nodesIID);
147         try {
148             rw.commit().get(1, TimeUnit.SECONDS);
149             LOG.info("Port mapping removal for node '{}'", nodeId);
150         } catch (InterruptedException | ExecutionException | TimeoutException e) {
151             LOG.error("Error for removing port mapping infos for node '{}'", nodeId);
152         }
153
154     }
155
156     @Override
157     public boolean updateMapping(String nodeId, Mapping oldMapping) {
158         OpenroadmNodeVersion openROADMversion = getNode(nodeId).getNodeInfo().getOpenroadmVersion();
159         switch (openROADMversion.getIntValue()) {
160             case 1:
161                 return portMappingVersion121.updateMapping(nodeId, oldMapping);
162             case 2:
163                 return portMappingVersion22.updateMapping(nodeId, oldMapping);
164             case 3:
165                 return portMappingVersion710.updateMapping(nodeId, oldMapping);
166             default:
167                 return false;
168         }
169     }
170
171     @Override
172     public Nodes getNode(String nodeId) {
173         InstanceIdentifier<Nodes> nodePortMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
174             new NodesKey(nodeId)).build();
175         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
176             Optional<Nodes> nodePortMapObject =
177                 readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortMappingIID).get();
178             if (nodePortMapObject.isPresent()) {
179                 Nodes node = nodePortMapObject.get();
180                 LOG.info("Found node {} in portmapping.", nodeId);
181                 return node;
182             }
183             LOG.warn("Could not find node {} in portmapping.", nodeId);
184         } catch (InterruptedException | ExecutionException ex) {
185             LOG.error("Unable to get node {} in portmapping", nodeId);
186         }
187         return null;
188     }
189 }