use of org.opendaylight.netvirt.aclservice.api.utils.AclInterface in project netvirt by opendaylight.
the class AclInstanceRecoveryHandler method recoverService.
@Override
public void recoverService(String entityId) {
LOG.info("Recover ACL instance {}", entityId);
Uuid aclId = new Uuid(entityId);
Collection<AclInterface> aclInterfaces = aclDataUtil.getInterfaceList(aclId);
for (AclInterface aclInterface : aclInterfaces) {
String aclInterfaceId = aclInterface.getInterfaceId();
Optional<Interface> interfaceOptional = AclServiceUtils.getInterface(dataBroker, aclInterfaceId);
if (interfaceOptional.isPresent()) {
Interface interfaceBefore = interfaceOptional.get();
LOG.debug("Starting Recovery of acl Instance {} for interface {}", entityId, interfaceBefore.getName());
InterfaceAcl interfaceAclBefore = interfaceBefore.getAugmentation(InterfaceAcl.class);
List<Uuid> sgList = new ArrayList<>(interfaceAclBefore.getSecurityGroups());
sgList.remove(aclId);
InterfaceAcl interfaceAclAfter = new InterfaceAclBuilder(interfaceAclBefore).setSecurityGroups(sgList).build();
Interface interfaceAfter = new InterfaceBuilder(interfaceBefore).addAugmentation(InterfaceAcl.class, interfaceAclAfter).build();
aclInterfaceListener.update(null, interfaceBefore, interfaceAfter);
aclInterfaceListener.update(null, interfaceAfter, interfaceBefore);
} else {
LOG.error("Interfaces not present for aclInterface {} ", aclInterfaceId);
}
}
}
use of org.opendaylight.netvirt.aclservice.api.utils.AclInterface in project netvirt by opendaylight.
the class AbstractAclServiceImpl method programAclForExistingTrafficTable.
private void programAclForExistingTrafficTable(AclInterface port, Ace ace, int addOrRemove, String flowName, List<MatchInfoBase> matches, Integer priority) {
AceIp acl = (AceIp) ace.getMatches().getAceType();
final String newFlowName = flowName + this.directionString + "_" + port.getDpId() + "_" + port.getLPortTag() + "_" + ((acl.getAceIpVersion() instanceof AceIpv4) ? "_IPv4" : "_IPv6") + "_FlowAfterRuleDeleted";
final List<MatchInfoBase> newMatches = matches.stream().filter(obj -> !(obj instanceof NxMatchCtState || obj instanceof MatchMetadata)).collect(Collectors.toList());
newMatches.add(AclServiceUtils.buildLPortTagMatch(port.getLPortTag(), serviceMode));
newMatches.add(new NxMatchCtState(AclConstants.TRACKED_RPL_CT_STATE, AclConstants.TRACKED_RPL_CT_STATE_MASK));
List<InstructionInfo> instructions = AclServiceUtils.createCtMarkInstructionForNewState(getAclFilterCumDispatcherTable(), port.getElanId());
// Reversing the flow add/delete operation for this table.
int operation = (addOrRemove == NwConstants.ADD_FLOW) ? NwConstants.DEL_FLOW : NwConstants.ADD_FLOW;
syncFlow(port.getDpId(), getAclForExistingTrafficTable(), newFlowName, priority, "ACL", 0, AclServiceUtils.getHardTimoutForApplyStatefulChangeOnExistingTraffic(ace, aclServiceUtils), AclConstants.COOKIE_ACL_BASE, newMatches, instructions, operation);
}
use of org.opendaylight.netvirt.aclservice.api.utils.AclInterface in project netvirt by opendaylight.
the class AbstractAclServiceImpl method programRemoteAclTable.
private void programRemoteAclTable(String aclName, Set<Uuid> remoteAclIds, Set<BigInteger> dpns, int addOrRemove) {
for (Uuid remoteAclId : remoteAclIds) {
Collection<AclInterface> remoteAclInterfaces = aclDataUtil.getInterfaceList(remoteAclId);
if (remoteAclInterfaces == null || remoteAclInterfaces.isEmpty()) {
continue;
}
Set<AllowedAddressPairs> aaps = remoteAclInterfaces.stream().map(port -> port.getAllowedAddressPairs()).flatMap(List::stream).filter(aap -> AclServiceUtils.isNotIpAllNetwork(aap)).collect(Collectors.toSet());
Integer aclTag = aclServiceUtils.getAclTag(remoteAclId);
if (addOrRemove == NwConstants.ADD_FLOW) {
for (BigInteger dpn : dpns) {
for (AllowedAddressPairs aap : aaps) {
programRemoteAclTableFlow(dpn, aclTag, aap, addOrRemove);
}
}
} else if (addOrRemove == NwConstants.DEL_FLOW) {
Set<BigInteger> remoteAclDpns = new HashSet<>();
Map<String, Set<AclInterface>> mapAclWithPortSet = aclDataUtil.getRemoteAclInterfaces(remoteAclId, this.direction);
if (mapAclWithPortSet != null) {
Map<String, Set<AclInterface>> copyOfMapAclWithPortSet = new HashMap<>(mapAclWithPortSet);
copyOfMapAclWithPortSet.remove(aclName);
remoteAclDpns = collectDpns(copyOfMapAclWithPortSet);
}
Set<BigInteger> dpnsToOperate = new HashSet<>(dpns);
dpnsToOperate.removeAll(remoteAclDpns);
LOG.debug("Deleting flows in Remote ACL table for remoteAclId={}, direction={}, dpnsToOperate={}, " + "remoteAclDpns={}, dpns={}", remoteAclId.getValue(), directionString, dpnsToOperate, remoteAclDpns, dpns);
for (BigInteger dpn : dpnsToOperate) {
for (AllowedAddressPairs aap : aaps) {
programRemoteAclTableFlow(dpn, aclTag, aap, addOrRemove);
}
}
}
}
}
use of org.opendaylight.netvirt.aclservice.api.utils.AclInterface in project netvirt by opendaylight.
the class AclInterfaceCacheImpl method addOrUpdate.
@Override
public AclInterface addOrUpdate(@Nonnull String interfaceId, BiConsumer<AclInterface, AclInterface.Builder> updateFunction) {
while (true) {
// First try to update the existing instance in the cache if one exists.
AclInterface aclInterface = cache.computeIfPresent(interfaceId, (key, prevAclInterface) -> {
Builder builder = AclInterface.builder(prevAclInterface);
updateFunction.accept(prevAclInterface, builder);
return builder.build();
});
if (aclInterface == null) {
// No existing instance so try to put a new one.
Builder builder = AclInterface.builder();
builder.interfaceId(interfaceId);
updateFunction.accept(null, builder);
aclInterface = builder.build();
if (cache.putIfAbsent(interfaceId, aclInterface) == null) {
// The new instance was added.
return aclInterface;
}
// The new instance wasn't added - some one else beat us to it. Loop back up and try again.
} else {
return aclInterface;
}
}
}
Aggregations