Migrate to serviceutils/tools and serviceutils/srm
[netvirt.git] / aclservice / impl / src / main / java / org / opendaylight / netvirt / aclservice / listeners / AclInterfaceStateListener.java
index 94eda89e860ff9205285ad914ece0b2e398ccd7a..40e4ebc12b220021ad52a2f6f1644e9e4c05a0cb 100644 (file)
@@ -24,6 +24,8 @@ import org.opendaylight.netvirt.aclservice.api.utils.AclInterface;
 import org.opendaylight.netvirt.aclservice.utils.AclClusterUtil;
 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.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;
@@ -31,14 +33,14 @@ 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.IpPrefixOrAddress;
+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<Interface,
-        AclInterfaceStateListener> implements ClusteredDataTreeChangeListener<Interface> {
+        AclInterfaceStateListener> implements ClusteredDataTreeChangeListener<Interface>, RecoverableListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(AclInterfaceStateListener.class);
 
@@ -54,7 +56,8 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
     @Inject
     public AclInterfaceStateListener(AclServiceManager aclServiceManger, AclClusterUtil aclClusterUtil,
             DataBroker dataBroker, AclDataUtil aclDataUtil, IInterfaceManager interfaceManager,
-            AclInterfaceCache aclInterfaceCache, AclServiceUtils aclServicUtils) {
+            AclInterfaceCache aclInterfaceCache, AclServiceUtils aclServicUtils,
+            ServiceRecoveryRegistry serviceRecoveryRegistry) {
         super(Interface.class, AclInterfaceStateListener.class);
         this.aclServiceManger = aclServiceManger;
         this.aclClusterUtil = aclClusterUtil;
@@ -63,12 +66,18 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
         this.interfaceManager = interfaceManager;
         this.aclInterfaceCache = aclInterfaceCache;
         this.aclServiceUtils = aclServicUtils;
+        serviceRecoveryRegistry.addRecoverableListener(AclServiceUtils.getRecoverServiceRegistryKey(), this);
     }
 
     @Override
     @PostConstruct
     public void init() {
         LOG.info("{} start", getClass().getSimpleName());
+        registerListener();
+    }
+
+    @Override
+    public void registerListener() {
         registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
@@ -121,41 +130,43 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
         if (!L2vlan.class.equals(added.getType())) {
             return;
         }
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface;
-        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());
-            return;
-        }
-        InterfaceAcl aclInPort = iface.getAugmentation(InterfaceAcl.class);
-        if (aclInPort == null) {
-            LOG.trace("Interface {} is not an ACL Interface, ignoring ADD interfaceState event",
-                    added.getName());
-            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.getSubnetIpPrefixes() == null) {
+                if (prevAclInterface.getSubnetInfo() == null) {
                     // For upgrades
-                    List<IpPrefixOrAddress> subnetIpPrefixes = AclServiceUtils.getSubnetIpPrefixes(dataBroker,
-                            added.getName());
-                    builder.subnetIpPrefixes(subnetIpPrefixes);
+                    List<SubnetInfo> subnetInfo = aclServiceUtils.getSubnetInfo(added.getName());
+                    builder.subnetInfo(subnetInfo);
                 }
                 SortedSet<Integer> ingressRemoteAclTags =
-                        aclServiceUtils.getRemoteAclTags(aclInPort.getSecurityGroups(), DirectionIngress.class);
+                        aclServiceUtils.getRemoteAclTags(prevAclInterface.getSecurityGroups(), DirectionIngress.class);
                 SortedSet<Integer> egressRemoteAclTags =
-                        aclServiceUtils.getRemoteAclTags(aclInPort.getSecurityGroups(), DirectionEgress.class);
+                        aclServiceUtils.getRemoteAclTags(prevAclInterface.getSecurityGroups(), DirectionEgress.class);
                 builder.ingressRemoteAclTags(ingressRemoteAclTags).egressRemoteAclTags(egressRemoteAclTags);
             }
         });
 
+        List<Uuid> aclList = aclInterface.getSecurityGroups();
+        if (aclList == null) {
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
+                    .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());
+                return;
+            }
+            InterfaceAcl aclInPort = iface.augmentation(InterfaceAcl.class);
+            if (aclInPort == null) {
+                LOG.trace("Interface {} is not an ACL Interface, ignoring ADD interfaceState event",
+                        added.getName());
+                return;
+            }
+        }
+
         if (AclServiceUtils.isOfInterest(aclInterface)) {
-            List<Uuid> aclList = aclInterface.getSecurityGroups();
             if (aclList != null) {
                 aclDataUtil.addAclInterfaceMap(aclList, aclInterface);
             }