2 * Copyright © 2020 AT&T and others. All rights reserved.
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
8 package org.opendaylight.transportpce.olm.util;
10 import com.google.common.base.Strings;
11 import java.util.ArrayList;
12 import java.util.List;
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.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;
61 final class OlmUtils710 {
63 private static final Logger LOG = LoggerFactory.getLogger(OlmUtils710.class);
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
71 * 1. pmFetch This operation traverse through current PM list and gets PM for
72 * given NodeId and Resource name
75 * Input parameter from the olm yang model get-pm rpc
76 * @param deviceTransactionManager
79 * @return Result of the request list of PM readings
81 public static GetPmOutputBuilder pmFetch(GetPmInput input, DeviceTransactionManager deviceTransactionManager) {
82 LOG.info("Getting PM Data for 7.1.0 NodeId: {} ResourceType: {} ResourceName: {}", input.getNodeId(),
83 input.getResourceType(), input.getResourceIdentifier());
85 GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder();
87 InstanceIdentifier<?> resourceKeyIID =
88 findClassKeyIdentifiers(input.getResourceType(), input.getResourceIdentifier());
89 CurrentPmEntryKey resourceKey = new CurrentPmEntryKey(resourceKeyIID,
90 convertResourceTypeEnum(input.getResourceType()), "");
92 InstanceIdentifier<CurrentPmList> iidCurrentPmList = InstanceIdentifier.create(CurrentPmList.class);
94 Optional<CurrentPmList> currentPmListOpt = deviceTransactionManager.getDataFromDevice(input.getNodeId(),
95 LogicalDatastoreType.OPERATIONAL, iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT,
96 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
97 if (currentPmListOpt.isPresent()) {
98 CurrentPmList currentPmList = currentPmListOpt.orElseThrow();
100 Map<CurrentPmEntryKey, CurrentPmEntry> currentPmEntryList = currentPmList.nonnullCurrentPmEntry();
101 LOG.info("Current PM list exists for node {} and contains {} entries.", input.getNodeId(),
102 currentPmEntryList.size());
103 for (Map.Entry<CurrentPmEntryKey, CurrentPmEntry> entry : currentPmEntryList.entrySet()) {
104 CurrentPmEntry cpe = entry.getValue();
105 CurrentPmEntryKey cpek = new CurrentPmEntryKey(cpe.getPmResourceInstance(), cpe.getPmResourceType(),
107 if (resourceKey.equals(cpek)) {
108 List<CurrentPm> currentPMList = new ArrayList<>(cpe.nonnullCurrentPm().values());
109 Stream<CurrentPm> currentPMStream = currentPMList.stream();
110 if (input.getPmNameType() != null) {
111 currentPMStream = currentPMStream.filter(pm -> pm.getType().getIntValue()
112 == PmNamesEnum.forValue(input.getPmNameType().getIntValue()).getIntValue());
114 if (input.getPmExtension() != null) {
115 currentPMStream = currentPMStream.filter(pm -> pm.getExtension()
116 .equals(input.getPmExtension()));
118 if (input.getLocation() != null) {
119 currentPMStream = currentPMStream.filter(pm -> Location.forValue(pm.getLocation().getIntValue())
120 .equals(Location.forValue(input.getLocation().getIntValue())));
122 if (input.getDirection() != null) {
123 currentPMStream = currentPMStream.filter(pm -> Direction.forValue(pm.getDirection()
125 .equals(Direction.forValue((input.getDirection().getIntValue()))));
127 List<CurrentPm> filteredPMs = currentPMStream.collect(Collectors.toList());
128 List<Measurements> measurements = extractWantedMeasurements(filteredPMs,input.getGranularity());
129 if (measurements.isEmpty()) {
131 "No Matching PM data found for node: {}, resource type: {}, resource name: {}, "
132 + "pm type: {}, extention: {}, location: {} and direction: {}",
133 input.getNodeId(), input.getResourceType(),
134 getResourceIdentifierAsString(input.getResourceIdentifier()),
135 input.getPmNameType(),input.getPmExtension(),input.getLocation(),
136 input.getDirection());
138 pmOutputBuilder.setNodeId(input.getNodeId()).setResourceType(input.getResourceType())
139 .setResourceIdentifier(input.getResourceIdentifier()).setGranularity(input
140 .getGranularity()).setMeasurements(measurements);
142 "PM data found successfully for node: {}, resource type: {}, resource name: {}, "
143 + "pm type: {}, extention: {}, location: {} and direction: {}",
144 input.getNodeId(), input.getResourceType(),
145 getResourceIdentifierAsString(input.getResourceIdentifier()),
146 input.getPmNameType(),input.getPmExtension(),input.getLocation(),
147 input.getDirection());
152 LOG.error("Unable to get CurrentPmList for node {}", input.getNodeId());
154 return pmOutputBuilder;
157 private static String getResourceIdentifierAsString(ResourceIdentifier resourceIdentifier) {
158 if (Strings.isNullOrEmpty(resourceIdentifier.getCircuitPackName())) {
159 return resourceIdentifier.getResourceName();
161 return resourceIdentifier.getResourceName() + ", circuit pack name: "
162 + resourceIdentifier.getCircuitPackName();
166 private static List<Measurements> extractWantedMeasurements(List<CurrentPm> currentPmList,
167 PmGranularity wantedGranularity) {
168 List<Measurements> olmMeasurements = new ArrayList<>();
169 for (CurrentPm pm : currentPmList) {
170 for (Measurement measurements: pm.nonnullMeasurement().values()) {
171 if (measurements.getGranularity().getIntValue() == org.opendaylight.yang.gen.v1.http.org.openroadm.pm
172 .types.rev171215.PmGranularity.forValue(wantedGranularity.getIntValue()).getIntValue()) {
173 MeasurementsBuilder pmMeasureBuilder = new MeasurementsBuilder();
174 pmMeasureBuilder.setPmparameterName(pm.getType().name());
175 pmMeasureBuilder.setPmparameterValue(measurements.getPmParameterValue().stringValue());
176 olmMeasurements.add(pmMeasureBuilder.build());
180 return olmMeasurements;
183 private static InstanceIdentifier<?> findClassKeyIdentifiers(ResourceTypeEnum wantedResourceType,
184 ResourceIdentifier wantedResourceIdentifier) {
185 switch (wantedResourceType) {
187 return InstanceIdentifier
188 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
191 return InstanceIdentifier
192 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
193 .child(Degree.class, new DegreeKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())))
195 case SharedRiskGroup:
196 return InstanceIdentifier
197 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
199 SharedRiskGroup.class,
200 new SharedRiskGroupKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())))
203 return InstanceIdentifier
204 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
205 .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier.getResourceName()))
208 return InstanceIdentifier
209 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
210 .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()))
213 return InstanceIdentifier
214 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
215 .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getCircuitPackName()))
216 .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()))
219 return InstanceIdentifier
220 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
221 .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()))
224 return InstanceIdentifier
225 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
226 .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()))
229 return InstanceIdentifier
230 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
231 .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()))
234 return InstanceIdentifier
235 .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
236 .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()))
239 LOG.error("Unknown resource type {}", wantedResourceType);
244 private static org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129.ResourceTypeEnum
245 convertResourceTypeEnum(ResourceTypeEnum wantedResourceType) {
246 switch (wantedResourceType) {
248 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129.ResourceTypeEnum.Device;
250 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129.ResourceTypeEnum.Degree;
251 case SharedRiskGroup:
252 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129
253 .ResourceTypeEnum.SharedRiskGroup;
255 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129
256 .ResourceTypeEnum.Connection;
258 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129
259 .ResourceTypeEnum.CircuitPack;
261 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129.ResourceTypeEnum.Port;
263 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129
264 .ResourceTypeEnum.Interface;
266 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129
267 .ResourceTypeEnum.InternalLink;
269 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129
270 .ResourceTypeEnum.PhysicalLink;
272 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129.ResourceTypeEnum.Shelf;
274 LOG.error("Unknown resource type {}", wantedResourceType);
279 private OlmUtils710() {