Merge "Fix bug when creating SRG termination points"
[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.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.rev210930.Direction;
51 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Location;
52 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.PmNamesEnum;
53 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifier;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
55 import org.opendaylight.yangtools.yang.common.Uint16;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59 final class OlmUtils221 {
60
61     private static final Logger LOG = LoggerFactory.getLogger(OlmUtils221.class);
62
63     /**
64      * This method retrieves list of current PMs for given nodeId,
65      * resourceType, resourceName and Granularity.Currently vendorExtentions
66      * are excluded but can be added back based on requirement
67      *
68      * <p>
69      * 1. pmFetch This operation traverse through current PM list and gets PM for
70      * given NodeId and Resource name
71      *
72      * @param input
73      *            Input parameter from the olm yang model get-pm rpc
74      * @param deviceTransactionManager
75      *            Device tx manager
76      *
77      * @return Result of the request list of PM readings
78      */
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         if (resourceKeyIID == null) {
88             return pmOutputBuilder;
89         }
90         CurrentPmEntryKey resourceKey = new CurrentPmEntryKey(resourceKeyIID,
91                 convertResourceTypeEnum(input.getResourceType()),"");
92         InstanceIdentifier<CurrentPmList> iidCurrentPmList = InstanceIdentifier.create(CurrentPmList.class);
93
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.get();
99             @NonNull
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(),
106                         "");
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());
113                     }
114                     if (input.getPmExtension() != null) {
115                         currentPMStream = currentPMStream.filter(pm -> pm.getExtension()
116                                 .equals(input.getPmExtension()));
117                     }
118                     if (input.getLocation() != null) {
119                         currentPMStream = currentPMStream.filter(pm -> Location.forValue(pm.getLocation()
120                                 .getIntValue())
121                                 .equals(Location.forValue(input.getLocation().getIntValue())));
122                     }
123                     if (input.getDirection() != null) {
124                         currentPMStream = currentPMStream.filter(pm -> Direction.forValue(pm.getDirection()
125                                 .getIntValue())
126                                 .equals(Direction.forValue((input.getDirection().getIntValue()))));
127                     }
128                     List<CurrentPm> filteredPMs = currentPMStream.collect(Collectors.toList());
129                     List<Measurements> measurements = extractWantedMeasurements(filteredPMs,input.getGranularity());
130                     if (measurements.isEmpty()) {
131                         LOG.error(
132                                 "No Matching PM data found for node: {}, resource type: {}, resource name: {}, "
133                                         + "pm type: {}, extention: {}, location: {} and direction: {}",
134                                 input.getNodeId(), input.getResourceType(),
135                                 getResourceIdentifierAsString(input.getResourceIdentifier()),
136                                 input.getPmNameType(),input.getPmExtension(),input.getLocation(),
137                                 input.getDirection());
138                     } else {
139                         pmOutputBuilder.setNodeId(input.getNodeId()).setResourceType(input.getResourceType())
140                                 .setResourceIdentifier(input.getResourceIdentifier()).setGranularity(input
141                                 .getGranularity())
142                                 .setMeasurements(measurements);
143                         LOG.info(
144                                 "PM data found successfully for node: {}, resource type: {}, resource name: {}, "
145                                         + "pm type: {}, extention: {}, location: {} and direction: {}",
146                                 input.getNodeId(), input.getResourceType(),
147                                 getResourceIdentifierAsString(input.getResourceIdentifier()),
148                                 input.getPmNameType(),input.getPmExtension(),input.getLocation(),
149                                 input.getDirection());
150                     }
151                 }
152             }
153         } else {
154             LOG.error("Unable to get CurrentPmList for node {}", input.getNodeId());
155         }
156         return pmOutputBuilder;
157     }
158
159     private static String getResourceIdentifierAsString(ResourceIdentifier resourceIdentifier) {
160         if (Strings.isNullOrEmpty(resourceIdentifier.getCircuitPackName())) {
161             return resourceIdentifier.getResourceName();
162         } else {
163             return resourceIdentifier.getResourceName() + ", circuit pack name: "
164                     + resourceIdentifier.getCircuitPackName();
165         }
166     }
167
168     private static List<Measurements> extractWantedMeasurements(List<CurrentPm> currentPmList,
169         org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity wantedGranularity) {
170         List<Measurements> olmMeasurements = new ArrayList<>();
171         for (CurrentPm pm : currentPmList) {
172             for (Measurement measurements: pm.nonnullMeasurement().values()) {
173                 if (measurements.getGranularity().getIntValue()
174                         == org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmGranularity.forValue(
175                         wantedGranularity.getIntValue()).getIntValue()) {
176                     MeasurementsBuilder pmMeasureBuilder = new MeasurementsBuilder();
177                     pmMeasureBuilder.setPmparameterName(pm.getType().name());
178                     pmMeasureBuilder.setPmparameterValue(measurements.getPmParameterValue().stringValue());
179                     olmMeasurements.add(pmMeasureBuilder.build());
180                 }
181             }
182         }
183         return olmMeasurements;
184     }
185
186     private static InstanceIdentifier<?> findClassKeyIdentifiers(ResourceTypeEnum wantedResourceType,
187             ResourceIdentifier wantedResourceIdentifier) {
188         if (wantedResourceIdentifier.getResourceName() == null) {
189             LOG.debug("resource {} is null", wantedResourceType);
190             return null;
191         }
192         switch (wantedResourceType) {
193             case Device:
194                 return InstanceIdentifier.create(OrgOpenroadmDevice.class);
195             case Degree:
196                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
197                         .child(Degree.class, new DegreeKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())));
198             case SharedRiskGroup:
199                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
200                         .child(SharedRiskGroup.class,
201                                 new SharedRiskGroupKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())));
202             case Connection:
203                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
204                         .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier
205                                 .getResourceName()));
206             case CircuitPack:
207                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
208                         .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()));
209             case Port:
210                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
211                         .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getCircuitPackName()))
212                         .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()));
213             case Interface:
214                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
215                         .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()));
216             case InternalLink:
217                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
218                         .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()));
219             case PhysicalLink:
220                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
221                         .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()));
222             case Shelf:
223                 return InstanceIdentifier.create(OrgOpenroadmDevice.class)
224                         .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()));
225             default:
226                 LOG.error("Unknown resource type {}", wantedResourceType);
227                 return null;
228         }
229     }
230
231     private static org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum
232         convertResourceTypeEnum(ResourceTypeEnum wantedResourceType) {
233         switch (wantedResourceType) {
234             case Device:
235                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Device;
236             case Degree:
237                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Degree;
238             case SharedRiskGroup:
239                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
240                         .ResourceTypeEnum.SharedRiskGroup;
241             case Connection:
242                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
243                         .ResourceTypeEnum.Connection;
244             case CircuitPack:
245                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
246                         .ResourceTypeEnum.CircuitPack;
247             case Port:
248                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Port;
249             case Interface:
250                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
251                         .ResourceTypeEnum.Interface;
252             case InternalLink:
253                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
254                         .ResourceTypeEnum.InternalLink;
255             case PhysicalLink:
256                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
257                         .ResourceTypeEnum.PhysicalLink;
258             case Shelf:
259                 return org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Shelf;
260             default:
261                 LOG.error("Unknown resource type {}", wantedResourceType);
262                 return null;
263         }
264     }
265
266     private OlmUtils221() {
267     }
268
269 }