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