X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=aclservice%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Faclservice%2Flisteners%2FAclInterfaceStateListener.java;h=6967a0a2302ab380a004fa24a7df704b53403fc1;hb=2f0569ed75ef8a1fb60f992d19c8bbdf92ff45bf;hp=66eb57481cb0de2b4c737fdea758a39bee068d9c;hpb=6ab063f45dd4db41ab31538ca4bcd6dddda4fcf1;p=netvirt.git diff --git a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclInterfaceStateListener.java b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclInterfaceStateListener.java index 66eb57481c..6967a0a230 100644 --- a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclInterfaceStateListener.java +++ b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclInterfaceStateListener.java @@ -10,15 +10,15 @@ package org.opendaylight.netvirt.aclservice.listeners; import java.util.Collections; import java.util.List; import java.util.SortedSet; -import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; -import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; +import org.opendaylight.infrautils.utils.concurrent.Executors; +import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache; import org.opendaylight.netvirt.aclservice.api.AclServiceManager; import org.opendaylight.netvirt.aclservice.api.AclServiceManager.Action; @@ -28,6 +28,7 @@ import org.opendaylight.netvirt.aclservice.utils.AclDataUtil; import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils; import org.opendaylight.serviceutils.srm.RecoverableListener; import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry; +import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface; @@ -35,14 +36,13 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types. import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.DirectionEgress; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.DirectionIngress; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAcl; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.port.subnets.port.subnet.SubnetInfo; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton -public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase implements ClusteredDataTreeChangeListener, RecoverableListener { +public class AclInterfaceStateListener extends AbstractAsyncDataTreeChangeListener + implements ClusteredDataTreeChangeListener, RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(AclInterfaceStateListener.class); @@ -61,7 +61,9 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); + public void deregisterListener() { + super.close(); } @Override - protected void remove(InstanceIdentifier key, Interface deleted) { + public void remove(InstanceIdentifier key, Interface deleted) { if (!L2vlan.class.equals(deleted.getType())) { return; } @@ -110,7 +109,7 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase { + jobCoordinator.enqueueJob(acl.getValue(), () -> { aclDataUtil.removeAclInterfaceMap(acl, aclInterface); return Collections.emptyList(); }); @@ -120,7 +119,7 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase key, Interface before, Interface after) { + public void update(InstanceIdentifier key, Interface before, Interface after) { /* * The update is not of interest as the attributes populated from this listener will not change. * The northbound updates are handled in AclInterfaceListener. @@ -135,33 +134,14 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase key, Interface added) { + public void add(InstanceIdentifier key, Interface added) { if (!L2vlan.class.equals(added.getType())) { return; } - AclInterface aclInterface = aclInterfaceCache.addOrUpdate(added.getName(), (prevAclInterface, builder) -> { - builder.dpId(AclServiceUtils.getDpIdFromIterfaceState(added)).lPortTag(added.getIfIndex()) - .isMarkedForDelete(false); - - if (AclServiceUtils.isOfInterest(prevAclInterface)) { - if (prevAclInterface.getSubnetInfo() == null) { - // For upgrades - List subnetInfo = aclServiceUtils.getSubnetInfo(added.getName()); - builder.subnetInfo(subnetInfo); - } - SortedSet ingressRemoteAclTags = - aclServiceUtils.getRemoteAclTags(prevAclInterface.getSecurityGroups(), DirectionIngress.class); - SortedSet egressRemoteAclTags = - aclServiceUtils.getRemoteAclTags(prevAclInterface.getSecurityGroups(), DirectionEgress.class); - builder.ingressRemoteAclTags(ingressRemoteAclTags).egressRemoteAclTags(egressRemoteAclTags); - } - }); - - List aclList = aclInterface.getSecurityGroups(); - if (aclList == null) { + if (aclInterfaceCache.get(added.getName()) == null) { org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces - .Interface iface = interfaceManager.getInterfaceInfoFromConfigDataStore(added.getName()); + .Interface iface = interfaceManager.getInterfaceInfoFromConfigDataStore(added.getName()); if (iface == null) { LOG.error("No interface with name {} available in interfaceConfig, servicing interfaceState ADD" + "for ACL failed", added.getName()); @@ -173,11 +153,28 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase { + builder.portSecurityEnabled(aclInPort.isPortSecurityEnabled()) + .interfaceType(aclInPort.getInterfaceType()).securityGroups(aclInPort.getSecurityGroups()) + .allowedAddressPairs(aclInPort.getAllowedAddressPairs()).subnetInfo(aclInPort.getSubnetInfo()); + }); } + AclInterface aclInterface = aclInterfaceCache.addOrUpdate(added.getName(), (prevAclInterface, builder) -> { + builder.dpId(AclServiceUtils.getDpIdFromIterfaceState(added)).lPortTag(added.getIfIndex()) + .isMarkedForDelete(false); + if (AclServiceUtils.isOfInterest(prevAclInterface)) { + SortedSet ingressRemoteAclTags = + aclServiceUtils.getRemoteAclTags(prevAclInterface.getSecurityGroups(), DirectionIngress.class); + SortedSet egressRemoteAclTags = + aclServiceUtils.getRemoteAclTags(prevAclInterface.getSecurityGroups(), DirectionEgress.class); + builder.ingressRemoteAclTags(ingressRemoteAclTags).egressRemoteAclTags(egressRemoteAclTags); + } + }); if (AclServiceUtils.isOfInterest(aclInterface)) { + List aclList = aclInterface.getSecurityGroups(); if (aclList != null) { - aclDataUtil.addAclInterfaceMap(aclList, aclInterface); + aclDataUtil.addOrUpdateAclInterfaceMap(aclList, aclInterface); } if (aclInterface.getElanId() == null) { LOG.debug("On Add event, skip ADD since ElanId is not updated"); @@ -195,7 +192,9 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase