/* * 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.ios_xe_provider.impl.listener; import java.util.Collection; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; 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.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.api.manager.PolicyManager; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicy; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; /** * Purpose: process changes of configured renderer policies */ public class RendererConfigurationListenerImpl implements ClusteredDataTreeChangeListener<RendererPolicy>, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(RendererConfigurationListenerImpl.class); private final ListenerRegistration<RendererConfigurationListenerImpl> listenerRegistration; private final PolicyManager policyManager; public RendererConfigurationListenerImpl(final DataBroker dataBroker, final PolicyManager policyManager) { this.policyManager = Preconditions.checkNotNull(policyManager, "missing endpoint template cache"); final InstanceIdentifier<RendererPolicy> policyPath = InstanceIdentifier.create(Renderers.class) .child(Renderer.class, new RendererKey(PolicyManagerImpl.IOS_XE_RENDERER)) .child(RendererPolicy.class); final DataTreeIdentifier<RendererPolicy> treePath = new DataTreeIdentifier<>( LogicalDatastoreType.CONFIGURATION, policyPath); listenerRegistration = dataBroker.registerDataTreeChangeListener(treePath, this); LOG.info("renderer-policy listener registered"); } @Override public void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<RendererPolicy>> collection) { LOG.debug("renderer policy configuration changed"); for (DataTreeModification<RendererPolicy> rendererPolicyDataTreeModification : collection) { final DataObjectModification<RendererPolicy> rootNode = rendererPolicyDataTreeModification.getRootNode(); final RendererPolicy dataBefore = rootNode.getDataBefore(); final RendererPolicy dataAfter = rootNode.getDataAfter(); // Policy configuration Configuration oldConfig = null; Configuration newConfig = null; long version = 0; if (dataBefore != null) { oldConfig = dataBefore.getConfiguration(); } if (dataAfter != null) { newConfig = dataAfter.getConfiguration(); if (dataAfter.getVersion() != null) { version = dataAfter.getVersion(); } } policyManager.syncPolicy(newConfig, oldConfig, version); } } @Override public void close() { listenerRegistration.close(); } }