IOvisor policy processing
[groupbasedpolicy.git] / renderers / iovisor / src / main / java / org / opendaylight / groupbasedpolicy / renderer / iovisor / endpoint / EndpointListener.java
index 2e2781e4983c5f9d55b28a5731bddb7b3d588817..1c49a0ea8c6f209514a1237df5bde5626cafbff5 100644 (file)
 
 package org.opendaylight.groupbasedpolicy.renderer.iovisor.endpoint;
 
-import java.util.Map;
-import java.util.Map.Entry;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+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.renderer.iovisor.utils.IovisorModuleUtils;
+import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.IovisorModuleAugmentation;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Preconditions;
-
-public class EndpointListener implements DataChangeListener, AutoCloseable {
-
-    private static final Logger LOG = LoggerFactory.getLogger(EndpointListener.class);
 
-    private final ListenerRegistration<DataChangeListener> registerListener;
+public class EndpointListener extends DataTreeChangeHandler<EndpointL3> {
 
-    private DataBroker dataBroker;
+    private final EndpointManager endpointManager;
 
-    public EndpointListener(DataBroker dataBroker) {
-        this.dataBroker = dataBroker;
-        this.registerListener = dataBroker.registerDataChangeListener(
-                                                LogicalDatastoreType.OPERATIONAL,
-                                                IidFactory.endpointsIidWildcard().child(Endpoint.class),
-                                                this,
-                                                AsyncDataBroker.DataChangeScope.SUBTREE);
+    public EndpointListener(DataBroker dataProvider, EndpointManager endpointManager) {
+        super(dataProvider,
+                new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, IidFactory.l3EndpointsIidWildcard()));
+        this.endpointManager = endpointManager;
     }
 
     @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
-        created(changes.getCreatedData());
-        updated(changes.getUpdatedData());
-        removed(changes);
-    }
-
-    /**
-     * Process created events.
-     *
-     * @param created
-     *            Created data
-     */
-    private void created(Map<InstanceIdentifier<?>, DataObject> created) {
-        for (Entry<InstanceIdentifier<?>, DataObject> newEndpoint : created.entrySet()) {
-            Endpoint endpoint = fromMd(newEndpoint.getKey(), (Endpoint) newEndpoint.getValue());
-            LOG.debug("Endpoint CREATED {}", endpoint);
-
-            // Validate the IOVisorModuleInstance
-            IovisorModuleAugmentation iovisorModuleAugmentation = endpoint.getAugmentation(IovisorModuleAugmentation.class);
-            Preconditions.checkNotNull(iovisorModuleAugmentation.getUri(), "At this point, the Endpoint should be provided with a IovisorModuleInstance");
-            if (IovisorModuleUtils.validateIovisorModuleInstance(dataBroker, iovisorModuleAugmentation.getUri())) {
-                LOG.debug("This Endpoint {} provides a valid IovisorModuleInstance {}", endpoint, iovisorModuleAugmentation.getUri());
-                // TODO process validated endpoint
-            }
-        }
-    }
-
-    /**
-     * Process updated events.
-     *
-     * @param updated
-     *            updated data
-     */
-    private void updated(Map<InstanceIdentifier<?>, DataObject> updated) {
-        for (Entry<InstanceIdentifier<?>, DataObject> updatedEndpoint : updated.entrySet()) {
-            Endpoint endpoint = fromMd(updatedEndpoint.getKey(), (Endpoint) updatedEndpoint.getValue());
-            LOG.debug("Endpoint UPDATED {}", endpoint);
-            //TODO process updated event
-
-        }
-    }
-
-    /**
-     * Process REMOVED data.
-     *
-     * @param changes
-     *            Changes data
-     */
-    private void removed(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
-        for (InstanceIdentifier<?> deletedEndpointPath : changes.getRemovedPaths()) {
-            Endpoint endpoint = fromMd(deletedEndpointPath, (Endpoint) changes.getOriginalData().get(deletedEndpointPath));
-            LOG.debug("Endpoint REMOVED {}", endpoint);
-            // TODO process removed event
-        }
+    protected void onWrite(DataObjectModification<EndpointL3> rootNode, InstanceIdentifier<EndpointL3> rootIdentifier) {
+        onSubtreeModified(rootNode, rootIdentifier);
     }
 
-    /**
-     * Get the object from MD-SAL based on the instance identifier.
-     *
-     * @param iid
-     *            {@link InstanceIdentifier} of the related event
-     * @param endpoint
-     *            Endpoint from the related event
-     * @return Endpoint constructed from the one gathered in the related event
-     */
-    private Endpoint fromMd(InstanceIdentifier<?> iid, Endpoint endpoint) {
-        EndpointBuilder result = new EndpointBuilder();
-
-        final EndpointKey endpointKey = iid.firstKeyOf(Endpoint.class);
-        if (endpointKey != null) {
-            result.setKey(endpointKey);
-        }
-
-        result.setCondition(endpoint.getCondition());
-        result.setEndpointGroup(endpoint.getEndpointGroup());
-        result.setEndpointGroups(endpoint.getEndpointGroups());
-        result.setL2Context(endpoint.getL2Context());
-        result.setL3Address(endpoint.getL3Address());
-        result.setMacAddress(endpoint.getMacAddress());
-        result.setNetworkContainment(endpoint.getNetworkContainment());
-        result.setTenant(endpoint.getTenant());
-        result.setTimestamp(endpoint.getTimestamp());
-
-        return result.build();
+    @Override
+    protected void onDelete(DataObjectModification<EndpointL3> rootNode,
+            InstanceIdentifier<EndpointL3> rootIdentifier) {
+        throw new UnsupportedOperationException("Not implemented yet.");
     }
 
     @Override
-    public void close() throws Exception {
-        if (registerListener != null)
-            registerListener.close();
+    protected void onSubtreeModified(DataObjectModification<EndpointL3> rootNode,
+            InstanceIdentifier<EndpointL3> rootIdentifier) {
+        endpointManager.processEndpoint(rootNode.getDataAfter());
     }
 }