Bug 3864: Notify netconf monitoring about changes in session
[netconf.git] / netconf / mdsal-netconf-notification / src / main / java / org / opendaylight / controller / config / yang / netconf / mdsal / notification / SessionNotificationProducer.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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.controller.config.yang.netconf.mdsal.notification;
9
10 import com.google.common.base.Preconditions;
11 import java.util.Collection;
12 import javax.annotation.Nonnull;
13 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
14 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
15 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdOrZeroType;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEnd;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEndBuilder;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStartBuilder;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26
27 /**
28  * Listens on changes in NetconfState/Sessions/Session datastore and publishes them
29  */
30 public class SessionNotificationProducer extends OperationalDatastoreListener<Session> {
31
32     private static final InstanceIdentifier<Session> SESSION_INSTANCE_IDENTIFIER =
33             InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class);
34     private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
35
36     public SessionNotificationProducer(BaseNotificationPublisherRegistration baseNotificationPublisherRegistration) {
37         super(SESSION_INSTANCE_IDENTIFIER);
38         this.baseNotificationPublisherRegistration = baseNotificationPublisherRegistration;
39     }
40
41     @Override
42     public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Session>> changes) {
43         for (DataTreeModification<Session> change : changes) {
44             final DataObjectModification<Session> rootNode = change.getRootNode();
45             final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
46             switch (modificationType) {
47                 case WRITE:
48                     final Session created = rootNode.getDataAfter();
49                     if (created != null && rootNode.getDataBefore() == null) {
50                         publishStartedSession(created);
51                     }
52                     break;
53                 case DELETE:
54                     final Session removed = rootNode.getDataBefore();
55                     if (removed != null) {
56                         publishEndedSession(removed);
57                     }
58                     break;
59             }
60         }
61     }
62
63     private void publishStartedSession(DataObject dataObject) {
64         Preconditions.checkArgument(dataObject instanceof Session);
65         Session session = (Session) dataObject;
66         final NetconfSessionStart sessionStart = new NetconfSessionStartBuilder()
67                 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
68                 .setSourceHost(session.getSourceHost().getIpAddress())
69                 .setUsername(session.getUsername())
70                 .build();
71         baseNotificationPublisherRegistration.onSessionStarted(sessionStart);
72     }
73
74     private void publishEndedSession(DataObject dataObject) {
75         Preconditions.checkArgument(dataObject instanceof Session);
76         Session session = (Session) dataObject;
77         final NetconfSessionEnd sessionEnd = new NetconfSessionEndBuilder()
78                 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
79                 .setSourceHost(session.getSourceHost().getIpAddress())
80                 .setUsername(session.getUsername())
81                 .build();
82         baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);
83     }
84
85 }