/*
* Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.statistics;
import java.util.concurrent.ScheduledExecutorService;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.groupbasedpolicy.api.StatisticsManager;
import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.sflow.values.SflowClientSettings;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
public class SflowClientSettingsListener extends DataTreeChangeHandler<SflowClientSettings> {
private static final Logger LOG = LoggerFactory.getLogger(SflowClientSettingsListener.class);
private static InstanceIdentifier<SflowClientSettings> IID =
InstanceIdentifier.builder(OfOverlayConfig.class)
.child(SflowClientSettings.class)
.build();
private OFStatisticsManager ofStatisticsManager;
private final ScheduledExecutorService executor;
private final StatisticsManager statisticsManager;
private ResolvedPolicyClassifierListener classifierListener;
public SflowClientSettingsListener(DataBroker dataprovider, ScheduledExecutorService executor, StatisticsManager statisticsManager) {
super(dataprovider);
this.statisticsManager = Preconditions.checkNotNull(statisticsManager);
this.executor = Preconditions.checkNotNull(executor);
registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, IID));
}
@Override
protected void onWrite(DataObjectModification<SflowClientSettings> rootNode,
InstanceIdentifier<SflowClientSettings> rootIdentifier) {
onSubtreeModified(rootNode, rootIdentifier);
}
@Override
protected void onDelete(DataObjectModification<SflowClientSettings> rootNode,
InstanceIdentifier<SflowClientSettings> rootIdentifier) {
try {
classifierListener.close();
ofStatisticsManager.close();
} catch (Exception e) {
LOG.error(
"Error during closing OFStatisticsManager and ResolvedPolicyClassifierListener. "
+ "Statistics do not have to be correct because of illegal state.", e);
}
}
@Override
protected void onSubtreeModified(DataObjectModification<SflowClientSettings> rootNode,
InstanceIdentifier<SflowClientSettings> rootIdentifier) {
SflowClientSettings sflowClientSettings =
Preconditions.checkNotNull(rootNode.getDataAfter());
if (classifierListener != null && ofStatisticsManager != null) {
try {
classifierListener.close();
ofStatisticsManager.close();
} catch (Exception e) {
LOG.error(
"Error during closing OFStatisticsManager and ResolvedPolicyClassifierListener. "
+ "Statistics do not have to be correct because of illegal state.", e);
}
}
ofStatisticsManager = new OFStatisticsManager(executor, statisticsManager);
ofStatisticsManager.setSflowCollectorUri(sflowClientSettings.getGbpOfoverlaySflowCollectorUri());
ofStatisticsManager.setDelay(sflowClientSettings.getGbpOfoverlaySflowRetrieveInterval());
classifierListener = new ResolvedPolicyClassifierListener(dataProvider, ofStatisticsManager);
}
}