Bug 5212 - Neutron-mapper has dependency on Ofoverlay renderer 19/33019/18
authorMartin Sunal <msunal@cisco.com>
Tue, 19 Jan 2016 16:41:17 +0000 (17:41 +0100)
committerMartin Sunal <msunal@cisco.com>
Wed, 3 Feb 2016 15:56:57 +0000 (16:56 +0100)
NeutronFloatingAware - adds NAT augmentation to endpoint-l3
NeutronNetworkAware - creates EXTERNAL_group EPG (as External
  Implicit Group (EIG)) if neutron external network is created
EXTERNAL_group EPG - provides contracts with allow IPv4/6 In/Out
L3-prefix-endpoint 0.0.0.0/0 belongs to EXTERNAL_group EPG
neutron ports where deviceOwner is router_gateway and router_interface
  are not mapped to endpoints
removed unused mappings
removed dependency on ofoverlay
neutron-ovsdb - added portByEndpoint listener which adds port-name to Ep, EpL3
ofoverlay - added listeners for ofoverlay endpoint context - add location(node,
  node-connector-id) based on port name
OvsdbNodeListener - creates of-overlay augmentation with external ports

Change-Id: If2a582d00f8771c433994154a02febf7c2a702cd
Signed-off-by: Martin Sunal <msunal@cisco.com>
37 files changed:
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/IidFactory.java
neutron-mapper/pom.xml
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/gbp/util/NeutronGbpIidFactory.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapper.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/Router.java [deleted file]
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/MappingFactory.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronFloatingIpAware.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkDao.java [new file with mode: 0644]
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronRouterAware.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronSubnetAware.java
neutron-mapper/src/main/yang/neutron-gbp-mapper.yang
neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/gbp/util/NeutronGbpIidFactoryTest.java
neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/RouterTest.java [deleted file]
neutron-ovsdb/src/main/java/org/opendaylight/controller/config/yang/config/neutron_ovsdb/impl/NeutronOvsdbModule.java
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronGbpFloatingIpListener.java [deleted file]
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronOvsdb.java
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListener.java [deleted file]
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/OvsdbNodeListener.java [new file with mode: 0644]
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/PortByEndpointListener.java [new file with mode: 0644]
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/EndpointHelper.java
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/InventoryHelper.java
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/NeutronOvsdbIidFactory.java
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronOvsdbTest.java [deleted file]
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListenerTest.java [deleted file]
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/EndpointHelperTest.java
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/InventoryHelperTest.java
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/NeutronOvsdbIidFactoryTest.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManager.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayContextListener.java [new file with mode: 0644]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayL3ContextListener.java [new file with mode: 0644]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/SwitchManager.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRendererTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerTest.java

index 74125c07f87d45b644333123c82ee5c42899ffa5..0855c152de4e7371aeca229d270d2da433145c99 100644 (file)
@@ -57,6 +57,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ContractKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroupKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.SubjectFeatureInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Clause;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.ClauseKey;
@@ -347,4 +349,14 @@ public class IidFactory {
     public static InstanceIdentifier<Renderers> renderersIid() {
         return InstanceIdentifier.builder(Renderers.class).build();
     }
+
+    public static InstanceIdentifier<ExternalImplicitGroup> externalImplicitGroupIid(TenantId tenantId,
+            EndpointGroupId epgId) {
+        return InstanceIdentifier.builder(Tenants.class)
+            .child(Tenant.class, new TenantKey(tenantId))
+            .child(Policy.class)
+            .child(ExternalImplicitGroup.class, new ExternalImplicitGroupKey(epgId))
+            .build();
+    }
+
 }
index e563cb0dcc587348e2bd9236b4d8ffb2b461ef80..b2b7727a70faa17d8823fb9f393ebcc3266dac8a 100644 (file)
       <artifactId>groupbasedpolicy</artifactId>
       <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>ofoverlay-renderer</artifactId>
-      <version>${project.version}</version>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.neutron</groupId>
       <artifactId>neutron-spi</artifactId>
index 1e5d2b92ac23d3b6c497ad10d5a17f53e985ece5..14b8b97fcc4c2203b1a369ec08fadddbb75abff8 100644 (file)
@@ -11,48 +11,19 @@ package org.opendaylight.groupbasedpolicy.neutron.gbp.util;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.FloatingIpAssociationMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.GbpByNeutronMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.NeutronByGbpMappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.FloatingIpPortsByInternalPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.InternalPortsByFloatingIpPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.floating.ip.ports.by.internal.ports.FloatingIpPortByInternalPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.floating.ip.ports.by.internal.ports.FloatingIpPortByInternalPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByFloatingIpPorts;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByRouterGatewayPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByRouterInterfacePorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router._interface.ports.EndpointByRouterInterfacePort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router._interface.ports.EndpointByRouterInterfacePortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router.gateway.ports.EndpointByRouterGatewayPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router.gateway.ports.EndpointByRouterGatewayPortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ExternalGatewaysAsL3Endpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ExternalNetworksByL2FloodDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.FloatingIpPortsByEndpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.PortsByEndpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.RouterGatewayPortsByEndpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.RouterInterfacePortsByEndpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3EndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomainKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.floating.ip.ports.by.endpoints.FloatingIpPortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.floating.ip.ports.by.endpoints.FloatingIpPortByEndpointKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router._interface.ports.by.endpoints.RouterInterfacePortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router._interface.ports.by.endpoints.RouterInterfacePortByEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router.gateway.ports.by.endpoints.RouterGatewayPortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router.gateway.ports.by.endpoints.RouterGatewayPortByEndpointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 
@@ -76,83 +47,6 @@ public class NeutronGbpIidFactory {
             .build();
     }
 
-    public static InstanceIdentifier<EndpointByRouterGatewayPort> endpointByRouterGatewayPortIid(UniqueId portId) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(GbpByNeutronMappings.class)
-            .child(EndpointsByRouterGatewayPorts.class)
-            .child(EndpointByRouterGatewayPort.class, new EndpointByRouterGatewayPortKey(portId))
-            .build();
-    }
-
-    public static InstanceIdentifier<RouterGatewayPortByEndpoint> routerGatewayPortByEndpointIid(
-            L2BridgeDomainId l2BdId, MacAddress mac) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(NeutronByGbpMappings.class)
-            .child(RouterGatewayPortsByEndpoints.class)
-            .child(RouterGatewayPortByEndpoint.class, new RouterGatewayPortByEndpointKey(l2BdId, mac))
-            .build();
-    }
-
-    public static InstanceIdentifier<EndpointByRouterInterfacePort> endpointByRouterInterfacePortIid(UniqueId portId) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(GbpByNeutronMappings.class)
-            .child(EndpointsByRouterInterfacePorts.class)
-            .child(EndpointByRouterInterfacePort.class, new EndpointByRouterInterfacePortKey(portId))
-            .build();
-    }
-
-    public static InstanceIdentifier<RouterInterfacePortByEndpoint> routerInterfacePortByEndpointIid(
-            L2BridgeDomainId l2BdId, MacAddress mac) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(NeutronByGbpMappings.class)
-            .child(RouterInterfacePortsByEndpoints.class)
-            .child(RouterInterfacePortByEndpoint.class, new RouterInterfacePortByEndpointKey(l2BdId, mac))
-            .build();
-    }
-
-    public static InstanceIdentifier<EndpointByFloatingIpPort> endpointByFloatingIpPortIid(UniqueId portId) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(GbpByNeutronMappings.class)
-            .child(EndpointsByFloatingIpPorts.class)
-            .child(EndpointByFloatingIpPort.class, new EndpointByFloatingIpPortKey(portId))
-            .build();
-    }
-
-    public static InstanceIdentifier<FloatingIpPortByEndpoint> floatingIpPortByEndpointIid(L2BridgeDomainId l2BdId,
-            MacAddress mac) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(NeutronByGbpMappings.class)
-            .child(FloatingIpPortsByEndpoints.class)
-            .child(FloatingIpPortByEndpoint.class, new FloatingIpPortByEndpointKey(l2BdId, mac))
-            .build();
-    }
-
-    public static InstanceIdentifier<InternalPortByFloatingIpPort> internalPortByFloatingIpPortIid(
-            UniqueId floatingIpPortId) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(FloatingIpAssociationMappings.class)
-            .child(InternalPortsByFloatingIpPorts.class)
-            .child(InternalPortByFloatingIpPort.class, new InternalPortByFloatingIpPortKey(floatingIpPortId))
-            .build();
-    }
-
-    public static InstanceIdentifier<FloatingIpPortByInternalPort> floatingIpPortByInternalPortIid(
-            UniqueId floatingIpPortId) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-            .child(FloatingIpAssociationMappings.class)
-            .child(FloatingIpPortsByInternalPorts.class)
-            .child(FloatingIpPortByInternalPort.class, new FloatingIpPortByInternalPortKey(floatingIpPortId))
-            .build();
-    }
-
     public static InstanceIdentifier<ExternalGatewayAsL3Endpoint> externalGatewayAsL3Endpoint(L3ContextId l3Context,
             IpAddress ipAddress) {
         return InstanceIdentifier.builder(
@@ -163,13 +57,4 @@ public class NeutronGbpIidFactory {
             .build();
     }
 
-    public static InstanceIdentifier<ExternalNetworkByL2FloodDomain> externalNetworkByL2FloodDomain(L2FloodDomainId l2FdId) {
-        return InstanceIdentifier.builder(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings.class)
-                .child(NeutronByGbpMappings.class)
-                .child(ExternalNetworksByL2FloodDomains.class)
-                .child(ExternalNetworkByL2FloodDomain.class, new ExternalNetworkByL2FloodDomainKey(l2FdId))
-                .build();
-    }
-
 }
index e46cdff4ec7064541605e55217ce2e38bc8e608b..f897c59e2bca5530650caeb1ad6008ce60cb7fea 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronFloatingIpAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronNetworkAware;
+import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronNetworkDao;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronPortAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronRouterAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronSubnetAware;
@@ -48,16 +49,14 @@ public class NeutronMapper implements AutoCloseable {
     }
 
     private void registerAwareProviders(DataBroker dataProvider, EndpointService epService, BundleContext context) {
-        ServiceRegistration<INeutronNetworkAware> neutronNetworkAwareRegistration =
-                context.registerService(INeutronNetworkAware.class, new NeutronNetworkAware(dataProvider), null);
-        registrations.add(neutronNetworkAwareRegistration);
+        SecGroupDao secGroupDao = new SecGroupDao();
+        SecRuleDao secRuleDao = new SecRuleDao();
+        NeutronNetworkDao networkDao = new NeutronNetworkDao();
 
         ServiceRegistration<INeutronSubnetAware> neutronSubnetAwareRegistration =
-                context.registerService(INeutronSubnetAware.class, new NeutronSubnetAware(dataProvider), null);
+                context.registerService(INeutronSubnetAware.class, new NeutronSubnetAware(dataProvider, networkDao), null);
         registrations.add(neutronSubnetAwareRegistration);
 
-        SecGroupDao secGroupDao = new SecGroupDao();
-        SecRuleDao secRuleDao = new SecRuleDao();
         NeutronSecurityRuleAware securityRuleAware = new NeutronSecurityRuleAware(dataProvider, secRuleDao, secGroupDao);
         ServiceRegistration<INeutronSecurityRuleAware> neutronSecurityRuleAwareRegistration =
                 context.registerService(INeutronSecurityRuleAware.class, securityRuleAware, null);
@@ -68,19 +67,23 @@ public class NeutronMapper implements AutoCloseable {
                 context.registerService(INeutronSecurityGroupAware.class, securityGroupAware, null);
         registrations.add(neutronSecurityGroupAwareRegistration);
 
+        ServiceRegistration<INeutronNetworkAware> neutronNetworkAwareRegistration = context.registerService(
+                INeutronNetworkAware.class, new NeutronNetworkAware(dataProvider, securityGroupAware, networkDao), null);
+        registrations.add(neutronNetworkAwareRegistration);
+
         NeutronPortAware portAware =
                 new NeutronPortAware(dataProvider, epService, securityRuleAware, securityGroupAware);
         ServiceRegistration<INeutronPortAware> neutronPortAwareRegistration =
                 context.registerService(INeutronPortAware.class, portAware, null);
         registrations.add(neutronPortAwareRegistration);
 
-        NeutronRouterAware routerAware = new NeutronRouterAware(dataProvider, epService, securityRuleAware);
+        NeutronRouterAware routerAware = new NeutronRouterAware(dataProvider, epService);
         ServiceRegistration<INeutronRouterAware> neutronRouterAwareRegistration =
                 context.registerService(INeutronRouterAware.class, routerAware, null);
         registrations.add(neutronRouterAwareRegistration);
 
         ServiceRegistration<INeutronFloatingIPAware> neutronFloatingIpAwareRegistration = context
-            .registerService(INeutronFloatingIPAware.class, new NeutronFloatingIpAware(dataProvider, epService), null);
+            .registerService(INeutronFloatingIPAware.class, new NeutronFloatingIpAware(dataProvider), null);
         registrations.add(neutronFloatingIpAwareRegistration);
     }
 
diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/Router.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/Router.java
deleted file mode 100644 (file)
index 2c8389f..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.annotation.Nullable;
-
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils;
-import org.opendaylight.groupbasedpolicy.util.IidFactory;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRefBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.EndpointIdentificationConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.endpoint.identification.constraints.L3EndpointIdentificationConstraints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.endpoint.identification.constraints.L3EndpointIdentificationConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.endpoint.identification.constraints.l3.endpoint.identification.constraints.PrefixConstraintBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.Contract;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ContractBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup.IntraGroupPolicy;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Clause;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.ClauseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Subject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.SubjectBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.ConsumerMatchers;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.ConsumerMatchersBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.ProviderMatchers;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.ProviderMatchersBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.RuleBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelectorBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ProviderNamedSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ProviderNamedSelectorBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstanceBuilder;
-
-import com.google.common.collect.ImmutableList;
-
-public class Router {
-
-    private static final ClassifierName IPV4_NAME = new ClassifierName("IPv4");
-    private static final ClassifierName IPV6_NAME = new ClassifierName("IPv6");
-    private static final SubjectName ROUTER_SUBJECT_NAME = new SubjectName("ALLOW_IPv4_IPv6");
-    private static final Description ROUTER_CONTRACT_DESC =
-            new Description("Allow IPv4 and IPv6 communication between router interfaces and endpoints.");
-    /**
-     * ID of {@link Contract}
-     */
-    public static final ContractId CONTRACT_ID = new ContractId("111bc60e-1110-11e5-885d-feff819cdc9f");
-    /**
-     * Contains rules with action {@link MappingUtils#ACTION_REF_ALLOW} matching IPv4 and IPv6
-     * communication in both directions
-     */
-    public static final Contract CONTRACT;
-
-    private static final Name ROUTER_EPG_NAME = new Name("ROUTER_PORTS");
-    private static final Description ROUTER_EPG_DESC = new Description("Represents router's interfaces.");
-    /**
-     * ID of {@link #EPG}
-     */
-    public static final EndpointGroupId EPG_ID = new EndpointGroupId("1118172e-cd84-4933-a35f-749f9a651de9");
-    /**
-     * Router endpoint-group providing {@link #CONTRACT}
-     */
-    public static final EndpointGroup EPG;
-    /**
-     * {@link ConsumerNamedSelector} pointing to {@link #CONTRACT}
-     */
-    public static final ConsumerNamedSelector CONTRACT_CONSUMER_SELECTOR;
-
-    static {
-        CONTRACT = createContractRouter();
-        CONTRACT_CONSUMER_SELECTOR = createConsumerSelector(CONTRACT);
-        EPG = createRouterEpg();
-    }
-
-    private static EndpointGroup createRouterEpg() {
-        ProviderNamedSelector routerProviderSelector = createProviderSelector(CONTRACT);
-        return new EndpointGroupBuilder().setId(EPG_ID)
-            .setName(ROUTER_EPG_NAME)
-            .setProviderNamedSelector(ImmutableList.of(routerProviderSelector))
-            .setIntraGroupPolicy(IntraGroupPolicy.RequireContract)
-            .setDescription(ROUTER_EPG_DESC)
-            .build();
-    }
-
-    private static ProviderNamedSelector createProviderSelector(Contract contract) {
-        SelectorName selectorName = new SelectorName(contract.getSubject().get(0).getName().getValue());
-        return new ProviderNamedSelectorBuilder().setName(selectorName)
-            .setContract(ImmutableList.of(contract.getId()))
-            .build();
-    }
-
-    private static ConsumerNamedSelector createConsumerSelector(Contract contract) {
-        SelectorName selectorName = new SelectorName(contract.getSubject().get(0).getName().getValue());
-        return new ConsumerNamedSelectorBuilder().setName(selectorName)
-            .setContract(ImmutableList.of(contract.getId()))
-            .build();
-    }
-
-    private static Contract createContractRouter() {
-        Rule endpointRouterIpv4Rule = createRuleAllow(IPV4_NAME, Direction.In);
-        Rule routerEndpointIpv4Rule = createRuleAllow(IPV4_NAME, Direction.Out);
-        Rule endpointRouterIpv6Rule = createRuleAllow(IPV6_NAME, Direction.In);
-        Rule routerEndpointIpv6Rule = createRuleAllow(IPV6_NAME, Direction.Out);
-        Subject subject = new SubjectBuilder().setName(ROUTER_SUBJECT_NAME)
-            .setOrder(0)
-            .setRule(ImmutableList.of(endpointRouterIpv4Rule, routerEndpointIpv4Rule, endpointRouterIpv6Rule,
-                    routerEndpointIpv6Rule))
-            .build();
-        return new ContractBuilder().setId(CONTRACT_ID)
-            .setSubject(ImmutableList.of(subject))
-            .setDescription(ROUTER_CONTRACT_DESC)
-            .build();
-    }
-
-    private static Rule createRuleAllow(ClassifierName classifierName, Direction direction) {
-        ClassifierName name =
-                new ClassifierName(direction.name() + MappingUtils.NAME_DOUBLE_DELIMETER + classifierName.getValue());
-        ClassifierRef classifierRef = new ClassifierRefBuilder().setName(name)
-            .setInstanceName(classifierName)
-            .setDirection(direction)
-            .build();
-        return new RuleBuilder().setName(new RuleName(name))
-            .setActionRef(MappingUtils.ACTION_REF_ALLOW)
-            .setClassifierRef(ImmutableList.of(classifierRef))
-            .build();
-    }
-
-    /**
-     * puts clause with {@link L3EndpointIdentificationConstraints} in {@link ConsumerMatchers}
-     * and {@link ProviderMatchers}. This clause points to subject in {@link #CONTRACT}.
-     *
-     * @param tenantId location of {@link #CONTRACT}
-     * @param ipPrefix used in {@link L3EndpointIdentificationConstraints}
-     * @param wTx transaction where entities are written
-     */
-    public static void writeRouterClauseWithConsProvEic(TenantId tenantId, @Nullable IpPrefix ipPrefix,
-            WriteTransaction wTx) {
-        Clause clause = createClauseWithConsProvEic(ipPrefix, ROUTER_SUBJECT_NAME);
-        wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.clauseIid(tenantId, CONTRACT_ID, clause.getName()),
-                clause, true);
-    }
-
-    private static Clause createClauseWithConsProvEic(@Nullable IpPrefix ipPrefix, SubjectName subjectName) {
-        ConsumerMatchers consumerMatchers = null;
-        ProviderMatchers providerMatchers = null;
-        StringBuilder clauseName = new StringBuilder();
-        clauseName.append(subjectName.getValue());
-        if (ipPrefix != null) {
-            clauseName.append(MappingUtils.NAME_DOUBLE_DELIMETER).append(Utils.getStringIpPrefix(ipPrefix));
-            consumerMatchers =
-                    new ConsumerMatchersBuilder()
-                        .setEndpointIdentificationConstraints(new EndpointIdentificationConstraintsBuilder()
-                            .setL3EndpointIdentificationConstraints(new L3EndpointIdentificationConstraintsBuilder()
-                                .setPrefixConstraint(
-                                        ImmutableList.of(new PrefixConstraintBuilder().setIpPrefix(ipPrefix).build()))
-                                .build())
-                            .build())
-                        .build();
-            providerMatchers =
-                    new ProviderMatchersBuilder()
-                        .setEndpointIdentificationConstraints(new EndpointIdentificationConstraintsBuilder()
-                            .setL3EndpointIdentificationConstraints(new L3EndpointIdentificationConstraintsBuilder()
-                                .setPrefixConstraint(
-                                        ImmutableList.of(new PrefixConstraintBuilder().setIpPrefix(ipPrefix).build()))
-                                .build())
-                            .build())
-                        .build();
-        }
-        return new ClauseBuilder().setName(new ClauseName(clauseName.toString()))
-            .setSubjectRefs(ImmutableList.of(subjectName))
-            .setConsumerMatchers(consumerMatchers)
-            .setProviderMatchers(providerMatchers)
-            .build();
-    }
-
-    /**
-     * Puts router entities (classifier-instances, {@link #CONTRACT} and {@link #EPG}) to
-     * {@link LogicalDatastoreType#CONFIGURATION}
-     *
-     * @param tenantId location of router entities
-     * @param wTx transaction where router entities are written
-     */
-    public static void writeRouterEntitiesToTenant(TenantId tenantId, WriteTransaction wTx) {
-        Set<ClassifierInstance> classifierInstances = getAllClassifierInstances();
-        for (ClassifierInstance ci : classifierInstances) {
-            wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.classifierInstanceIid(tenantId, ci.getName()), ci,
-                    true);
-        }
-        wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.contractIid(tenantId, CONTRACT_ID), CONTRACT, true);
-        wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.endpointGroupIid(tenantId, EPG_ID), EPG, true);
-    }
-
-    /**
-     * @return All classifier-instances used in {@link CONTRACT}
-     */
-    public static Set<ClassifierInstance> getAllClassifierInstances() {
-        HashSet<ClassifierInstance> cis = new HashSet<>();
-        cis.add(createIpv4());
-        cis.add(createIpv6());
-        return cis;
-    }
-
-    private static ClassifierInstance createIpv4() {
-        return new ClassifierInstanceBuilder().setName(IPV4_NAME)
-            .setClassifierDefinitionId(EtherTypeClassifierDefinition.DEFINITION.getId())
-            .setParameterValue(createParams(EtherTypeClassifierDefinition.IPv4_VALUE))
-            .build();
-    }
-
-    private static ClassifierInstance createIpv6() {
-        return new ClassifierInstanceBuilder().setName(IPV6_NAME)
-            .setClassifierDefinitionId(EtherTypeClassifierDefinition.DEFINITION.getId())
-            .setParameterValue(createParams(EtherTypeClassifierDefinition.IPv6_VALUE))
-            .build();
-    }
-
-    private static List<ParameterValue> createParams(long etherType) {
-        List<ParameterValue> params = new ArrayList<>();
-        params.add(new ParameterValueBuilder().setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM))
-            .setIntValue(etherType)
-            .build());
-        return params;
-    }
-}
index 3b63bcdf294e9f81b68ab8241e26d250ebc3e793..64b5114d2ec31bf6dc29f0e732880f601dc720ff 100644 (file)
@@ -11,25 +11,13 @@ package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPortBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router._interface.ports.EndpointByRouterInterfacePort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router._interface.ports.EndpointByRouterInterfacePortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router.gateway.ports.EndpointByRouterGatewayPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router.gateway.ports.EndpointByRouterGatewayPortBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3EndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3EndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.floating.ip.ports.by.endpoints.FloatingIpPortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.floating.ip.ports.by.endpoints.FloatingIpPortByEndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpointBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router._interface.ports.by.endpoints.RouterInterfacePortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router._interface.ports.by.endpoints.RouterInterfacePortByEndpointBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router.gateway.ports.by.endpoints.RouterGatewayPortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router.gateway.ports.by.endpoints.RouterGatewayPortByEndpointBuilder;
 
 public class MappingFactory {
 
@@ -51,48 +39,6 @@ public class MappingFactory {
             .build();
     }
 
-    public static EndpointByRouterGatewayPort createEndpointByRouterGatewayPort(EndpointKey epKey, UniqueId portId) {
-        return new EndpointByRouterGatewayPortBuilder().setPortId(portId)
-            .setL2Context(epKey.getL2Context())
-            .setMacAddress(epKey.getMacAddress())
-            .build();
-    }
-
-    public static RouterGatewayPortByEndpoint createRouterGatewayPortByEndpoint(UniqueId portId, EndpointKey epKey) {
-        return new RouterGatewayPortByEndpointBuilder().setPortId(portId)
-            .setL2Context(epKey.getL2Context())
-            .setMacAddress(epKey.getMacAddress())
-            .build();
-    }
-
-    public static EndpointByRouterInterfacePort createEndpointByRouterInterfacePort(EndpointKey epKey, UniqueId portId) {
-        return new EndpointByRouterInterfacePortBuilder().setPortId(portId)
-            .setL2Context(epKey.getL2Context())
-            .setMacAddress(epKey.getMacAddress())
-            .build();
-    }
-
-    public static RouterInterfacePortByEndpoint createRouterInterfacePortByEndpoint(UniqueId portId, EndpointKey epKey) {
-        return new RouterInterfacePortByEndpointBuilder().setPortId(portId)
-            .setL2Context(epKey.getL2Context())
-            .setMacAddress(epKey.getMacAddress())
-            .build();
-    }
-
-    public static EndpointByFloatingIpPort createEndpointByFloatingIpPort(EndpointKey epKey, UniqueId portId) {
-        return new EndpointByFloatingIpPortBuilder().setPortId(portId)
-            .setL2Context(epKey.getL2Context())
-            .setMacAddress(epKey.getMacAddress())
-            .build();
-    }
-
-    public static FloatingIpPortByEndpoint createFloatingIpPortByEndpoint(UniqueId portId, EndpointKey epKey) {
-        return new FloatingIpPortByEndpointBuilder().setPortId(portId)
-            .setL2Context(epKey.getL2Context())
-            .setMacAddress(epKey.getMacAddress())
-            .build();
-    }
-
     public static ExternalGatewayAsL3Endpoint createExternalGatewayByL3Endpoint(EndpointL3Key epL3Key) {
         return new ExternalGatewayAsL3EndpointBuilder().setKey(
                 new ExternalGatewayAsL3EndpointKey(epL3Key.getIpAddress(), epL3Key.getL3Context()))
index f71c3b68b6c3c57ace409b68cb15424aec099e99..2650595ba88684baedf979e20ca55d380bcd3e6d 100644 (file)
@@ -13,19 +13,15 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 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.util.Utils;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.neutron.spi.INeutronFloatingIPAware;
-import org.opendaylight.neutron.spi.INeutronPortCRUD;
-import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
 import org.opendaylight.neutron.spi.NeutronFloatingIP;
-import org.opendaylight.neutron.spi.NeutronPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.floating.ip.ports.by.internal.ports.FloatingIpPortByInternalPortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddressBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,11 +31,9 @@ public class NeutronFloatingIpAware implements INeutronFloatingIPAware {
 
     public static final Logger LOG = LoggerFactory.getLogger(NeutronFloatingIpAware.class);
     private final DataBroker dataProvider;
-    private final EndpointService epService;
 
-    public NeutronFloatingIpAware(DataBroker dataProvider, EndpointService epService) {
+    public NeutronFloatingIpAware(DataBroker dataProvider) {
         this.dataProvider = checkNotNull(dataProvider);
-        this.epService = checkNotNull(epService);
     }
 
     @Override
@@ -56,52 +50,30 @@ public class NeutronFloatingIpAware implements INeutronFloatingIPAware {
     @Override
     public int canUpdateFloatingIP(NeutronFloatingIP delta, NeutronFloatingIP original) {
         LOG.trace("canUpdateFloatingIP - delta: {} original: {}", delta, original);
-        // floating IP UUID is same as device ID of a port representing floating IP
-        UniqueId floatingIpPortId = NeutronPortAware.getFloatingIpPortIdByDeviceId(original.getFloatingIPUUID());
-        if (floatingIpPortId == null) {
-            LOG.warn("Illegal state - Port representing floating ip where floating IP uuid is {} does not exist.",
-                    original.getFloatingIPUUID());
-            return StatusCode.INTERNAL_SERVER_ERROR;
-        }
-
-        ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
         String oldFixedIPAddress = Strings.nullToEmpty(original.getFixedIPAddress());
-        String oldPortUUID = Strings.nullToEmpty(original.getPortUUID());
         String newFixedIPAddress = Strings.nullToEmpty(delta.getFixedIPAddress());
-        String newPortUUID = Strings.nullToEmpty(delta.getPortUUID());
-        if (oldFixedIPAddress.equals(newFixedIPAddress) && oldPortUUID.equals(newPortUUID)) {
+        if (oldFixedIPAddress.equals(newFixedIPAddress)) {
             // interesting fields were not changed
             return StatusCode.OK;
         }
 
-        if ((!oldFixedIPAddress.isEmpty() && newFixedIPAddress.isEmpty())
-                || (!oldPortUUID.isEmpty() && newPortUUID.isEmpty())) {
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.internalPortByFloatingIpPortIid(floatingIpPortId), rwTx);
+        ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
+        L3ContextId routerL3Context = new L3ContextId(delta.getRouterUUID());
+        String newFloatingIp = Strings.nullToEmpty(delta.getFloatingIPAddress());
+        if (!newFixedIPAddress.isEmpty() && !newFloatingIp.isEmpty()) {
+            IpAddress epIp = Utils.createIpAddress(newFixedIPAddress);
+            IpAddress epNatIp = Utils.createIpAddress(newFloatingIp);
+            NatAddress nat = new NatAddressBuilder().setNatAddress(epNatIp).build();
+            rwTx.put(LogicalDatastoreType.OPERATIONAL,
+                    IidFactory.l3EndpointIid(routerL3Context, epIp).augmentation(NatAddress.class), nat, true);
+        }
+        if (!oldFixedIPAddress.isEmpty()) {
             DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.floatingIpPortByInternalPortIid(new UniqueId(oldPortUUID)), rwTx);
-            // TODO unregister EP representing floating ip port
-        } else if (!newFixedIPAddress.isEmpty() && !newPortUUID.isEmpty()) {
-            // workaround for https://bugs.opendaylight.org/show_bug.cgi?id=3368
-            // otherwise we will create port representing floating IP in NeutronPortAware
-            Integer errorCode = registerFloatingIpPort(original.getTenantUUID(), floatingIpPortId.getValue(), rwTx);
-            if (errorCode != null) {
-                rwTx.cancel();
-                return errorCode;
-            }
-
-            UniqueId internalPortId = new UniqueId(newPortUUID);
-            InternalPortByFloatingIpPort internalPortByFloatingIpPort = new InternalPortByFloatingIpPortBuilder().setFloatingIpPortId(
-                    floatingIpPortId)
-                .setFloatingIpPortIpAddress(Utils.createIpAddress(original.getFloatingIPAddress()))
-                .setInternalPortId(internalPortId)
-                .setInternalPortIpAddress(Utils.createIpAddress(newFixedIPAddress))
-                .build();
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.internalPortByFloatingIpPortIid(floatingIpPortId),
-                    internalPortByFloatingIpPort, true);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.floatingIpPortByInternalPortIid(internalPortId),
-                    new FloatingIpPortByInternalPortBuilder(internalPortByFloatingIpPort).build(), true);
+                    IidFactory.l3EndpointIid(routerL3Context, Utils.createIpAddress(oldFixedIPAddress))
+                        .augmentation(NatAddress.class),
+                    rwTx);
         }
+
         boolean isSubmitToDsSuccessful = DataStoreHelper.submitToDs(rwTx);
         if (!isSubmitToDsSuccessful) {
             return StatusCode.INTERNAL_SERVER_ERROR;
@@ -110,24 +82,6 @@ public class NeutronFloatingIpAware implements INeutronFloatingIPAware {
         return StatusCode.OK;
     }
 
-    private Integer registerFloatingIpPort(String tenantUUID, String floatingIpPortUUID, ReadWriteTransaction rwTx) {
-        NeutronCRUDInterfaces neutronCRUDInterface = new NeutronCRUDInterfaces().fetchINeutronPortCRUD(this);
-        INeutronPortCRUD portInterface = neutronCRUDInterface.getPortInterface();
-        if (portInterface == null) {
-            LOG.warn("Illegal state - No provider for {}", INeutronPortCRUD.class.getName());
-            return StatusCode.INTERNAL_SERVER_ERROR;
-        }
-        NeutronPort floatingIpPort = portInterface.getPort(floatingIpPortUUID);
-        // TenantId tenantId = new TenantId(Utils.normalizeUuid());
-        floatingIpPort.setTenantID(tenantUUID);
-        boolean isNeutronPortCreated = NeutronPortAware.addNeutronPort(floatingIpPort, rwTx, epService);
-        if (!isNeutronPortCreated) {
-            rwTx.cancel();
-            return StatusCode.INTERNAL_SERVER_ERROR;
-        }
-        return null;
-    }
-
     @Override
     public void neutronFloatingIPUpdated(NeutronFloatingIP floatingIP) {
         LOG.trace("neutronFloatingIPUpdated - {}", floatingIP);
index 1439150b570dac8e0eb944306156eecd0017799a..a692884049a53330f7d594147d70b93f7a88a1e4 100644 (file)
@@ -16,25 +16,25 @@ import java.util.UUID;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 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.mapping.group.NeutronSecurityGroupAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronMapperIidFactory;
+import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronUtils;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.neutron.spi.INeutronNetworkAware;
 import org.opendaylight.neutron.spi.NeutronNetwork;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
+import org.opendaylight.neutron.spi.NeutronSecurityGroup;
+import org.opendaylight.neutron.spi.NeutronSecurityRule;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomainBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.mapper.rev150223.mappings.network.mappings.NetworkMapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.mapper.rev150223.mappings.network.mappings.NetworkMappingBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomain;
@@ -43,22 +43,27 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomainBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroupBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
 
 public class NeutronNetworkAware implements INeutronNetworkAware {
 
     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkAware.class);
     private final DataBroker dataProvider;
     private final Set<TenantId> tenantsWithRouterAndNetworkSeviceEntities = new HashSet<>();
+    private final NeutronSecurityGroupAware secGrpAware;
+    private final NeutronNetworkDao networkDao;
 
-    public NeutronNetworkAware(DataBroker dataProvider) {
+    public NeutronNetworkAware(DataBroker dataProvider, NeutronSecurityGroupAware secGrpAware, NeutronNetworkDao networkDao) {
         this.dataProvider = checkNotNull(dataProvider);
+        this.secGrpAware = checkNotNull(secGrpAware);
+        this.networkDao = checkNotNull(networkDao);
     }
 
     /**
@@ -111,49 +116,61 @@ public class NeutronNetworkAware implements INeutronNetworkAware {
 
         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);
             NetworkService.writeMgmtClauseWithConsProvEic(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);
             NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.MGMT_CONTRACT_CONSUMER_SELECTOR, rwTx);
         }
+        networkDao.addNetwork(network);
         if (network.getRouterExternal() != null && network.getRouterExternal() == true) {
-            addEpgExternalIfMissing(tenantId, rwTx);
-            addExternalNetworkIfMissing(l2Fd.getId(), rwTx);
+            addEigEpgExternalWithContracts(tenantId, rwTx);
         }
         DataStoreHelper.submitToDs(rwTx);
     }
 
-    private void addExternalNetworkIfMissing(L2FloodDomainId l2FdId, ReadWriteTransaction rwTx) {
-        InstanceIdentifier<ExternalNetworkByL2FloodDomain> iid =
-                NeutronGbpIidFactory.externalNetworkByL2FloodDomain(l2FdId);
-        Optional<ExternalNetworkByL2FloodDomain> externalPresent =
-                DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, iid, rwTx);
-        if (!externalPresent.isPresent()) {
-            ExternalNetworkByL2FloodDomainBuilder builder =
-                    new ExternalNetworkByL2FloodDomainBuilder().setL2FloodDomainId(l2FdId);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.externalNetworkByL2FloodDomain(l2FdId),
-                    builder.build(), true);
-        }
-    }
-
-    private void addEpgExternalIfMissing(TenantId tenantId, ReadWriteTransaction rwTx) {
-        Optional<EndpointGroup> potentialEpgExternal = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
-                IidFactory.endpointGroupIid(tenantId, MappingUtils.EPG_EXTERNAL_ID), rwTx);
-        if (!potentialEpgExternal.isPresent()) {
-            EndpointGroup epgExternal = new EndpointGroupBuilder().setId(MappingUtils.EPG_EXTERNAL_ID)
-                .setName(new Name("EXTERNAL_group"))
-                .setDescription(new Description(MappingUtils.NEUTRON_EXTERNAL + "epg_external_networks"))
-                .build();
-            rwTx.put(LogicalDatastoreType.CONFIGURATION,
-                    IidFactory.endpointGroupIid(tenantId, MappingUtils.EPG_EXTERNAL_ID), epgExternal, true);
+    private void addEigEpgExternalWithContracts(TenantId tenantId, ReadWriteTransaction rwTx) {
+        Uuid tenantUuid = new Uuid(tenantId.getValue());
+        NeutronSecurityRule inIpv4 = new NeutronSecurityRule();
+        inIpv4.setID("19b85ad2-bdfc-11e5-9912-ba0be0483c18");
+        inIpv4.setSecurityRuleDirection(NeutronUtils.INGRESS);
+        inIpv4.setSecurityRuleEthertype(NeutronUtils.IPv4);
+        inIpv4.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
+        inIpv4.setTenantID(tenantUuid);
+        NeutronSecurityRule outIpv4 = new NeutronSecurityRule();
+        outIpv4.setID("19b85eba-bdfc-11e5-9912-ba0be0483c18");
+        outIpv4.setSecurityRuleDirection(NeutronUtils.EGRESS);
+        outIpv4.setSecurityRuleEthertype(NeutronUtils.IPv4);
+        outIpv4.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
+        outIpv4.setTenantID(tenantUuid);
+        NeutronSecurityRule inIpv6 = new NeutronSecurityRule();
+        inIpv6.setID("19b86180-bdfc-11e5-9912-ba0be0483c18");
+        inIpv6.setSecurityRuleDirection(NeutronUtils.INGRESS);
+        inIpv6.setSecurityRuleEthertype(NeutronUtils.IPv6);
+        inIpv6.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
+        inIpv6.setTenantID(tenantUuid);
+        NeutronSecurityRule outIpv6 = new NeutronSecurityRule();
+        outIpv6.setID("19b86270-bdfc-11e5-9912-ba0be0483c18");
+        outIpv6.setSecurityRuleDirection(NeutronUtils.EGRESS);
+        outIpv6.setSecurityRuleEthertype(NeutronUtils.IPv6);
+        outIpv6.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
+        outIpv6.setTenantID(tenantUuid);
+        NeutronSecurityGroup externalSecGrp = new NeutronSecurityGroup();
+        externalSecGrp.setID(MappingUtils.EPG_EXTERNAL_ID.getValue());
+        externalSecGrp.setSecurityGroupName("EXTERNAL_group");
+        externalSecGrp.setTenantID(tenantUuid);
+        externalSecGrp.setSecurityRules(ImmutableList.of(inIpv4, outIpv4, inIpv6, outIpv6));
+        boolean isAddedNeutronSecurityGroup = secGrpAware.addNeutronSecurityGroup(externalSecGrp, rwTx);
+        if (!isAddedNeutronSecurityGroup) {
+            LOG.error("Problem with adding External Neutron Security Group representing External Implicit Group. {}", externalSecGrp);
+            return;
         }
+        ExternalImplicitGroup eig = new ExternalImplicitGroupBuilder().setId(MappingUtils.EPG_EXTERNAL_ID).build();
+        rwTx.put(LogicalDatastoreType.CONFIGURATION,
+                IidFactory.externalImplicitGroupIid(tenantId, eig.getId()), eig, true);
     }
 
     /**
diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkDao.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkDao.java
new file mode 100644 (file)
index 0000000..a79631e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.opendaylight.neutron.spi.NeutronNetwork;
+
+import com.google.common.base.Preconditions;
+
+public class NeutronNetworkDao {
+
+    private final Set<String> externalNetworks = new HashSet<>();
+
+    public void addNetwork(NeutronNetwork network) {
+        Preconditions.checkNotNull(network);
+        if (network.getRouterExternal() != null && network.getRouterExternal() == true) {
+            externalNetworks.add(network.getID());
+        }
+    }
+
+    /**
+     * Checks if neutron network is external
+     * @param networkId UUID of the network
+     * @return {@code true} if {@link NeutronNetwork#getRouterExternal()} is {@code true}; {@code false} otherwise
+     */
+    public boolean isExternalNetwork(String networkId) {
+        return externalNetworks.contains(networkId);
+    }
+
+}
index ee22c5729e4d4a8b88b0997a069a79589fd3f377..5c19ea5a9e39f3ad93bd41cbfba30f410bd6ffd3 100644 (file)
@@ -11,10 +11,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 
@@ -25,7 +23,6 @@ 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.mapping.group.NeutronSecurityGroupAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule.NeutronSecurityRuleAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
@@ -44,7 +41,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
@@ -70,18 +66,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L2Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L3Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router._interface.ports.EndpointByRouterInterfacePort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router.gateway.ports.EndpointByRouterGatewayPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3Endpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.floating.ip.ports.by.endpoints.FloatingIpPortByEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router._interface.ports.by.endpoints.RouterInterfacePortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router.gateway.ports.by.endpoints.RouterGatewayPortByEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextInputBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
@@ -104,7 +92,6 @@ public class NeutronPortAware implements INeutronPortAware {
     private final EndpointService epService;
     private final NeutronSecurityRuleAware secRuleAware;
     private final NeutronSecurityGroupAware secGrpAware;
-    private final static Map<String, UniqueId> floatingIpPortByDeviceId = new HashMap<>();
 
     public NeutronPortAware(DataBroker dataProvider, EndpointService epService, NeutronSecurityRuleAware secRuleAware, NeutronSecurityGroupAware secGrpAware) {
         this.dataProvider = checkNotNull(dataProvider);
@@ -146,7 +133,6 @@ public class NeutronPortAware implements INeutronPortAware {
         }
         if (isFloatingIpPort(port)) {
             LOG.trace("Port is floating ip - {} device id - {}", port.getID(), port.getDeviceID());
-            floatingIpPortByDeviceId.put(port.getDeviceID(), new UniqueId(port.getID()));
             return;
         }
         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
@@ -203,7 +189,6 @@ public class NeutronPortAware implements INeutronPortAware {
         }
         EndpointKey epKey = new EndpointKey(fwCtx.getL2BridgeDomain().getId(), new MacAddress(port.getMacAddress()));
         addNeutronGbpMapping(port, epKey, rwTx);
-
         try {
             RegisterEndpointInput registerEpRpcInput = createRegisterEndpointInput(port, fwCtx);
             RpcResult<Void> rpcResult = epService.registerEndpoint(registerEpRpcInput).get();
@@ -218,15 +203,28 @@ public class NeutronPortAware implements INeutronPortAware {
         return true;
     }
 
+    private static void addNeutronGbpMapping(NeutronPort port, EndpointKey epKey, ReadWriteTransaction rwTx) {
+        UniqueId portId = new UniqueId(port.getID());
+        if (!isRouterInterfacePort(port) && !isRouterGatewayPort(port) && !isFloatingIpPort(port)) {
+            LOG.trace("Adding Port-Endpoint mapping for port {} (device owner {}) and endpoint {}", port.getID(),
+                    port.getDeviceOwner(), epKey);
+            EndpointByPort endpointByPort = MappingFactory.createEndpointByPort(epKey, portId);
+            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.endpointByPortIid(portId), endpointByPort,
+                    true);
+            PortByEndpoint portByEndpoint = MappingFactory.createPortByEndpoint(portId, epKey);
+            rwTx.put(LogicalDatastoreType.OPERATIONAL,
+                    NeutronGbpIidFactory.portByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()), portByEndpoint,
+                    true);
+        }
+    }
+
     public static boolean addL3EndpointForExternalGateway(TenantId tenantId, L3ContextId l3ContextId,
             IpAddress ipAddress, NetworkDomainId networkContainment, ReadWriteTransaction rwTx) {
 
         EndpointL3Key epL3Key = new EndpointL3Key(ipAddress, l3ContextId);
         addNeutronExtGwGbpMapping(epL3Key, rwTx);
         List<EndpointGroupId> epgIds = new ArrayList<>();
-        // each EP has to be in EPG ANY, except dhcp and router
         epgIds.add(MappingUtils.EPG_EXTERNAL_ID);
-        epgIds.add(Router.EPG_ID);
         EndpointL3 epL3 = createL3Endpoint(tenantId, epL3Key, epgIds, networkContainment);
         InstanceIdentifier<EndpointL3> iid_l3 = IidFactory.l3EndpointIid(l3ContextId, ipAddress);
         rwTx.put(LogicalDatastoreType.OPERATIONAL, iid_l3, epL3, true);
@@ -234,51 +232,9 @@ public class NeutronPortAware implements INeutronPortAware {
     }
 
     private static void addNeutronExtGwGbpMapping(EndpointL3Key epL3Key, ReadWriteTransaction rwTx) {
-            ExternalGatewayAsL3Endpoint externalGatewayL3Endpoint = MappingFactory.createExternalGatewayByL3Endpoint(epL3Key);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.externalGatewayAsL3Endpoint(epL3Key.getL3Context(), epL3Key.getIpAddress()),
-                    externalGatewayL3Endpoint, true);
-    }
-
-    private static void addNeutronGbpMapping(NeutronPort port, EndpointKey epKey, ReadWriteTransaction rwTx) {
-        UniqueId portId = new UniqueId(port.getID());
-        if (isRouterInterfacePort(port)) {
-            LOG.trace("Adding RouterInterfacePort-Endpoint mapping for port {} and endpoint {}", port.getID(), epKey);
-            EndpointByRouterInterfacePort endpointByPort = MappingFactory.createEndpointByRouterInterfacePort(epKey,
-                    portId);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.endpointByRouterInterfacePortIid(portId),
-                    endpointByPort, true);
-            RouterInterfacePortByEndpoint portByEndpoint = MappingFactory.createRouterInterfacePortByEndpoint(portId,
-                    epKey);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.routerInterfacePortByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()),
-                    portByEndpoint, true);
-        } else if (isRouterGatewayPort(port)) {
-            LOG.trace("Adding RouterGatewayPort-Endpoint mapping for port {} and endpoint {}", port.getID(), epKey);
-            EndpointByRouterGatewayPort endpointByPort = MappingFactory.createEndpointByRouterGatewayPort(epKey, portId);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.endpointByRouterGatewayPortIid(portId),
-                    endpointByPort, true);
-            RouterGatewayPortByEndpoint portByEndpoint = MappingFactory.createRouterGatewayPortByEndpoint(portId, epKey);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.routerGatewayPortByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()),
-                    portByEndpoint, true);
-        } else if (isFloatingIpPort(port)) {
-            LOG.trace("Adding FloatingIpPort-Endpoint mapping for port {} and endpoint {}", port.getID(), epKey);
-            EndpointByFloatingIpPort endpointByPort = MappingFactory.createEndpointByFloatingIpPort(epKey, portId);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.endpointByFloatingIpPortIid(portId),
-                    endpointByPort, true);
-            FloatingIpPortByEndpoint portByEndpoint = MappingFactory.createFloatingIpPortByEndpoint(portId, epKey);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.floatingIpPortByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()),
-                    portByEndpoint, true);
-        } else {
-            LOG.trace("Adding Port-Endpoint mapping for port {} (device owner {}) and endpoint {}", port.getID(),
-                    port.getDeviceOwner(), epKey);
-            EndpointByPort endpointByPort = MappingFactory.createEndpointByPort(epKey, portId);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.endpointByPortIid(portId), endpointByPort, true);
-            PortByEndpoint portByEndpoint = MappingFactory.createPortByEndpoint(portId, epKey);
-            rwTx.put(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.portByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()), portByEndpoint, true);
-        }
+        ExternalGatewayAsL3Endpoint externalGatewayL3Endpoint = MappingFactory.createExternalGatewayByL3Endpoint(epL3Key);
+        rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.externalGatewayAsL3Endpoint(epL3Key.getL3Context(), epL3Key.getIpAddress()),
+                externalGatewayL3Endpoint, true);
     }
 
     public static boolean addL3PrefixEndpoint(L3ContextId l3ContextId, IpPrefix ipPrefix, IpAddress ipAddress, TenantId tenantId,
@@ -481,7 +437,7 @@ public class NeutronPortAware implements INeutronPortAware {
         }
         if (isFloatingIpPort(port)) {
             LOG.trace("Port is floating ip - {} device id - {}", port.getID(), port.getDeviceID());
-            floatingIpPortByDeviceId.remove(port.getDeviceID());
+            return;
         }
         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
         TenantId tenantId = new TenantId(Utils.normalizeUuid(port.getTenantID()));
@@ -512,35 +468,17 @@ public class NeutronPortAware implements INeutronPortAware {
 
     private static void deleteNeutronGbpMapping(NeutronPort port, EndpointKey epKey, ReadWriteTransaction rwTx) {
         UniqueId portId = new UniqueId(port.getID());
-        if (isRouterInterfacePort(port)) {
-            LOG.trace("Adding RouterInterfacePort-Endpoint mapping for port {} and endpoint {}", port.getID(), epKey);
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.endpointByRouterInterfacePortIid(portId), rwTx);
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.routerInterfacePortByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()), rwTx);
-        } else if (isRouterGatewayPort(port)) {
-            LOG.trace("Adding RouterGatewayPort-Endpoint mapping for port {} and endpoint {}", port.getID(), epKey);
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.endpointByRouterGatewayPortIid(portId), rwTx);
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.routerGatewayPortByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()), rwTx);
-        } else if (isFloatingIpPort(port)) {
-            LOG.trace("Adding FloatingIpPort-Endpoint mapping for port {} and endpoint {}", port.getID(), epKey);
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.endpointByFloatingIpPortIid(portId), rwTx);
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                    NeutronGbpIidFactory.floatingIpPortByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()), rwTx);
-        } else {
+        if (!isRouterInterfacePort(port) && !isRouterGatewayPort(port) && !isFloatingIpPort(port)) {
             LOG.trace("Adding Port-Endpoint mapping for port {} (device owner {}) and endpoint {}", port.getID(),
                     port.getDeviceOwner(), epKey);
-            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.endpointByPortIid(portId), rwTx);
+            DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
+                    NeutronGbpIidFactory.endpointByPortIid(portId), rwTx);
             DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
                     NeutronGbpIidFactory.portByEndpointIid(epKey.getL2Context(), epKey.getMacAddress()), rwTx);
         }
     }
 
     private static RegisterL3PrefixEndpointInput createRegisterL3PrefixEndpointInput(EndpointL3PrefixKey key, List<EndpointL3Key> endpointL3Keys, TenantId tenantId) {
-        List<EndpointGroupId> epgIds = new ArrayList<>();
         List<EndpointL3Gateways> l3Gateways = new ArrayList<EndpointL3Gateways>();
         for (EndpointL3Key epL3Key : endpointL3Keys) {
             EndpointL3Gateways l3Gateway = new EndpointL3GatewaysBuilder().setIpAddress(epL3Key.getIpAddress())
@@ -551,7 +489,7 @@ public class NeutronPortAware implements INeutronPortAware {
         RegisterL3PrefixEndpointInputBuilder inputBuilder = new RegisterL3PrefixEndpointInputBuilder()
                                                 .setL3Context(key.getL3Context())
                                                 .setIpPrefix(key.getIpPrefix())
-                                                .setEndpointGroups(epgIds)
+                                                .setEndpointGroup(MappingUtils.EPG_EXTERNAL_ID)
                                                 .setTenant(tenantId)
                                                 .setEndpointL3Gateways(l3Gateways)
                                                 .setTimestamp(System.currentTimeMillis());
@@ -580,12 +518,10 @@ public class NeutronPortAware implements INeutronPortAware {
 
         List<NeutronSecurityGroup> securityGroups = port.getSecurityGroups();
         if ((securityGroups == null || securityGroups.isEmpty())) {
-            if (isFloatingIpPort(port)) {
-                epgIds.add(MappingUtils.EPG_EXTERNAL_ID);
-            } else if (!isDhcpPort(port)) {
+            if (!isDhcpPort(port)) {
                 LOG.warn(
                         "Port {} does not contain any security group. The port should belong to 'default' security group at least.",
-                        port.getPortUUID());
+                        port.getID());
             }
         } else {
             for (NeutronSecurityGroup secGrp : securityGroups) {
@@ -598,10 +534,6 @@ public class NeutronPortAware implements INeutronPortAware {
             .setMacAddress(new MacAddress(port.getMacAddress()))
             .setTenant(new TenantId(Utils.normalizeUuid(port.getTenantID())))
             .setEndpointGroups(epgIds)
-            .addAugmentation(OfOverlayContextInput.class,
-                    new OfOverlayContextInputBuilder()
-                        .setPortName(createTapPortName(port))
-                    .build())
             .setTimestamp(System.currentTimeMillis());
         List<Neutron_IPs> fixedIPs = port.getFixedIPs();
         // TODO Li msunal this getting of just first IP has to be rewrite when OFOverlay renderer
@@ -620,23 +552,19 @@ public class NeutronPortAware implements INeutronPortAware {
         return inputBuilder.build();
     }
 
-    private static Name createTapPortName(NeutronPort port) {
-        return new Name("tap" + port.getID().substring(0, 11));
-    }
-
-    private static boolean isDhcpPort(NeutronPort port) {
+    public static boolean isDhcpPort(NeutronPort port) {
         return DEVICE_OWNER_DHCP.equals(port.getDeviceOwner());
     }
 
-    private static boolean isRouterInterfacePort(NeutronPort port) {
+    public static boolean isRouterInterfacePort(NeutronPort port) {
         return DEVICE_OWNER_ROUTER_IFACE.equals(port.getDeviceOwner());
     }
 
-    private static boolean isRouterGatewayPort(NeutronPort port) {
+    public static boolean isRouterGatewayPort(NeutronPort port) {
         return DEVICE_OWNER_ROUTER_GATEWAY.equals(port.getDeviceOwner());
     }
 
-    private static boolean isFloatingIpPort(NeutronPort port) {
+    public static boolean isFloatingIpPort(NeutronPort port) {
         return DEVICE_OWNER_FLOATING_IP.equals(port.getDeviceOwner());
     }
 
@@ -682,8 +610,4 @@ public class NeutronPortAware implements INeutronPortAware {
         return l3s;
     }
 
-    public static UniqueId getFloatingIpPortIdByDeviceId(String deviceId) {
-        return floatingIpPortByDeviceId.get(deviceId);
-    }
-
 }
index 200eae1f435f95cff95cf78ff48348ef25f4474e..614821b228fe5d4faeb061ace153379c5386a35b 100644 (file)
@@ -21,8 +21,6 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.Router;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule.NeutronSecurityRuleAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils.ForwardingCtx;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronMapperIidFactory;
@@ -59,7 +57,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -74,12 +71,10 @@ public class NeutronRouterAware implements INeutronRouterAware {
     private static final String DEFAULT_ROUTE = "0.0.0.0/0";
     private final DataBroker dataProvider;
     private final  EndpointService epService;
-    private final NeutronSecurityRuleAware secRuleAware;
 
-    public NeutronRouterAware(DataBroker dataProvider, EndpointService epService, NeutronSecurityRuleAware secRuleAware) {
+    public NeutronRouterAware(DataBroker dataProvider, EndpointService epService) {
         this.dataProvider = checkNotNull(dataProvider);
         this.epService = checkNotNull(epService);
-        this.secRuleAware = checkNotNull(secRuleAware);
     }
 
     @Override
@@ -207,16 +202,6 @@ public class NeutronRouterAware implements INeutronRouterAware {
     @Override
     public void neutronRouterDeleted(NeutronRouter router) {
         LOG.trace("neutronRouterDeleted - {}", router);
-        ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
-        TenantId tenantId = new TenantId(Utils.normalizeUuid(router.getTenantID()));
-        Optional<EndpointGroup> potentialEpg = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
-                IidFactory.endpointGroupIid(tenantId, Router.EPG_ID), rwTx);
-        if (!potentialEpg.isPresent()) {
-            LOG.warn("Illegal state - Endpoint group {} does not exist.", Router.EPG_ID.getValue());
-            rwTx.cancel();
-            return;
-        }
-        DataStoreHelper.submitToDs(rwTx);
     }
 
     @Override
@@ -349,6 +334,9 @@ public class NeutronRouterAware implements INeutronRouterAware {
         NeutronSubnet neutronSubnet = subnetInterface.getSubnet(subnet.getId().getValue());
         List<NeutronPort> portsInNeutronSubnet = neutronSubnet.getPortsInSubnet();
         for (NeutronPort port : portsInNeutronSubnet) {
+            if (NeutronPortAware.isRouterGatewayPort(port) || NeutronPortAware.isRouterInterfacePort(port)) {
+                continue;
+            }
             boolean isPortAdded = NeutronPortAware.addNeutronPort(port, rwTx, epService);
             if (!isPortAdded) {
                 return false;
@@ -434,6 +422,9 @@ public class NeutronRouterAware implements INeutronRouterAware {
         NeutronSubnet neutronSubnet = subnetInterface.getSubnet(subnetId.getValue());
         List<NeutronPort> portsInNeutronSubnet = neutronSubnet.getPortsInSubnet();
         for (NeutronPort port : portsInNeutronSubnet) {
+            if (NeutronPortAware.isRouterGatewayPort(port) || NeutronPortAware.isRouterInterfacePort(port)) {
+                continue;
+            }
             boolean isPortAdded = NeutronPortAware.addNeutronPort(port, rwTx, epService);
             if (!isPortAdded) {
                 rwTx.cancel();
index 25af8b489a5bb62795f2e5f580a2cb8a595e0f83..9f847f9516e6519a635a676c820c7b3e871a2dd4 100644 (file)
@@ -12,7 +12,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 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.util.MappingUtils;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils.ForwardingCtx;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils;
@@ -27,10 +26,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,9 +38,11 @@ public class NeutronSubnetAware implements INeutronSubnetAware {
 
     private final static Logger LOG = LoggerFactory.getLogger(NeutronSubnetAware.class);
     private final DataBroker dataProvider;
+    private final NeutronNetworkDao networkDao;
 
-    public NeutronSubnetAware(DataBroker dataProvider) {
+    public NeutronSubnetAware(DataBroker dataProvider, NeutronNetworkDao networkDao) {
         this.dataProvider = checkNotNull(dataProvider);
+        this.networkDao = checkNotNull(networkDao);
     }
 
     /**
@@ -70,12 +69,12 @@ public class NeutronSubnetAware implements INeutronSubnetAware {
         DataStoreHelper.submitToDs(rwTx);
 
         rwTx = dataProvider.newReadWriteTransaction();
-        if (isExternalNetwork(subnet.getParent(), rwTx)) {
+        if (networkDao.isExternalNetwork(neutronSubnet.getNetworkUUID())) {
             LOG.trace("neutronSubnetCreated - adding L3 Endpoint");
             L2FloodDomainId l2FdId = new L2FloodDomainId(subnet.getParent().getValue());
             ForwardingCtx fwCtx = MappingUtils.createForwardingContext(tenantId, l2FdId, rwTx);
             IpAddress defaultGateway = Utils.createIpAddress(neutronSubnet.getGatewayIP());
-            //Create L3Endpoint for defaultGateway and write to externalGateways to L3Endpoints in neutron-gbp datastore
+            //Create L3Endpoint for defaultGateway
             NetworkDomainId containment = new NetworkDomainId(neutronSubnet.getID());
             NeutronPortAware.addL3EndpointForExternalGateway(tenantId, fwCtx.getL3Context().getId(), defaultGateway, containment ,rwTx);
             DataStoreHelper.submitToDs(rwTx);
@@ -93,19 +92,6 @@ public class NeutronSubnetAware implements INeutronSubnetAware {
         return subnetBuilder.build();
     }
 
-
-    private boolean isExternalNetwork(ContextId context, ReadWriteTransaction rwTx) {
-        L2FloodDomainId l2FdId = new L2FloodDomainId(context.getValue());
-        LOG.trace("neutronSubnetCreated - Looking up L2FD: {}", l2FdId);
-        InstanceIdentifier<ExternalNetworkByL2FloodDomain> iid = NeutronGbpIidFactory.externalNetworkByL2FloodDomain(l2FdId);
-        Optional<ExternalNetworkByL2FloodDomain> external = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
-                iid, rwTx);
-        if (external.isPresent()) {
-            return true;
-        }
-        return false;
-    }
-
     /**
      * @see org.opendaylight.neutron.spi.INeutronSubnetAware#canUpdateSubnet(org.opendaylight.neutron.spi.NeutronSubnet,
      *      org.opendaylight.neutron.spi.NeutronSubnet)
index 389c4204a467a17caac06b6f5b156e26153e3290..5ba306a8345f1c4cc066993dfb09f3f4cf58b759 100644 (file)
@@ -25,27 +25,6 @@ module neutron-gbp-mapper {
             type gbp-common:unique-id;
         }
     }
-    
-    grouping internal-port-floating-ip-port-association-fields {
-        leaf floating-ip-port-id {
-            description "A unique ID for the neutron port";
-            type gbp-common:unique-id;
-            mandatory true;
-        }
-        leaf floating-ip-port-ip-address {
-            type inet:ip-address;
-            mandatory true;
-        }
-        leaf internal-port-id {
-            description "A unique ID for the neutron port";
-            type gbp-common:unique-id;
-            mandatory true;
-        }
-        leaf internal-port-ip-address {
-            type inet:ip-address;
-            mandatory true;
-        }
-    }
 
     container mappings {
         description "Mapping of neutron entities by groupbasedpolicy entities and vice versa.";
@@ -61,33 +40,6 @@ module neutron-gbp-mapper {
                     uses neutron-port-key;
                 }
             }
-            container router-gateway-ports-by-endpoints {
-                description "Neutron router gateway ports by groupbasedpolicy endpoint";
-                list router-gateway-port-by-endpoint {
-                    description "Neutron router gateway port key by groupbasedpolicy endpoint key";
-                    key "l2-context mac-address";
-                    uses gbp-endpoint:l2-key;
-                    uses neutron-port-key;
-                }
-            }
-            container router-interface-ports-by-endpoints {
-                description "Neutron router interface ports by groupbasedpolicy endpoint";
-                list router-interface-port-by-endpoint {
-                    description "Neutron router interface port key by groupbasedpolicy endpoint key";
-                    key "l2-context mac-address";
-                    uses gbp-endpoint:l2-key;
-                    uses neutron-port-key;
-                }
-            }
-            container floating-ip-ports-by-endpoints {
-                description "Neutron floating IP ports by groupbasedpolicy endpoint";
-                list floating-ip-port-by-endpoint {
-                    description "Neutron floating ip port key by groupbasedpolicy endpoint key";
-                    key "l2-context mac-address";
-                    uses gbp-endpoint:l2-key;
-                    uses neutron-port-key;
-                }
-            }
 
             container external-gateways-as-l3-endpoints {
                 description "L3Endpoints that represent Neutron External Gateways for External Subnets.
@@ -99,16 +51,6 @@ module neutron-gbp-mapper {
                     uses gbp-endpoint:l3-key;
                 }
             }
-
-            container external-networks-by-l2-flood-domains {
-                list external-network-by-l2-flood-domain {
-                    key l2-flood-domain-id;
-                    leaf l2-flood-domain-id {
-                        description "The L2 Flood Domain ID";
-                        type gbp-common:l2-flood-domain-id;
-                    }
-                }
-            }
         }
 
         container gbp-by-neutron-mappings {
@@ -122,50 +64,8 @@ module neutron-gbp-mapper {
                     uses gbp-endpoint:l2-key;
                 }
             }
-            container endpoints-by-router-gateway-ports {
-                description "Groupbasedpolicy endpoints by neutron router gateway ports";
-                list endpoint-by-router-gateway-port {
-                    description "Groupbasedpolicy endpoint key by neutron router gateway port key";
-                    key port-id;
-                    uses neutron-port-key;
-                    uses gbp-endpoint:l2-key;
-                }
-            }
-            container endpoints-by-router-interface-ports {
-                description "Groupbasedpolicy endpoints by neutron router interface ports";
-                list endpoint-by-router-interface-port {
-                    description "Groupbasedpolicy endpoint key by neutron router interface port key";
-                    key port-id;
-                    uses neutron-port-key;
-                    uses gbp-endpoint:l2-key;
-                }
-            }
-            container endpoints-by-floating-ip-ports {
-                description "Groupbasedpolicy endpoints by neutron floating IP ports";
-                list endpoint-by-floating-ip-port {
-                    description "Groupbasedpolicy endpoint key by neutron floating IP port key";
-                    key port-id;
-                    uses neutron-port-key;
-                    uses gbp-endpoint:l2-key;
-                }
-            }
         }
 
-        container floating-ip-association-mappings {
-            description "Mapping of association between neutron port representing floating IP and internal neutron port";
-            container internal-ports-by-floating-ip-ports {
-                list internal-port-by-floating-ip-port {
-                    key floating-ip-port-id;
-                    uses internal-port-floating-ip-port-association-fields;
-                }
-            }
-            container floating-ip-ports-by-internal-ports {
-                list floating-ip-port-by-internal-port {
-                    key internal-port-id;
-                    uses internal-port-floating-ip-port-association-fields;
-                }
-            }
-        }
     }
 
 }
index eb6ad6ae6003dc30f88b2aa43362efd2305b51aa..ae6fd385fa09e178d8d636d9ad50f1f3f31f2f29 100644 (file)
@@ -1,6 +1,9 @@
 package org.opendaylight.groupbasedpolicy.neutron.gbp.util;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
 import java.util.Iterator;
@@ -9,49 +12,17 @@ import org.junit.Test;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.FloatingIpAssociationMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.GbpByNeutronMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.NeutronByGbpMappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.FloatingIpPortsByInternalPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.InternalPortsByFloatingIpPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.floating.ip.ports.by.internal.ports.FloatingIpPortByInternalPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.floating.ip.ports.by.internal.ports.FloatingIpPortByInternalPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByFloatingIpPorts;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByRouterGatewayPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByRouterInterfacePorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router._interface.ports.EndpointByRouterInterfacePort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router._interface.ports.EndpointByRouterInterfacePortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router.gateway.ports.EndpointByRouterGatewayPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.router.gateway.ports.EndpointByRouterGatewayPortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ExternalGatewaysAsL3Endpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ExternalNetworksByL2FloodDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.FloatingIpPortsByEndpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.PortsByEndpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.RouterGatewayPortsByEndpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.RouterInterfacePortsByEndpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3Endpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3EndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomainKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.floating.ip.ports.by.endpoints.FloatingIpPortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.floating.ip.ports.by.endpoints.FloatingIpPortByEndpointKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router._interface.ports.by.endpoints.RouterInterfacePortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router._interface.ports.by.endpoints.RouterInterfacePortByEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router.gateway.ports.by.endpoints.RouterGatewayPortByEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.router.gateway.ports.by.endpoints.RouterGatewayPortByEndpointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 
@@ -67,7 +38,7 @@ public class NeutronGbpIidFactoryTest {
         assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
         assertEquals(EndpointByPort.class, id.getTargetType());
         assertFalse(id.isWildcarded());
-        assertEquals(portId, id.firstKeyOf(EndpointByPort.class, EndpointByPortKey.class).getPortId());
+        assertEquals(portId, id.firstKeyOf(EndpointByPort.class).getPortId());
     }
 
     @Test
@@ -81,133 +52,8 @@ public class NeutronGbpIidFactoryTest {
         assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
         assertEquals(PortByEndpoint.class, id.getTargetType());
         assertFalse(id.isWildcarded());
-        assertEquals(l2BdId, id.firstKeyOf(PortByEndpoint.class, PortByEndpointKey.class).getL2Context());
-        assertEquals(mac, id.firstKeyOf(PortByEndpoint.class, PortByEndpointKey.class).getMacAddress());
-    }
-
-    @Test
-    public void endpointByRouterGatewayPortIidTest() {
-        UniqueId portId = mock(UniqueId.class);
-        InstanceIdentifier<EndpointByRouterGatewayPort> id = NeutronGbpIidFactory.endpointByRouterGatewayPortIid(portId);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, GbpByNeutronMappings.class, EndpointsByRouterGatewayPorts.class,
-                EndpointByRouterGatewayPort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(EndpointByRouterGatewayPort.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(portId, id.firstKeyOf(EndpointByRouterGatewayPort.class, EndpointByRouterGatewayPortKey.class)
-            .getPortId());
-    }
-
-    @Test
-    public void routerGatewayPortByEndpointIidTest() {
-        L2BridgeDomainId l2BdId = mock(L2BridgeDomainId.class);
-        MacAddress mac = mock(MacAddress.class);
-        InstanceIdentifier<RouterGatewayPortByEndpoint> id = NeutronGbpIidFactory.routerGatewayPortByEndpointIid(
-                l2BdId, mac);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, NeutronByGbpMappings.class, RouterGatewayPortsByEndpoints.class,
-                RouterGatewayPortByEndpoint.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(RouterGatewayPortByEndpoint.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(l2BdId, id.firstKeyOf(RouterGatewayPortByEndpoint.class, RouterGatewayPortByEndpointKey.class)
-            .getL2Context());
-        assertEquals(mac, id.firstKeyOf(RouterGatewayPortByEndpoint.class, RouterGatewayPortByEndpointKey.class)
-            .getMacAddress());
-    }
-
-    @Test
-    public void endpointByRouterInterfacePortIidTest() {
-        UniqueId portId = mock(UniqueId.class);
-        InstanceIdentifier<EndpointByRouterInterfacePort> id = NeutronGbpIidFactory.endpointByRouterInterfacePortIid(portId);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, GbpByNeutronMappings.class, EndpointsByRouterInterfacePorts.class,
-                EndpointByRouterInterfacePort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(EndpointByRouterInterfacePort.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(portId, id.firstKeyOf(EndpointByRouterInterfacePort.class, EndpointByRouterInterfacePortKey.class)
-            .getPortId());
-    }
-
-    @Test
-    public void routerInterfacePortByEndpointIidTest() {
-        L2BridgeDomainId l2BdId = mock(L2BridgeDomainId.class);
-        MacAddress mac = mock(MacAddress.class);
-        InstanceIdentifier<RouterInterfacePortByEndpoint> id = NeutronGbpIidFactory.routerInterfacePortByEndpointIid(
-                l2BdId, mac);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, NeutronByGbpMappings.class, RouterInterfacePortsByEndpoints.class,
-                RouterInterfacePortByEndpoint.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(RouterInterfacePortByEndpoint.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(l2BdId, id.firstKeyOf(RouterInterfacePortByEndpoint.class, RouterInterfacePortByEndpointKey.class)
-            .getL2Context());
-        assertEquals(mac, id.firstKeyOf(RouterInterfacePortByEndpoint.class, RouterInterfacePortByEndpointKey.class)
-            .getMacAddress());
-    }
-
-    @Test
-    public void endpointByFloatingIpPortIidTest() {
-        UniqueId portId = mock(UniqueId.class);
-        InstanceIdentifier<EndpointByFloatingIpPort> id = NeutronGbpIidFactory.endpointByFloatingIpPortIid(portId);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, GbpByNeutronMappings.class, EndpointsByFloatingIpPorts.class,
-                EndpointByFloatingIpPort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(EndpointByFloatingIpPort.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(portId, id.firstKeyOf(EndpointByFloatingIpPort.class, EndpointByFloatingIpPortKey.class)
-            .getPortId());
-    }
-
-    @Test
-    public void floatingIpPortByEndpointIidTest() {
-        L2BridgeDomainId l2BdId = mock(L2BridgeDomainId.class);
-        MacAddress mac = mock(MacAddress.class);
-        InstanceIdentifier<FloatingIpPortByEndpoint> id = NeutronGbpIidFactory.floatingIpPortByEndpointIid(l2BdId, mac);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, NeutronByGbpMappings.class, FloatingIpPortsByEndpoints.class,
-                FloatingIpPortByEndpoint.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(FloatingIpPortByEndpoint.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(l2BdId, id.firstKeyOf(FloatingIpPortByEndpoint.class, FloatingIpPortByEndpointKey.class)
-            .getL2Context());
-        assertEquals(mac, id.firstKeyOf(FloatingIpPortByEndpoint.class, FloatingIpPortByEndpointKey.class)
-            .getMacAddress());
-    }
-
-    @Test
-    public void internalPortByFloatingIpPortIidTest() {
-        UniqueId floatingIpPortId = mock(UniqueId.class);
-        InstanceIdentifier<InternalPortByFloatingIpPort> id = NeutronGbpIidFactory.internalPortByFloatingIpPortIid(floatingIpPortId);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, FloatingIpAssociationMappings.class,
-                InternalPortsByFloatingIpPorts.class, InternalPortByFloatingIpPort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(InternalPortByFloatingIpPort.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(floatingIpPortId,
-                id.firstKeyOf(InternalPortByFloatingIpPort.class, InternalPortByFloatingIpPortKey.class)
-                    .getFloatingIpPortId());
-    }
-
-    @Test
-    public void floatingIpPortByInternalPortIidTest() {
-        UniqueId floatingIpPortId = mock(UniqueId.class);
-        InstanceIdentifier<FloatingIpPortByInternalPort> id = NeutronGbpIidFactory.floatingIpPortByInternalPortIid(floatingIpPortId);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, FloatingIpAssociationMappings.class,
-                FloatingIpPortsByInternalPorts.class, FloatingIpPortByInternalPort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(FloatingIpPortByInternalPort.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(floatingIpPortId,
-                id.firstKeyOf(FloatingIpPortByInternalPort.class, FloatingIpPortByInternalPortKey.class)
-                    .getInternalPortId());
+        assertEquals(l2BdId, id.firstKeyOf(PortByEndpoint.class).getL2Context());
+        assertEquals(mac, id.firstKeyOf(PortByEndpoint.class).getMacAddress());
     }
 
     @Test
@@ -222,27 +68,12 @@ public class NeutronGbpIidFactoryTest {
         assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
         assertEquals(ExternalGatewayAsL3Endpoint.class, id.getTargetType());
         assertFalse(id.isWildcarded());
-        assertEquals(l3Context, id.firstKeyOf(ExternalGatewayAsL3Endpoint.class, ExternalGatewayAsL3EndpointKey.class)
+        assertEquals(l3Context, id.firstKeyOf(ExternalGatewayAsL3Endpoint.class)
             .getL3Context());
-        assertEquals(ipAddress, id.firstKeyOf(ExternalGatewayAsL3Endpoint.class, ExternalGatewayAsL3EndpointKey.class)
+        assertEquals(ipAddress, id.firstKeyOf(ExternalGatewayAsL3Endpoint.class)
             .getIpAddress());
     }
 
-    @Test
-    public void externalNetworkByL2FloodDomainTest() {
-        L2FloodDomainId l2FdId = mock(L2FloodDomainId.class);
-        InstanceIdentifier<ExternalNetworkByL2FloodDomain> id = NeutronGbpIidFactory.externalNetworkByL2FloodDomain(l2FdId);
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, NeutronByGbpMappings.class, ExternalNetworksByL2FloodDomains.class,
-                ExternalNetworkByL2FloodDomain.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(ExternalNetworkByL2FloodDomain.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(l2FdId,
-                id.firstKeyOf(ExternalNetworkByL2FloodDomain.class, ExternalNetworkByL2FloodDomainKey.class)
-                    .getL2FloodDomainId());
-    }
-
     private static void assertPathArgumentTypes(Iterable<PathArgument> pathArguments, Class<?>[] expectedTypes) {
         assertNotNull(pathArguments);
         Iterator<PathArgument> it = pathArguments.iterator();
diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/RouterTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/RouterTest.java
deleted file mode 100644 (file)
index 38039f9..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-
-import java.util.Set;
-
-import org.junit.Test;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.test.GbpDataBrokerTest;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance;
-
-public class RouterTest extends GbpDataBrokerTest {
-
-    private static final String IPV4_NAME = "IPv4";
-    private static final String IPV6_NAME = "IPv6";
-    private static final SubjectName ROUTER_SUBJECT_NAME = new SubjectName("ALLOW_IPv4_IPv6");
-    private final String tenantId = "00000000-0000-0000-0000-000000000002";
-
-    @Test
-    public void instantiate() {
-        Router service = new Router();
-        assertNotNull(service);
-    }
-
-    @Test
-    public void testWriteRouterClauseWithConsProvEicIpv4() throws Exception {
-        DataBroker dataBroker = getDataBroker();
-        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-        String ipv4Prefix = "170.0.0.1/8";
-        Router.writeRouterClauseWithConsProvEic(new TenantId(tenantId), new IpPrefix(new Ipv4Prefix(ipv4Prefix)), rwTx);
-        rwTx.submit().get();
-
-        //expected clause name
-        String clauseNameIpV4 = ROUTER_SUBJECT_NAME.getValue() + MappingUtils.NAME_DOUBLE_DELIMETER + ipv4Prefix;
-        clauseNameIpV4 = clauseNameIpV4.replace('/', '_');
-
-        PolicyAssert.assertClauseExists(dataBroker, tenantId, Router.CONTRACT_ID.getValue(), clauseNameIpV4);
-
-    }
-
-    @Test
-    public void testWriteRouterClauseWithConsProvEicIpv6() throws Exception {
-        DataBroker dataBroker = getDataBroker();
-        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-        String ipv6Prefix = "2001:0db8:85a3:0000:0000:8a2e:0370:7334/128";
-        Router.writeRouterClauseWithConsProvEic(new TenantId(tenantId), new IpPrefix(new Ipv6Prefix(ipv6Prefix)), rwTx);
-        rwTx.submit().get();
-
-        //expected clause name
-        String clauseNameIpV6 = ROUTER_SUBJECT_NAME.getValue() + MappingUtils.NAME_DOUBLE_DELIMETER + ipv6Prefix;
-        clauseNameIpV6 = clauseNameIpV6.replace('/', '_').replace(':', '.');
-
-        PolicyAssert.assertClauseExists(dataBroker, tenantId, Router.CONTRACT_ID.getValue(), clauseNameIpV6);
-    }
-
-    @Test
-    public void testWriteRouterEntitiesToTenant() throws Exception {
-        //write everything
-        DataBroker dataBroker = getDataBroker();
-        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-        Router.writeRouterEntitiesToTenant(new TenantId(tenantId), rwTx);
-        rwTx.submit().get();
-
-        //read classifier instances
-        PolicyAssert.assertClassifierInstanceExists(dataBroker, tenantId, IPV4_NAME);
-        PolicyAssert.assertClassifierInstanceExists(dataBroker, tenantId, IPV6_NAME);
-
-        //read contract
-        PolicyAssert.assertContractExists(dataBroker, tenantId, Router.CONTRACT_ID.getValue());
-
-        //read group id
-        PolicyAssert.assertEndpointGroupExists(dataBroker, tenantId, Router.EPG_ID.getValue());
-    }
-
-    @Test
-    public void testGetAllClassifierInstances() {
-        Set<ClassifierInstance> classifierInstances = Router.getAllClassifierInstances();
-        assertNotNull(classifierInstances);
-        assertFalse(classifierInstances.isEmpty());
-        assertEquals(classifierInstances.size(), 2);
-    }
-
-}
index 34a10664d42c5d71eabafc1c20af813942da8bdc..d29e04f7182dbebb5463282d4f057cd9c4e14477 100644 (file)
@@ -33,15 +33,9 @@ public class NeutronOvsdbModule extends org.opendaylight.controller.config.yang.
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        final NeutronOvsdb neutronOvsdb = new NeutronOvsdb(getDataBrokerDependency(), getRpcRegistryDependency(), bundleContext);
+        final NeutronOvsdb neutronOvsdb = new NeutronOvsdb(getDataBrokerDependency(), getRpcRegistryDependency());
         LOG.info("Neutron ovsdb started.");
-        return new AutoCloseable() {
-
-            @Override
-            public void close() throws Exception {
-                neutronOvsdb.close();
-            }
-        };
+        return neutronOvsdb;
     }
 
     public void setBundleContext(BundleContext bundleContext) {
diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronGbpFloatingIpListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronGbpFloatingIpListener.java
deleted file mode 100644 (file)
index de6e2ef..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Map.Entry;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.groupbasedpolicy.dto.EpKey;
-import org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.NeutronOvsdbIidFactory;
-import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
-import org.opendaylight.groupbasedpolicy.util.IidFactory;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddressBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Optional;
-
-public class NeutronGbpFloatingIpListener implements DataChangeListener, AutoCloseable {
-
-    private static final Logger LOG = LoggerFactory.getLogger(NeutronGbpFloatingIpListener.class);
-    private final ListenerRegistration<DataChangeListener> gbpFloatingIpListener;
-    private final DataBroker dataBroker;
-
-    public NeutronGbpFloatingIpListener(DataBroker dataBroker) {
-        this.dataBroker = checkNotNull(dataBroker);
-         gbpFloatingIpListener = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                NeutronOvsdbIidFactory.neutronGbpInternalPortByFloatingIpIidWildcard(), this, DataChangeScope.BASE);
-        LOG.trace("NeutronGbpFloatingIpListener started");
-    }
-
-    @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-
-        /*
-         */
-        for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getCreatedData().entrySet()) {
-            if (entry.getValue() instanceof InternalPortByFloatingIpPort) {
-                InternalPortByFloatingIpPort internalPortByFloatingIp = (InternalPortByFloatingIpPort) entry.getValue();
-                processInternalPortByFloatingIp(internalPortByFloatingIp);
-            }
-        }
-
-        /*
-         * Updates
-         */
-        for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getUpdatedData().entrySet()) {
-            if (entry.getValue() instanceof InternalPortByFloatingIpPort) {
-                InternalPortByFloatingIpPort internalPortByFloatingIp = (InternalPortByFloatingIpPort) entry.getValue();
-                processInternalPortByFloatingIp(internalPortByFloatingIp);
-            }
-        }
-
-        /*
-         * Deletions
-         */
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            /*
-             * Remove ?
-             */
-        }
-    }
-
-    private void processInternalPortByFloatingIp(InternalPortByFloatingIpPort internalPortByFloatingIp) {
-        IpAddress natAddress = internalPortByFloatingIp.getFloatingIpPortIpAddress();
-        IpAddress ipAddress = internalPortByFloatingIp.getInternalPortIpAddress();
-
-        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
-        Optional<EndpointByPort> optEndpointByPort = DataStoreHelper.readFromDs(
-                LogicalDatastoreType.OPERATIONAL,
-                NeutronOvsdbIidFactory.endpointByPortIid(internalPortByFloatingIp.getInternalPortId()), rTx);
-        if (optEndpointByPort.isPresent()) {
-            EpKey l2EpKey = new EpKey(optEndpointByPort.get().getL2Context(), optEndpointByPort.get().getMacAddress());
-            updateEndpointNat(l2EpKey, ipAddress, natAddress);
-        } else {
-            LOG.error("processEpByFloatingIp: Couldn't find EP associated with {}.", internalPortByFloatingIp);
-        }
-    }
-
-    private void updateEndpointNat(EpKey l2EpKey, IpAddress ipAddress, IpAddress natAddress) {
-        Endpoint l2Ep;
-        EndpointL3 l3Ep;
-        EndpointL3Key l3EpKey = null;
-
-        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-
-        Optional<Endpoint> optL2Ep = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
-                IidFactory.endpointIid((L2BridgeDomainId) l2EpKey.getL2Context(), l2EpKey.getMacAddress()), rwTx);
-        if (optL2Ep.isPresent()) {
-            l2Ep = optL2Ep.get();
-        } else {
-            LOG.error("updateEndpointNat: No Endpoint {} ", l2EpKey);
-            return;
-        }
-
-        if (l2Ep.getL3Address() == null) {
-            LOG.error("updateEndpointNat: L2Ep {} had no IP address to translate to.", l2Ep);
-            return;
-        }
-
-        for (L3Address l3Address : l2Ep.getL3Address()) {
-            if (l3Address.getIpAddress().equals(ipAddress)) {
-                l3EpKey = new EndpointL3Key(l3Address.getIpAddress(), l3Address.getL3Context());
-                break;
-            }
-        }
-        if (l3EpKey == null) {
-            return;
-        }
-        Optional<EndpointL3> optL3Ep = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
-                IidFactory.l3EndpointIid(l3EpKey.getL3Context(), l3EpKey.getIpAddress()), rwTx);
-        if (optL3Ep.isPresent()) {
-            l3Ep = optL3Ep.get();
-            NatAddress nat = new NatAddressBuilder().setNatAddress(natAddress).build();
-
-            EndpointL3 updatedEpL3 = new EndpointL3Builder(l3Ep).addAugmentation(NatAddress.class, nat).build();
-
-            rwTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.l3EndpointIid(l3EpKey.getL3Context(), l3EpKey.getIpAddress()), updatedEpL3,true);
-            boolean writeResult = DataStoreHelper.submitToDs(rwTx);
-            if(!writeResult) {
-                LOG.trace("updateEndpointNat: Could not write {} to datastore.",updatedEpL3.getKey());
-            }
-        }
-    }
-
-    @Override
-    public void close() throws Exception {
-        gbpFloatingIpListener.close();
-    }
-
-}
index ae4ce1ee6fa14c5a60728d7841094dd9b948df7e..4c6e72372d97dd1eb6466443823f37b0a8f3b85a 100644 (file)
@@ -10,31 +10,26 @@ package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
 
 public class NeutronOvsdb implements AutoCloseable {
 
-    private final List<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
     private final TerminationPointDataChangeListener tpListener;
-    private final NodeDataChangeListener nodeListener;
-    private final NeutronGbpFloatingIpListener neutronGbpFloatingIpListener;
+//    private final NodeDataChangeListener nodeListener;
+    private final PortByEndpointListener portByEndpointListener;
+    private final OvsdbNodeListener ovsdbNodeListener;
 
-    public NeutronOvsdb(DataBroker dataProvider, RpcProviderRegistry rpcProvider, BundleContext context) {
+    public NeutronOvsdb(DataBroker dataProvider, RpcProviderRegistry rpcProvider) {
         checkNotNull(dataProvider);
         checkNotNull(rpcProvider);
-        checkNotNull(context);
 
         EndpointService epService = rpcProvider.getRpcService(EndpointService.class);
         tpListener = new TerminationPointDataChangeListener(dataProvider, epService);
-        nodeListener = new NodeDataChangeListener(dataProvider);
-        neutronGbpFloatingIpListener = new NeutronGbpFloatingIpListener(dataProvider);
+//        nodeListener = new NodeDataChangeListener(dataProvider);
+        ovsdbNodeListener = new OvsdbNodeListener(dataProvider);
+        portByEndpointListener = new PortByEndpointListener(dataProvider);
     }
 
     /**
@@ -42,9 +37,10 @@ public class NeutronOvsdb implements AutoCloseable {
      */
     @Override
     public void close() throws Exception {
-        for (ServiceRegistration<?> registration : registrations) {
-            registration.unregister();
-        }
+        tpListener.close();
+//        nodeListener.close();
+        ovsdbNodeListener.close();
+        portByEndpointListener.close();
     }
 
 }
diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListener.java
deleted file mode 100644 (file)
index 2bd1334..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.InventoryHelper.addOfOverlayExternalPort;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.InventoryHelper.getLongFromDpid;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.NeutronOvsdbIidFactory.ovsdbNodeAugmentationIid;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getNodeFromBridgeRef;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.ovsdb.southbound.SouthboundConstants;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfaces;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Strings;
-
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.removeIfExists;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
-
-public class NodeDataChangeListener implements DataChangeListener, AutoCloseable {
-
-    private static final Logger LOG = LoggerFactory.getLogger(NodeDataChangeListener.class);
-    private static final String NEUTRON_PROVIDER_MAPPINGS_KEY = "provider_mappings";
-    private static final String INVENTORY_PREFIX = "openflow:";
-    private final ListenerRegistration<DataChangeListener> registration;
-    private static DataBroker dataBroker;
-
-    public NodeDataChangeListener(DataBroker dataBroker) {
-        this.dataBroker = checkNotNull(dataBroker);
-        registration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, ovsdbNodeAugmentationIid(SouthboundConstants.OVSDB_TOPOLOGY_ID), this,
-                DataChangeScope.ONE);
-        LOG.trace("NodeDataChangeListener started");
-    }
-
-    /*
-     * When vSwitch is deleted, we loose data in operational DS to determine Iid of
-     * corresponding ExternalInterfaces.
-     */
-    public static final Map<InstanceIdentifier<OvsdbNodeAugmentation>, InstanceIdentifier<ExternalInterfaces>> nodeIdByExtInterface = new HashMap<>();
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-
-        /*
-         * TerminationPoint notifications with OVSDB augmentations
-         * vSwitch ports. Iterate through the list of new ports.
-         */
-        for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getCreatedData().entrySet()) {
-            if (entry.getValue() instanceof OvsdbNodeAugmentation) {
-                OvsdbNodeAugmentation ovsdbNode = (OvsdbNodeAugmentation) entry.getValue();
-                InstanceIdentifier<OvsdbNodeAugmentation> key = (InstanceIdentifier<OvsdbNodeAugmentation>) entry.getKey();
-                InstanceIdentifier<ExternalInterfaces> extInterfacesIid = processNodeNotification(ovsdbNode);
-                if (extInterfacesIid != null) {
-                    nodeIdByExtInterface.put(key, extInterfacesIid);
-                }
-            }
-        }
-
-        /*
-         * Updates
-         */
-        for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getUpdatedData().entrySet()) {
-            if (entry.getValue() instanceof OvsdbNodeAugmentation) {
-                OvsdbNodeAugmentation ovsdbNode = (OvsdbNodeAugmentation) entry.getValue();
-                if (Strings.isNullOrEmpty(getProviderMapping(ovsdbNode))) {
-                    removeExternalInterfaces((InstanceIdentifier<OvsdbNodeAugmentation>) entry.getKey());
-                }
-            }
-        }
-
-        /*
-         * Deletions
-         */
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            if (iid.getTargetType().equals(OvsdbNodeAugmentation.class)) {
-                if (nodeIdByExtInterface.get(iid) != null) {
-                    removeExternalInterfaces((InstanceIdentifier<OvsdbNodeAugmentation>) iid);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void close() throws Exception {
-        registration.close();
-    }
-
-    public static InstanceIdentifier<ExternalInterfaces> processNodeNotification(OvsdbNodeAugmentation ovsdbNode) {
-        LOG.trace("Search for provider mapping on node {}", ovsdbNode);
-        String providerPortName = getProviderMapping(ovsdbNode);
-        if (providerPortName != null) {
-            LOG.trace("Found provider mapping, creating Inventory NodeId");
-            String nodeConnectorIdString = getInventoryNodeId(ovsdbNode, providerPortName);
-            if (nodeConnectorIdString != null) {
-                LOG.trace("Adding OfOverlay External port for {}", nodeConnectorIdString);
-                String[] elements = nodeConnectorIdString.split(":");
-                String nodeIdString = elements[0] + ":" + elements[1];
-                NodeConnectorId ncid = getNodeConnectorId(nodeConnectorIdString);
-                return addOfOverlayExternalPort(new NodeId(nodeIdString), ncid, dataBroker);
-            }
-        }
-        return null;
-    }
-
-    private void removeExternalInterfaces(InstanceIdentifier<OvsdbNodeAugmentation> iidOvsdbNodeAug){
-        InstanceIdentifier<ExternalInterfaces> iidExtInterface = nodeIdByExtInterface.get(iidOvsdbNodeAug);
-        ReadWriteTransaction wTx = dataBroker.newReadWriteTransaction();
-        removeIfExists(LogicalDatastoreType.CONFIGURATION, iidExtInterface, wTx);
-        submitToDs(wTx);
-        nodeIdByExtInterface.remove(iidOvsdbNodeAug);
-    }
-
-    private static NodeConnectorId getNodeConnectorId(String nodeConnectorIdString) {
-        return new NodeConnectorId(nodeConnectorIdString);
-    }
-
-    public static String getProviderMapping(OvsdbNodeAugmentation ovsdbNode) {
-        if (ovsdbNode.getOpenvswitchOtherConfigs() != null) {
-            for (OpenvswitchOtherConfigs config : ovsdbNode.getOpenvswitchOtherConfigs()) {
-                if (config.getOtherConfigKey() == null || config.getOtherConfigValue() == null) {
-                    continue;
-                }
-                if (config.getOtherConfigKey().equals(NEUTRON_PROVIDER_MAPPINGS_KEY)) {
-                    String otherConfig = config.getOtherConfigValue();
-                    if (otherConfig != null) {
-                        String[] elements = otherConfig.split(":");
-                        if (elements.length == 2) {
-                            return elements[1];
-                        }
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Get the DPID and OpenFlow port of the bridge that owns the {@link TerminationPoint} in the
-     * provider mapping
-     *
-     * @return the DPID and OpenFlow port of the bridge that owns the {@link TerminationPoint} in
-     * the provider mapping
-     */
-    private static String getInventoryNodeId(OvsdbNodeAugmentation ovsdbNode, String externalPortName) {
-        List<ManagedNodeEntry> ovsdbNodes = ovsdbNode.getManagedNodeEntry();
-        if (ovsdbNodes == null) {
-            LOG.trace("No ManagedNodeEntry was found on {}", ovsdbNode);
-            return null;
-        }
-        for (ManagedNodeEntry managedNode : ovsdbNodes) {
-            if (managedNode.getBridgeRef() != null) {
-                /*
-                 * Get the Node, then see if it has any TerminationPoint
-                 * augmentations. If it does, check each TerminationPoint
-                 * augmentation to see if it is the matching provider_mapping
-                 */
-                Node node = getNodeFromBridgeRef(managedNode.getBridgeRef(), dataBroker);
-                if (node == null) {
-                    LOG.error("Couldn't get Topology Node for {}", managedNode.getBridgeRef());
-                    return null;
-                }
-                OvsdbBridgeAugmentation ovsdbBridge = node.getAugmentation(OvsdbBridgeAugmentation.class);
-                if (ovsdbBridge == null) {
-                    LOG.trace("OVSDB Node {} does not contain OvsdbBridgeAugmentation. {}", node.getKey(), node);
-                    continue;
-                }
-                for (TerminationPoint tp : node.getTerminationPoint()) {
-                    OvsdbTerminationPointAugmentation tpAug = tp.getAugmentation(OvsdbTerminationPointAugmentation.class);
-                    if ((tpAug == null) || (tpAug.getName() == null) || (tpAug.getOfport() == null)) {
-                        continue;
-                    }
-                    if (tpAug.getName().equals(externalPortName)) {
-                        return buildInventoryNcid(ovsdbBridge, tpAug);
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    private static String buildInventoryNcid(OvsdbBridgeAugmentation ovsdbBridge,
-            OvsdbTerminationPointAugmentation terminationPoint) {
-        Long macLong = getLongFromDpid(ovsdbBridge.getDatapathId().getValue());
-        return INVENTORY_PREFIX + String.valueOf(macLong) + ":" + String.valueOf(terminationPoint.getOfport());
-    }
-}
diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/OvsdbNodeListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/OvsdbNodeListener.java
new file mode 100644 (file)
index 0000000..acf3603
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.InventoryHelper;
+import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
+import org.opendaylight.ovsdb.southbound.SouthboundConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigsKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Strings;
+
+public class OvsdbNodeListener extends DataTreeChangeHandler<Node> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OvsdbNodeListener.class);
+    public static final String NEUTRON_PROVIDER_MAPPINGS_KEY = "provider_mappings";
+    private static final String OF_SEPARATOR = ":";
+    private static final String OF_INVENTORY_PREFIX = "openflow";
+
+    private final Map<OvsdbBridgeRef, String> providerPortNameByBridgeRef = new HashMap<>();
+    private final Map<InstanceIdentifier<Node>, NeutronBridgeWithExtPort> bridgeByNodeIid = new HashMap<>();
+
+    public OvsdbNodeListener(DataBroker dataProvider) {
+        super(dataProvider,
+                new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
+                        InstanceIdentifier.create(NetworkTopology.class)
+                            .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
+                            .child(Node.class)));
+    }
+
+    @Override
+    protected void onWrite(DataObjectModification<Node> rootNode, InstanceIdentifier<Node> rootIdentifier) {
+        Node node = rootNode.getDataAfter();
+        OvsdbNodeAugmentation ovsdbNode = node.getAugmentation(OvsdbNodeAugmentation.class);
+        if (ovsdbNode != null) {
+            LOG.trace("OVSDB node created: {} \n {}", rootIdentifier, node);
+            DataObjectModification<OpenvswitchOtherConfigs> ovsOtherConfigModification =
+                    getProviderMappingsModification(rootNode);
+            if (isProviderPortNameChanged(ovsOtherConfigModification) && ovsdbNode.getManagedNodeEntry() != null) {
+                String newProviderPortName = getProviderPortName(ovsOtherConfigModification.getDataAfter());
+                LOG.debug("provider_mappings created {} on node {}", newProviderPortName, node.getNodeId().getValue());
+                for (ManagedNodeEntry mngdNodeEntry : ovsdbNode.getManagedNodeEntry()) {
+                    providerPortNameByBridgeRef.put(mngdNodeEntry.getBridgeRef(), newProviderPortName);
+                    LOG.trace("Added Provider port name {} by OVSDB bridge ref {}", newProviderPortName,
+                            mngdNodeEntry.getBridgeRef());
+                }
+            }
+        }
+
+        OvsdbBridgeAugmentation ovsdbBridge = node.getAugmentation(OvsdbBridgeAugmentation.class);
+        if (ovsdbBridge != null) {
+            LOG.trace("OVSDB bridge created: {} \n {}", rootIdentifier, node);
+            Set<DataObjectModification<OvsdbTerminationPointAugmentation>> ovsdbTpModifications =
+                    getOvsdbTpModifications(rootNode);
+            NodeId ofNodeId = buildOfNodeId(ovsdbBridge);
+            if (!ovsdbTpModifications.isEmpty() && ofNodeId != null) {
+                NeutronBridgeWithExtPort bridge = getBridge(rootIdentifier);
+                bridge.ofNodeId = ofNodeId;
+                LOG.trace("OF node {} representing OVSDB bridge {}", ofNodeId.getValue(), node.getNodeId().getValue());
+            }
+            for (DataObjectModification<OvsdbTerminationPointAugmentation> ovsdbTpModification : ovsdbTpModifications) {
+                OvsdbTerminationPointAugmentation newOvsdbTp = ovsdbTpModification.getDataAfter();
+                if (ovsdbBridge.getBridgeName().getValue().equals(newOvsdbTp.getName())) {
+                    LOG.trace("Termination Point {} same as Bridge {}. Not processing", newOvsdbTp.getName(),
+                            ovsdbBridge.getBridgeName().getValue());
+                    continue;
+                }
+                String portName = newOvsdbTp.getName();
+                Long ofport = newOvsdbTp.getOfport();
+                if (isOfportOrNameChanged(ovsdbTpModification) && portName != null && ofport != null) {
+                    NeutronBridgeWithExtPort bridge = getBridge(rootIdentifier);
+                    bridge.ofportByName.put(ofport, portName);
+                    LOG.trace("OVSDB termination point with ofport {} and port-name {} created.", ofport, portName);
+                    // port name is same as provider port name so the termination point represents
+                    // external port
+                    if (portName.equals(providerPortNameByBridgeRef.get(new OvsdbBridgeRef(rootIdentifier)))) {
+                        NodeConnectorId ofNcId = buildOfNodeConnectorId(newOvsdbTp, ofNodeId);
+                        bridge.externalIfaces.add(ofNcId);
+                        InventoryHelper.addOfOverlayExternalPort(bridge.ofNodeId, ofNcId, dataProvider);
+                        LOG.debug("Added of-overlay external-interface {} to node {}", ofNcId.getValue(),
+                                bridge.ofNodeId);
+                        traceBridge(rootIdentifier);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void onDelete(DataObjectModification<Node> rootNode, InstanceIdentifier<Node> rootIdentifier) {
+        LOG.trace("Not implemented - OVSDB element deleted: {} \n {}", rootIdentifier, rootNode.getDataBefore());
+    }
+
+    @Override
+    protected void onSubtreeModified(DataObjectModification<Node> rootNode, InstanceIdentifier<Node> rootIdentifier) {
+        Node node = rootNode.getDataAfter();
+        OvsdbBridgeAugmentation ovsdbBridge = node.getAugmentation(OvsdbBridgeAugmentation.class);
+        if (ovsdbBridge != null) {
+            LOG.trace("OVSDB bridge updated: {} \n before {} \n after {}", rootIdentifier, rootNode.getDataBefore(),
+                    rootNode.getDataAfter());
+            Set<DataObjectModification<OvsdbTerminationPointAugmentation>> ovsdbTpModifications =
+                    getOvsdbTpModifications(rootNode);
+            NodeId ofNodeId = buildOfNodeId(ovsdbBridge);
+            if (!ovsdbTpModifications.isEmpty() && ofNodeId != null) {
+                NeutronBridgeWithExtPort bridge = getBridge(rootIdentifier);
+                if (bridge.ofNodeId != null && !bridge.ofNodeId.equals(ofNodeId)) {
+                    LOG.debug("OVSDB bridge {} has changed datapath-id. \n  Old: {} \n  New: {}",
+                            node.getNodeId().getValue(), bridge.ofNodeId.getValue(), ofNodeId.getValue());
+                    bridge.ofNodeId = ofNodeId;
+                }
+            }
+            for (DataObjectModification<OvsdbTerminationPointAugmentation> ovsdbTpModification : ovsdbTpModifications) {
+                OvsdbTerminationPointAugmentation newOvsdbTp = ovsdbTpModification.getDataAfter();
+                if (ovsdbBridge.getBridgeName().getValue().equals(newOvsdbTp.getName())) {
+                    LOG.trace("Termination Point {} same as Bridge {}. Not processing", newOvsdbTp.getName(),
+                            ovsdbBridge.getBridgeName().getValue());
+                    continue;
+                }
+                String portName = newOvsdbTp.getName();
+                Long ofport = newOvsdbTp.getOfport();
+                if (isOfportOrNameChanged(ovsdbTpModification) && portName != null && ofport != null) {
+                    NeutronBridgeWithExtPort bridge = getBridge(rootIdentifier);
+                    bridge.ofportByName.put(ofport, portName);
+                    LOG.trace("OVSDB termination point with ofport {} and port-name {} created.", ofport, portName);
+                    // port name is same as provider port name so the termination point represents
+                    // external port
+                    if (portName.equals(providerPortNameByBridgeRef.get(new OvsdbBridgeRef(rootIdentifier)))) {
+                        NodeConnectorId ofNcId = buildOfNodeConnectorId(newOvsdbTp, ofNodeId);
+                        bridge.externalIfaces.add(ofNcId);
+                        InventoryHelper.addOfOverlayExternalPort(bridge.ofNodeId, ofNcId, dataProvider);
+                        LOG.debug("Added of-overlay external-interface {} to node {}", ofNcId.getValue(),
+                                bridge.ofNodeId);
+                        traceBridge(rootIdentifier);
+                    }
+                }
+            }
+        }
+    }
+
+    private NeutronBridgeWithExtPort getBridge(InstanceIdentifier<Node> nodeIid) {
+        NeutronBridgeWithExtPort bridge = bridgeByNodeIid.get(nodeIid);
+        if (bridge == null) {
+            bridge = new NeutronBridgeWithExtPort();
+            bridgeByNodeIid.put(nodeIid, bridge);
+        }
+        return bridge;
+    }
+
+    @SuppressWarnings("unchecked")
+    private static Set<DataObjectModification<OvsdbTerminationPointAugmentation>> getOvsdbTpModifications(
+            DataObjectModification<Node> rootNode) {
+        Set<DataObjectModification<OvsdbTerminationPointAugmentation>> modifications = new HashSet<>();
+        for (DataObjectModification<? extends DataObject> modifiedChild : rootNode.getModifiedChildren()) {
+            if (TerminationPoint.class.isAssignableFrom(modifiedChild.getDataType())) {
+                DataObjectModification<OvsdbTerminationPointAugmentation> modifiedAugmentation =
+                        ((DataObjectModification<TerminationPoint>) modifiedChild)
+                            .getModifiedAugmentation(OvsdbTerminationPointAugmentation.class);
+                if (modifiedAugmentation != null) {
+                    modifications.add(modifiedAugmentation);
+                }
+            }
+        }
+        return modifications;
+    }
+
+    private static boolean isOfportOrNameChanged(
+            DataObjectModification<OvsdbTerminationPointAugmentation> ovsdbTpModification) {
+        if (ovsdbTpModification == null) {
+            return false;
+        }
+        OvsdbTerminationPointAugmentation oldTp = ovsdbTpModification.getDataBefore();
+        OvsdbTerminationPointAugmentation newTp = ovsdbTpModification.getDataAfter();
+        if (oldTp != null && newTp != null) {
+            if (oldTp.getOfport() != null && newTp.getOfport() != null && oldTp.getOfport() != newTp.getOfport()) {
+                return true;
+            }
+            if (!(Strings.nullToEmpty(oldTp.getName())).equals(Strings.nullToEmpty(newTp.getName()))) {
+                return true;
+            }
+        }
+        if (isOfportOrNameNotNull(oldTp)) {
+            return true;
+        }
+        if (isOfportOrNameNotNull(newTp)) {
+            return true;
+        }
+        return false;
+    }
+
+    private static boolean isOfportOrNameNotNull(OvsdbTerminationPointAugmentation tp) {
+        if (tp != null) {
+            if (tp.getOfport() != null) {
+                return true;
+            }
+            if (tp.getName() != null) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static DataObjectModification<OpenvswitchOtherConfigs> getProviderMappingsModification(
+            DataObjectModification<Node> rootNode) {
+        DataObjectModification<OvsdbNodeAugmentation> modifiedOvsdbNode =
+                rootNode.getModifiedAugmentation(OvsdbNodeAugmentation.class);
+        if (modifiedOvsdbNode == null) {
+            return null;
+        }
+        return modifiedOvsdbNode.getModifiedChildListItem(OpenvswitchOtherConfigs.class,
+                new OpenvswitchOtherConfigsKey(NEUTRON_PROVIDER_MAPPINGS_KEY));
+    }
+
+    private static boolean isProviderPortNameChanged(DataObjectModification<OpenvswitchOtherConfigs> ovsConfig) {
+        if (ovsConfig == null) {
+            return false;
+        }
+        OpenvswitchOtherConfigs oldConfig = ovsConfig.getDataBefore();
+        OpenvswitchOtherConfigs newConfig = ovsConfig.getDataAfter();
+        if (oldConfig != null && newConfig != null) {
+            if (!(Strings.nullToEmpty(oldConfig.getOtherConfigValue())
+                .equals(Strings.nullToEmpty(newConfig.getOtherConfigValue())))) {
+                return true;
+            }
+        } else if (oldConfig != null && !Strings.isNullOrEmpty(oldConfig.getOtherConfigValue())) {
+            return true;
+        } else if (newConfig != null && !Strings.isNullOrEmpty(newConfig.getOtherConfigValue())) {
+            return true;
+        }
+        return false;
+    }
+
+    private static @Nonnull String getProviderPortName(OpenvswitchOtherConfigs config) {
+        if (NEUTRON_PROVIDER_MAPPINGS_KEY.equals(config.getOtherConfigKey()) && config.getOtherConfigValue() != null) {
+            String otherConfig = config.getOtherConfigValue();
+            String[] elements = otherConfig.split(":");
+            if (elements.length == 2) {
+                return elements[1];
+            }
+        }
+        return "";
+    }
+
+    private static NodeId buildOfNodeId(OvsdbBridgeAugmentation ovsdbBridge) {
+        if (ovsdbBridge.getDatapathId() == null) {
+            return null;
+        }
+        Long macLong = InventoryHelper.getLongFromDpid(ovsdbBridge.getDatapathId().getValue());
+        return new NodeId(OF_INVENTORY_PREFIX + OF_SEPARATOR + String.valueOf(macLong));
+    }
+
+    private static NodeConnectorId buildOfNodeConnectorId(OvsdbTerminationPointAugmentation terminationPoint,
+            NodeId nodeId) {
+        if (terminationPoint.getOfport() == null) {
+            return null;
+        }
+        return new NodeConnectorId(nodeId.getValue() + OF_SEPARATOR + String.valueOf(terminationPoint.getOfport()));
+    }
+
+    private void traceBridge(InstanceIdentifier<Node> identifier) {
+        if (LOG.isTraceEnabled()) {
+            NeutronBridgeWithExtPort bridge = bridgeByNodeIid.get(identifier);
+            if (bridge == null) {
+                LOG.trace("Bridge does not exist: {}", identifier);
+                return;
+            }
+            String providerPortName = providerPortNameByBridgeRef.get(new OvsdbBridgeRef(identifier));
+            LOG.trace("State of bridge:\n  ID: {} \n  providerPortName: {} \n  {}", identifier, providerPortName,
+                    bridge);
+        }
+    }
+
+    private class NeutronBridgeWithExtPort {
+
+        NodeId ofNodeId;
+        Set<NodeConnectorId> externalIfaces = new HashSet<>();
+        Map<Long, String> ofportByName = new HashMap<>();
+
+        @Override
+        public String toString() {
+            return "NeutronBridgeWithExtPort:\n  ofNodeId=" + ofNodeId + "\n  externalIfaces=" + externalIfaces
+                    + ",\n  ofportByName=" + ofportByName;
+        }
+    }
+
+}
diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/PortByEndpointListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/PortByEndpointListener.java
new file mode 100644 (file)
index 0000000..4997259
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
+
+import java.util.List;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
+import org.opendaylight.groupbasedpolicy.util.IidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.NeutronByGbpMappings;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.PortsByEndpoints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ports.by.endpoints.PortByEndpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayL3Context;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayL3ContextBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+
+/**
+ * Listens on PortByEndpoint created events. port-name is augmented to endpoint and endpoint-l3 (IFF
+ * they exist in DS).
+ */
+public class PortByEndpointListener extends DataTreeChangeHandler<PortByEndpoint> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PortByEndpointListener.class);
+    private static final String TAP = "tap";
+
+    public PortByEndpointListener(DataBroker dataProvider) {
+        super(dataProvider,
+                new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
+                        InstanceIdentifier.builder(Mappings.class)
+                            .child(NeutronByGbpMappings.class)
+                            .child(PortsByEndpoints.class)
+                            .child(PortByEndpoint.class)
+                            .build()));
+    }
+
+    @Override
+    protected void onWrite(DataObjectModification<PortByEndpoint> rootNode,
+            InstanceIdentifier<PortByEndpoint> rootIdentifier) {
+        PortByEndpoint portByEp = rootNode.getDataAfter();
+        ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
+
+        final EndpointKey epKey = new EndpointKey(portByEp.getL2Context(), portByEp.getMacAddress());
+        InstanceIdentifier<Endpoint> epIid = IidFactory.endpointIid(epKey);
+        Optional<Endpoint> potentialEp = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL, epIid, rwTx);
+        if (!potentialEp.isPresent()) {
+            LOG.warn("PortByEndpoint created notification received but endpoint {} does not exist in DS."
+                    + " port-name was not added.", epKey);
+            rwTx.cancel();
+            return;
+        }
+        Endpoint ep = potentialEp.get();
+        Name portName = createTapPortName(portByEp.getPortId());
+        OfOverlayContext newOfOverlayCtx = new OfOverlayContextBuilder().setPortName(portName).build();
+        rwTx.merge(LogicalDatastoreType.OPERATIONAL, epIid.augmentation(OfOverlayContext.class), newOfOverlayCtx);
+
+        List<L3Address> l3Addresses = ep.getL3Address();
+        if (l3Addresses == null) {
+            LOG.warn("PortByEndpoint created notification received but endpoint {} has no L3 address."
+                    + " port-name was not added.", epKey);
+            rwTx.cancel();
+            return;
+        }
+        L3Address l3Address = l3Addresses.get(0);
+
+        EndpointL3Key l3EpKey = new EndpointL3Key(l3Address.getIpAddress(), l3Address.getL3Context());
+        InstanceIdentifier<EndpointL3> l3EpIid = IidFactory.l3EndpointIid(l3EpKey);
+        Optional<EndpointL3> potentialL3Ep =
+                DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL, l3EpIid, rwTx);
+        if (!potentialL3Ep.isPresent()) {
+            LOG.warn("PortByEndpoint created notification received but L3 endpoint {} does not exist in DS."
+                    + " port-name was not added.", l3EpKey);
+            rwTx.cancel();
+            return;
+        }
+        OfOverlayL3Context newOfOverlayL3Ctx = new OfOverlayL3ContextBuilder().setPortName(portName).build();
+        rwTx.merge(LogicalDatastoreType.OPERATIONAL, l3EpIid.augmentation(OfOverlayL3Context.class), newOfOverlayL3Ctx);
+
+        DataStoreHelper.submitToDs(rwTx);
+    }
+
+    @Override
+    protected void onDelete(DataObjectModification<PortByEndpoint> rootNode,
+            InstanceIdentifier<PortByEndpoint> rootIdentifier) {
+        // NOOP
+    }
+
+    @Override
+    protected void onSubtreeModified(DataObjectModification<PortByEndpoint> rootNode,
+            InstanceIdentifier<PortByEndpoint> rootIdentifier) {
+        // NOOP
+    }
+
+    private static Name createTapPortName(UniqueId portId) {
+        return new Name(TAP + portId.getValue().substring(0, 11));
+    }
+
+}
index 94c7d2cdcbcc9249f1fa3cffa467808287c6d9a1..5339e9e1b4604de35d982ba9a34f23edac59a652 100755 (executable)
@@ -9,8 +9,6 @@
 package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.NodeDataChangeListener.getProviderMapping;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.NodeDataChangeListener.processNodeNotification;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.lookupEndpoint;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.updateEndpointRemoveLocation;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.updateEndpointWithLocation;
@@ -225,22 +223,6 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
 
         }
 
-        /*
-         * Check if Neutron External port was announed in Node before TerminationPoint it refers to
-         * was actually instantiated. This may or may not have external information in the future,
-         * hence
-         * not process as IF/ELSE externalID.
-         */
-        ReadOnlyTransaction transaction = dataBroker.newReadOnlyTransaction();
-        Optional<Node> node = readFromDs(LogicalDatastoreType.OPERATIONAL, nodeIid, transaction);
-        if (node.isPresent() && node.get().getAugmentation(OvsdbNodeAugmentation.class) != null) {
-            OvsdbNodeAugmentation ovsdbNodeAug = node.get().getAugmentation(OvsdbNodeAugmentation.class);
-            if (getProviderMapping(ovsdbNodeAug) != null) {
-                processNodeNotification(ovsdbNodeAug);
-
-            }
-        } else {
-        }
         /*
          * This may be a notification for a tunnel we just created.
          * In that case, we need to update the Inventory Node's OfOverlay
index 24e2f72123d22228377b5db03e5173e01711002c..f4a5865278620887553684d097d7b5fb18a4c503 100755 (executable)
@@ -10,7 +10,6 @@ package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
 import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
 import static org.opendaylight.groupbasedpolicy.util.IidFactory.endpointIid;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -23,14 +22,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 
 
 public class EndpointHelper {
-    private static final Logger LOG = LoggerFactory.getLogger(EndpointHelper.class);
 
     /**
      * Look up the {@link Endpoint} from the Endpoint Registry.
@@ -59,24 +55,14 @@ public class EndpointHelper {
      * @param nodeConnectorIdString  the string representation of the inventory NodeConnectorId
      * @param rwTx                   a reference to ReadWriteTransaction object
      */
-    public static void updateEndpointWithLocation(Endpoint endpoint, String nodeIdString,
-        String nodeConnectorIdString, ReadWriteTransaction rwTx) {
-
+    public static void updateEndpointWithLocation(Endpoint endpoint, String nodeIdString, String nodeConnectorIdString,
+            ReadWriteTransaction rwTx) {
         NodeId invNodeId = new NodeId(nodeIdString);
         NodeConnectorId ncId = new NodeConnectorId(nodeConnectorIdString);
-
-        OfOverlayContext ofc = endpoint.getAugmentation(OfOverlayContext.class);
-        OfOverlayContextBuilder ofcBuilder;
-        if (ofc == null) {
-            ofcBuilder = new OfOverlayContextBuilder();
-        } else {
-            ofcBuilder = new OfOverlayContextBuilder(ofc);
-        }
-        ofcBuilder.setNodeConnectorId(ncId).setNodeId(invNodeId);
-        EndpointBuilder epBuilder = new EndpointBuilder(endpoint);
-        epBuilder.addAugmentation(OfOverlayContext.class, ofcBuilder.build());
-        Endpoint newEp = epBuilder.build();
-        rwTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.endpointIid(newEp.getL2Context(), newEp.getMacAddress()), newEp);
+        OfOverlayContext newOfOverlayCtx =
+                new OfOverlayContextBuilder().setNodeId(invNodeId).setNodeConnectorId(ncId).build();
+        rwTx.merge(LogicalDatastoreType.OPERATIONAL,
+                IidFactory.endpointIid(endpoint.getKey()).augmentation(OfOverlayContext.class), newOfOverlayCtx);
         DataStoreHelper.submitToDs(rwTx);
     }
 
index b2976b630eb779e18f4ce944be53cd503963cd56..3a4d00156daf7c8326713bf11cb87c9db7bcabe0 100755 (executable)
@@ -7,15 +7,23 @@
  */
 package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
 
-import com.google.common.base.Optional;
+import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
+import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbTerminationPoint;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
+
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.neutron.ovsdb.AbstractTunnelType;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;
@@ -36,13 +44,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbTerminationPoint;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
+import com.google.common.base.Optional;
 
 public class InventoryHelper {
 
@@ -182,9 +184,9 @@ public class InventoryHelper {
         ExternalInterfaces externalInterfaces = new ExternalInterfacesBuilder().setKey(new ExternalInterfacesKey(ncId))
             .setNodeConnectorId(ncId)
             .build();
-        WriteTransaction transaction = dataBroker.newReadWriteTransaction();
+        WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
         transaction.put(LogicalDatastoreType.CONFIGURATION, nodeExternalInterfacesIid, externalInterfaces, true);
-        submitToDs(transaction);
+        DataStoreHelper.submitToDs(transaction);
         LOG.trace("Added external interface node connector {} to node {}", ncId.getValue(), nodeId.getValue());
         return nodeExternalInterfacesIid;
     }
index 39165329142577fca0df1010fbb7fc2e7cc91d29..5fad3aa639a5647ee8212f226ec52a185f52ce42 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -9,19 +9,16 @@ package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
 
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.FloatingIpAssociationMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.GbpByNeutronMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.NeutronByGbpMappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.InternalPortsByFloatingIpPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByFloatingIpPorts;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ExternalGatewaysAsL3Endpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
@@ -33,55 +30,37 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 public class NeutronOvsdbIidFactory {
 
     public static InstanceIdentifier<OvsdbNodeAugmentation> ovsdbNodeAugmentationIid(TopologyId ovsdbTopologyId) {
-        return InstanceIdentifier.create(NetworkTopology.class) .child(Topology.class, new TopologyKey(ovsdbTopologyId))
-        .child(Node.class)
-        .augmentation(OvsdbNodeAugmentation.class);
+        return InstanceIdentifier.create(NetworkTopology.class)
+            .child(Topology.class, new TopologyKey(ovsdbTopologyId))
+            .child(Node.class)
+            .augmentation(OvsdbNodeAugmentation.class);
     }
 
     public static InstanceIdentifier<ExternalGatewayAsL3Endpoint> neutronGbpExternalGatewayIidWildcard() {
         return InstanceIdentifier.builder(Mappings.class)
-                .child(NeutronByGbpMappings.class)
-                .child(ExternalGatewaysAsL3Endpoints.class)
-                .child(ExternalGatewayAsL3Endpoint.class)
-                .build();
-    }
-
-    public static InstanceIdentifier<EndpointByFloatingIpPort> neutronGbpFloatingIpIidWildcard() {
-        return InstanceIdentifier.builder(Mappings.class)
-                .child(GbpByNeutronMappings.class)
-                .child(EndpointsByFloatingIpPorts.class)
-                .child(EndpointByFloatingIpPort.class)
-                .build();
+            .child(NeutronByGbpMappings.class)
+            .child(ExternalGatewaysAsL3Endpoints.class)
+            .child(ExternalGatewayAsL3Endpoint.class)
+            .build();
     }
 
     public static InstanceIdentifier<EndpointByPort> endpointByPortIid(UniqueId portId) {
         return InstanceIdentifier.builder(Mappings.class)
-                .child(GbpByNeutronMappings.class)
-                .child(EndpointsByPorts.class)
-                .child(EndpointByPort.class, new EndpointByPortKey(portId))
-                .build();
-    }
-
-    public static InstanceIdentifier<InternalPortByFloatingIpPort> internalPortByFloatingIpIid(UniqueId floatingIpPortId) {
-        return InstanceIdentifier.builder(Mappings.class)
-                .child(FloatingIpAssociationMappings.class)
-                .child(InternalPortsByFloatingIpPorts.class)
-                .child(InternalPortByFloatingIpPort.class, new InternalPortByFloatingIpPortKey(floatingIpPortId))
-                .build();
+            .child(GbpByNeutronMappings.class)
+            .child(EndpointsByPorts.class)
+            .child(EndpointByPort.class, new EndpointByPortKey(portId))
+            .build();
     }
 
-    public static InstanceIdentifier<InternalPortByFloatingIpPort> neutronGbpInternalPortByFloatingIpIidWildcard() {
-        return InstanceIdentifier.builder(Mappings.class)
-                .child(FloatingIpAssociationMappings.class)
-                .child(InternalPortsByFloatingIpPorts.class)
-                .child(InternalPortByFloatingIpPort.class)
-                .build();
+    public static InstanceIdentifier<NeutronByGbpMappings> neutronGbpMappingsIidWildcard() {
+        return InstanceIdentifier.builder(Mappings.class).child(NeutronByGbpMappings.class).build();
     }
 
-
-    public static InstanceIdentifier<NeutronByGbpMappings> neutronGbpMappingsIidWildcard() {
-        return InstanceIdentifier.builder(Mappings.class)
-                .child(NeutronByGbpMappings.class)
-                .build();
+    public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node> nodeIid(
+            NodeId nodeId) {
+        return InstanceIdentifier.builder(Nodes.class)
+            .child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node.class,
+                    new NodeKey(nodeId))
+            .build();
     }
 }
diff --git a/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronOvsdbTest.java b/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronOvsdbTest.java
deleted file mode 100644 (file)
index 2a5581e..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
-import org.osgi.framework.BundleContext;
-
-public class NeutronOvsdbTest {
-
-    private NeutronOvsdb neutronOvsdb;
-
-    private DataBroker dataProvider;
-    private RpcProviderRegistry rpcProvider;
-    private BundleContext context;
-
-    @Before
-    public void initialise() {
-        dataProvider = mock(DataBroker.class);
-        rpcProvider = mock(RpcProviderRegistry.class);
-        context = mock(BundleContext.class);
-
-        EndpointService epService = mock(EndpointService.class);
-        when(rpcProvider.getRpcService(EndpointService.class)).thenReturn(epService);
-
-        neutronOvsdb = new NeutronOvsdb(dataProvider, rpcProvider, context);
-    }
-
-    @Test
-    public void closeTest() throws Exception {
-        neutronOvsdb.close();
-    }
-
-}
diff --git a/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListenerTest.java b/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListenerTest.java
deleted file mode 100644 (file)
index d3468a2..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfaces;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
-
-public class NodeDataChangeListenerTest {
-
-    private NodeDataChangeListener listener;
-
-    private DataBroker dataBroker;
-    private ListenerRegistration<DataChangeListener> registration;
-    private Map<InstanceIdentifier<?>, DataObject> dataMap;
-    private Set<InstanceIdentifier<?>> dataSet;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
-    private InstanceIdentifier<OvsdbNodeAugmentation> identifier;
-    private OvsdbNodeAugmentation dataObject;
-    private ReadOnlyTransaction readOnlyTransaction;
-    private ReadWriteTransaction readWriteTransaction;
-
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    @Before
-    public void initialise() throws Exception {
-        dataBroker = mock(DataBroker.class);
-        registration = mock(ListenerRegistration.class);
-        when(
-                dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(registration);
-
-        TopologyId topologyId = mock(TopologyId.class);
-        identifier = InstanceIdentifier.create(NetworkTopology.class)
-            .child(Topology.class, new TopologyKey(topologyId))
-            .child(Node.class)
-            .augmentation(OvsdbNodeAugmentation.class);
-
-        dataObject = mock(OvsdbNodeAugmentation.class);
-        ManagedNodeEntry managedNode = mock(ManagedNodeEntry.class);
-        when((dataObject).getManagedNodeEntry()).thenReturn(Arrays.asList(managedNode));
-        OvsdbBridgeRef bridgeRef = mock(OvsdbBridgeRef.class);
-        when(managedNode.getBridgeRef()).thenReturn(bridgeRef);
-        when(bridgeRef.getValue()).thenReturn((InstanceIdentifier) identifier);
-
-        dataMap = new HashMap<InstanceIdentifier<?>, DataObject>();
-        dataMap.put(identifier, dataObject);
-        dataSet = new HashSet<InstanceIdentifier<?>>(Arrays.asList(identifier));
-
-        OpenvswitchOtherConfigs config = mock(OpenvswitchOtherConfigs.class);
-        when((dataObject).getOpenvswitchOtherConfigs()).thenReturn(Arrays.asList(config));
-        when(config.getOtherConfigKey()).thenReturn("provider_mappings");
-        when(config.getOtherConfigValue()).thenReturn("otherConfig:Value");
-
-        readOnlyTransaction = mock(ReadOnlyTransaction.class);
-        when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
-        CheckedFuture<Optional<?>, ReadFailedException> readOnlyFuture = mock(CheckedFuture.class);
-        when(readOnlyTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
-                readOnlyFuture);
-        Optional<Node> readOnlyOptional = mock(Optional.class);
-        when(readOnlyFuture.checkedGet()).thenReturn((Optional) readOnlyOptional);
-        when(readOnlyOptional.isPresent()).thenReturn(true);
-        Node node = mock(Node.class);
-        when(readOnlyOptional.get()).thenReturn(node);
-
-        OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
-        when(node.getAugmentation(OvsdbBridgeAugmentation.class)).thenReturn(ovsdbBridge);
-        TerminationPoint terminationPoint = mock(TerminationPoint.class);
-        when(node.getTerminationPoint()).thenReturn(Arrays.asList(terminationPoint));
-        OvsdbTerminationPointAugmentation tpAug = mock(OvsdbTerminationPointAugmentation.class);
-        when(terminationPoint.getAugmentation(OvsdbTerminationPointAugmentation.class)).thenReturn(tpAug);
-        when(tpAug.getName()).thenReturn("Value");
-        when(tpAug.getOfport()).thenReturn(5L);
-        DatapathId datapathId = mock(DatapathId.class);
-        when(ovsdbBridge.getDatapathId()).thenReturn(datapathId);
-        when(datapathId.getValue()).thenReturn("FF:FF:FF:FF:FF:FF:FF:FF");
-
-        change = mock(AsyncDataChangeEvent.class);
-
-        readWriteTransaction = mock(ReadWriteTransaction.class);
-        when(dataBroker.newReadWriteTransaction()).thenReturn(readWriteTransaction);
-        CheckedFuture<Void, TransactionCommitFailedException> readWriteFuture = mock(CheckedFuture.class);
-        when(readWriteTransaction.submit()).thenReturn(readWriteFuture);
-        // ExternalInterfaces
-        CheckedFuture<Optional<Node>, ReadFailedException> deleteFuture = mock(CheckedFuture.class);
-        when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
-                deleteFuture);
-        Optional<Node> deleteOptional = mock(Optional.class);
-        when(deleteFuture.checkedGet()).thenReturn(deleteOptional);
-        when(deleteOptional.isPresent()).thenReturn(true);
-
-        listener = new NodeDataChangeListener(dataBroker);
-    }
-
-    @Test
-    public void constructorTest() throws Exception {
-        listener.close();
-        verify(registration).close();
-    }
-
-    @Test
-    public void onDataChangeTestCreations() {
-        when(change.getCreatedData()).thenReturn(dataMap);
-        listener.onDataChanged(change);
-        Assert.assertTrue(NodeDataChangeListener.nodeIdByExtInterface.containsKey(identifier));
-    }
-
-    @Test
-    public void onDataChangeTestUpdates() {
-        InstanceIdentifier<ExternalInterfaces> eiIdentifier = InstanceIdentifier.create(ExternalInterfaces.class);;
-        NodeDataChangeListener.nodeIdByExtInterface.put(identifier, eiIdentifier);
-        when(change.getUpdatedData()).thenReturn(dataMap);
-        when((dataObject).getOpenvswitchOtherConfigs()).thenReturn(null);
-        listener.onDataChanged(change);
-        Assert.assertFalse(NodeDataChangeListener.nodeIdByExtInterface.containsKey(identifier));
-    }
-
-    @Test
-    public void onDataChangeTestRemove() {
-        InstanceIdentifier<ExternalInterfaces> eiIdentifier = InstanceIdentifier.create(ExternalInterfaces.class);;
-        NodeDataChangeListener.nodeIdByExtInterface.put(identifier, eiIdentifier);
-        when(change.getRemovedPaths()).thenReturn(dataSet);
-        listener.onDataChanged(change);
-        Assert.assertFalse(NodeDataChangeListener.nodeIdByExtInterface.containsKey(identifier));
-    }
-
-}
index d33d8afd84b63e0db9300b00c63dd1b74f72ace6..b928eb5fa1d9d5be22d3201d483ff91545e3dc37 100644 (file)
@@ -35,8 +35,10 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
@@ -159,10 +161,13 @@ public class TerminationPointDataChangeListenerTest {
         Optional<Endpoint> endpointOptional = mock(Optional.class);
         when(endpointFuture.checkedGet()).thenReturn(endpointOptional);
         when(endpointOptional.isPresent()).thenReturn(true);
-        Endpoint endpoint = mock(Endpoint.class);
-        when(endpointOptional.get()).thenReturn(endpoint);
         OfOverlayContext ofc = mock(OfOverlayContext.class);
-        when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(ofc);
+        Endpoint endpoint = new EndpointBuilder().setL2Context(new L2BridgeDomainId("foo"))
+            .setMacAddress(new MacAddress("01:23:45:67:89:AB"))
+            .setTenant(new TenantId("fooTenant"))
+            .addAugmentation(OfOverlayContext.class, ofc)
+            .build();
+        when(endpointOptional.get()).thenReturn(endpoint);
 
         // OfOverlayNodeConfig
         ofOverlayNodeConfigFuture = mock(CheckedFuture.class);
index e8e6b7a894542517ed2526b03aad4cae2222ef3d..134db052e4713fa8bd6da6f95606f041880fbce4 100644 (file)
@@ -21,7 +21,11 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -42,7 +46,12 @@ public class EndpointHelperTest {
     @Before
     public void initialise() throws Exception {
         epKey = mock(EndpointKey.class);
-        endpoint = mock(Endpoint.class);
+        OfOverlayContext ofc = mock(OfOverlayContext.class);
+        endpoint = new EndpointBuilder().setL2Context(new L2BridgeDomainId("foo"))
+                .setMacAddress(new MacAddress("01:23:45:67:89:AB"))
+                .setTenant(new TenantId("fooTenant"))
+                .addAugmentation(OfOverlayContext.class, ofc)
+                .build();
         readTransaction = mock(ReadOnlyTransaction.class);
         writeTransaction = mock(ReadWriteTransaction.class);
 
@@ -52,9 +61,6 @@ public class EndpointHelperTest {
         readOptional = mock(Optional.class);
         when(readFuture.checkedGet()).thenReturn(readOptional);
 
-        OfOverlayContext ofc = mock(OfOverlayContext.class);
-        when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(ofc);
-
         submitFuture = mock(CheckedFuture.class);
         when(writeTransaction.submit()).thenReturn(submitFuture);
     }
index 638d275817214bc2df8ae496107f7a3a30b8e716..70e9dabd5564a35866157eb713813a4121b957e3 100644 (file)
@@ -300,7 +300,7 @@ public class InventoryHelperTest {
         NodeId nodeId = mock(NodeId.class);
         NodeConnectorId ncId = mock(NodeConnectorId.class);
         ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
-        when(dataBroker.newReadWriteTransaction()).thenReturn(transaction);
+        when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
         CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
         when(transaction.submit()).thenReturn(submitFuture);
 
index 0f6fe28d92373a9e4df76b8e2602a58240e269e3..da90f4ce56f10106e56272bd4f3070a63e4d767e 100644 (file)
@@ -8,39 +8,30 @@
 
 package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import java.util.Iterator;
 
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
+import org.junit.Test;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.FloatingIpAssociationMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.GbpByNeutronMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.NeutronByGbpMappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.InternalPortsByFloatingIpPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.floating.ip.association.mappings.internal.ports.by.floating.ip.ports.InternalPortByFloatingIpPortKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByFloatingIpPorts;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.EndpointsByPorts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.floating.ip.ports.EndpointByFloatingIpPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ExternalGatewaysAsL3Endpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.gateways.as.l3.endpoints.ExternalGatewayAsL3Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
 public class NeutronOvsdbIidFactoryTest {
 
     @Test
@@ -52,7 +43,7 @@ public class NeutronOvsdbIidFactoryTest {
         assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
         assertEquals(OvsdbNodeAugmentation.class, id.getTargetType());
         assertTrue(id.isWildcarded());
-        assertEquals(ovsdbTopologyId, id.firstKeyOf(Topology.class, TopologyKey.class).getTopologyId().getValue());
+        assertEquals(ovsdbTopologyId, id.firstKeyOf(Topology.class).getTopologyId().getValue());
     }
 
     @Test
@@ -66,17 +57,6 @@ public class NeutronOvsdbIidFactoryTest {
         assertTrue(id.isWildcarded());
     }
 
-    @Test
-    public void neutronGbpFloatingIpIidWildcardTest() {
-        InstanceIdentifier<EndpointByFloatingIpPort> id = NeutronOvsdbIidFactory.neutronGbpFloatingIpIidWildcard();
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, GbpByNeutronMappings.class,
-                EndpointsByFloatingIpPorts.class, EndpointByFloatingIpPort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(EndpointByFloatingIpPort.class, id.getTargetType());
-        assertTrue(id.isWildcarded());
-    }
-
     @Test
     public void endpointByPortIidTest() {
         final String portId = "e0bb2cf8-8855-434e-839b-d2e59e045218";
@@ -87,31 +67,7 @@ public class NeutronOvsdbIidFactoryTest {
         assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
         assertEquals(EndpointByPort.class, id.getTargetType());
         assertFalse(id.isWildcarded());
-        assertEquals(portId, id.firstKeyOf(EndpointByPort.class, EndpointByPortKey.class).getPortId().getValue());
-    }
-
-    @Test
-    public void internalPortByFloatingIpIidTest() {
-        final String floatingIpPortId = "02b9c2ed-8626-472b-8f58-808539cd62a7";
-        InstanceIdentifier<InternalPortByFloatingIpPort> id = NeutronOvsdbIidFactory.internalPortByFloatingIpIid(new UniqueId(floatingIpPortId));
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, FloatingIpAssociationMappings.class,
-                InternalPortsByFloatingIpPorts.class, InternalPortByFloatingIpPort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(InternalPortByFloatingIpPort.class, id.getTargetType());
-        assertFalse(id.isWildcarded());
-        assertEquals(floatingIpPortId, id.firstKeyOf(InternalPortByFloatingIpPort.class, InternalPortByFloatingIpPortKey.class).getFloatingIpPortId().getValue());
-    }
-
-    @Test
-    public void neutronGbpInternalPortByFloatingIpIidWildcardTest() {
-        InstanceIdentifier<InternalPortByFloatingIpPort> id = NeutronOvsdbIidFactory.neutronGbpInternalPortByFloatingIpIidWildcard();
-        assertNotNull(id);
-        Class<?>[] expectedTypes = {Mappings.class, FloatingIpAssociationMappings.class,
-                InternalPortsByFloatingIpPorts.class, InternalPortByFloatingIpPort.class};
-        assertPathArgumentTypes(id.getPathArguments(), expectedTypes);
-        assertEquals(InternalPortByFloatingIpPort.class, id.getTargetType());
-        assertTrue(id.isWildcarded());
+        assertEquals(portId, id.firstKeyOf(EndpointByPort.class).getPortId().getValue());
     }
 
     @Test
index 15022b26f6edd37c6531711c3c2b41d60a0da146..6162c540ee3bbb6b05000c22a30788bf0f5ad0de 100644 (file)
@@ -90,6 +90,8 @@ public class EndpointManager implements AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(EndpointManager.class);
     private final EndpointManagerListener endpointListener;
+    private final OfOverlayContextListener ofOverlayContextListener;
+    private final OfOverlayL3ContextListener ofOverlayL3ContextListener;
     private final ConcurrentMap<EpKey, Endpoint> endpoints = new ConcurrentHashMap<>();
     private final ConcurrentMap<EpKey, Endpoint> externalEndpointsWithoutLocation = new ConcurrentHashMap<>();
     private final ConcurrentMap<NodeId, ConcurrentMap<EgKey, Set<EpKey>>> endpointsByGroupByNode =
@@ -129,8 +131,12 @@ public class EndpointManager implements AutoCloseable {
         }
         if (dataProvider != null) {
             endpointListener = new EndpointManagerListener(this.dataProvider, this);
+            ofOverlayContextListener = new OfOverlayContextListener(dataProvider, switchManager);
+            ofOverlayL3ContextListener = new OfOverlayL3ContextListener(dataProvider, switchManager);
         } else {
             endpointListener = null;
+            ofOverlayContextListener = null;
+            ofOverlayL3ContextListener = null;
         }
         LOG.debug("Initialized OFOverlay endpoint manager");
     }
@@ -498,11 +504,18 @@ public class EndpointManager implements AutoCloseable {
     // auto closeable
     @Override
     public void close() throws Exception {
-        if (endpointListener != null)
+        if (endpointListener != null) {
             endpointListener.close();
+        }
         if (notificationListenerRegistration != null) {
             notificationListenerRegistration.close();
         }
+        if (ofOverlayContextListener != null) {
+            ofOverlayContextListener.close();
+        }
+        if (ofOverlayL3ContextListener != null) {
+            ofOverlayL3ContextListener.close();
+        }
     }
 
     private Set<EpKey> getEpNGSet(NodeId location, EgKey eg) {
@@ -774,48 +787,6 @@ public class EndpointManager implements AutoCloseable {
         return egKeys;
     }
 
-    @SuppressWarnings("unused")
-    private Endpoint addEndpointFromL3Endpoint(EndpointL3 l3Ep, ReadWriteTransaction rwTx) {
-        // Make an indexed tenant and resolveL2BridgeDomain from L3EP containment if not L3
-        // (instanceof)
-        OfOverlayL3Context ofL3Ctx = l3Ep.getAugmentation(OfOverlayL3Context.class);
-        OfOverlayContext ofCtx = new OfOverlayContextBuilder(ofL3Ctx).build();
-        if (l3Ep.getNetworkContainment() instanceof L3Context) {
-            LOG.error("Cannot generate Endpoint from EndpointL3, network containment is L3Context.");
-            rwTx.cancel();
-            return null;
-        }
-
-        IndexedTenant indexedTenant;
-        Optional<Tenant> tenant =
-                readFromDs(LogicalDatastoreType.CONFIGURATION, IidFactory.tenantIid(l3Ep.getTenant()), rwTx);
-        if (tenant.isPresent()) {
-            indexedTenant = new IndexedTenant(tenant.get());
-        } else {
-            LOG.error("Could not find tenant {} for EndpointL3 {}", l3Ep.getTenant(), l3Ep);
-            rwTx.cancel();
-            return null;
-        }
-        List<L3Address> l3Address = new ArrayList<>();
-        l3Address.add(new L3AddressBuilder().setIpAddress(l3Ep.getIpAddress())
-            .setL3Context(l3Ep.getL3Context())
-            .setKey(new L3AddressKey(l3Ep.getIpAddress(), l3Ep.getL3Context()))
-            .build());
-        L2BridgeDomain l2Bd = indexedTenant.resolveL2BridgeDomain(l3Ep.getNetworkContainment());
-        Endpoint ep = new EndpointBuilder().setKey(new EndpointKey(l2Bd.getId(), l3Ep.getMacAddress()))
-            .setMacAddress(l3Ep.getMacAddress())
-            .setL2Context(l2Bd.getId())
-            .setEndpointGroups(l3Ep.getEndpointGroups())
-            .setTenant(l3Ep.getTenant())
-            .setL3Address(l3Address)
-            .setCondition(l3Ep.getCondition())
-            .setNetworkContainment(l3Ep.getNetworkContainment())
-            .addAugmentation(OfOverlayContext.class, ofCtx)
-            .build();
-        rwTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.endpointIid(ep.getL2Context(), ep.getMacAddress()), ep);
-        return ep;
-    }
-
     private Set<EndpointGroupId> getEndpointGroupsFromEndpoint(Endpoint ep) {
         if (ep == null)
             return new HashSet<>();
diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayContextListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayContextListener.java
new file mode 100644 (file)
index 0000000..d3029ac
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Determines node-id and node-connector-id as location for an endpoint based on port-name.
+ */
+public class OfOverlayContextListener extends DataTreeChangeHandler<OfOverlayContext> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OfOverlayContextListener.class);
+    private final SwitchManager swManager;
+
+    public OfOverlayContextListener(DataBroker dataProvider, SwitchManager swManager) {
+        super(dataProvider, new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
+            .builder(Endpoints.class).child(Endpoint.class).augmentation(OfOverlayContext.class).build()));
+        this.swManager = checkNotNull(swManager);
+    }
+
+    @Override
+    protected void onWrite(DataObjectModification<OfOverlayContext> rootNode,
+            InstanceIdentifier<OfOverlayContext> rootIdentifier) {
+        OfOverlayContext ofOverlayCtx = rootNode.getDataAfter();
+        LOG.trace("on write: \n OfOverlayContext: {} \n rootIdentifier: {}", ofOverlayCtx, rootIdentifier);
+        if (ofOverlayCtx.getNodeConnectorId() != null && ofOverlayCtx.getNodeId() != null) {
+            return; // Location is already on EP
+        }
+        Name portName = ofOverlayCtx.getPortName();
+        updateLocationBasedOnPortName(portName, rootIdentifier);
+    }
+
+    @Override
+    protected void onDelete(DataObjectModification<OfOverlayContext> rootNode,
+            InstanceIdentifier<OfOverlayContext> rootIdentifier) {
+        // NOOP
+    }
+
+    @Override
+    protected void onSubtreeModified(DataObjectModification<OfOverlayContext> rootNode,
+            InstanceIdentifier<OfOverlayContext> rootIdentifier) {
+        Name newPortName = rootNode.getDataAfter().getPortName();
+        Name oldPortName = rootNode.getDataBefore().getPortName();
+        LOG.trace("on update: \n old OfOverlayContext: {} \n new OfOverlayContext: {} \n rootIdentifier: {}",
+                rootNode.getDataBefore(), rootNode.getDataAfter(), rootIdentifier);
+        if (oldPortName == null && newPortName == null) {
+            LOG.debug("Cannot update location for EP {} because port-name is missing.",
+                    rootIdentifier.firstKeyOf(Endpoint.class));
+            return;
+        }
+        if (oldPortName != null && newPortName != null && oldPortName.equals(newPortName)) {
+            LOG.debug("No need to update location for EP {} because port-name {} was not changed.",
+                    rootIdentifier.firstKeyOf(Endpoint.class), oldPortName.getValue());
+            return;
+        }
+        updateLocationBasedOnPortName(newPortName, rootIdentifier);
+    }
+
+    private void updateLocationBasedOnPortName(Name portName, InstanceIdentifier<OfOverlayContext> rootIdentifier) {
+        if (portName == null) {
+            LOG.debug("Cannot determine EP location for EP because port-name is missing.",
+                    rootIdentifier.firstKeyOf(Endpoint.class));
+            return;
+        }
+        InstanceIdentifier<NodeConnector> ncIid = swManager.getNodeConnectorIidForPortName(portName);
+        if (ncIid == null) {
+            LOG.debug("Cannot determine EP location for EP {} because node-connector with port-name {}"
+                    + " does not exist on any node.", rootIdentifier.firstKeyOf(Endpoint.class), portName);
+            return;
+        }
+        NodeId nodeId = ncIid.firstKeyOf(Node.class).getId();
+        NodeConnectorId ncId = ncIid.firstKeyOf(NodeConnector.class).getId();
+        WriteTransaction wTx = dataProvider.newWriteOnlyTransaction();
+        OfOverlayContext newOfOverlayCtx =
+                new OfOverlayContextBuilder().setNodeId(nodeId).setNodeConnectorId(ncId).build();
+        wTx.merge(LogicalDatastoreType.OPERATIONAL, rootIdentifier, newOfOverlayCtx);
+        DataStoreHelper.submitToDs(wTx);
+    }
+
+}
diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayL3ContextListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayL3ContextListener.java
new file mode 100644 (file)
index 0000000..60ff2d7
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayL3Context;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayL3ContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Determines node-id and node-connector-id as location for an L3 endpoint based on port-name.
+ */
+public class OfOverlayL3ContextListener extends DataTreeChangeHandler<OfOverlayL3Context> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OfOverlayL3ContextListener.class);
+    private final SwitchManager swManager;
+
+    public OfOverlayL3ContextListener(DataBroker dataProvider, SwitchManager swManager) {
+        super(dataProvider, new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
+            .builder(Endpoints.class).child(EndpointL3.class).augmentation(OfOverlayL3Context.class).build()));
+        this.swManager = checkNotNull(swManager);
+    }
+
+    @Override
+    protected void onWrite(DataObjectModification<OfOverlayL3Context> rootNode,
+            InstanceIdentifier<OfOverlayL3Context> rootIdentifier) {
+        OfOverlayL3Context ofOverlayL3Ctx = rootNode.getDataAfter();
+        LOG.trace("on write: \n OfOverlayL3Context: {} \n rootIdentifier: {}", ofOverlayL3Ctx, rootIdentifier);
+        if (ofOverlayL3Ctx.getNodeConnectorId() != null && ofOverlayL3Ctx.getNodeId() != null) {
+            return; // Location is already on L3EP
+        }
+        Name portName = ofOverlayL3Ctx.getPortName();
+        updateLocationBasedOnPortName(portName, rootIdentifier);
+    }
+
+    @Override
+    protected void onDelete(DataObjectModification<OfOverlayL3Context> rootNode,
+            InstanceIdentifier<OfOverlayL3Context> rootIdentifier) {
+        // NOOP
+    }
+
+    @Override
+    protected void onSubtreeModified(DataObjectModification<OfOverlayL3Context> rootNode,
+            InstanceIdentifier<OfOverlayL3Context> rootIdentifier) {
+        Name newPortName = rootNode.getDataAfter().getPortName();
+        Name oldPortName = rootNode.getDataBefore().getPortName();
+        LOG.trace("on update: \n old OfOverlayL3Context: {} \n new OfOverlayL3Context: {} \n rootIdentifier: {}",
+                rootNode.getDataBefore(), rootNode.getDataAfter(), rootIdentifier);
+        if (oldPortName == null && newPortName == null) {
+            LOG.debug("Cannot update location for L3EP {} because port-name is missing.",
+                    rootIdentifier.firstKeyOf(EndpointL3.class));
+            return;
+        }
+        if (oldPortName != null && newPortName != null && oldPortName.equals(newPortName)) {
+            LOG.debug("No need to update location for L3EP {} because port-name {} was not changed.",
+                    rootIdentifier.firstKeyOf(EndpointL3.class), oldPortName.getValue());
+            return;
+        }
+        updateLocationBasedOnPortName(newPortName, rootIdentifier);
+    }
+
+    private void updateLocationBasedOnPortName(Name portName, InstanceIdentifier<OfOverlayL3Context> rootIdentifier) {
+        if (portName == null) {
+            LOG.debug("Cannot determine L3EP location for L3EP because port-name is missing.",
+                    rootIdentifier.firstKeyOf(EndpointL3.class));
+            return;
+        }
+        InstanceIdentifier<NodeConnector> ncIid = swManager.getNodeConnectorIidForPortName(portName);
+        if (ncIid == null) {
+            LOG.debug("Cannot determine L3EP location for L3EP {} because node-connector with port-name {}"
+                    + " does not exist on any node.", rootIdentifier.firstKeyOf(EndpointL3.class), portName);
+            return;
+        }
+        NodeId nodeId = ncIid.firstKeyOf(Node.class).getId();
+        NodeConnectorId ncId = ncIid.firstKeyOf(NodeConnector.class).getId();
+        WriteTransaction wTx = dataProvider.newWriteOnlyTransaction();
+        OfOverlayL3Context newOfOverlayCtx =
+                new OfOverlayL3ContextBuilder().setNodeId(nodeId).setNodeConnectorId(ncId).build();
+        wTx.merge(LogicalDatastoreType.OPERATIONAL, rootIdentifier, newOfOverlayCtx);
+        DataStoreHelper.submitToDs(wTx);
+    }
+
+}
index bcccf7c5224d0d5cad2cf782ae98e0166d717172..66a69d8afb0e4c1aa98eefc8977ef7b240ab99fd 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig.EncapsulationFormat;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfaces;
@@ -109,6 +110,22 @@ public class SwitchManager implements AutoCloseable {
         state.updateStatus();
     }
 
+    public synchronized InstanceIdentifier<NodeConnector> getNodeConnectorIidForPortName(Name portName) {
+        for (SwitchState sw : switches.values()) {
+            if (sw.fcncByNcIid == null) {
+                continue;
+            }
+            for (Entry<InstanceIdentifier<NodeConnector>, FlowCapableNodeConnector> fcncByNcIidEntry : sw.fcncByNcIid
+                .entrySet()) {
+                FlowCapableNodeConnector fcnc = fcncByNcIidEntry.getValue();
+                if (portName.getValue().equals(fcnc.getName())) {
+                    return fcncByNcIidEntry.getKey();
+                }
+            }
+        }
+        return null;
+    }
+
     /**
      * Get the collection of switches that are in the "ready" state. Note
      * that the collection is immutable.
index 7fea1d79ae3b45cee0a6cf43e8ede5ace4a5d9eb..a1fd3b8503691f8b7164f50f1fdcaeb99e1511f1 100644 (file)
@@ -20,6 +20,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
@@ -62,9 +64,10 @@ public class OFOverlayRendererTest {
         policyValidatorRegistry = mock(PolicyValidatorRegistry.class);
         tableOffset = 5;
         configReg = mock(ListenerRegistration.class);
-        when(
-                dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(configReg);
+        when(dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
+                any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(configReg);
+        when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
+                any(DataTreeChangeListener.class))).thenReturn(configReg);
 
         WriteTransaction writeTransaction = mock(WriteTransaction.class);
         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
@@ -82,7 +85,7 @@ public class OFOverlayRendererTest {
     @Test
     public void constructorTest() throws Exception {
         renderer.close();
-        verify(configReg, times(5)).close();
+        verify(configReg, times(10)).close();
     }
 
     @Test
index fe232f183e2eca259c06bd16ec29615534cdc672..724a813cd358ce88566c415652d582f8af04980d 100644 (file)
@@ -31,6 +31,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
@@ -113,9 +115,11 @@ public class EndpointManagerTest {
         when(writeTransaction.submit()).thenReturn(checkedFutureWrite);
         BindingAwareBroker.RpcRegistration<EndpointService> rpcRegistration = mock(BindingAwareBroker.RpcRegistration.class);
         listenerReg = mock(ListenerRegistration.class);
-        when(
-                dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(listenerReg);
+        when(dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
+                any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(listenerReg);
+        when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
+                any(DataTreeChangeListener.class))).thenReturn(listenerReg);
+
         when(rpcRegistry.addRpcImplementation(any(Class.class), any(RpcService.class))).thenReturn(rpcRegistration);
 
         manager = spy(new EndpointManager(dataProvider, rpcRegistry, notificationService, executor, switchManager));
@@ -587,70 +591,10 @@ public class EndpointManagerTest {
         Assert.assertFalse(collection.isEmpty());
     }
 
-    @SuppressWarnings({"unchecked"})
-    @Test
-    public void addEndpointFromL3EndpointTest() throws Exception {
-        EndpointL3 l3Ep = mock(EndpointL3.class);
-        ReadWriteTransaction rwTx = mock(ReadWriteTransaction.class);
-        OfOverlayL3Context ofL3Ctx = mock(OfOverlayL3Context.class);
-        when(l3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofL3Ctx);
-
-        CheckedFuture<Optional<Tenant>, ReadFailedException> checkedFuture = mock(CheckedFuture.class);
-        when(rwTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(checkedFuture);
-        Optional<Tenant> optional = mock(Optional.class);
-        when(checkedFuture.checkedGet()).thenReturn(optional);
-        Tenant tenant = mock(Tenant.class);
-        ForwardingContext fwCtx = mock(ForwardingContext.class);
-        when(tenant.getForwardingContext()).thenReturn(fwCtx);
-        when(optional.isPresent()).thenReturn(true);
-        when(optional.get()).thenReturn(tenant);
-
-        L2BridgeDomain l2BridgeDomain = mock(L2BridgeDomain.class);
-        when(fwCtx.getL2BridgeDomain()).thenReturn(Collections.singletonList(l2BridgeDomain));
-        L2BridgeDomainId l2BridgeDomainId = mock(L2BridgeDomainId.class);
-        when(l2BridgeDomain.getId()).thenReturn(l2BridgeDomainId);
-        String l2bdValue = UUID.randomUUID().toString();
-        when(l2BridgeDomainId.getValue()).thenReturn(l2bdValue);
-
-        NetworkDomainId networkDomainId = mock(NetworkDomainId.class);
-        when(l3Ep.getNetworkContainment()).thenReturn(networkDomainId);
-        when(networkDomainId.getValue()).thenReturn(l2bdValue);
-
-        Method method = EndpointManager.class.getDeclaredMethod("addEndpointFromL3Endpoint", EndpointL3.class,
-                ReadWriteTransaction.class);
-        method.setAccessible(true);
-        method.invoke(manager, l3Ep, rwTx);
-        verify(rwTx).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Endpoint.class));
-    }
-
-    @SuppressWarnings({"unchecked"})
-    @Test
-    public void addEndpointFromL3EndpointTestTenantPresentFalse() throws Exception {
-        EndpointL3 l3Ep = mock(EndpointL3.class);
-        ReadWriteTransaction rwTx = mock(ReadWriteTransaction.class);
-        OfOverlayL3Context ofL3Ctx = mock(OfOverlayL3Context.class);
-        when(l3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofL3Ctx);
-
-        CheckedFuture<Optional<Tenant>, ReadFailedException> checkedFuture = mock(CheckedFuture.class);
-        when(rwTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(checkedFuture);
-        Optional<Tenant> optional = mock(Optional.class);
-        when(checkedFuture.checkedGet()).thenReturn(optional);
-        when(optional.isPresent()).thenReturn(false);
-
-        Method method = EndpointManager.class.getDeclaredMethod("addEndpointFromL3Endpoint", EndpointL3.class,
-                ReadWriteTransaction.class);
-        method.setAccessible(true);
-        method.invoke(manager, l3Ep, rwTx);
-        verify(rwTx).cancel();
-    }
-
     @Test
     public void closeTest() throws Exception {
         manager.close();
-        verify(listenerReg).close();
-        manager = new EndpointManager(null, rpcRegistry, notificationService, executor, switchManager);
-        manager.close();
-        verify(listenerReg, times(1)).close();
+        verify(listenerReg, times(3)).close();
     }
 
      //**************