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