2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom;
24 import com.fasterxml.jackson.core.JsonProcessingException;
25 import java.time.Instant;
26 import org.eclipse.jdt.annotation.NonNull;
27 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
28 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
29 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
30 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO;
31 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESNotificationFieldsPOJO;
32 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor;
33 import org.opendaylight.mdsal.dom.api.DOMEvent;
34 import org.opendaylight.mdsal.dom.api.DOMNotification;
35 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
40 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
41 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
42 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
43 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 public class ORanDOMChangeNotificationListener implements DOMNotificationListener {
49 private static final Logger log = LoggerFactory.getLogger(ORanDOMChangeNotificationListener.class);
51 private final NetconfDomAccessor netconfDomAccessor;
52 private final DataProvider databaseService;
53 private @NonNull VESCollectorService vesCollectorService;
54 private final DOMNotificationToXPath domNotificationXPath;
55 private ORanDOMNotifToVESEventAssembly mapper = null;
56 private static int sequenceNo = 0;
58 public ORanDOMChangeNotificationListener(NetconfDomAccessor netconfDomAccessor,
59 @NonNull VESCollectorService vesCollectorService, DataProvider databaseService) {
60 this.netconfDomAccessor = netconfDomAccessor;
61 this.databaseService = databaseService;
62 this.vesCollectorService = vesCollectorService;
63 domNotificationXPath = new DOMNotificationToXPath();
67 public void onNotification(@NonNull DOMNotification domNotification) {
68 if (domNotification.getType()
69 .equals(Absolute.of(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_NETCONF_CONFIG_CHANGE))) {
70 handleNetconfConfigChange(domNotification);
74 private void handleNetconfConfigChange(@NonNull DOMNotification domNotification) {
75 DateAndTime eventTime;
76 Instant notificationEventTime = null;
77 if (domNotification instanceof DOMEvent) {
78 notificationEventTime = ((DOMEvent) domNotification).getEventInstant();
79 eventTime = NetconfTimeStampImpl.getConverter().getTimeStamp(notificationEventTime.toString());
81 eventTime = NetconfTimeStampImpl.getConverter().getTimeStamp();
84 ContainerNode cn = domNotification.getBody();
86 // Process the changed-by child
87 // ContainerNode changedByContainerNode = (ContainerNode) cn
88 // .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_CHANGEDBY));
89 // ChoiceNode serverOrUserIDVal = (ChoiceNode) changedByContainerNode
90 // .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_SERVERORUSER));
91 // @SuppressWarnings("unused")
92 // String userIDValue = serverOrUserIDVal
93 // .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_USERNAME)).body()
95 // @SuppressWarnings("unused")
96 // Integer sessionIDVal = Integer.valueOf(serverOrUserIDVal
97 // .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_SESSIONID)).body()
100 // // Process the datastore child
101 // @SuppressWarnings("unused")
102 // String datastoreValue = cn
103 // .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_DATASTORE)).body()
106 // Process the edit child
107 UnkeyedListNode editList = (UnkeyedListNode) cn
108 .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_EDITNODE));
109 if (editList != null) {
110 for (int listCnt = 0; listCnt < editList.size(); listCnt++) {
111 String operationValue = editList.childAt(listCnt)
112 .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_OPERATION))
114 String targetValue = editList.childAt(listCnt)
115 .childByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_TARGET))
118 EventlogEntity eventLogEntity1 = new EventlogBuilder()
119 .setNodeId(netconfDomAccessor.getNodeId().getValue()).setCounter(sequenceNo++)
120 .setTimestamp(eventTime).setObjectId(targetValue).setAttributeName("N.A")
121 .setSourceType(SourceType.Netconf).setNewValue(String.valueOf(operationValue)).build();
122 databaseService.writeEventLog(eventLogEntity1);
126 if (vesCollectorService.getConfig().isVESCollectorEnabled()) {
127 if (mapper == null) {
128 this.mapper = new ORanDOMNotifToVESEventAssembly(netconfDomAccessor, vesCollectorService);
130 VESCommonEventHeaderPOJO header =
131 mapper.createVESCommonEventHeader(domNotificationXPath.getTime(domNotification),
132 ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_NETCONF_CONFIG_CHANGE.getLocalName(),
134 VESNotificationFieldsPOJO body =
135 mapper.createVESNotificationFields(domNotificationXPath.convertDomNotifToXPath(domNotification),
136 ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_NETCONF_CONFIG_CHANGE.getLocalName());
137 log.info("domNotification in XPath format = {}",
138 domNotificationXPath.convertDomNotifToXPath(domNotification));
140 vesCollectorService.publishVESMessage(vesCollectorService.generateVESEvent(header, body));
141 } catch (JsonProcessingException e) {
142 log.warn("Exception while generating JSON object ", e);