c4aa15d8a4f21fb6327f470e3940f23cfb46369f
[transportpce.git] / olm / src / main / java / org / opendaylight / transportpce / olm / util / OlmUtils22.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 package org.opendaylight.transportpce.olm.util;
9
10 import com.google.common.base.Strings;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Optional;
14 import java.util.stream.Collectors;
15 import java.util.stream.Stream;
16
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
19 import org.opendaylight.transportpce.common.Timeouts;
20 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.GetPmInput;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.GetPmOutputBuilder;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.get.pm.output.Measurements;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.get.pm.output.MeasurementsBuilder;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.PortsKey;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacksKey;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.internal.links.InternalLink;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.internal.links.InternalLinkKey;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.Degree;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.DegreeKey;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.SharedRiskGroup;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.SharedRiskGroupKey;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.physical.links.PhysicalLink;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.physical.links.PhysicalLinkKey;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.shelves.Shelves;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.shelves.ShelvesKey;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.CurrentPmList;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.group.CurrentPm;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.list.CurrentPmEntry;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.list.CurrentPmEntryKey;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.val.group.Measurement;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
50 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev170907.Direction;
51 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev170907.Location;
52 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev170907.PmNamesEnum;
53 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev170907.olm.get.pm.input.ResourceIdentifier;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58 final class OlmUtils22 {
59
60     private static final Logger LOG = LoggerFactory.getLogger(OlmUtils22.class);
61
62     /**
63      * This method retrieves list of current PMs for given nodeId,
64      * resourceType, resourceName and Granularity.Currently vendorExtentions
65      * are excluded but can be added back based on requirement
66      *
67      * <p>
68      * 1. pmFetch This operation traverse through current PM list and gets PM for
69      * given NodeId and Resource name
70      *
71      * @param input
72      *            Input parameter from the olm yang model get-pm rpc
73      * @param deviceTransactionManager
74      *            Device tx manager
75      *
76      * @return Result of the request list of PM readings
77      */
78     //LOG.info message length is >120 char and can be difficultly shortened
79     @SuppressWarnings("checkstyle:linelength")
80     public static GetPmOutputBuilder pmFetch(GetPmInput input, DeviceTransactionManager deviceTransactionManager) {
81         LOG.info("Getting PM Data for 2.2.1 NodeId: {} ResourceType: {} ResourceName: {}", input.getNodeId(),
82             input.getResourceType(), input.getResourceIdentifier());
83
84         GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder();
85
86         InstanceIdentifier<?> resourceKeyIID =
87             findClassKeyIdentifiers(input.getResourceType(), input.getResourceIdentifier());
88         CurrentPmEntryKey resourceKey = new CurrentPmEntryKey(resourceKeyIID,
89             convertResourceTypeEnum(input.getResourceType()), "");
90
91         InstanceIdentifier<CurrentPmList> iidCurrentPmList = InstanceIdentifier.create(CurrentPmList.class);
92
93         Optional<CurrentPmList> currentPmListOpt = deviceTransactionManager.getDataFromDevice(input.getNodeId(),
94             LogicalDatastoreType.OPERATIONAL, iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT,
95             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
96         if (currentPmListOpt.isPresent()) {
97             CurrentPmList  currentPmList = currentPmListOpt.get();
98
99             @Nullable
100             List<CurrentPmEntry> currentPmEntryList = currentPmList.getCurrentPmEntry();
101             LOG.info("Current PM list exists for node {} and contains {} entries.", input.getNodeId(),
102                 currentPmEntryList.size());
103             for (CurrentPmEntry cpe : currentPmEntryList) {
104                 CurrentPmEntryKey cpek = new CurrentPmEntryKey(cpe.getPmResourceInstance(), cpe.getPmResourceType(),
105                     cpe.getPmResourceTypeExtension());
106                 if (resourceKey.equals(cpek)) {
107                     List<CurrentPm> currentPMList = cpe.getCurrentPm();
108                     Stream<CurrentPm> currentPMStream = currentPMList.stream();
109                     if (input.getPmNameType() != null) {
110                         currentPMStream = currentPMStream.filter(pm -> pm.getType().getIntValue()
111                             == PmNamesEnum.forValue(input.getPmNameType().getIntValue()).getIntValue());
112                     }
113                     if (input.getPmExtension() != null) {
114                         currentPMStream = currentPMStream.filter(pm -> pm.getExtension()
115                             .equals(input.getPmExtension()));
116                     }
117                     if (input.getLocation() != null) {
118                         currentPMStream = currentPMStream.filter(pm -> pm.getLocation()
119                             .equals(Location.forValue(input.getLocation().getIntValue())));
120                     }
121                     if (input.getDirection() != null) {
122                         currentPMStream = currentPMStream.filter(pm -> pm.getDirection()
123                             .equals(Direction.forValue((input.getDirection().getIntValue()))));
124                     }
125                     List<CurrentPm> filteredPMs = currentPMStream.collect(Collectors.toList());
126                     List<Measurements> measurements = extractWantedMeasurements(filteredPMs,input.getGranularity());
127                     if (measurements.isEmpty()) {
128                         LOG.error(
129                             "No Matching PM data found for node: {}, resource type: {}, resource name: {}, pm type: {}, extention: {}, location: {} and direction: {}",
130                             input.getNodeId(), input.getResourceType(),
131                             getResourceIdentifierAsString(input.getResourceIdentifier()),
132                             input.getPmNameType(),input.getPmExtension(),input.getLocation(),
133                             input.getDirection());
134                     } else {
135                         pmOutputBuilder.setNodeId(input.getNodeId()).setResourceType(input.getResourceType())
136                             .setResourceIdentifier(input.getResourceIdentifier()).setGranularity(input.getGranularity())
137                             .setMeasurements(measurements);
138                         LOG.info(
139                             "PM data found successfully for node: {}, resource type: {}, resource name: {}, pm type: {}, extention: {}, location: {} and direction: {}",
140                             input.getNodeId(), input.getResourceType(),
141                             getResourceIdentifierAsString(input.getResourceIdentifier()),
142                             input.getPmNameType(),input.getPmExtension(),input.getLocation(),
143                             input.getDirection());
144                     }
145                 }
146             }
147         } else {
148             LOG.error("Unable to get CurrentPmList for node {}", input.getNodeId());
149         }
150         return pmOutputBuilder;
151     }
152
153     private static String getResourceIdentifierAsString(ResourceIdentifier resourceIdentifier) {
154         if (Strings.isNullOrEmpty(resourceIdentifier.getCircuitPackName())) {
155             return resourceIdentifier.getResourceName();
156         } else {
157             return resourceIdentifier.getResourceName() + ", circuit pack name: "
158                 + resourceIdentifier.getCircuitPackName();
159         }
160     }
161
162     private static List<Measurements> extractWantedMeasurements(List<CurrentPm> currentPmList,
163         org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity wantedGranularity) {
164         List<Measurements> olmMeasurements = new ArrayList<>();
165         for (CurrentPm pm : currentPmList) {
166             for (Measurement measurements: pm.getMeasurement()) {
167                 if (measurements.getGranularity().getIntValue() == org.opendaylight.yang.gen.v1.http.org.openroadm.pm
168                     .types.rev171215.PmGranularity.forValue(wantedGranularity.getIntValue()).getIntValue()) {
169                     MeasurementsBuilder pmMeasureBuilder = new MeasurementsBuilder();
170                     pmMeasureBuilder.setPmparameterName(pm.getType().name());
171                     pmMeasureBuilder.setPmparameterValue(measurements.getPmParameterValue().stringValue());
172                     olmMeasurements.add(pmMeasureBuilder.build());
173                 }
174             }
175         }
176         return olmMeasurements;
177     }
178
179     private static InstanceIdentifier<?> findClassKeyIdentifiers(ResourceTypeEnum wantedResourceType,
180         ResourceIdentifier wantedResourceIdentifier) {
181         switch (wantedResourceType) {
182             case Device:
183                 return InstanceIdentifier.create(OrgOpenroadmDevice.class);
184             case Degree:
185                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
186                     .child(Degree.class, new DegreeKey(Integer.parseInt(wantedResourceIdentifier.getResourceName())));
187             case SharedRiskGroup:
188                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
189                     .child(SharedRiskGroup.class,
190                         new SharedRiskGroupKey(Integer.parseInt(wantedResourceIdentifier.getResourceName())));
191             case Connection:
192                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
193                     .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier.getResourceName()));
194             case CircuitPack:
195                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
196                     .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()));
197             case Port:
198                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
199                     .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getCircuitPackName()))
200                     .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()));
201             case Interface:
202                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
203                     .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()));
204             case InternalLink:
205                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
206                     .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()));
207             case PhysicalLink:
208                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
209                     .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()));
210             case Shelf:
211                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
212                     .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()));
213             default:
214                 LOG.error("Unknown resource type {}", wantedResourceType);
215                 return null;
216         }
217     }
218
219     private static org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum
220         convertResourceTypeEnum(ResourceTypeEnum wantedResourceType) {
221         switch (wantedResourceType) {
222             case Device:
223                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Device;
224             case Degree:
225                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Degree;
226             case SharedRiskGroup:
227                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
228                     .ResourceTypeEnum.SharedRiskGroup;
229             case Connection:
230                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
231                     .ResourceTypeEnum.Connection;
232             case CircuitPack:
233                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
234                     .ResourceTypeEnum.CircuitPack;
235             case Port:
236                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Port;
237             case Interface:
238                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
239                     .ResourceTypeEnum.Interface;
240             case InternalLink:
241                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
242                     .ResourceTypeEnum.InternalLink;
243             case PhysicalLink:
244                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
245                     .ResourceTypeEnum.PhysicalLink;
246             case Shelf:
247                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Shelf;
248             default:
249                 LOG.error("Unknown resource type {}", wantedResourceType);
250                 return null;
251         }
252     }
253
254     private OlmUtils22() {
255     }
256
257 }