This reworks interactions with Acl.getAccessListEntries(), so that
it's non-presence is uniformly treated in all cases. This fixes at
least:
java.lang.NullPointerException: null
at org.opendaylight.netvirt.aclservice.listeners.AclEventListener.remove(AclEventListener.java:110) ~[?:?]
at org.opendaylight.netvirt.aclservice.listeners.AclEventListener.remove(AclEventListener.java:50) ~[?:?]
at org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase$DataTreeChangeHandler.run(AsyncDataTreeChangeListenerBase.java:158) ~[274:org.opendaylight.genius.mdsalutil-api:0.7.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:?]
at java.lang.Thread.run(Thread.java:748) [?:?]
While also consilading duplicate code.
JIRA: NETVIRT-1636
Change-Id: Ifc33c63aa41c0fb75453deeee2093906c2ad5e95
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit
6a1bd2bd02d4612c8f468d179d5cb0dc795f1d84)
import org.opendaylight.netvirt.aclservice.utils.AclServiceOFFlowBuilder;
import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.AccessListEntries;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.Ace;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.Matches;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIp;
LOG.warn("The ACL {} not found in cache", aclUuid.getValue());
continue;
}
- AccessListEntries accessListEntries = acl.getAccessListEntries();
- if (accessListEntries != null && accessListEntries.getAce() != null) {
- for (Ace ace: accessListEntries.getAce()) {
- programAceRule(flowEntries, port, aclUuid.getValue(), ace, addOrRemove);
- }
+ for (Ace ace : AclServiceUtils.aceList(acl)) {
+ programAceRule(flowEntries, port, aclUuid.getValue(), ace, addOrRemove);
}
}
return true;
SecurityRuleAttr aceAttr = AclServiceUtils.getAccessListAttributes(ace);
if (aceAttr == null) {
LOG.error("Ace {} of Acl {} is either null or not having SecurityRuleAttr",
- ((ace == null) ? null : ace.getRuleName()), aclName);
+ ace == null ? null : ace.getRuleName(), aclName);
return;
}
if (addOrRemove == NwConstants.ADD_FLOW && aceAttr.isDeleted()) {
import javax.inject.Inject;
import javax.inject.Singleton;
import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
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;
this.aclServiceUtils.releaseAclTag(aclName);
}
// Handle Rule deletion If SG Remove event is received before SG Rule delete event
- if (null != acl.getAccessListEntries() && null != acl.getAccessListEntries().getAce()) {
- List<Ace> aceList = acl.getAccessListEntries().getAce();
+ List<Ace> aceList = AclServiceUtils.aceList(acl);
+ if (!aceList.isEmpty()) {
Collection<AclInterface> aclInterfaces =
ImmutableSet.copyOf(aclDataUtil.getInterfaceList(new Uuid(aclName)));
updateAceRules(aclInterfaces, aclName, aceList, AclServiceManager.Action.REMOVE);
* @param aclName the acl name
* @param action the action
*/
- private void updateRemoteAclCache(@Nullable List<Ace> aceList, String aclName, AclServiceManager.Action action) {
+ private void updateRemoteAclCache(@NonNull List<Ace> aceList, String aclName, AclServiceManager.Action action) {
for (Ace ace : aceList) {
SecurityRuleAttr aceAttributes = ace.augmentation(SecurityRuleAttr.class);
if (AclServiceUtils.doesAceHaveRemoteGroupId(aceAttributes)) {
return this;
}
- @NonNull
- private List<Ace> getChangedAceList(Acl updatedAcl, Acl currentAcl) {
+ private static @NonNull List<Ace> getChangedAceList(Acl updatedAcl, Acl currentAcl) {
if (updatedAcl == null) {
return Collections.emptyList();
}
- List<Ace> updatedAceList =
- updatedAcl.getAccessListEntries() == null || updatedAcl.getAccessListEntries().getAce() == null
- ? new ArrayList<>()
- : new ArrayList<>(updatedAcl.getAccessListEntries().getAce());
+ List<Ace> updatedAceList = AclServiceUtils.aceList(updatedAcl);
if (currentAcl == null) {
return updatedAceList;
}
- List<Ace> currentAceList =
- currentAcl.getAccessListEntries() == null || currentAcl.getAccessListEntries().getAce() == null
- ? new ArrayList<>()
- : new ArrayList<>(currentAcl.getAccessListEntries().getAce());
+
+ List<Ace> currentAceList = AclServiceUtils.aceList(currentAcl);
+ updatedAceList = new ArrayList<>(updatedAceList);
for (Iterator<Ace> iterator = updatedAceList.iterator(); iterator.hasNext();) {
Ace ace1 = iterator.next();
for (Ace ace2 : currentAceList) {
import java.util.concurrent.Future;
import javax.inject.Inject;
import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
return flowMatches;
}
- public static List<Ace> getAceListFromAcl(Acl acl) {
- if (acl.getAccessListEntries() != null) {
- List<Ace> aceList = acl.getAccessListEntries().getAce();
- if (aceList != null && !aceList.isEmpty()
- && aceList.get(0).augmentation(SecurityRuleAttr.class) != null) {
- return aceList;
- }
+ public static @NonNull List<Ace> aceList(@NonNull Acl acl) {
+ final AccessListEntries ale = acl.getAccessListEntries();
+ return ale == null ? Collections.emptyList() : ale.nonnullAce();
+ }
+
+ public static @NonNull List<Ace> getAceListFromAcl(Acl acl) {
+ List<Ace> aceList = aceList(acl);
+ if (!aceList.isEmpty() && aceList.get(0).augmentation(SecurityRuleAttr.class) != null) {
+ return aceList;
}
return Collections.emptyList();
}
public static Set<Uuid> getRemoteAclIdsByDirection(Acl acl, Class<? extends DirectionBase> direction) {
Set<Uuid> remoteAclIds = new HashSet<>();
- AccessListEntries accessListEntries = acl.getAccessListEntries();
- if (accessListEntries != null && accessListEntries.getAce() != null) {
- for (Ace ace : accessListEntries.getAce()) {
- SecurityRuleAttr aceAttr = AclServiceUtils.getAccessListAttributes(ace);
- if (aceAttr != null && Objects.equals(aceAttr.getDirection(), direction)
- && doesAceHaveRemoteGroupId(aceAttr)) {
- remoteAclIds.add(aceAttr.getRemoteGroupId());
- }
+ for (Ace ace : aceList(acl)) {
+ SecurityRuleAttr aceAttr = AclServiceUtils.getAccessListAttributes(ace);
+ if (aceAttr != null && Objects.equals(aceAttr.getDirection(), direction)
+ && doesAceHaveRemoteGroupId(aceAttr)) {
+ remoteAclIds.add(aceAttr.getRemoteGroupId());
}
}
return remoteAclIds;