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