Bug 4487 fixing of NPE and moved creation of infrastructure 94/28494/4
authorMartin Sunal <msunal@cisco.com>
Fri, 16 Oct 2015 10:38:13 +0000 (12:38 +0200)
committerMartin Sunal <msunal@cisco.com>
Fri, 16 Oct 2015 13:47:50 +0000 (15:47 +0200)
- Network Service EPG and Client Epg are created on neutronNetworkCreated

Change-Id: I85b805f327e73f41f81ce3c42846c55fa32cd641
Signed-off-by: Martin Sunal <msunal@cisco.com>
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/DestinationMapper.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PolicyEnforcer.java

index a4bfad2c94a695401fe34faa3342f9a8f2826749..5167289c530b3afbc4aab09bc8913b59fdd29a64 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.neutron.gbp.util.NeutronGbpIidFactory;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkClient;
+import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkService;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.Router;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronMapperIidFactory;
@@ -54,7 +55,7 @@ public class NeutronNetworkAware implements INeutronNetworkAware {
 
     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkAware.class);
     private final DataBroker dataProvider;
-    private Set<TenantId> tenantsWithRouterEntities = new HashSet<>();
+    private final Set<TenantId> tenantsWithRouterAndNetworkSeviceEntities = new HashSet<>();
 
     public NeutronNetworkAware(DataBroker dataProvider) {
         this.dataProvider = checkNotNull(dataProvider);
@@ -116,11 +117,17 @@ public class NeutronNetworkAware implements INeutronNetworkAware {
             .build();
         rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronMapperIidFactory.networkMappingIid(l2FdId), networkMapping, true);
 
-        if (!tenantsWithRouterEntities.contains(tenantId)) {
-            tenantsWithRouterEntities.add(tenantId);
+        if (!tenantsWithRouterAndNetworkSeviceEntities.contains(tenantId)) {
+            tenantsWithRouterAndNetworkSeviceEntities.add(tenantId);
             Router.writeRouterEntitiesToTenant(tenantId, rwTx);
             Router.writeRouterClauseWithConsProvEic(tenantId, null, rwTx);
+            NetworkService.writeNetworkServiceEntitiesToTenant(tenantId, rwTx);
+            NetworkService.writeDhcpClauseWithConsProvEic(tenantId, null, rwTx);
+            NetworkService.writeDnsClauseWithConsProvEic(tenantId, null, rwTx);
+            NetworkClient.writeNetworkClientEntitiesToTenant(tenantId, rwTx);
             NetworkClient.writeConsumerNamedSelector(tenantId, Router.CONTRACT_CONSUMER_SELECTOR, rwTx);
+            NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DHCP_CONTRACT_CONSUMER_SELECTOR, rwTx);
+            NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DNS_CONTRACT_CONSUMER_SELECTOR, rwTx);
         }
         if (network.getRouterExternal() != null && network.getRouterExternal() == true) {
             addEpgExternalIfMissing(tenantId, rwTx);
index 86fc91c845d4f7bf5336db2cada62b652240feec..56f7c87f3e8b8e390b5abd034dc33aebaf477dfc 100644 (file)
@@ -106,7 +106,6 @@ public class NeutronPortAware implements INeutronPortAware {
     private final NeutronSecurityRuleAware secRuleAware;
     private final NeutronSecurityGroupAware secGrpAware;
     private final static Map<String, UniqueId> floatingIpPortByDeviceId = new HashMap<>();
-    private final Set<TenantId> tenantsWithNetworkSeviceEntities = new HashSet<>();
 
     public NeutronPortAware(DataBroker dataProvider, EndpointService epService, NeutronSecurityRuleAware secRuleAware, NeutronSecurityGroupAware secGrpAware) {
         this.dataProvider = checkNotNull(dataProvider);
@@ -161,15 +160,6 @@ public class NeutronPortAware implements INeutronPortAware {
                 rwTx.cancel();
                 return;
             }
-            if (!tenantsWithNetworkSeviceEntities.contains(tenantId)) {
-                tenantsWithNetworkSeviceEntities.add(tenantId);
-                NetworkService.writeNetworkServiceEntitiesToTenant(tenantId, rwTx);
-                NetworkService.writeDhcpClauseWithConsProvEic(tenantId, null, rwTx);
-                NetworkService.writeDnsClauseWithConsProvEic(tenantId, null, rwTx);
-                NetworkClient.writeNetworkClientEntitiesToTenant(tenantId, rwTx);
-                NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DHCP_CONTRACT_CONSUMER_SELECTOR, rwTx);
-                NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DNS_CONTRACT_CONSUMER_SELECTOR, rwTx);
-            }
         } else {
             // this is here b/c stable/kilo sends sec-groups only with port
             List<NeutronSecurityGroup> secGroups = port.getSecurityGroups();
index 7cbfd2b1b234b6d62155e51bbbf5227c92010278..dcda8f7f8ad142f0bbefd4a67a5ca12d63836c5e 100755 (executable)
@@ -8,16 +8,49 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Strings;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.ARP;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.IPv4;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.IPv6;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxRegMatch;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.applyActionIns;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.decNwTtlAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.ethernetMatch;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.getOfPortNum;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.gotoTableIns;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.groupAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.instructions;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpOpAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpShaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpSpaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadRegAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIPv4Action;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIdAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveArpShaToArpThaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveArpSpaToArpTpaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveEthSrcToEthDstAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.outputAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.setDlDstAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.setDlSrcAction;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.endpoint.EpKey;
-import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.RegMatch;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.OrdinalFactory.EndpointFwdCtxOrdinals;
 import org.opendaylight.groupbasedpolicy.resolver.EgKey;
@@ -72,43 +105,11 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.ARP;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.IPv4;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.IPv6;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxRegMatch;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.applyActionIns;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.decNwTtlAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.ethernetMatch;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.getOfPortNum;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.gotoTableIns;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.groupAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.instructions;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpOpAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpShaAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpSpaAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadRegAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIPv4Action;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIdAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveArpShaToArpThaAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveArpSpaToArpTpaAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveEthSrcToEthDstAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.outputAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.setDlDstAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.setDlSrcAction;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
+import com.google.common.base.Optional;
+import com.google.common.base.Strings;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
 
 /**
  * Manage the table that maps the destination address to the next hop for the
@@ -1117,10 +1118,6 @@ public class DestinationMapper extends FlowTable {
 
     private HashSet<Subnet> getSubnets(final TenantId tenantId) {
 
-        // if (subnetsByTenant.get(tenantId) != null) {
-        // return subnetsByTenant.get(tenantId);
-        // }
-
         if (ctx.getDataBroker() == null) {
             return null;
         }
@@ -1133,18 +1130,20 @@ public class DestinationMapper extends FlowTable {
         } catch (Exception e) {
             LOG.error("Could not read Tenant {}", tenantId, e);
             return null;
+        } finally {
+            t.close();
         }
 
-        HashSet<Subnet> subnets = new HashSet<Subnet>();
-
         if (!tenantInfo.isPresent()) {
             LOG.warn("Tenant {} not found", tenantId);
             return null;
         }
 
-        subnets.addAll(tenantInfo.get().getSubnet());
-        // subnetsByTenant.put(tenantId, subnets);
-        return subnets;
+        List<Subnet> subnets = tenantInfo.get().getSubnet();
+        if (subnets == null) {
+            return new HashSet<>();
+        }
+        return new HashSet<>(subnets);
     }
 
     // Need a method to get subnets for EPs attached to the node locally
index d821d9c66383c59788d73116a7ca22d2f552aaa4..d08fcc164e05e361dec459199c1203c13616d596 100755 (executable)
@@ -210,6 +210,10 @@ public class PolicyEnforcer extends FlowTable {
                 IndexedTenant tenant = ctx.getPolicyResolver().getTenant(srcEpgKey.getTenantId());
                 if (tenant != null) {
                     EndpointGroup group = tenant.getEndpointGroup(srcEpgKey.getEgId());
+                    if (group == null) {
+                        LOG.debug("EPG {} does not exit and is used in EP {}", srcEpgKey, srcEp.getKey());
+                        continue;
+                    }
                     IntraGroupPolicy igp = group.getIntraGroupPolicy();
 
                     if (igp == null || igp.equals(IntraGroupPolicy.Allow)) {