Bug 5510 - Modifying DataTreeChangeHandler
[groupbasedpolicy.git] / renderers / ofoverlay / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / statistics / SflowClientSettingsListener.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.groupbasedpolicy.renderer.ofoverlay.statistics;
9
10 import java.util.concurrent.ScheduledExecutorService;
11
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
14 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.groupbasedpolicy.api.StatisticsManager;
17 import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.sflow.values.SflowClientSettings;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 import com.google.common.base.Preconditions;
25
26 public class SflowClientSettingsListener extends DataTreeChangeHandler<SflowClientSettings> {
27
28     private static final Logger LOG = LoggerFactory.getLogger(SflowClientSettingsListener.class);
29     private static InstanceIdentifier<SflowClientSettings> IID =
30             InstanceIdentifier.builder(OfOverlayConfig.class)
31                     .child(SflowClientSettings.class)
32                     .build();
33     private OFStatisticsManager ofStatisticsManager;
34     private final ScheduledExecutorService executor;
35     private final StatisticsManager statisticsManager;
36     private ResolvedPolicyClassifierListener classifierListener;
37
38     public SflowClientSettingsListener(DataBroker dataprovider, ScheduledExecutorService executor, StatisticsManager statisticsManager) {
39         super(dataprovider);
40         this.statisticsManager = Preconditions.checkNotNull(statisticsManager);
41         this.executor = Preconditions.checkNotNull(executor);
42         registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, IID));
43     }
44
45     @Override
46     protected void onWrite(DataObjectModification<SflowClientSettings> rootNode,
47             InstanceIdentifier<SflowClientSettings> rootIdentifier) {
48         onSubtreeModified(rootNode, rootIdentifier);
49     }
50
51     @Override
52     protected void onDelete(DataObjectModification<SflowClientSettings> rootNode,
53             InstanceIdentifier<SflowClientSettings> rootIdentifier) {
54         try {
55             classifierListener.close();
56             ofStatisticsManager.close();
57         } catch (Exception e) {
58             LOG.error(
59                     "Error during closing OFStatisticsManager and ResolvedPolicyClassifierListener. "
60                     + "Statistics do not have to be correct because of illegal state.", e);
61         }
62     }
63
64     @Override
65     protected void onSubtreeModified(DataObjectModification<SflowClientSettings> rootNode,
66             InstanceIdentifier<SflowClientSettings> rootIdentifier) {
67         SflowClientSettings sflowClientSettings =
68                 Preconditions.checkNotNull(rootNode.getDataAfter());
69         if (classifierListener != null && ofStatisticsManager != null) {
70             try {
71                 classifierListener.close();
72                 ofStatisticsManager.close();
73             } catch (Exception e) {
74                 LOG.error(
75                         "Error during closing OFStatisticsManager and ResolvedPolicyClassifierListener. "
76                         + "Statistics do not have to be correct because of illegal state.", e);
77             }
78         }
79         ofStatisticsManager = new OFStatisticsManager(executor, statisticsManager);
80         ofStatisticsManager.setSflowCollectorUri(sflowClientSettings.getGbpOfoverlaySflowCollectorUri());
81         ofStatisticsManager.setDelay(sflowClientSettings.getGbpOfoverlaySflowRetrieveInterval());
82         classifierListener = new ResolvedPolicyClassifierListener(dataProvider, ofStatisticsManager);
83     }
84 }