a25fd2fc3b655eb9d1ef8b9ac47db4295d617636
[genius.git] / itm / itm-impl / src / main / java / org / opendaylight / genius / itm / listeners / TunnelMonitorIntervalListener.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. 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.genius.itm.listeners;
9
10 import com.google.common.base.Optional;
11 import javax.annotation.PostConstruct;
12 import javax.annotation.PreDestroy;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
19 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
20 import org.opendaylight.genius.itm.confighelpers.ItmMonitorIntervalWorker;
21 import org.opendaylight.genius.itm.impl.ItmUtils;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorInterval;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
25 import org.opendaylight.yangtools.concepts.ListenerRegistration;
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 @Singleton
31 public class TunnelMonitorIntervalListener
32         extends AsyncDataTreeChangeListenerBase<TunnelMonitorInterval, TunnelMonitorIntervalListener>
33         implements  AutoCloseable {
34     private static final Logger LOG = LoggerFactory.getLogger(TunnelMonitorIntervalListener.class);
35     private ListenerRegistration<DataChangeListener> monitorIntervalListenerRegistration;
36     private final DataBroker broker;
37
38     @Inject
39     public TunnelMonitorIntervalListener(DataBroker dataBroker) {
40         super(TunnelMonitorInterval.class, TunnelMonitorIntervalListener.class);
41         this.broker = dataBroker;
42     }
43
44     @PostConstruct
45     public void start() {
46         registerListener(LogicalDatastoreType.CONFIGURATION, this.broker);
47         LOG.info("TunnelMonitorIntervalListener Started");
48     }
49
50     @Override
51     @PreDestroy
52     public void close() {
53         LOG.info("TunnelMonitorIntervalListener Closed");
54     }
55
56     @Override protected InstanceIdentifier<TunnelMonitorInterval> getWildCardPath() {
57         return InstanceIdentifier.create(TunnelMonitorInterval.class);
58     }
59
60     @Override
61     protected void remove(InstanceIdentifier<TunnelMonitorInterval> key, TunnelMonitorInterval dataObjectModification) {
62         LOG.debug("remove TunnelMonitorIntervalListener called with {}",dataObjectModification.getInterval());
63         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
64         InstanceIdentifier<TransportZones> path = InstanceIdentifier.builder(TransportZones.class).build();
65         Optional<TransportZones> transportZonesOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION,
66                 path, broker);
67         if (transportZonesOptional.isPresent()) {
68             TransportZones tzones = transportZonesOptional.get();
69             for (TransportZone tzone : tzones.getTransportZone()) {
70                 //if you remove configuration, the last configured interval is only set i.e no change
71                 LOG.debug("Remove:Calling TunnelMonitorIntervalWorker with tzone = {} and {}",
72                         tzone.getZoneName(),dataObjectModification.getInterval());
73                 ItmMonitorIntervalWorker toggleWorker = new ItmMonitorIntervalWorker(tzone.getZoneName(),
74                         dataObjectModification.getInterval(), broker);
75                 coordinator.enqueueJob(tzone.getZoneName(), toggleWorker);
76             }
77         }
78     }
79
80     @Override protected void update(InstanceIdentifier<TunnelMonitorInterval> key,
81                                     TunnelMonitorInterval dataObjectModificationBefore,
82                                     TunnelMonitorInterval dataObjectModificationAfter) {
83         LOG.debug("update TunnelMonitorIntervalListener called with {}",dataObjectModificationAfter.getInterval());
84         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
85         InstanceIdentifier<TransportZones> path = InstanceIdentifier.builder(TransportZones.class).build();
86         Optional<TransportZones> transportZonesOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION,
87                 path, broker);
88         if (transportZonesOptional.isPresent()) {
89             TransportZones tzones = transportZonesOptional.get();
90             for (TransportZone tzone : tzones.getTransportZone()) {
91                 LOG.debug("Update:Calling TunnelMonitorIntervalWorker with tzone = {} and {}",
92                         tzone.getZoneName(),dataObjectModificationAfter.getInterval());
93                 ItmMonitorIntervalWorker intervalWorker = new ItmMonitorIntervalWorker(tzone.getZoneName(),
94                         dataObjectModificationAfter.getInterval(), broker);
95                 coordinator.enqueueJob(tzone.getZoneName(), intervalWorker);
96             }
97         }
98     }
99
100     @Override
101     protected void add(InstanceIdentifier<TunnelMonitorInterval> key, TunnelMonitorInterval dataObjectModification) {
102         LOG.debug("Add TunnelMonitorIntervalListener called with {}",dataObjectModification.getInterval());
103         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
104         InstanceIdentifier<TransportZones> path = InstanceIdentifier.builder(TransportZones.class).build();
105         Optional<TransportZones> transportZonesOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION,
106                 path, broker);
107         if (transportZonesOptional.isPresent()) {
108             TransportZones tzones = transportZonesOptional.get();
109             for (TransportZone tzone : tzones.getTransportZone()) {
110                 LOG.debug("Add:Calling TunnelMonitorIntervalWorker with tzone = {} and {}",
111                         tzone.getZoneName(),dataObjectModification.getInterval());
112                 ItmMonitorIntervalWorker intervalWorker = new ItmMonitorIntervalWorker(tzone.getZoneName(),
113                         dataObjectModification.getInterval(), broker);
114                 //conversion to milliseconds done while writing to i/f-mgr config DS
115                 coordinator.enqueueJob(tzone.getZoneName(), intervalWorker);
116             }
117         }
118     }
119
120     @Override protected TunnelMonitorIntervalListener getDataTreeChangeListener() {
121         return TunnelMonitorIntervalListener.this;
122     }
123 }