09baa377599a7e148f354d7ce11f21e6d03887a8
[ccsdk/features.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Update Copyright (C) 2021 Samsung Electronics Intellectual Property. All rights reserved.
9  * ================================================================================
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *     http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * ============LICENSE_END=========================================================
22  *
23  */
24 package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.entity;
25
26 import java.sql.SQLException;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.Date;
30 import java.util.List;
31 import org.mariadb.jdbc.Driver;
32 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
33 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
34 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBConfig;
35 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
36 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriter;
37 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriterFault;
38 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriterInventory;
39 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriterPm;
40 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
41 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
42 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CmlogEntity;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionLogStatus;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogEntity;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GranularityPeriodType;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntity;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInputBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterBuilder;
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
60
61 /**
62  * Event service, writing all events into the database into the appropriate index.
63  *
64  * @author herbert
65  */
66 public class HtDatabaseEventsService implements DataProvider {
67     private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
68
69     private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter();;
70
71     protected final SqlDBClient dbClient;
72     protected String controllerId;
73     protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data> connectionlogRW;
74     protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data> eventlogRW;
75     protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data> eventRWFaultLog;
76     protected final SqlDBReaderWriterFault<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.Data> eventRWFaultCurrent;
77     protected final SqlDBReaderWriterInventory<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data> equipmentRW;
78     protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data> guicutthroughRW;
79     protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data> networkelementConnectionRW;
80     protected final SqlDBReaderWriterPm<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data> pm15mRW;
81     protected final SqlDBReaderWriterPm<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data> pm24hRW;
82     protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.cmlog.list.output.Data> eventRWCMLog;
83     protected final String controllerTableName;
84
85     public HtDatabaseEventsService(SqlDBConfig config) {
86         LOG.debug("Creating dummy instance of org.mariadb.jdbc.Driver");
87         @SuppressWarnings("unused")
88         Driver dvr = new org.mariadb.jdbc.Driver();
89         dvr = null;
90         this.controllerId = config.getControllerId();
91         this.controllerTableName = SqlDBMapper.TABLENAME_CONTROLLER + config.getDbSuffix();
92         this.dbClient = new SqlDBClient(config.getUrl(), config.getUsername(), config.getPassword());
93         this.connectionlogRW = new SqlDBReaderWriter<>(dbClient, Entity.Connectionlog, config.getDbSuffix(),
94                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data.class,
95                 this.controllerId);
96         this.eventlogRW = new SqlDBReaderWriter<>(dbClient, Entity.Eventlog, config.getDbSuffix(),
97                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data.class,
98                 this.controllerId);
99         this.eventRWFaultLog = new SqlDBReaderWriter<>(dbClient, Entity.Faultlog, config.getDbSuffix(),
100                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data.class,
101                 this.controllerId);
102         this.eventRWFaultCurrent = new SqlDBReaderWriterFault<>(dbClient, Entity.Faultcurrent, config.getDbSuffix(),
103                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.Data.class,
104                 this.controllerId);
105         this.equipmentRW = new SqlDBReaderWriterInventory<>(dbClient, Entity.Inventoryequipment, config.getDbSuffix(),
106                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data.class,
107                 this.controllerId);
108         this.guicutthroughRW = new SqlDBReaderWriter<>(dbClient,
109                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity.Guicutthrough,
110                 config.getDbSuffix(),
111                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data.class,
112                 this.controllerId).setWriteInterface(Guicutthrough.class);
113         this.networkelementConnectionRW = new SqlDBReaderWriter<>(dbClient, Entity.NetworkelementConnection,
114                 config.getDbSuffix(),
115                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data.class,
116                 this.controllerId);
117         this.networkelementConnectionRW.setWriteInterface(NetworkElementConnectionEntity.class);
118
119         this.pm15mRW = new SqlDBReaderWriterPm<>(dbClient, Entity.Historicalperformance15min, config.getDbSuffix(),
120                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data.class,
121                 this.controllerId);
122
123         this.pm24hRW = new SqlDBReaderWriterPm<>(dbClient, Entity.Historicalperformance24h, config.getDbSuffix(),
124                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data.class,
125                 this.controllerId);
126
127         this.eventRWCMLog = new SqlDBReaderWriter<>(dbClient, Entity.Cmlog, config.getDbSuffix(),
128                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.cmlog.list.output.Data.class,
129                 this.controllerId);
130
131     }
132
133     @Override
134     public void writeConnectionLog(ConnectionlogEntity event) {
135         this.connectionlogRW.write(event, null);
136     }
137
138     @Override
139     public void writeEventLog(EventlogEntity event) {
140         this.eventlogRW.write(event, null);
141
142     }
143
144     @Override
145     public void writeFaultLog(FaultlogEntity fault) {
146         this.eventRWFaultLog.write(fault, null);
147     }
148
149     @Override
150     public void writeCMLog(CmlogEntity cm) {
151         this.eventRWCMLog.write(cm, null);
152     }
153
154     @Override
155     public void updateFaultCurrent(FaultcurrentEntity fault) {
156         final String id = DatabaseIdGenerator.getFaultcurrentId(fault);
157         if (FaultEntityManager.isManagedAsCurrentProblem(fault)) {
158             if (FaultEntityManager.isNoAlarmIndication(fault)) {
159                 LOG.debug("Remove from currentFaults: {}", fault.toString());
160                 this.eventRWFaultCurrent.remove(id);
161             } else {
162                 LOG.debug("Write to currentFaults: {}", fault.toString());
163                 this.eventRWFaultCurrent.updateOrInsert(fault, id);
164             }
165         } else {
166             LOG.debug("Ingnore for currentFaults: {}", fault.toString());
167         }
168     }
169
170     @Override
171     public int clearFaultsCurrentOfNode(String nodeName) {
172         return this.eventRWFaultCurrent
173                 .remove(Arrays.asList(new FilterBuilder().setProperty("node-id").setFiltervalue(nodeName).build()));
174     }
175
176     @Override
177     public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
178         return this.eventRWFaultCurrent
179                 .remove(Arrays.asList(new FilterBuilder().setProperty("node-id").setFiltervalue(nodeName).build(),
180                         new FilterBuilder().setProperty("object-id").setFiltervalue(objectId).build()));
181     }
182
183     @Override
184     public List<String> getAllNodesWithCurrentAlarms() {
185         return this.eventRWFaultCurrent.getAllNodes();
186     }
187
188     @Override
189     public void writeInventory(String nodeId, List<Inventory> list) {
190         for (Inventory internalEquipment : list) {
191             this.equipmentRW.updateOrInsert(internalEquipment,
192                     internalEquipment.getId() != null ? internalEquipment.getId()
193                             : DatabaseIdGenerator.getInventoryId(internalEquipment));
194         }
195     }
196
197     @Override
198     public void writeGuiCutThroughData(Guicutthrough gcData, String nodeId) {
199         this.guicutthroughRW.write(gcData, nodeId);
200     }
201
202     @Override
203     public int clearGuiCutThroughEntriesOfNode(String nodeName) {
204         return this.guicutthroughRW.remove(nodeName);
205     }
206
207     @Override
208     public boolean updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy,
209             String nodeId) {
210         return this.networkelementConnectionRW.updateOrInsert(networkElementConnectionEntitiy, nodeId) != null;
211     }
212
213     @Override
214     public boolean updateNetworkConnection22(NetworkElementConnectionEntity ne, String nodeId) {
215         return this.networkelementConnectionRW.updateOrInsert(ne, nodeId) != null;
216     }
217
218     /**
219      * Remove network element connection if not required
220      * This function is called onDisconnect event for netconf node
221      */
222     @Override
223     public void removeNetworkConnection(String nodeId) {
224         NetworkElementConnectionEntity e = this.networkelementConnectionRW.read(nodeId);
225         Boolean isRequired = e!=null? e.getIsRequired():null;
226         if (e != null && isRequired  != null) {
227             if (isRequired) {
228                 LOG.debug("updating connection status for {} of required ne to disconnected", nodeId);
229                 this.networkelementConnectionRW.update(new UpdateNetworkElementConnectionInputBuilder()
230                         .setStatus(ConnectionLogStatus.Disconnected).build(), nodeId);
231             } else {
232                 LOG.debug("remove networkelement-connection for {} entry because of non-required", nodeId);
233                 this.networkelementConnectionRW.remove(nodeId);
234             }
235         } else {
236             LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection",
237                     nodeId);
238         }
239
240
241     }
242
243     @Override
244     public int doIndexClean(Date olderAreOutdated) {
245         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
246         List<Filter> filter = new ArrayList<>();
247         filter.add(new FilterBuilder().setProperty("timestamp").setFiltervalue(String.format("<%s", netconfTimeStamp))
248                 .build());
249         if (this.controllerId != null) {
250             filter.add(
251                     new FilterBuilder().setProperty(SqlDBMapper.ODLID_DBCOL).setFiltervalue(this.controllerId).build());
252         }
253         int removed = 0;
254
255         removed += this.eventlogRW.remove(filter);
256         removed += this.eventRWFaultLog.remove(filter);
257         removed += this.eventRWCMLog.remove(filter);
258         return removed;
259     }
260
261     @Override
262     public long getNumberOfOldObjects(Date olderAreOutdated) {
263         List<Filter> filter = Arrays.asList(FaultEntityManager.getOlderOrEqualFilter(olderAreOutdated));
264         try {
265             return this.eventRWFaultLog.count(filter, this.controllerId);
266         } catch (SQLException e) {
267             LOG.warn("problem counting faults older than {}: ", olderAreOutdated, e);
268         }
269         return 0;
270     }
271
272     @Override
273     public List<NetworkElementConnectionEntity> getNetworkElementConnections() {
274         return this.networkelementConnectionRW.readAll(NetworkElementConnectionEntity.class);
275     }
276
277     @Override
278     public void doWritePerformanceData(List<PmdataEntity> list) {
279         list.stream().forEach((pmData) -> {
280             GranularityPeriodType granularityPeriod =
281                     pmData.getGranularityPeriod() != null ? pmData.getGranularityPeriod()
282                             : GranularityPeriodType.Unknown;
283             switch (granularityPeriod) {
284                 case Period15Min:
285                     this.pm15mRW.write(pmData);
286                     break;
287                 case Period24Hours:
288                     this.pm24hRW.write(pmData);
289                     break;
290                 case Unknown:
291                 default:
292                     LOG.debug("Unknown granularity {}", granularityPeriod);
293                     break;
294             }
295         });
296
297     }
298
299     @Override
300     public HtDatabaseClient getRawClient() {
301         return null;
302     }
303
304 }