2 * Copyright © 2017 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;
13 import java.util.Optional;
14 import java.util.stream.Collectors;
15 import java.util.stream.Stream;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.controller.md.sal.common.api.data.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;
58 final class OlmUtils22 {
60 private static final Logger LOG = LoggerFactory.getLogger(OlmUtils22.class);
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
68 * 1. pmFetch This operation traverse through current PM list and gets PM for
69 * given NodeId and Resource name
72 * Input parameter from the olm yang model get-pm rpc
73 * @param deviceTransactionManager
76 * @return Result of the request list of PM readings
78 public static GetPmOutputBuilder pmFetch(GetPmInput input, DeviceTransactionManager deviceTransactionManager) {
79 LOG.info("Getting PM Data for 2.2.1 NodeId: {} ResourceType: {} ResourceName: {}", input.getNodeId(),
80 input.getResourceType(), input.getResourceIdentifier());
82 GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder();
84 InstanceIdentifier<?> resourceKeyIID =
85 findClassKeyIdentifiers(input.getResourceType(), input.getResourceIdentifier());
86 CurrentPmEntryKey resourceKey = new CurrentPmEntryKey(resourceKeyIID,
87 convertResourceTypeEnum(input.getResourceType()), "");
89 InstanceIdentifier<CurrentPmList> iidCurrentPmList = InstanceIdentifier.create(CurrentPmList.class);
91 Optional<CurrentPmList> currentPmListOpt = deviceTransactionManager.getDataFromDevice(input.getNodeId(),
92 LogicalDatastoreType.OPERATIONAL, iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT,
93 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
94 if (currentPmListOpt.isPresent()) {
95 CurrentPmList currentPmList = currentPmListOpt.get();
98 List<CurrentPmEntry> currentPmEntryList = currentPmList.getCurrentPmEntry();
99 LOG.info("Current PM list exists for node {} and contains {} entries.", input.getNodeId(),
100 currentPmEntryList.size());
101 for (CurrentPmEntry cpe : currentPmEntryList) {
102 CurrentPmEntryKey cpek = new CurrentPmEntryKey(cpe.getPmResourceInstance(), cpe.getPmResourceType(),
103 cpe.getPmResourceTypeExtension());
104 if (resourceKey.equals(cpek)) {
105 List<CurrentPm> currentPMList = cpe.getCurrentPm();
106 Stream<CurrentPm> currentPMStream = currentPMList.stream();
107 if (input.getPmNameType() != null) {
108 currentPMStream = currentPMStream.filter(pm -> pm.getType().getIntValue()
109 == PmNamesEnum.forValue(input.getPmNameType().getIntValue()).getIntValue());
111 if (input.getPmExtension() != null) {
112 currentPMStream = currentPMStream.filter(pm -> pm.getExtension()
113 .equals(input.getPmExtension()));
115 if (input.getLocation() != null) {
116 currentPMStream = currentPMStream.filter(pm -> pm.getLocation()
117 .equals(Location.forValue(input.getLocation().getIntValue())));
119 if (input.getDirection() != null) {
120 currentPMStream = currentPMStream.filter(pm -> pm.getDirection()
121 .equals(Direction.forValue((input.getDirection().getIntValue()))));
123 List<CurrentPm> filteredPMs = currentPMStream.collect(Collectors.toList());
124 List<Measurements> measurements = extractWantedMeasurements(filteredPMs,input.getGranularity());
125 if (measurements.isEmpty()) {
126 LOG.error("No Matching PM data found for node: {}, " + "resource type: {},"
127 + " resource name: {}, pm type: {}, extention: {}"
128 + ", location: {} and direction: {}",
129 input.getNodeId(), input.getResourceType(),
130 getResourceIdentifierAsString(input.getResourceIdentifier()),
131 input.getPmNameType(),input.getPmExtension(),input.getLocation(),
132 input.getDirection());
134 pmOutputBuilder.setNodeId(input.getNodeId()).setResourceType(input.getResourceType())
135 .setResourceIdentifier(input.getResourceIdentifier()).setGranularity(input.getGranularity())
136 .setMeasurements(measurements);
137 LOG.info("PM data found successfully for node: {}, " + "resource type: {},"
138 + " resource name: {}, pm type: {}, extention: {}"
139 + ", location: {} and direction: {}",
140 input.getNodeId(), input.getResourceType(),
141 getResourceIdentifierAsString(input.getResourceIdentifier()),
142 input.getPmNameType(),input.getPmExtension(),input.getLocation(),
143 input.getDirection());
148 LOG.error("Unable to get CurrentPmList for node {}", input.getNodeId());
150 return pmOutputBuilder;
153 private static String getResourceIdentifierAsString(ResourceIdentifier resourceIdentifier) {
154 if (Strings.isNullOrEmpty(resourceIdentifier.getCircuitPackName())) {
155 return resourceIdentifier.getResourceName();
157 return resourceIdentifier.getResourceName() + ", circuit pack name: "
158 + resourceIdentifier.getCircuitPackName();
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());
176 return olmMeasurements;
179 private static InstanceIdentifier<?> findClassKeyIdentifiers(ResourceTypeEnum wantedResourceType,
180 ResourceIdentifier wantedResourceIdentifier) {
181 switch (wantedResourceType) {
183 return InstanceIdentifier.create(OrgOpenroadmDevice.class);
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())));
192 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
193 .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier.getResourceName()));
195 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
196 .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()));
198 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
199 .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getCircuitPackName()))
200 .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()));
202 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
203 .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()));
205 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
206 .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()));
208 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
209 .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()));
211 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
212 .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()));
214 LOG.error("Unknown resource type {}", wantedResourceType);
219 private static org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum
220 convertResourceTypeEnum(ResourceTypeEnum wantedResourceType) {
221 switch (wantedResourceType) {
223 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Device;
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;
230 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
231 .ResourceTypeEnum.Connection;
233 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
234 .ResourceTypeEnum.CircuitPack;
236 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Port;
238 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
239 .ResourceTypeEnum.Interface;
241 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
242 .ResourceTypeEnum.InternalLink;
244 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
245 .ResourceTypeEnum.PhysicalLink;
247 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Shelf;
249 LOG.error("Unknown resource type {}", wantedResourceType);
254 private OlmUtils22() {