658c507cd0237419ffe69cf35232f3df84545059
[ccsdk/features.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  *
21  */
22 package org.onap.ccsdk.features.sdnr.wt.devicemanager.openroadm71.impl;
23
24 import java.net.URL;
25 import java.util.ArrayList;
26 import java.util.Collection;
27 import java.util.Enumeration;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31 import org.onap.ccsdk.features.sdnr.wt.common.YangHelper;
32 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
33 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev200529.HistoricalPmList;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev200529.historical.pm.group.HistoricalPm;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev200529.historical.pm.list.HistoricalPmEntry;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev200529.historical.pm.val.group.Measurement;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev200327.PmDataType;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev200327.PmGranularity;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev200327.PmNamesEnum;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.g836.pm.types.rev200413.ErroredSecond;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.g836.pm.types.rev200413.SeverelyErroredSecond;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.openroadm.pm.types.rev200413.PerformanceMeasurementTypeId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GranularityPeriodType;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntity;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntityBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.entity.PerformanceDataBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.grp.MeasurementBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.grp.MeasurementKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.units.rev200413.Celsius;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.units.rev200413.DB;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.units.rev200413.DBm;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.units.rev200413.Fahrenheit;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.units.rev200413.KHz;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.units.rev200413.MW;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.units.rev200413.PerformanceMeasurementUnitId;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.osgi.framework.Bundle;
59 import org.osgi.framework.BundleContext;
60 import org.osgi.framework.FrameworkUtil;
61 import org.slf4j.Logger;
62 import org.slf4j.LoggerFactory;
63
64 /**
65  * @author shabnam
66  *
67  *         Reading Openroadm PM data and returning as PmDataEntitiy data
68  */
69 public class PmDataBuilderOpenRoadm {
70     // variables
71     private static final Logger log = LoggerFactory.getLogger(PmDataBuilderOpenRoadm.class);
72     private PmdataEntityBuilder pmDataBuilder;
73     private Bundle b = FrameworkUtil.getBundle(this.getClass());
74
75     // end of variables
76     // constructors
77     public PmDataBuilderOpenRoadm(NetconfBindingAccessor accessor) {
78         this.pmDataBuilder = new PmdataEntityBuilder();
79         this.pmDataBuilder.setNodeName(accessor.getNodeId().getValue());
80     }
81
82     // end of constructors
83     // public methods
84     // Read PM data
85     public HistoricalPmList getPmData(NetconfBindingAccessor accessor) {
86         final Class<HistoricalPmList> pmDataClass = HistoricalPmList.class;
87         log.info("Get PM data for element {}", accessor.getNodeId().getValue());
88         InstanceIdentifier<HistoricalPmList> pmDataIid = InstanceIdentifier.builder(pmDataClass).build();
89         return accessor.getTransactionUtils().readData(accessor.getDataBroker(), LogicalDatastoreType.OPERATIONAL,
90                 pmDataIid);
91
92     }
93
94     // Build PM entity for writing into the database
95     public List<PmdataEntity> buildPmDataEntity(HistoricalPmList historicalPmEnitityList) {
96         List<PmdataEntity> pmEntitiyList = new ArrayList<>();
97         if (historicalPmEnitityList == null) {
98             return pmEntitiyList;
99         }
100         Collection<HistoricalPmEntry> pmDataEntryList =
101                 YangHelper.getCollection(historicalPmEnitityList.getHistoricalPmEntry());
102         for (HistoricalPmEntry pmDataEntry : pmDataEntryList) {
103             pmDataBuilder.setUuidInterface(pmDataEntry.getPmResourceType().getName());
104             Collection<HistoricalPm> historicalPmList = YangHelper.getCollection(pmDataEntry.getHistoricalPm());
105             for (HistoricalPm historicalPm : historicalPmList) {
106                 log.info("PmName:{}", historicalPm.getType());
107                 //              pmDataBuilder.setPerformanceData(value)
108
109                 try {
110                     writeperformanceData(historicalPm);
111                 } catch (ClassNotFoundException e) {
112                     log.info("No relevant data found");
113                 }
114                 pmEntitiyList.add(this.pmDataBuilder.build());
115
116                 log.info("PmListSize before db writing: {}", pmEntitiyList.size());
117             }
118             log.info("PmListSize before db writing: {}", pmEntitiyList.size());
119         }
120         return pmEntitiyList;
121     }
122     // end of public methods
123
124     // private methods
125     private void writeperformanceData(HistoricalPm historicalPm) throws ClassNotFoundException {
126         Collection<Measurement> measurementList = YangHelper.getCollection(historicalPm.getMeasurement());
127         Map<MeasurementKey, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.grp.Measurement> measurementMap =
128                 new HashMap<>();
129         // Map Performance data of PmDataEntity with MeasurmentData-HistoricalPm
130         PerformanceDataBuilder performanceDataBuilder = new PerformanceDataBuilder();
131         for (Measurement measurementData : measurementList) {
132             this.pmDataBuilder.setGranularityPeriod(mapGranularityPeriod(measurementData.getGranularity()))
133                     .setTimeStamp(measurementData.getCompletionTime());
134             if (measurementData.getValidity().getName().equals("suspect")) {
135                 this.pmDataBuilder.setSuspectIntervalFlag(true);
136             }
137             measurementMap.put(
138                     new MeasurementKey(measurementBuilder(historicalPm.getType(), measurementData.getPmParameterUnit(),
139                             measurementData.getPmParameterValue()).getPmKey()),
140                     measurementBuilder(historicalPm.getType(), measurementData.getPmParameterUnit(),
141                             measurementData.getPmParameterValue()));
142
143
144         }
145
146         pmDataBuilder.setPerformanceData(performanceDataBuilder.setMeasurement(measurementMap).build());
147     }
148
149
150
151     // Mapping Granularity period of PmDataEntity with PmGranularity of MeasurmentData-HistoricalPm
152     private GranularityPeriodType mapGranularityPeriod(PmGranularity pmGranularity) {
153         return this.mapGranularityPeriod(pmGranularity.getName());
154     }
155
156     private GranularityPeriodType mapGranularityPeriod(String pmGranularity) {
157
158         GranularityPeriodType granPeriod = null;
159         switch (pmGranularity) {
160             case ("notApplicable"):
161                 granPeriod = GranularityPeriodType.Unknown;
162                 break;
163             case ("15min"):
164                 granPeriod = GranularityPeriodType.Period15Min;
165                 break;
166             case ("24Hour"):
167                 granPeriod = GranularityPeriodType.Period24Hours;
168                 break;
169             default:
170                 granPeriod = GranularityPeriodType.Period15Min;
171                 break;
172         }
173         return granPeriod;
174     }
175
176     private List<Class<? extends PerformanceMeasurementTypeId>> setMeasurementTypeId() {
177         String packageName =
178                 "org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.openroadm.pm.types.rev200413";
179         String packageName1 =
180                 "/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/data/provider/openroadm/pm/types/rev200413/";
181         List<Class<? extends PerformanceMeasurementTypeId>> measTypeObjList = new ArrayList<>();
182         URL root = Thread.currentThread().getContextClassLoader().getResource(packageName1);
183
184         log.info("path for type package: {}", root);
185
186         Enumeration<URL> results = getFileURL(b, packageName);
187         log.info("FOund Packages {}", results);
188         if (results != null) {
189             while (results.hasMoreElements()) {
190                 URL path = results.nextElement();
191
192                 Class<?> cls1 = loadClass(b, path.getFile());
193
194                 if (PerformanceMeasurementTypeId.class.isAssignableFrom(cls1)) {
195                     measTypeObjList.add((Class<? extends PerformanceMeasurementTypeId>) cls1);
196
197
198                 }
199                 if (cls1 != null) {
200                     log.info("Class Added {}", cls1.getSimpleName());
201                 }
202
203             }
204
205
206         }
207
208         return measTypeObjList;
209     }
210
211     private Class<? extends PerformanceMeasurementUnitId> setMeasurementUnit(String unitName) {
212         Class<? extends PerformanceMeasurementUnitId> measurementUnitClass = null;
213         switch (unitName) {
214             case ("celsius"):
215                 measurementUnitClass = Celsius.class;
216                 break;
217             case ("dB"):
218                 measurementUnitClass = DB.class;
219                 break;
220             case ("dBm"):
221                 measurementUnitClass = DBm.class;
222                 break;
223             case ("fahrenheit"):
224                 measurementUnitClass = Fahrenheit.class;
225                 break;
226             case ("kHz"):
227                 measurementUnitClass = KHz.class;
228                 break;
229             case ("mW"):
230                 measurementUnitClass = MW.class;
231                 break;
232             default:
233                 break;
234         }
235         return measurementUnitClass;
236     }
237
238     private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.grp.Measurement measurementBuilder(
239             PmNamesEnum pmType, String pmUnit, PmDataType pmDataType) {
240
241         MeasurementBuilder measBuilder = new MeasurementBuilder();
242         if (pmType.getName().equals("erroredSeconds")) {
243             measBuilder.setPmKey(ErroredSecond.class);
244         } else if (pmType.getName().equals("severelyErroredSeconds")) {
245             measBuilder.setPmKey(SeverelyErroredSecond.class);
246         } else {
247             for (Class<? extends PerformanceMeasurementTypeId> obj : setMeasurementTypeId()) {
248                 if (obj.toString().contains(pmType.name())) {
249                     measBuilder.setPmKey(obj);
250                 }
251             }
252         }
253         measBuilder.setPmUnit(setMeasurementUnit(pmUnit));
254         measBuilder.setPmValue(new org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev191129.PmDataType(
255                 pmDataType.getDecimal64()));
256         return measBuilder.build();
257
258     }
259
260     private Class<?> loadClass(Bundle bundle, String classFilePath) {
261         String className = classFilePath.replaceFirst("^/", "").replace('/', '.').replaceFirst(".class$", "");
262         try {
263             return bundle.loadClass(className);
264         } catch (Exception e) {
265             log.info(String.format("Class [%s] could not be loaded. Message: [%s].", className, e.getMessage()));
266         }
267         return null;
268     }
269
270     private static Enumeration<URL> getFileURL(Bundle b, String classPath) {
271
272         BundleContext context = b == null ? null : b.getBundleContext();
273         if (context == null) {
274             log.info("no bundle context available");
275             return null;
276         }
277         Bundle[] bundles = context.getBundles();
278         if (bundles == null || bundles.length <= 0) {
279             log.info("no bundles found");
280             return null;
281         }
282         log.info("found {} bundles", bundles.length);
283         Enumeration<URL> resultUrl = null;
284
285         for (Bundle bundle : bundles) {
286             resultUrl = bundle.findEntries("/" + classPath.replace(".", "/"), "*.class", false);
287             if (resultUrl != null) {
288                 break;
289
290             }
291
292         }
293
294         return resultUrl;
295     }
296
297
298     // end of private methods
299 }
300