SDN-R Server provide GUI cut through for ODLUX
[ccsdk/features.git] / sdnr / wt / devicemanager / provider / src / main / java / org / onap / ccsdk / features / sdnr / wt / devicemanager / eventdatahandler / DeviceManagerDatabaseNotificationService.java
1 /*
2  * ============LICENSE_START========================================================================
3  * ONAP : ccsdk feature sdnr wt
4  * =================================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6  * =================================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License
13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14  * or implied. See the License for the specific language governing permissions and limitations under
15  * the License.
16  * ============LICENSE_END==========================================================================
17  */
18 package org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler;
19
20 import java.util.List;
21 import org.eclipse.jdt.annotation.NonNull;
22 import org.eclipse.jdt.annotation.Nullable;
23 import org.onap.ccsdk.features.sdnr.wt.common.HtAssert;
24 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
25 import org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl.DcaeForwarderInternal;
26 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.util.InternalSeverity;
27 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml;
28 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml;
29 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml;
30 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml;
31 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClientInternal;
32 import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.impl.MaintenanceServiceImpl;
33 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.EquipmentService;
34 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
35 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationService;
36 import org.onap.ccsdk.features.sdnr.wt.devicemanager.toggleAlarmFilter.DevicemanagerNotificationDelayService;
37 import org.onap.ccsdk.features.sdnr.wt.devicemanager.toggleAlarmFilter.NotificationDelayFilter;
38 import org.onap.ccsdk.features.sdnr.wt.devicemanager.toggleAlarmFilter.NotificationDelayedListener;
39 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.EquipmentData;
40 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.EventlogNotificationBuilder;
41 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.FaultData;
42 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.FaultNotificationBuilder2;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Faultcurrent;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55 public class DeviceManagerDatabaseNotificationService implements NotificationService, EquipmentService, FaultService,
56         NotificationDelayedListener<ProblemNotificationXml> {
57
58     private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerDatabaseNotificationService.class);
59
60     private final @NonNull DataProvider databaseService;
61     private final @NonNull WebSocketServiceClientInternal webSocketService;
62     private @NonNull final DevicemanagerNotificationDelayService notificationDelayService;
63     private @NonNull final DcaeForwarderInternal aotsDcaeForwarder;
64
65     private final @NonNull MaintenanceServiceImpl maintenanceService;
66
67     /**
68      * @param databaseService to access database
69      * @param maintenanceService
70      * @param webSocketService to send notifications
71      * @param notificationDelayService filter to prevent toggle alarms
72      * @param aotsDcaeForwarder
73      */
74     public DeviceManagerDatabaseNotificationService(@NonNull DataProvider databaseService,
75             @NonNull MaintenanceServiceImpl maintenanceService,
76             @NonNull WebSocketServiceClientInternal webSocketService,
77             @NonNull DevicemanagerNotificationDelayService notificationDelayService,
78             @NonNull DcaeForwarderInternal aotsDcaeForwarder) {
79         super();
80         HtAssert.nonnull(databaseService, maintenanceService, webSocketService, notificationDelayService);
81
82         this.databaseService = databaseService;
83         this.maintenanceService = maintenanceService;
84         this.webSocketService = webSocketService;
85         this.notificationDelayService = notificationDelayService;
86         this.aotsDcaeForwarder = aotsDcaeForwarder;
87     }
88
89     @Override
90     public void eventNotification(@NonNull EventlogEntity eventNotification) {
91         String nodeId = eventNotification.getNodeId();
92         if (nodeId == null) {
93             nodeId = "EmptyNodeId";
94         }
95         databaseService.writeEventLog(eventNotification);
96         webSocketService.sendViaWebsockets(nodeId, new AttributeValueChangedNotificationXml(eventNotification));
97     }
98
99     @Override
100     public void changeNotification(NodeId nodeId, @Nullable Integer counter, @Nullable DateAndTime timeStamp,
101             @Nullable String objectId, @Nullable String attributeName, @Nullable String newValue) {
102         EventlogEntity eventlogEntity =
103                 new EventlogNotificationBuilder(nodeId, counter, timeStamp, objectId, attributeName, newValue).build();
104         databaseService.writeEventLog(eventlogEntity);
105         webSocketService.sendViaWebsockets(nodeId.getValue(), new AttributeValueChangedNotificationXml(eventlogEntity));
106     }
107
108     @Override
109     public void creationNotification(NodeId nodeId, @Nullable Integer counter, @Nullable DateAndTime timeStamp,
110             @Nullable String objectId) {
111         EventlogEntity eventlogEntity =
112                 new EventlogNotificationBuilder(nodeId, counter, timeStamp, objectId, "creation", null).build();
113         databaseService.writeEventLog(eventlogEntity);
114         webSocketService.sendViaWebsockets(nodeId.getValue(), new ObjectCreationNotificationXml(eventlogEntity));
115     }
116
117
118     @Override
119     public void deletionNotification(NodeId nodeId, @Nullable Integer counter, @Nullable DateAndTime timeStamp,
120             @Nullable String objectId) {
121         EventlogEntity eventlogEntity =
122                 new EventlogNotificationBuilder(nodeId, counter, timeStamp, objectId, "deletion", null).build();
123         databaseService.writeEventLog(eventlogEntity);
124         webSocketService.sendViaWebsockets(nodeId.getValue(), new ObjectDeletionNotificationXml(eventlogEntity));
125     }
126
127     @Override
128     public void writeEquipment(@NonNull EquipmentData equipment) {
129         //equipment.getList().forEach(card -> databaseService.writeInventory(card));
130         HtAssert.nonnull(equipment);
131         List<Inventory> list = equipment.getList();
132         HtAssert.nonnull(list);
133         for (Inventory card : list) {
134             databaseService.writeInventory(card);
135         }
136     }
137
138     @Override
139     public void faultNotification(@NonNull FaultlogEntity faultNotification) {
140         databaseService.writeFaultLog(faultNotification);
141         databaseService.updateFaultCurrent(getFaultCurrent(faultNotification));
142
143         ProblemNotificationXml notificationXml = new ProblemNotificationXml(faultNotification);
144         String nodeName = faultNotification.getNodeId();
145         if (NotificationDelayFilter.isEnabled()) {
146             if (notificationXml.getSeverity() == InternalSeverity.NonAlarmed) {
147                 this.notificationDelayService.getInstance(nodeName, this).clearAlarmNotification(notificationXml);
148             } else {
149                 this.notificationDelayService.getInstance(nodeName, this).pushAlarmNotification(notificationXml);
150             }
151         } else {
152             this.pushAlarmIfNotInMaintenance(nodeName, notificationXml);
153         }
154         // ToggleAlarmFilter functionality
155         //        if (notificationDelayService.processNotification(notificationXml.getSeverity() == InternalSeverity.NonAlarmed,
156         //                notificationXml.getProblem(), notificationXml)) {
157         //              if (notificationDelayService.processNotification(notificationXml)) {
158         //                  aotsDcaeForwarder.sendProblemNotificationUsingMaintenanceFilter(nodeName, notificationXml);
159         //              }
160         //        }
161         // end of ToggleAlarmFilter
162
163         this.webSocketService.sendViaWebsockets(nodeName, notificationXml);
164     }
165
166     private void pushAlarmIfNotInMaintenance(String nodeName, ProblemNotificationXml notificationXml) {
167         if (!this.maintenanceService.isONFObjectInMaintenance(nodeName, notificationXml.getObjectId(),
168                 notificationXml.getProblem())) {
169             this.aotsDcaeForwarder.sendProblemNotification(nodeName, notificationXml);
170         } else {
171             LOG.debug("Notification will not be sent to external services. Device " + nodeName
172                     + " is in maintenance mode");
173         }
174     }
175
176     @Override
177     public void faultNotification(@NonNull NodeId nodeId, @Nullable Integer counter, @Nullable DateAndTime timeStamp,
178             @Nullable String objectId, @Nullable String problem, @Nullable SeverityType severity) {
179         FaultNotificationBuilder2 bFaultlog = new FaultNotificationBuilder2(nodeId, counter, timeStamp, objectId,
180                 problem, severity, SourceType.Netconf);
181         faultNotification(bFaultlog.build());
182
183     }
184
185     @Override
186     public int removeAllCurrentProblemsOfNode(@NonNull NodeId nodeId) {
187         int deleted = databaseService.clearFaultsCurrentOfNode(nodeId.getValue());
188         return deleted;
189     }
190
191     @Override
192     public void initCurrentProblemStatus(@NonNull NodeId nodeId, FaultData resultList) {
193         resultList.getProblemList().forEach(problem -> {
194             FaultcurrentBuilder bFaultcurrent = new FaultcurrentBuilder();
195             bFaultcurrent.fieldsFrom(problem);
196             databaseService.updateFaultCurrent(bFaultcurrent.build());
197         });
198     }
199
200     @Override
201     public int removeObjectsCurrentProblemsOfNode(@NonNull NodeId nodeId, String objectId) {
202         int deleted = databaseService.clearFaultsCurrentOfNodeWithObjectId(nodeId.getValue(), objectId);
203         return deleted;
204     }
205
206     private Faultcurrent getFaultCurrent(@NonNull FaultlogEntity problem) {
207         FaultcurrentBuilder bFaultcurrent = new FaultcurrentBuilder();
208         bFaultcurrent.fieldsFrom(problem);
209         return bFaultcurrent.build();
210
211     }
212
213     @Override
214     public void onNotificationDelay(String nodeName, ProblemNotificationXml notification) {
215         LOG.debug("Got delayed event of type :: {}", ProblemNotificationXml.class.getSimpleName());
216         this.pushAlarmIfNotInMaintenance(nodeName, notification);
217     }
218 }