*/
package org.opendaylight.netvirt.aclservice.listeners;
-import com.google.common.util.concurrent.Futures;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
-import java.util.concurrent.ExecutionException;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
LOG.debug("On update event, notify ACL service manager to update ACL for interface: {}",
interfaceId);
// handle add for AclPortsLookup before processing update
- try {
- Futures.allAsList(aclServiceUtils.addAclPortsLookupForInterfaceUpdate(aclInterfaceBefore,
- aclInterfaceAfter)).get();
- } catch (InterruptedException | ExecutionException e) {
- LOG.error("Error adding ACL ports for interface update", e);
- }
+ aclServiceUtils.addAclPortsLookupForInterfaceUpdate(aclInterfaceBefore, aclInterfaceAfter);
aclServiceManager.notify(aclInterfaceAfter, aclInterfaceBefore, AclServiceManager.Action.UPDATE);
// handle delete for AclPortsLookup after processing update
- try {
- Futures.allAsList(aclServiceUtils.deleteAclPortsLookupForInterfaceUpdate(aclInterfaceBefore,
- aclInterfaceAfter)).get();
- } catch (InterruptedException | ExecutionException e) {
- LOG.error("Error deleting ACL ports for interface update", e);
- }
+ aclServiceUtils.deleteAclPortsLookupForInterfaceUpdate(aclInterfaceBefore, aclInterfaceAfter);
}
}
updateCacheWithAclChange(aclInterfaceBefore, aclInterfaceAfter);
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.augmentation(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())
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);
}
import org.opendaylight.genius.mdsalutil.matches.MatchUdpSourcePort;
import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchRegister;
import org.opendaylight.genius.mdsalutil.packet.IPProtocols;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
import org.opendaylight.netvirt.aclservice.api.AclServiceManager.MatchCriteria;
import org.opendaylight.netvirt.aclservice.api.utils.AclInterface;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
private final AclDataUtil aclDataUtil;
private final AclserviceConfig config;
private final IdManagerService idManager;
+ private final JobCoordinator jobCoordinator;
@Inject
public AclServiceUtils(DataBroker dataBroker, AclDataUtil aclDataUtil, AclserviceConfig config,
- IdManagerService idManager) {
+ IdManagerService idManager, JobCoordinator jobCoordinator) {
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.aclDataUtil = aclDataUtil;
this.config = config;
this.idManager = idManager;
+ this.jobCoordinator = jobCoordinator;
}
/**
.build();
}
- public List<ListenableFuture<Void>> addAclPortsLookupForInterfaceUpdate(AclInterface portBefore,
- AclInterface portAfter) {
- List<ListenableFuture<Void>> futures = new ArrayList<>();
+ public void addAclPortsLookupForInterfaceUpdate(AclInterface portBefore, AclInterface portAfter) {
LOG.debug("Processing interface additions for port {}", portAfter.getInterfaceId());
List<AllowedAddressPairs> addedAllowedAddressPairs = getUpdatedAllowedAddressPairs(
portAfter.getAllowedAddressPairs(), portBefore.getAllowedAddressPairs());
if (addedAllowedAddressPairs != null && !addedAllowedAddressPairs.isEmpty()) {
- futures.addAll(addAclPortsLookup(portAfter, portAfter.getSecurityGroups(), addedAllowedAddressPairs));
+ addAclPortsLookup(portAfter, portAfter.getSecurityGroups(), addedAllowedAddressPairs);
}
List<Uuid> addedAcls = getUpdatedAclList(portAfter.getSecurityGroups(), portBefore.getSecurityGroups());
if (addedAcls != null && !addedAcls.isEmpty()) {
- futures.addAll(addAclPortsLookup(portAfter, addedAcls, portAfter.getAllowedAddressPairs()));
+ addAclPortsLookup(portAfter, addedAcls, portAfter.getAllowedAddressPairs());
}
- return futures;
}
- public List<ListenableFuture<Void>> deleteAclPortsLookupForInterfaceUpdate(AclInterface portBefore,
- AclInterface portAfter) {
- List<ListenableFuture<Void>> futures = new ArrayList<>();
+ public void deleteAclPortsLookupForInterfaceUpdate(AclInterface portBefore, AclInterface portAfter) {
LOG.debug("Processing interface removals for port {}", portAfter.getInterfaceId());
List<AllowedAddressPairs> deletedAllowedAddressPairs = getUpdatedAllowedAddressPairs(
portBefore.getAllowedAddressPairs(), portAfter.getAllowedAddressPairs());
if (deletedAllowedAddressPairs != null && !deletedAllowedAddressPairs.isEmpty()) {
- futures.addAll(deleteAclPortsLookup(portAfter, portAfter.getSecurityGroups(), deletedAllowedAddressPairs));
+ deleteAclPortsLookup(portAfter, portAfter.getSecurityGroups(), deletedAllowedAddressPairs);
}
List<Uuid> deletedAcls = getUpdatedAclList(portBefore.getSecurityGroups(), portAfter.getSecurityGroups());
if (deletedAcls != null && !deletedAcls.isEmpty()) {
- futures.addAll(deleteAclPortsLookup(portAfter, deletedAcls, portAfter.getAllowedAddressPairs()));
+ deleteAclPortsLookup(portAfter, deletedAcls, portAfter.getAllowedAddressPairs());
}
- return futures;
}
- public List<ListenableFuture<Void>> addAclPortsLookup(AclInterface port, List<Uuid> aclList,
+ public void addAclPortsLookup(AclInterface port, List<Uuid> aclList,
List<AllowedAddressPairs> allowedAddresses) {
String portId = port.getInterfaceId();
LOG.trace("Adding AclPortsLookup for port={}, acls={}, AAPs={}", portId, aclList, allowedAddresses);
if (aclList == null || allowedAddresses == null || allowedAddresses.isEmpty()) {
LOG.warn("aclList or allowedAddresses is null. port={}, acls={}, AAPs={}", portId, aclList,
allowedAddresses);
- return Collections.emptyList();
+ return;
}
- List<ListenableFuture<Void>> futures = new ArrayList<>();
+
for (Uuid aclId : aclList) {
String aclName = aclId.getValue();
- synchronized (aclName.intern()) {
+ jobCoordinator.enqueueJob(aclName.intern(), () -> {
+ List<ListenableFuture<Void>> futures = new ArrayList<>();
futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> {
for (AllowedAddressPairs aap : allowedAddresses) {
PortIds portIdObj =
WriteTransaction.CREATE_MISSING_PARENTS);
}
}));
- }
+ return futures;
+ });
}
- return futures;
}
- public List<ListenableFuture<Void>> deleteAclPortsLookup(AclInterface port, List<Uuid> aclList,
+ public void deleteAclPortsLookup(AclInterface port, List<Uuid> aclList,
List<AllowedAddressPairs> allowedAddresses) {
String portId = port.getInterfaceId();
LOG.trace("Deleting AclPortsLookup for port={}, acls={}, AAPs={}", portId, aclList, allowedAddresses);
if (aclList == null || allowedAddresses == null || allowedAddresses.isEmpty()) {
LOG.warn("aclList or allowedAddresses is null. port={}, acls={}, AAPs={}", portId, aclList,
allowedAddresses);
- return Collections.emptyList();
+ return;
}
- List<ListenableFuture<Void>> futures = new ArrayList<>();
+
for (Uuid aclId : aclList) {
String aclName = aclId.getValue();
- synchronized (aclName.intern()) {
+ jobCoordinator.enqueueJob(aclName.intern(), () -> {
+ List<ListenableFuture<Void>> futures = new ArrayList<>();
futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> {
for (AllowedAddressPairs aap : allowedAddresses) {
InstanceIdentifier<PortIds> path =
cleanUpStaleEntriesInAclPortsLookup(aclName, tx);
}));
- }
+ return futures;
+ });
}
- return futures;
}
private void cleanUpStaleEntriesInAclPortsLookup(String aclName, WriteTransaction tx) {